双变量数据分析

研究方法
Python
作者

yangjh

发布日期

2022年11月27日

双变量数据分析是统计分析中的一种方法,旨在探索和理解两个变量之间的关系。这种分析可以揭示变量之间是否存在关联、关联的方向和强度,以及它们的关系是否具有统计学意义。

两个变量之间的相关性

所谓相关,就是一个变量的值发生变化时,另一个变量的值也发生变化。相关的两个变量不一定有因果关系,可能是共同变化。

假设有一个观察到的现象:在中国的某些城市,随着空气净化器的销量增加,儿童呼吸道疾病的发病率也有所上升。这两个变量之间存在明显的相关关系:空气净化器销量增加时,儿童呼吸道疾病的发病率也似乎在增加。

但是,这并不意味着空气净化器的使用导致了儿童呼吸道疾病的增加,或者儿童呼吸道疾病的增加导致了空气净化器的销量增加。实际上,这两个变量的共同变化可能是由另一个变量引起的——空气污染的增加。在空气污染加剧的时候,人们更有可能购买空气净化器来改善室内空气质量,同时空气污染的恶化也可能导致儿童呼吸道疾病的发病率上升。

这个例子说明了即使两个变量之间存在相关关系,也不能急于得出它们之间存在因果关系的结论。可能存在一个或多个隐藏变量(如空气污染水平),这些变量可能是导致观察到的相关性的真正原因。

相关性并不意味着因果关系

保罗·拉扎斯菲尔德提出了两个变量存在因果关系的三个条件:

  1. 原因出现在结果之前;
  2. 变量之间存在相关关系;
  3. 两个变量之间的相关性不能被与这两个变量都相关的第三个或更多变量所解释。

假设我们想要研究“锻炼”(原因)是否能提高“健康水平”(结果)。

  1. 原因出现在结果之前:这意味着人们需要先开始锻炼,然后才能观察到他们的健康水平是否有所改善。如果先观察到健康水平的提高,再开始锻炼,那么就不能说锻炼是导致健康改善的原因。
  2. 变量之间存在相关关系:研究需要显示锻炼和健康水平之间有正相关关系。也就是说,更多的锻炼通常与更好的健康状况相关联。如果锻炼量增加和健康水平提高之间没有统计上的相关性,那么我们不能说锻炼改善了健康。
  3. 两个变量之间的相关性不能被第三个或更多变量所解释:这是排除其他干扰因素的重要条件。例如,如果进行锻炼的人同时也更有可能关注饮食,那么饮食可能是健康改善的另一个原因。为了确定锻炼本身对健康的影响,我们需要确保锻炼和健康之间的关系不仅仅是因为这些人也吃得更健康。

通过确保这三个条件得到满足,研究者能够更有信心地得出结论,认为锻炼确实是导致健康水平提高的原因。

相关程度

变量之间的相关程度有强弱之分,可用不同的统计方法予以测量。多数相关统计法以0代表无相关,以1代表全相关。

相关方向

正相关是指一个变量增加时,另一个变量也在增加。负相关则相反。

不对称关系与对称关系

\(X\)影响\(Y\),但是\(Y\)不影响\(X\),这种情况称之为不对称关系,反之,为对称关系。

不对称关系的一个典型例子是“钥匙和汽车”的关系。在这个关系中:钥匙对汽车有影响:你需要钥匙来启动汽车。没有钥匙,汽车就无法启动。但汽车对钥匙没有影响:无论汽车的状态如何,都不会影响钥匙的功能和状态。这种单向的影响关系就是不对称关系。钥匙可以影响汽车的状态(启动或不启动),但汽车的状态并不会影响钥匙。

不对称关系

对称关系的一个例子是“友谊”的关系。在友谊中:一个人对另一个人有影响:一个朋友的行为和情绪可以影响另一个朋友。同时,另一个人也对这个人有影响:同样地,第二个朋友的行为和情绪也会影响第一个朋友。这种双向的影响关系就是对称关系。朋友之间的行为和情绪是相互影响的。

对称关系

通过这两个例子,我们可以看到不对称关系是单向影响的,而对称关系则是双向或多向影响的。

消除误差比例

消除误差比例(Proportion of Reduction in Error, PRE),表示用给一个现象(如变量X)来解释另一个现象时能够消除百分之几的错误。公式为:

\[PRE=\dfrac{E_1-E_2}{E_1}\]

