大师兄的数据分析学习笔记(四):探索性数据分析(三)
大师兄的数据分析学习笔记(六):探索性数据分析(五)
四、多因子与复合分析
- 探索性数据分析,最重要的作用是吧数据的全貌进行展现,让数据分析者能根据数据取进行决策。
- 每个属性的数据,除了自己本身所具有的的性质外,属性与属性之间,或者属性与已知成熟的规律之间也可能会有联系。
- 多因子与复合分析,指的就是属性与属性之间常见的联系与分析方法。
1. 假设检验
- 假设检验就是根据一定的假设条件,从样本推断总体或者推断样本与样本之间关系的一种方法。
- 具体过程:
第一步:建立原假设(包含等号),的反命题为,也叫备择假设。
第二步:选择检验统计量,检验统计量是根据数值的均值、方差等性质构造的一个转换函数,目的是让这个数据符合一个已知分布。
第三步: 根据显著水平(一般为0.05,),确定拒绝域,也就是说要求数据有95%的可能与某分布一致。
第四步: 计算p值或者样本统计值,作出判断。
>>>from astropy.modeling import models,fitting
>>>import numpy as np
>>>import matplotlib.pyplot as plt
>>>def func(x,miu,sigma):
>>> return 1./np.sqrt(2*np.pi)/sigma*np.exp(-(x-miu)**2/2/sigma**2)
>>># 生成正态分布
>>>x = np.linspace(0, 1, 100)
>>>y = func(x, 0.5, 0.2)
>>>y += np.random.normal(0., 0.02, x.shape)
>>>plt.plot(x, y)
>>>plt.xlabel('x')
>>>plt.ylabel('y')
>>>plt.show()
>>># 使用astropy进行拟合
>>>g_init = models.Gaussian1D(amplitude=1., mean=0, stddev=1.)
>>>fit_g = fitting.LevMarLSQFitter()
>>>g = fit_g(g_init, x, y)
>>>print(g.mean.value, g.stddev.value)
0.4998641574199107 0.19898961723032316
2. 卡方检验
- 卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,如果卡方值越大,二者偏差程度越大;反之,二者偏差越小;若两个值完全相等时,卡方值就为0,表明理论值完全符合。
- 第一步:提出原假设:
:总体的分布函数为.
如果总体分布为离散型,则假设具体为
:总体X的分布律为
- 第二步:将总体的取值范围分成k个互不相交的小区间,如可取
,其中可取,可取,区间的划分视具体情况而定,但要使每个小区间所含的样本值个数不小于5,而区间个数不要太大也不要太小。 - 第三步:把落入第个小区间的的样本值的个数记作fi,成为组频数(真实值),所有组频数之和等于样本容量。
- 第四步:当为真时,根据所假设的总体理论分布,可算出总体的值落入第个小区间的概率,于是,就是落入第个小区间的样本值的理论频数(理论值)。
- 第五步:当为真时,次试验中样本值落入第个小区间的频率与概率应很接近,当不真时,则与pi相差很大。基于这种思想,皮尔逊引进如下检验统计量,在0假设成立的情况下服从自由度为的卡方分布。
- 案例:假设新冠重症、轻症与是否打疫苗的统计表如下:
- | 已打疫苗 | 未打疫苗 | 合计 |
---|---|---|---|
轻症 | 90(75) | 60(75) | 150 |
重症 | 10(25) | 40(25) | 50 |
合计 | 100 | 100 | 200 |
>>>import scipy.stats as ss
>>>res = ss.chi2_contingency([[90,60],[10,40]])
>>>print(f'stat:{res[0]}')
>>>print(f'p:{res[1]}')
>>>print(f'dof:{res[2]}')
>>>print(f'expected:{res[3]}')
stat:22.426666666666666
p:2.183216533714857e-06
dof:1
expected:[[75. 75.]
[25. 25.]]
- 卡方值为22,超过p值0.05对应的3.841,证明轻症和已打疫苗有关联。
3. 方差检验
- 由于用到了F分布,所以方差检验也叫作F检验,用于两个及两个以上样本均数差别的显著性检验。
- 方差检验的基本原理是认为不同处理组的均数间的差别基本来源有两个:
(1) 实验条件,即不同的处理造成的差异,称为组间差异。用变量在各组的均值与总均值之偏差平方和的总和表示,记作SSb,组间自由度dfb。
(2) 随机误差,如测量误差造成的差异或个体间的差异,称为组内差异,用变量在各组的均值与该组内变量值之偏差平方和的总和表示, 记作SSw,组内自由度dfw。
总偏差平方和 SSt = SSb + SSw。
- 组内SSw、组间SSb除以各自的自由度(组内dfw =n-m,组间dfb=m-1,其中n为样本总数,m为组数),得到其均方MSw和MSb,一种情况是处理没有作用,即各组样本均来自同一总体,MSb/MSw≈1。
- 另一种情况是处理确实有作用,组间均方是由于误差与不同处理共同导致的结果,即各样本来自不同总体。那么,MSb>>MSw(远远大于)。
- MSb/MSw比值构成F分布。用F值与其临界值比较,推断各样本是否来自相同的总体 。
- 假设工厂有以下3组,共15人,年龄分布如下:
甲组 | 已租 | 丙组 |
---|---|---|
36 | 28 | 30 |
50 | 44 | 27 |
30 | 29 | 42 |
33 | 36 | 45 |
41 | 23 | 45 |
>>>import scipy.stats as ss
>>>data1 = [36,50,30,33,41]
>>>data2 = [28,44,29,36,23]
>>>data3 = [30,27,42,45,45]
>>>res = ss.f_oneway(data1,data2,data3)
>>>print(f"statistic:{res[0]}")
>>>print(f"pvalue:{res[1]}")
statistic:0.8593981253083374
pvalue:0.44791070261692767
- P值>0.05,所以可以接受原假设。