本文主要是常见假设检验的python实现。
正态总体参数的假设检验
单正态总体均值的检验
import pandas as pd
import numpy as np
from scipy.stats import norm
from scipy import stats
import matplotlib.pyplot as plt
import os
os.chdir('E:\Files\数据文件\第9章')
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
单侧检验 ($\sigma$已知)
美国联邦贸易委员会(FTC)定期设计统计调查,用以检验制造商的产品说明。例如,大号听装Hiltop咖啡的标签上标明装有3磅咖啡。FTC知道Hiltop的生产线不可能精确地在每罐中放人3磅咖啡,甚至无法保证所有听装咖啡重量的总体均值为3磅/听。当然,只要听装总体重量的均值至少为3磅/听,消费者的权益将得到保障。于是,FTC把大号听装咖啡标签上的信息理解为Hillop的承诺:听装咖啡重量的总体均值为3磅/听。
假设每罐咖啡的重量服从正态分布$N(\mu,0.18^2)$,样本容量为$n=36$,样本数据如下:
data = pd.read_excel('Coffee.xlsx',sheet_name='Data')
print(np.array(data.T))
sns.distplot(data)
data.T
[[3.15 2.76 3.18 2.77 2.86 2.66 2.86 2.54 3.02 3.13 2.94 2.74 2.84 2.6
2.94 2.93 3.18 2.95 2.86 2.91 2.96 3.14 2.65 2.77 2.96 3.1 2.82 3.05
2.94 2.82 3.21 3.11 2.9 3.05 2.93 2.89]]
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ... | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Weight | 3.15 | 2.76 | 3.18 | 2.77 | 2.86 | 2.66 | 2.86 | 2.54 | 3.02 | 3.13 | ... | 2.82 | 3.05 | 2.94 | 2.82 | 3.21 | 3.11 | 2.9 | 3.05 | 2.93 | 2.89 |
问题:如何检验Hillop的承诺?
- 原假设与备择假设
$$H_0:\mu\geq3,H_1:\mu<3$$
- 拒绝域:在显著性水平$\alpha=0.01$的情况下,z统计量的拒绝域为$$\{z\leq-2.33\}$$
- z统计量的计算
$$z = \frac{\bar x-\mu}{\sigma/\sqrt{n}}$$
#样本均值
s_avg = np.array(data).mean()
#z(u)统计量
z = (s_avg - 3)/0.18*np.sqrt(36)
print('z统计量为%s' % np.round(z,2))
z统计量为-2.67
由于z统计量位于拒绝域内,因此,拒绝原假设$H_0$,即认为Hilltop咖啡含量不足。
- 使用p-value
在计算得到z统计量为-2.67之后,查标准正态分布表可得p-value为0.0038,小于显著性水平0.01,因此拒绝原假设。
双侧检验($\sigma$已知)
高尔夫设备制造商如果想让他们的产品用于美国高尔夫球联合会(USGA)的赛事,则必须达到USGA的套标准。Maxflight有限公司最近采用一种高技术制造工艺生产高尔夫球,其平均发球距离达到295码。然而,这种制造工艺有时发生调控失常,导致所生产的高尔夫球的平均发球距离不是295码。当平均发球距离低于295码时,公司担心由于高尔夫球的平均发球距离没有达到广告中宣传的那么远而使销售量减少。当球的平均发球距离超过295码时,Maxlight的高尔夫球将因为超过USCA制定的击出和滚动总距离标准而被USGA拒绝。
Maxflight的质量控制程序定期选择50个高尔夫球组成样本来监控制造工艺过程。假设发球距离服从正态分布 $𝑁(\mu,12^2)$,样本数据如下
data = pd.read_excel('GolfTest.xlsx',sheet_name='Data')
print(np.array(data.T))
sns.distplot(data)
data.T
[[303 282 289 298 283 317 297 308 317 293 284 290 304 290 311 305 277 278
301 304 300 293 300 276 318 303 309 293 316 302 295 294 291 297 300 299
303 299 282 318 296 285 288 279 310 315 292 303 301 292]]
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ... | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Yards | 303 | 282 | 289 | 298 | 283 | 317 | 297 | 308 | 317 | 293 | ... | 296 | 285 | 288 | 279 | 310 | 315 | 292 | 303 | 301 | 292 |
问题:如何确定制造工艺是否失控?
- 原假设与备择假设
$$H_0:\mu=295,H_1:\mu\neq3$$
- 拒绝域:在显著性水平$\alpha=0.05$的情况下,z统计量的拒绝域为$$\{z\leq-1.96 或 z\geq1.96\}$$
- z统计量的计算
$$z = \frac{\bar x-\mu}{\sigma/\sqrt{n}}$$
#样本均值
s_avg = np.array(data).mean()
#z(u)统计量
z = (s_avg - 295)/12*np.sqrt(50)
print('z统计量为%s' % np.round(z,2))
z统计量为1.53
可见,z并未落在拒绝域内,因此无法拒绝原假设,即该批次产品的制造工艺过程无需调整。
单侧检验 ($\sigma$未知)
一本商务旅行方面的杂志想根据商务旅客总体的评定来划分跨太平洋通道的机场等级。评定标准中最低分为0,最高分为10。总体平均等级超过7的机场将被认为是提供了优质服务的机场。杂志的职员在每一个机场选取60名商务旅客组成一个样本,得到他们的评级数据。在伦敦希斯罗机场的样本中,样本均值$x=7.25$分,样本标准差$s=1.052$分。样本数据如下:
data = pd.read_excel('AirRating.xlsx',sheet_name='Data')
print(np.array(data.T))
sns.distplot(data)
data.T
[[ 5 7 8 7 8 8 8 7 8 10 6 7 8 8 9 7 8 7 8 8 9 6 8 6 7 8 8 6 6 8 7 7 5 6 7 7 7 6 7 7 8 9 7 9 5 7 7 5 8 7 8 8 8 7 6 7 7 7 7 8]]
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ... | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Rating | 5 | 7 | 8 | 7 | 8 | 8 | 8 | 7 | 8 | 10 | ... | 8 | 8 | 8 | 7 | 6 | 7 | 7 | 7 | 7 | 8 |
问题:数据能否表明希斯罗机场可以被认为是提供了优质服务的机场?
- 原假设与备择假设
$$H_0:\mu\leq7,H_1:\mu>7$$
- t统计量的计算
$$t = \frac{\bar x-\mu}{s/\sqrt{n}}$$
t,p_2 = stats.ttest_1samp(data,7)
p_1 = p_2/2
print("t统计量为:{}\n单侧p-value为:{}".format(t,p_1))
t统计量为:[1.84141375]
单侧p-value为:[0.03529481]
可以看出,p-value小于0.05,因此,拒绝原假设,即认为该机场的提供了优质的服务。
双侧检验 ($\sigma$未知)
企业生产产品并通过超过1000多家的零售商分销其产品。在为即将到来的冬季制定生产规模计划时,HolidayToys必须在知道零售层面的实际需求量前确定每种产品生产的数量。对本年度最重要的一种新款玩具,HolidayToys的市场负责人预计平均每家零售商的需求量为40个。在根据这估计作出最后的生产决策之前,HolidayToys决定对25个零售商组成的样本进行调查,以便得到有关这种新款玩具需求量的更多信息。在向每个零售商提供有关这种新款玩具的特征、成本以及建议零售价格等方面的信息后,要求每个零售商给出一个预计的订货量。获得数据如下:
data = pd.read_excel('Orders.xlsx',sheet_name='Data')
print(np.array(data.T))
sns.distplot(data)
data.T
[[26 23 32 47 45 31 47 59 21 52 45 53 34 45 39 52 52 22 22 33 21 34 42 30
28]]
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ... | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Units | 26 | 23 | 32 | 47 | 45 | 31 | 47 | 59 | 21 | 52 | ... | 52 | 52 | 22 | 22 | 33 | 21 | 34 | 42 | 30 | 28 |
问题:根据数据推断,是否需要调整生产计划?
- 原假设与备择假设
$$H_0:\mu=40,H_1:\mu\neq40$$
- t统计量的计算
$$t = \frac{\bar x-\mu}{s/\sqrt{n}}$$
t,p_2 = stats.ttest_1samp(data,40)
print("t统计量为:{}\n双侧p-value为:{}".format(t,p_2))
t统计量为:[-1.10264561]
双侧p-value为:[0.28111572]
可以看出,p-value大于0.05,因此,不能拒绝原假设,即认为无需调整生产计划。
两正态总体均值差的检验
$\sigma_1$和$\sigma_2$已知
作为评价两个培训中心教育质量差异的研究的一部分,对两个中心的学员进行了一次标准化考试。用考试平均分数的差来评估两个中心教育质量的差异。假设两随机变量分别服从$N(\mu_1,10^2),N(\mu_2,10^2)$从A培训中心抽取一个$n_1=30$人的独立简单随机样本,从B培训中心抽取一个$n_2=40$人的独立简单随机样 本。数据如下:
os.chdir('E:\Files\数据文件\第10章')
data = pd.read_excel('ExamScores.xlsx',sheet_name='Data')
print(np.array(data.T))
sns.distplot(data['Center A'])
sns.distplot(data['Center B'])
data.T
[[97. 95. 89. 79. 78. 87. 83. 94. 76. 79. 83. 84. 76. 82. 85. 85. 91. 72. 86. 70. 91. 82. 73. 96. 64. 74. 88. 88. 60. 73. nan nan nan nan nan nan nan nan nan nan]
[64. 85. 72. 64. 74. 93. 70. 79. 79. 75. 66. 83. 74. 70. 82. 82. 75. 78. 99. 57. 91. 78. 87. 93. 89. 81. 84. 63. 78. 66. 84. 85. 85. 84. 59. 62. 91. 83. 80. 76.]]
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ... | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Center A | 97.0 | 95.0 | 89.0 | 79.0 | 78.0 | 87.0 | 83.0 | 94.0 | 76.0 | 79.0 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Center B | 64.0 | 85.0 | 72.0 | 64.0 | 74.0 | 93.0 | 70.0 | 79.0 | 79.0 | 75.0 | ... | 84.0 | 85.0 | 85.0 | 84.0 | 59.0 | 62.0 | 91.0 | 83.0 | 80.0 | 76.0 |
问题:两个中心的培训质量有没有差异?
- 原假设与备择假设
$$H_0:\mu_1-\mu_2=0,H_1:\mu_1-\mu_2\neq0$$
- 拒绝域:在0.05的显著性水平下,z统计量的拒绝域为$$\{|z|\geq1.96\}$$
- z统计量的计算
$$z = \frac {\bar x -\bar y}{\sqrt{\frac {\sigma_1^2} {n_1}+\frac{\sigma_2^2}{n_2}}}\sim N(0,1)$$
#计算均值
x_avg = data['Center A'].mean()
y_avg = data['Center B'].mean()
z = (x_avg-y_avg)/(np.sqrt(100/30+100/40))
print("z统计量为%s" % np.round(z,2))
z统计量为1.66
由于z统计量未落入拒绝域内,因此不能拒绝原假设,即两培训中心培训结果并无显著性差异。
- p-value
p = (1-norm.cdf(1.66))*2
print("p-value为%s" % np.round(p,3))
p-value为0.097
由于p-value大于显著性水平,因此,无法拒绝原假设。
$\sigma_1$和$\sigma_2$未知
总体方差未知时的双样本t检验是实际使用较多的一种检验方法,其必须满足以下三个条件:
- 正态性:即两总体必须服从正态分布。
- 独立性:即两总体必须相互独立。
- 方差齐性:即两总体方差必须相等。
因此,在进行小样本检验前必须进行正态性检验和方差齐性检验。
设想开发一个新的计算机软件包,它有助于系统分析员减少设计、开发、实现信息系统所需要的时间。为评估新软件包的优点,抽取了24名系统分析员组成-一个随机样本。发给每个分析员一张假定的信息系统的说明书。指定其中12名分析员使用当前技术来开发该信息系统,另外12名分析员先接受新软件包的培训,然后用新软件包来开发该信息系统。假定两组开发时间分别服从正态分布。
数据如下所示:
df = pd.read_excel('SoftwareTest.xlsx',sheet_name='Data')
print(df.T.values)
sns.distplot(df['Current'],label='Current',bins=5)
sns.distplot(df['New'],label='New',bins=5)
plt.legend()
df.T
[[300 280 344 385 372 360 288 321 376 290 301 283]
[274 220 308 336 198 300 315 258 318 310 332 263]]
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Current | 300 | 280 | 344 | 385 | 372 | 360 | 288 | 321 | 376 | 290 | 301 | 283 |
New | 274 | 220 | 308 | 336 | 198 | 300 | 315 | 258 | 318 | 310 | 332 | 263 |
问题:希望能够证明新软件包能使平均完成项目时间缩短。
- 原假设与备择假设$$H_0;\mu_1\leq\mu_2,H_1:\mu_1>\mu_2$$
- 检验统计量$$t=\sqrt{\frac{mn(m+n-2)}{m+n}}\frac{\bar x-\bar y-(\mu_1-\mu_2)}{\sqrt{(m-1)s^2_x+(n-1)s^2_y}}\sim t(m+n-2)$$
t,p = stats.ttest_ind(df['Current'],df['New'])
print('t统计量为:{}\np-value为:{}'.format(t,p/2))
t统计量为:2.272126992420037
p-value为:0.016602185445629195
在显著性水平为0.05的情况下拒绝原假设,即新的软件包能够提升工作效率。
匹配样本
假设一家制造企业的员工可用两种不同方法完成一项生产任务。为了使产品产量最大化,公司想确认总体完成生产任务平均时间较少的方法。令$\mu_1$表示生产方法1的总体完成生产任务的平均时间,$\mu_2$表示生产方法2的总体完成生产任务的平均时间。假设两总体服从正态分布。
现有6名工人组成一个随机样本。6名工人完成生产任务时间的数据如下所示:
df = pd.read_excel('Matched.xlsx',sheet_name='Data')
df['diff']=df['Method 1']-df['Method 2']
df
Method 1 | Method 2 | diff | |
---|---|---|---|
0 | 6.0 | 5.4 | 0.6 |
1 | 5.0 | 5.2 | -0.2 |
2 | 7.0 | 6.5 | 0.5 |
3 | 6.2 | 5.9 | 0.3 |
4 | 6.0 | 6.0 | 0.0 |
5 | 6.4 | 5.8 | 0.6 |
问题:两种生产方法是否有显著差距?
- 原假设与备择假设$$H_0:\mu_d=0,H_1:\mu_d\neq0$$
- 计算t统计量
t,p = stats.ttest_1samp(df['diff'],0)
print('t统计量为:{}\np-value为:{}'.format(t,p))
t统计量为:2.1957751641341994
p-value为:0.07951591461959698
由于显著性水平0.05小于p-value,因此无法拒绝原假设,即不认为两种方法有显著差异。
正态总体方差的检验
单正态总体方差的检验
圣路易斯城市汽车公司鼓励其员工遵守时间,以在公众面前树立值得信赖的形象。作为一个规范制度,该公司要求各辆汽车的到站时间变化不大。就到站时间的方差而言,公司规定的标准是到站时间(以分钟计)的方差不超过4。假设到站时间服从正态分布。样本数据如下:
os.chdir('E:\Files\数据文件\第11章')
df = pd.read_excel('BusTimes.xlsx',sheet_name='Data')
print(df.T.values)
sns.distplot(df)
df.T
[[15.7 16.9 12.8 15.6 14. 16.2 14.8 19.8 13.2 15.3 14.7 10.2 16.7 13.6 14. 18.2 15.7 14.2 11.1 16.8 11.8 16. 14.2 12.7]]
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ... | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Times | 15.7 | 16.9 | 12.8 | 15.6 | 14.0 | 16.2 | 14.8 | 19.8 | 13.2 | 15.3 | ... | 14.0 | 18.2 | 15.7 | 14.2 | 11.1 | 16.8 | 11.8 | 16.0 | 14.2 | 12.7 |
问题:根据数据判断方差是否过大。
- 原假设与备择假设$$H_0:\sigma^2\leq4,H_1:\sigma^2>4$$
- 检验统计量的计算
$$\frac{(n-1)s^2}{\sigma^2}\sim\chi^2(n-1)$$
chi = (24-1)*np.var(df.values,ddof=1)/4
p = 1 - stats.chi2(23).cdf(chi)
print('卡方统计量为:{}\np-value为:{}'.format(chi,p))
卡方统计量为:28.179583333333333
p-value为:0.20906678256000377
显然,无法拒绝原假设。
两正态总体方差的检验
Dullus县立学校想更新明年校车服务的合同,必须从Milbank公司和GulfPark公司这两个公共汽车公司中选择一个。我们将用到达时间或运送时间的方差作为衡量公共汽车公司服务质量的基本标准。较低的方差说明服务质量比较稳定而且水平比较高。如果两个公司的汽车到达时间的方差相等,Dullus学校的管理者就会选择能提供较低价格的那个公司。然而,如果两个公司汽车到达时间的样本数据表明两个方差明显不等,管理者将优先考虑服务质量更好或方差更小的那个公司。假设两公司汽车到达时间服从正态分布,数据如下:
df = pd.read_excel('SchoolBus.xlsx',sheet_name='Data')
print(df.values.T)
sns.distplot(df['Milbank'],label='Milbank')
sns.distplot(df['Gulf Park'],label='Gulf Park')
plt.legend()
df.T
[[35.9 29.9 31.2 16.2 19. 15.9 18.8 22.2 19.9 16.4 5. 25.4 14.7 22.7 18. 28.1 12.1 21.4 13.4 22.9 21. 10.1 23. 19.4 15.2 28.2]
[21.6 20.5 23.3 18.8 17.2 7.7 18.6 18.7 20.4 22.4 23.1 19.8 26. 17.1 27.9 20.8 nan nan nan nan nan nan nan nan nan nan]]
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ... | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Milbank | 35.9 | 29.9 | 31.2 | 16.2 | 19.0 | 15.9 | 18.8 | 22.2 | 19.9 | 16.4 | ... | 12.1 | 21.4 | 13.4 | 22.9 | 21.0 | 10.1 | 23.0 | 19.4 | 15.2 | 28.2 |
Gulf Park | 21.6 | 20.5 | 23.3 | 18.8 | 17.2 | 7.7 | 18.6 | 18.7 | 20.4 | 22.4 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
问题:判断两公司方差是否有显著差异。
- 原假设与备择假设$$H_0:\sigma_1=\sigma_2,H_1:\sigma_1\neq\sigma_2$$
- 计算检验统计量$$F=\frac {s_1^2}{s_2^2}\sim F(n_1-1,n_2-1)$$
len(df['Gulf Park'].dropna())
16
var_1=np.var(df['Milbank'],ddof=1)
var_2=np.var(df['Gulf Park'],ddof=1)
F = var_1/var_2
p_1 = stats.f.sf(F,len(df['Milbank'])-1,len(df['Gulf Park'].dropna())-1)
print("F统计量值为:{}\np-value为:{}".format(F,p_1*2))
F统计量值为:2.4010357713886266
p-value为:0.0810541404332569
显然,在显著性水平为0.05时无法拒绝原假设,即两总体方差无显著区别。
$\chi^2$检验
Scott市场调查公司进行一项市场份额研究,在过去的一年中,公司A的市场份额稳定在30%,公司B稳定在50%,公司C稳定在20%。因为每一名顾客可以按照购买这些公司的产品来进行分类,因此我们得到一个三种可能结果的多项概率分布。三个结果中每一种的概率如下:
- $P_A$-顾客购买公司A产品的概率
- $P_g$顾客购买公司B产品的概率
- $P_c$顾客购买公司C产品的概率
利用历史的市场份额,我们有多项概率分布:$$P_A=0.30,P_b=0.50,P_c=0.20$$
公司C开发了一种“新型改进”产品,以取代当前市场上该公司所售产品。Scott市场调查公司受雇于公司C,目的是判断新产品是否使三家公司的市场份额发生了改变。特别地,Scot市场调查公司将向一个顾客样本介绍公司C的新产品,然后询问顾客对于公司A、公司B及公司C新产品的偏好。样本数据如下:
类别 | 假设比率 | 观察频数 | 期望频数 |
---|---|---|---|
公司A | 0.30 | 48 | 60 |
公司B | 0.50 | 98 | 100 |
公司C | 0.20 | 54 | 40 |
问题:C公司引进新产品后是否改变了历史市场份额?
- 原假设与备择假设
$$H_0:P_A=0.30,P_B=0.50,P_c=0.20$$
- 检验统计量$$\chi^2=\sum\frac{(np_i-f_i)^2}{(np_i)^2}\sim\chi^2(k-1)$$
chi = (60-48)**2/60+(100-98)**2/100+(40-54)**2/40
p = 1-stats.chi2(2).cdf(chi)
print("统计量:{}\np-value:{}".format(chi,p))
统计量:7.34
p-value:0.02547646994668107
在0.05的显著性水平下,拒绝原假设,即认为市场份额发生了变化。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。