PRE的值越大,就表示\(X\)\(Y\)的关系越强。\(E_1\)表示不知道\(X\)的值,预测\(Y\)值时所产的全部误差。\(E_2\)表示知道\(X\)的值,预测\(Y\)值时所产生的全部误差。

想象一下,你正在尝试预测一个班级学生的期末考试成绩。如果你什么信息都没有,可能只能猜一个大家都差不多的平均分。这个猜测很可能会有很大的误差,因为实际上学生们的成绩各不相同。

但是,如果你了解了更多信息,比如每个学生的平时成绩、出勤率、甚至是他们的学习习惯,你就可以建立一个模型来预测他们的期末成绩。这个模型如果做得好,那么预测的准确性会比单纯猜一个平均分要高得多。

在这个例子中,消除误差比例(PRE)就是用来衡量你的模型相对于简单猜测(比如平均分)在减少预测误差方面的表现。如果你的模型能显著减少预测误差,那么它的PRE值会很高,说明你的模型非常有效。相反,如果PRE值很低,甚至接近于0,那就意味着你的模型并没有比简单猜测更准确。

相关系数

相关测量法中以一个统计值表示两个变量之间的相关关系,这个值就是相关系数(coefficient of association)。

相关系数强弱的一般判断标准

区间 强弱
0.8-1.0 极强相关
0.6-0.8 强相关
0.4-0.6 中等程度相关
0.2-0.4 弱相关
0.0-0.2 极弱相关或无相关

相关系数的选择标准

  1. 两个变量的测量层次(即变量的类别)。
  2. 两个变量的关系是否对称。
  3. 优先选择具有消除误差比例意义的统计值。

双变量数据分析流程

以下是进行双变量数据分析的几个关键步骤:

1. 确定变量类型

首先,需要确定两个变量的类型(数值变量还是类别变量):

  • 数值变量:如收入、年龄、身高等。
  • 类别变量:如性别、品牌、种类等。

2. 选择合适的分析方法

根据变量的类型,选择适当的分析方法:

  • 两个数值变量
    • 相关分析:如皮尔逊相关系数,用于衡量两个变量之间的线性关系强度和方向。
    • 散点图:用于可视化两个数值变量之间的关系。
  • 一个数值变量和一个类别变量
    • t检验或ANOVA(方差分析):用于比较不同组的平均值。
    • 箱形图:展示不同组在数值变量上的分布情况。
  • 两个类别变量
    • 卡方检验:用于检验两个分类变量之间是否独立。
    • 列联表和条形图:展示频数或百分比分布。

3. 数据可视化

利用适当的图表来直观展示两个变量之间的关系。

4. 计算统计量

计算相关系数、均值差异、卡方统计量等,以量化变量间的关系。

5. 结果解释

基于分析结果,解释两个变量之间的关系:

  • 关联的方向:正相关、负相关或无相关。
  • 关联的强度:弱、中等或强。
  • 统计学意义:结果是否在统计学上显著。

6. 考虑潜在的混杂变量

在得出结论前,考虑可能影响两个变量关系的其他因素。

7. 提出进一步的研究问题

根据双变量分析的结果,提出可能的后续研究问题或假设。

双变量数据分析是理解变量之间关系的重要步骤,它为深入的多变量分析和因果关系研究提供了基础。通过这种分析,研究者可以揭示数据中的重要模式和趋势,为进一步的研究和决策提供依据。

两个无序类别变量

描述统计

两个无序类别变量之间的相关测量,可以使用Lambda相关测量、古德曼和古鲁斯卡的tau-y相关测量。

Lambda相关测量法

Lambda相关测量法有两种形式,一种是对称的,简写为\(\lambda\)系数,一种是不对称的,简写为\(\lambda_y\)系数。Lambda系数是以众值作为预测的准则,如果全部众值集中在条件次数表的同一行或同一侧,则Lambda系数便会等于0。因此,Lambda相关测量法存在敏感性问题。Lambda系数具有消除误差比例的意义。

古德曼和古鲁斯卡的tau-y系数

tau-y系数是属于不对称相关测量法,要求两个变量一个是因变量,另一个是自变量。tau-y系数具有消除误差比例的意义。tau-y系数用到了全部边缘次数和条件次数,故其敏感度高于Lambda测量法,如果是不对称关系,应优先选用tau-y系数。

tau-y系数的Python实现

