利用python进行假设检验

概念:假设检验,就是要对总体参数u提出一个假设,然后利用样本信息去验证这个假设是否成立。
假设检验的假设:
(1)假设检验时,会设置两个假设
一个是原假设,也叫零假设,用H0表示。原假设一般是统计者想要拒绝的假设。原假设设置一般为:等于=、大于等于>=、小于等于<=。
另一个是备择假设,用H1表示。备择假设是统计者想要接受的假设,备择假设的设置一般为:不等于!=、大于>、小于<。

(2)为什么把设计者想要拒绝的假设放在原假设呢?
因为原假设如果误判的话,只会犯弃真错误,而犯弃真错误的概率已经被规定的显著性水平所控制了。

接下来了解一下什么是弃真错误、取伪错误
为什么会出现弃真错误、取伪错误呢?
由概念可知,我们是通过样本数据来估计总体参数的假设,但是样本数据是随机的,这样就有可能会产生小概率的弃真错误、取伪错误。
(1)弃真错误:也叫第I类错误或者α错误,它是指原假设是真实的,但是通过样本取估计总体参数假设时,拒绝了原假设。很明显我们拒绝了真实的原假设,所以叫弃真错误。这个错误的概率为α,通常取值为0.0qizhen1,0.05,0.1等,取值越小,犯弃真错误的概率越小
(2)取伪错误:也叫第II类错误或者β错误,它是指原假设实际上时不真实的,但是通过样本取估计总体参数假设时,承认了原假设。很明显我们承认了假的的原假设,所以叫取伪错误。这个错误的概率为β。

(3)检验方式
检验方式分为两种:
(1)双侧检验:所关心的假设问题不具有方向性
(2)单侧检验:左侧检验:希望所考察的数值越大越好;右侧检验:希望所考察的数值越小越好

(4)假设检验的步骤
1、提出原假设和备择假设
2、从所研究总体中抽取一个随机样本
3、构造检验统计量
4、根据显著性水平确定拒绝域临界值
5、计算检验统计量与临界值进行比较

(5)两种假设检验
(1)一个总体的假设检验:在一个总体参数检验中:用到的检验统计量由三个:Z统计量,T统计量(适用于均值与比例);卡方统计量(适用于方差)。

具体适用情况说明:主要考虑样本量\总体标准差
1、大样本(一般以样本数是否大于30来判断),总体标准差已知
z统计量
2、大样本(一般以样本数是否大于30来判断),总体标准差未知
z统计量 用样本标准差代替总体标准差
3、小样本(一般以样本数是否大于30来判断),总体标准差已知
z统计量
4、小样本(一般以样本数是否大于30来判断),总体标准差未知
T统计量 用样本标准差代替总体标准差

补充:总体的假设检验与一个总体假设检验的适用条件类似
建议参考统计学第六版(贾俊平)第六章:假设检验
利用spass软件直接进行分析,python显得效率不够高
接下来,我们用python进行假设检验分析。

数据来源:https://pan.baidu.com/s/1t4SKF6U2yyjT365FaE692A*
数据字段说明:gender:1为男性,2 为女性;Temperature:体温;HeartRate:心率

问题清单:
1、人体体温的总体均值是否为98.6华氏度?
2、人体的温度是否服从正态分布?
3、人体提问中存在的异常数据有哪些?
4、男女体温是否存在异常?
5、体温与心率间的相关性?

import pandas as pd
import numpy as np
from scipy import stats
import statsmodels

