机器学习:软件工程方法与实现
上QQ阅读APP看书,第一时间看更新

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男女的年龄均值是有显著差异的。