def goodmanKruska_tau_y(df, x: str, y: str) -> float:
    """ 取得条件次数表 """
    cft = pd.crosstab(df[y], df[x], margins=True)
    """ 取得全部个案数目 """
    n = cft.at['All', 'All']
    """ 初始化变量 """
    E_1 = E_2 = tau_y = 0

    """ 计算E_1 """
    for i in range(cft.shape[0] - 1):
        F_y = cft['All'][i]
        E_1 += ((n - F_y) * F_y) / n
    """ 计算E_2 """
    for j in range(cft.shape[1] - 1):
        for k in range(cft.shape[0] - 1):
            F_x = cft.iloc[cft.shape[0] - 1, j]
            f = cft.iloc[k, j]
            E_2 += ((F_x - f) * f) / F_x
    """ 计算tauy """
    tau_y = (E_1 - E_2) / E_1

    return tau_y

其他无消除误差比例的相关系数

除了上述的两种系数外,还有phi相关系数、列联相关系数、V相关系数等,这些系数都不具有消除误差比例的意义。

交互分类表

可以使用交互分类表进行可视化。

交互分类(cross classification)是最基本的两个变量相关情况的描述统计方法。交互分类表又称为条件次数表在表中的总次数称之为边缘次数,表中的其他次数称为条件次数。按照百分比计算的条件次数表称为条件百分表。

"""使用crosstab函数可以绘制交互分类表及条件百分表"""
pandas.crosstab(df['政治面貌'], df['年级'], normalize='columns', margins=True)

条件百分表的列

在社会科学研究中,通常将自变量作为计算百分率的方向,即将自变量放置在条件百分表的列中。但如果因变量在样本中的分布不能代表其在总体内的分布,则以因变量为计算百分率的方向。

卡方检验

卡方(样本方差除以总体方差得到的一个随机变量)\(\chi^2\)检验适用于两个无序类别变量相关性的检验,也适用于分析高层次的变量。(适用于低层次变量的方法也适用于高层次,但高层次的不能用于低层次)。卡方检验是非参数检验方法,对样本规模有要求。

适用条件

  1. 样本是随机抽取的。
  2. 两个变量是无序定类变量,类别互斥且完整,如果题目是多选题,则选项就不互斥,不应使用卡方检验。
  3. 单元格有两个以上时,期望频率小于5的单元格不能超过总格子数的20%,否则不能进行卡方检验。(实际上就是要求样本规模要大)如果单元格中的频数太少,应合并单元格。

计算公式

卡方

\[\chi^2 = \sum{\dfrac{(f-e)^2}{e}}\]

  • f:根据所抽取的样本计算而来的实际次数。
  • e:与每个实际次数相应的预期次数。预期次数等于两个边缘次数的乘积除以样本的大小n。
自由度

\[df=(r-1)(c-1)\]

  • df:自由度
  • r:条件次数表中的行数
  • c:条件次数表中的列数

卡方与自由度的关系

卡方的抽样分布取决于自由度,在决定显著度后,能够拒绝虚无假设,要看自由度的大小,自由度越大,卡方分布的偏态度越小。不同自由度对应的卡方值是可以计算出来的。卡方值越大,虚无假设被否定的可能性就越大。

Python实现

from scipy import stats
chi2, p, dof, ex = stats.chi2_contingency(pandas.crosstab(x, y))

检验结果的汇报格式

对….的调查发现,X与Y有关/无关,\(\chi^2(9, N=690)=123.345, p<0.01, 古德曼和古鲁斯卡的\tau_y=0.033\)。进一步分析发现:分组汇报。

例如:

对某地公众所做的调查发现,受教育程度与年收入有关,受教育程度越高,年收入也越高,\(\chi^2(9,N=690)=123.345,p<0.01,古德曼和古鲁斯卡的\tau_y=0.033\)。进一步分析发现:初中及以下学历者年收入大多在12999美元以下;高中学历者年收入大多在13000~29999美元之间;大学学历者年收入大多在60000美元以上;研究生学历者半数以上年收入在60000美元以上。

两个有序类别变量

两个有序类别变量,除了采用两个无序类别变量的相关测量法之外,还可以使用Gamma系数和Somers的dy系数等级序相关测量法(rank-order correlation methods)。

Gamma系数

Gamma系数适合于对称关系。该系数具有消除误差比例的意义。\(G = \dfrac{N_s-N_d}{N_s+N_d},其中\)\(N_s\)是同序对数。某对个案在两个变量上的相对等级是相同的。\(N_d\)是异序对数。某对个案在两个变量上的相对等级是不同的。