test_df=pd.read_csv(r'C:\Users\HEYINGJIE\Desktop\test.csv')
print(test_df.head())
'''
   Temperature  Gender  HeartRate
0         96.3       1         70
1         96.7       1         71
2         96.9       1         74
3         97.0       1         80
4         97.1       1         73
'''
#1、人体体温的总体均值是否为98.6华氏度?
#由于此样本量大于30为大样本,且总体标准差未知,可用z统计量来检测,用样本标准差代替总体标准差
##计算z统计量
mu=96.8#总体均值
temp=test_df["Temperature"]
#样本均值
sample_mean=temp.mean()
#样本标准差
sample_std=np.std(temp,ddof=1)
#样本个数
sample_size=temp.size
#计算z值
z=(sample_mean-mu)/(sample_std/np.sqrt(sample_size))
"""
结果:22.537033076347395
假设显著水平为0.05,采取双侧检验,z(a/2)为±1.96小于22.53....,所以拒绝原假设,及人体体温的均值不是98.6华氏度。
"""
#或者直接使用statsmodels包的statsmodels.stats.weightstats.ztest函数
"""
z=sw.ztest(list(temp),value=98.6)
print(z)
'''
结果:(-5.475925202078115, 4.3523151658821985e-08)
z统计量等于-5.47,p值为0.000000.明显小于显著性0.05,拒绝原假设
'''
#2、人体的温度是否服从正态分布?
#先画出分布的直方图,初步判断是否服从正态分布
import matplotlib.pyplot as plt
import seaborn as sns
sns.distplot(temp, color='b', bins=10, kde=True)
plt.show()

利用python进行假设检验_第1张图片
从图中初步判断,基本不服从正态分布
#利用stats模块进一步判断是否服从正态分布

a=stats.kstest(temp, 'norm')
print(a)
'''
结果:KstestResult(statistic=1.0, pvalue=0.0)
p值小于0.05,则拒绝原假设,不服从正态分布
'''
#判断是否服从T分布
np.random.seed(1)
ks = stats.t.fit(temp)
df = ks[0]
loc = ks[1]
scale = ks[2]
t_estm = stats.t.rvs(df=df, loc=loc, scale=scale, size=sample_size)
a=stats.ks_2samp(temp, t_estm)
print(a)
'''
Ks_2sampResult(statistic=0.13846153846153847, pvalue=0.16562192064942574)
从中可以看出T统计量的p值为0.1656>0.05,承认原假设,及人体的体温服从t分布。
'''

#判断是否服从卡方分布
np.random.seed(1)
chi_square = stats.chi2.fit(temp)
df = chi_square[0]
loc = chi_square[1]
scale = chi_square[2]
chi_estm = stats.chi2.rvs(df=df, loc=loc, scale=scale, size=sample_size)
a=stats.ks_2samp(temp, chi_estm)
print(a)
'''
Ks_2sampResult(statistic=0.07692307692307693, pvalue=0.8384989928923016)
从中可以看出T统计量的p值为0.83远大于0.05,承认原假设,及人体的体温更服从卡方分布。

#画出拟合的卡方分布与测试数据的拟合图
from matplotlib import pyplot as plt
plt.figure()
temp.plot(kind = 'kde')
chi2_distribution = stats.chi2(chi_square[0], chi_square[1],chi_square[2])
x = np.linspace(chi2_distribution.ppf(0.01), chi2_distribution.ppf(0.99), 100)
plt.plot(x, chi2_distribution.pdf(x), c='orange')
plt.xlabel('Human temperature')
plt.title('temperature on chi_square', size=20)
plt.legend(['test_data', 'chi_square'])

利用python进行假设检验_第2张图片
3.、人体体温中存在的异常数据是哪些?
已知体温数据服从卡方分布的情况下,可以直接使用Python计算出P=0.025和P=0.975时的分布值,在分布值两侧的数据属于小概率,认为是异常值。

a=chi2_distribution.ppf(0.025)
print(a)
'''
97.0690523831819
'''
b=chi2_distribution.ppf(0.975)
print(b)
'''
99.76188149610974
'''
c=temp[temp<97.069]
d=temp[temp>99.761]
'''
1     96.7
2     96.9
3     97.0
65    96.4
66    96.7
67    96.8
63      99.4
64      99.5
126     99.4
127     99.9
128    100.0
129    100.8
'''

4.男女体温是否存在异常?

#方法1:对性别进行分组
statistics=test_df.groupby(["Gender"]).size()
print(statistics)
"""
Gender
1    65
2    65
dtype: int64
"""
male_df=test_df.loc[test_df["Gender"]==1]
female_df=test_df.loc[test_df["Gender"]==2]
#构建统计量计算函数
def t_statistics(a,b):
	n_1=len(a)
	n_2=len(b)
	mean_1=a.mean()
	mean_2=b.mean()
	std_1=a.std()
	std_2=b.std()

	s_1=std_1**2/n_1
	s_2=std_2**2/n_2

	f=(s_1+s_2)**2/((s_1**2/(n_1-1))+(s_2**2/(n_2-1)))
	print("自由度为:",f)
	t=(mean_1-mean_2)/np.sqrt(s_1+s_2)

	#计算边界值设定显著水平为0.05,双侧检验,去边界值为0.025
	v=stats.t.ppf(0.025,f)
	print('stat=%.3f,boundary=%.3f'%(t,v))
	if abs(t)>abs(v):
		print("拒绝原假设,男女体温存在显著差异")
	else:
		print("不拒绝原假设,男女体温不存在显著差异")

t_statistics(male_df['Temperature'],female_df["Temperature"])
"""
自由度为: 127.5103008303909
stat=-2.285,boundary=-1.979
拒绝原假设,男女体温存在显著差异
"""
#由此可知,t统计量较大,落入拒绝域,明显拒绝原假设,男女体温存在显著差异

#方法2:使用ttest_ind函数
stat,p=stats.ttest_ind(male_df['Temperature'],female_df["Temperature"])
print("stat=%.3f,p=%.3f" % (stat,p))
if p>0.05:
	print("不拒绝原假设,男女体温不存在显著差异")
else:
	print("拒绝原假设,男女体温存在显著差异")
"""
stat=-2.285,p=0.024
#拒绝原假设,男女体温存在显著差异

5.体温与心率间的相关性?

#5.体温与心率间的相关性?
import matplotlib.pyplot as plt
temperature=test_df["Temperature"]
heartate=test_df["HeartRate"]
plt.scatter(temperature,heartate)
plt.show()

#计算皮尔逊相关系数
stat,p=stats.pearsonr(temperature,heartate)
print('stat=%.3f,p=%.3f' % (stat,p))
"""
结果:stat=0.254,p=0.004
从结果可以看出,皮尔逊相关系数为0.254,在0.2-0.4之间,存在弱相关,且p值为0.004,小于0.05,认为其不存在线性相关关系。
皮尔逊相关系数:
补充:由于抽样误差的存在,根据样本资料得到的相关系数,必须对其进行检验,做是否P=0的假设,以判断总体中两变量是否存在线性关系
适用范围:
1. 两个变量之间是线性关系,都是连续数据。
2. 两个变量的总体是正态分布,或接近正态的单峰分布。
3. 两个变量的观测值是成对的,每对观测值之间相互独立。
判断标准:
0.8-1.0     极强相关
0.6-0.8     强相关
0.4-0.6     中等程度相关
0.2-0.4     弱相关
0.0-0.2     极弱相关或无相关
"""

利用python进行假设检验_第3张图片
参考链接:https://www.colabug.com/2020/0111/6832299/mip/

小白练习,欢迎指导

你可能感兴趣的:(python,python,数据分析,机器学习)