5.2.3 双变量可视化分析
双变量分析同时分析两个变量,以探讨两个变量之间的关系:是否存在关联或差异,以及这种关联或差异的强度。
1.数值双变量
双变量数值之间常用散点图和相关性图进行可视化分析。
(1)散点图
散点图是显示两个数值变量之间关系的一种可视化,用两组数据构成多个坐标点,考察坐标点的分布,判断两个变量之间是否存在某种关联,或总结坐标点的分布模式。
#查看年龄和舱位等级散点图 sns.swarmplot(y='age', x='pclass', data=titanic_df)
输出如图5-10所示。
图5-10 散点图
通过散点图可以直观地发现,买头等舱(pclass=1)的人年龄相对大一些,普通舱(pclass=2)则以青年为主,符合我们的认知。
(2)相关性图
相关性图可反映两个变量之间的相关方向,但无法确切表明两个变量之间相关的程度,因此在绘图的时候还需要增加相关系数,以便让人更直观地判断相关程度。
相关系数是最早由统计学家卡尔·皮尔逊设计的统计指标,是研究变量之间线性相关程度的量,一般用字母r表示。由于研究对象的不同,相关系数有多种定义方式,数值变量较为常用的是皮尔逊相关系数。相关计算公式如式(5-1)所示。
公式中r是线性相关系数,Covar是协方差,Var是方差。
from scipy、stats import pearsonr #查看年龄和舱位等级相关性 sns.jointplot(x="pclass", y="age", data=titanic_df, kind="reg",stat_func=pearsonr)
输出如图5-11所示。
图5-11 线性相关性图
相关系数取值范围在-1和1之间,其中-1表示完全负线性相关,1表示完全正线性相关,零表示没有线性相关。图5-11中展示了age和pclases呈现低的负线性相关。需要指出的是,线性相关系数只能表示线性相关,无法表示非线性相关。
2.类别双变量
双变量类别之间常用堆积图和卡方检验进行分析。
(1)堆积柱形图
堆积柱形图可以直观展示某个类别下另一个类别变量的数量情况:
var = titanic_df.groupby(['embarked','who']).who.count() var.unstack().plot(kind='bar', stacked=True, color=['red', 'blue', 'green'], figsize=(8, 6)) plt.show()
输出如图5-12所示。
图5-12 堆积柱形图
(2)卡方检验
卡方检验可用于确定分类变量之间的相关性,它基于频率表中一个或多个类别中的预期频率(e)和观察到的频率(n)之间的差异。卡方分布返回计算出的卡方和自由度的概率,概率为零表示两个类别变量之间完全依赖,而概率为1表示两个类别变量完全独立。相关计算公式如式(5-2)所示。
#导入scipy.stats.chi2_contingency包 from scipy.stats import chi2_contingency #计算embarked和alive交叉列联表 embarked_alive = pd.crosstab(titanic_df.embarked, titanic_df.alive) chi2, p, dof, ex = chi2_contingency(embarked_alive) print('卡方值:{}'.format(chi2)) print('p_value:{}'.format(p)) print('自由度:{}'.format(dof)) print('期望频率:{}'.format(ex))
上述代码输出如下:
卡方值:26.48914983923762 p_value:1.769922284120912e-06 自由度:2 期望频率:[ [103.7480315 64.2519685] [ 47.5511811 29.4488189] [397.7007874 246.2992126] ]
这里只是简单介绍卡方检验的使用,更详细的介绍可查看6.3.4节。
3.数值与类别
数值变量和类别变量分析常用含误差条的线图、组合图、Z检验和t检验。
(1)含误差条的线图
含误差条的线图中,横坐标表示类别变量,纵坐标表示具体类别下连续变量的分布情况,其中误差条表示标准误差,这是一种展示两个变量如何相互关联和变化的方法。
plt.errorbar(x=titanic_df.groupby([ 'class']).age.mean().index, y=titanic_df.groupby(['class']).age.mean(), yerr=titanic_df.groupby(['class']).age.std(), fmt="o") plt.xlabel('class') plt.ylabel('age') plt.show()
输出如图5-13所示。
(2)组合图
组合图同时使用两种或多种图表类型。
ax = sns.boxplot(x="alive", y="age", data=titanic_df) ax = sns.swarmplot(x="alive", y="age", data=titanic_df, color=".8")
输出如图5-14所示。
图5-13 含误差条的线图
图5-14 组合图
(3)Z检验和t检验
如果要评估两组数据的均值是否有显著差异,可以使用Z检验和t检验。Z检验是用标准正态分布的理论来推断差异发生的概率,从而比较两组数据的均值的差异是否显著。已知标准差,要验证一组数的均值是否与某一期望值相等时,使用Z检验。统计量Z值计算公式如式(5-3)所示。
公式中X为均值,S为方差,n为频数。一般实际使用中,总体参数标准差经常是未知的,不满足使用Z检验的条件,因此一般实际工作中更多使用t检验。
t检验是用t分布理论来推断差异发生的概率,从而判定两组数据的均值的差异是否显著。t检验,亦称Student t检验(Student’s t test),主要用于总体标准差σ未知的正态分布。t检验是威廉·戈塞(William Gosset)为了观测酿酒质量而发明的,于1908年公布在Biometrika杂志上。由于酿酒厂的规定禁止Gosset发表关于酿酒过程变化性的研究成果,Gosset被迫使用笔名Student发表论文。
统计量t值的计算公式如式(5-4)所示。
下面使用SciPy的t检验接口检测经典泰坦尼克数据集titanic男女的年龄均值是否有显著差异。
#导入scipy.stats.ttest_ind from scipy.stats import ttest_ind #剔除age空值 titanic_age=titanic_df[titanic_df.age.isnull().values == False] t_statistics, p = ttest_ind(titanic_age[titanic_age['sex'] == 'female'].age, titanic_age[titanic_age['sex'] == 'male'].age) print('t值:{}'.format(t_statistics)) print('p_value:{}'.format(p))
输出结果如下:
t值:-2.499206354920835 p_value:0.012671296797013709
由t检验结果可知p_value小于0.05,在显著水平α=0.05的水准下,titanic男女的年龄均值是有显著差异的。