Somers dy系数

\[d_y = \dfrac{N_s-N_d}{N_s+N_d+T_y}\]

  • \(N_s\)是同序对数。某对个案在两个变量上的相对等级是相同的。
  • \(N_d\)是异序对数。某对个案在两个变量上的相对等级是不同的。
  • \(T_y\)只在因变量Y上同分的对数。
  • 该系数适用于非对称关系,且具有消除误差比例的意义。

Python实现

from scipy.stats import somersd
"""x,y 应该为定序变量,次序是关键!"""
x = df['年级'].cat.codes
y = df['会打多少分'].cat.codes
somersd(x,y)

结果汇报

Somers’ d was run to determine the association between customer satisfaction and hotel room cleanliness amongst 189 participants. There was a strong, positive correlation between customer satisfaction and hotel room cleanliness, which was statistically significant (d = .603, p < .0005).

肯德尔的tau系数

该系数有3种形式,最适合社会科学分析的是tau-c,用于分析对称关系,但不具有消除误差比例意义。pandas自带的相关系数计算函数,提供tau-c的函数。

斯皮尔曼秩相关系数

该系数是对称相关测量法,其平方值具有消除误差比例意义。

Python实现

df[x,y].corr(method='spearman')

两个数值变量

两个变量都是数值变量,则可以用简单回归分析法以自变量的值预计因变量的数值,用积矩相关系数来测量两个变量的相关强度和方向。

确定两个数值变量之间是否线性相关

通过散点图观察

两个数值变量的相关性,应首先通过散点图进行观察,如果发现散点图中的分布显然不是直线形状,就不能用\(r\)系数来测量相关情况。测量非线性相关的方法有很多,其中的一种就是相关比率。

比较e值和r值的比较确定

除了使用散点图直接观察外,将相关比率的开方(E值)与积矩相关系数r值进行比较,可以大致上判断是否非直线关系。两值相差越大,显示两个数值变量之间的关系越是非线性。

简单线性回归分析

  1. 回归分析的目的,是要找出一个错误最小的方法来预测因变量的数值。
  2. 回归方法中最容易的是简单线性回归分析法,它根据方程\(Y=bX+a\)来预测。
  3. \(b\)称为回归系数,表示直线的斜率。如果以一条简单的直线作为预测的工具,则上述方程所犯的误差总数是最小的。
  4. 回归系数\(b\)是分析不对称关系的统计法,但是其值不一定在-1和+1之间,它的大小是随变量的衡量单位而定,没有一定的范围,故很少用\(b\)来表示相关程度的强弱。

积矩相关测量法

  1. 皮尔逊积矩相关系数\(r\),用于分析对称关系,其值在-1和+1之间,同时\(r^2\)具有消除误差比例的意义。\(r^2\) 称为决定系数。
  2. \(r\) 系数所表示的,就是以线性回归方程式作为预测的工具时所能减少的误差比例。
  3. 因此,如果\(r\)系数值越大,一方面表示线性回归方程式的预测能力越强,另一方面也表示两个变量之间的关系越接近于线性关系。

Python实现

from scipy import stats
r, p = stats.pearsonr(x, y)

类别变量与数值变量

当以无序类别变量为自变量,以数值变量为因变量时,可采用相关比率作为相关测量方法。

相关系数

采用相关比率作为相关系数。

相关比率(correlation ratio),又称为eta平方系数\(E^2\)\(E^2\)的值介于0到1之间,且具有消除误差比例的意义。相关比率除了分析无序类别变量与数值变量的相关之外,还可以分析两个定距变量之间的非线性关系。

Python实现

from statsmodels.formula.api import ols
model = ols('英语成绩 ~ 职业',df).fit()
print(model.rsquared)

可采用箱型图进行可视化。

参考文献

  1. 李沛良. (2001). 社会研究的统计应用. 社会科学文献出版社.
  2. Somers’ D - HandWiki
  3. scipy.stats.somersd — SciPy v1.9.0 Manual
  4. Gamma Coefficient (Goodman and Kruskal’s Gamma) & Yule’s Q (statisticshowto.com)
  5. Somers’ d using SPSS Statistics | A How-To Statistical Guide by Laerd Statistics
  6. scipy.stats.pearsonr — SciPy v1.9.0 Manual