单因素方差分析(连续变量与一个多分类变量)
单因素分析可以得到不同因素对观测变量的影响程度。这里因素的不同水平表示因素不同的状态或者等级。比如研究信用卡的消费是否受教育程度(4个水平)的影响,可以使用单因素方差分析,其前提条件与双样本t检验相似:变量服从正态分布、观测之间独立、以及方差齐性检验。
需要注意的是在方差分析中,原假设为所有组的方差相等,备择假设为至少有两组方差不等,如下图所示。
在方差分析中,数据的总误差可以解释为组内误差与组间误差,二者的区别在于找到组间变异(SSM)和组内变异(SSE)之间的关系,其中组内变异是同类别下数据的离均差平方和,代表同类别内数据变异的程度;组间变异是组内均值与总均值的离均差平方和,代表不同类别数据之间的变异的程度,组间变异与组内变异之和为总变异。因此在总变异不变时,组间差异大,组内差异就小,这也意味着各个类别间数据的差异较大时,类别内的数据差异较小。此时可以构造F统计量:
其中SSM/(k-1) 表示组间变异除以自由度,SSE/(n-k) 代表组内变异除以自由度,两者的比值服从自由度为(k-1, n-k)的F分布。显然,当F值越大时,说明组间的变异越大,就越倾向于拒绝原假设,即组间是有差异的。
下面对信用卡的消费是否受教育程度的影响进行单因素方差分析:
edu=[]
for i in card['edu_class'].unique():#遍历受教育程度的每一等级
edu.append(card[card['edu_class']==i]['avg_exp'])
stats.f_oneway(*edu)#加*可以将edu列表中的四个元素拆分
Out[1]: F_onewayResult(statistic=31.825683356937684, pvalue=7.658361691248798e-13)
可见P值接近于0,拒绝原假设,认为组间是有显著差异的,即教育程度会显著影响信用卡的消费。
多因素方差分析(连续变量与多个分类变量)
多因素方差分析可以检验多个分类变量与一个连续变量的关系。在多因素方差分析中,除考虑多个分类变量对连续变量的影响外,还应考虑分类变量之间的交互效应。例如,在探讨信用卡消费与性别、教育程度的关系时,应考虑性别与教育程度的交互效应,即教育程度对不同性别的信用卡消费人群的影响可能存在差异。
1、无交互效应时构建OLS模型:
import statsmodels.formula.api as smf
ana=smf.ols('avg_exp ~ C(edu_class) + C(gender)',data=card).fit()
sm.stats.anova_lm(ana)
Out[7]:
df sum_sq mean_sq F PR(>F)
C(edu_class) 3.0 8.126056e+06 2.708685e+06 31.578365 1.031496e-12
C(gender) 1.0 4.178273e+04 4.178273e+04 0.487111 4.877082e-01
Residual 65.0 5.575481e+06 8.577662e+04 NaN NaN
可以看到教育程度的F值为31.58,P值趋近于0,拒绝原假设,即教育程度不同的群体消费支出有显著差异;性别的F值为0.49,P值为0.49,无法拒绝原假设,即男女消费支出无显著差异。
2、有交互效应时构建OLS模型:
pd.set_option('display.max_columns', None)
anal=smf.ols('avg_exp ~ C(edu_class) + C(gender) + C(edu_class)*C(gender)', data=card).fit()
sm.stats.anova_lm(anal)
Out[10]:
df sum_sq mean_sq F \
C(edu_class) 3.0 8.126056e+06 2.708685e+06 33.839350
C(gender) 1.0 4.178273e+04 4.178273e+04 0.521988
C(edu_class):C(gender) 3.0 8.761475e+05 2.920492e+05 3.648543
Residual 63.0 5.042862e+06 8.004544e+04 NaN
PR(>F)
C(edu_class) 3.753889e-13
C(gender) 4.726685e-01
C(edu_class):C(gender) 1.716862e-02
Residual NaN
考虑交互效应后,与教育程度及性别对应的F值和P值都发生了微小的改变。其中教育程度和性别的交互项对消费支出的影响在5%的显著性水平上也是显著的,F值为3.65 ,P值为0.02。下面查看带交互项的多元方差分析的回归系数结果:
anal.summary()#以下仅展示系数表结果
====================================================================================================
coef std err t P>|t| [0.025 0.975]
----------------------------------------------------------------------------------------------------
Intercept 207.3700 200.057 1.037 0.304 -192.412 607.152
C(edu_class)[T.1] 417.8090 209.367 1.996 0.050 -0.577 836.195
C(edu_class)[T.2] 732.2613 212.977 3.438 0.001 306.661 1157.861
C(edu_class)[T.3] 1346.5708 216.086 6.232 0.000 914.757 1778.384
C(gender)[T.1] -0.0168 67.939 -0.000 1.000 -135.782 135.749
C(edu_class)[T.1]:C(gender)[T.1] 192.7428 162.889 1.183 0.241 -132.765 518.251
C(edu_class)[T.2]:C(gender)[T.1] 96.8755 110.846 0.874 0.385 -124.632 318.383
C(edu_class)[T.3]:C(gender)[T.1] -289.6350 109.331 -2.649 0.010 -508.115 -71.155
可以看到不同教育等级前的系数均显著(P值分别为0.05、0.001和0.000),则教育程度对消费支出的影响显著;同理性别对消费支出的影响不显著;交互项中,教育等级为3的女性对消费支出有显著的负向影响。
相关分析(两个连续变量之间)
探讨两个连续变量之间的关系时,可使用相关分析。
相关系数
可以使用corr函数进行相关分析,其中method参数除可以指定“pearson"外,还可以指定“spearman”和“kendall"用于输出Spearman相关系数和kendall相关系数。下面探索信用卡消费与收入之间的相关关系:
card[['Income','avg_exp']].corr(method='pearson')
Out[27]:
Income avg_exp
Income 1.000000 0.674011
avg_exp 0.674011 1.000000
散点矩阵图
通过散点矩阵图可以对多个变量之间的相关关系进行直观和全面的了解。从seaborn中引入pairplot函数,画出的矩阵图中对角线位置默认为该变量的频数直方图,其他位置为变量之间的散点图。
from seaborn import pairplot
import matplotlib.pyplot as plt
pairplot(card[['avg_exp','Age','Income','dist_home_val','dist_avg_income']])
plt.show()
通过参数hue还可以指定分组变量,比如查看不同性别群体中各变量的差异:
pairplot(card[['avg_exp','Age','Income','dist_home_val','dist_avg_income',\
'gender']],hue='gender',kind='reg',diag_kind='kde',size=1.5)
#kind : {'scatter', 'reg'};diag_kind : {'auto', 'hist', 'kde'}
plt.show()
从图中可以看出,每张图都根据分组变量进行了区分,并且给出了数据的回归拟合线以及上下的浮动范围。
变量之间的假设检验方法总结
参考文献
常国珍等《Python数据科学:技术详解与商业实践》,机械工业出版社