计算克莱默V(也称为 克莱默相关系数,Correlation Coefficient 或 Cramer’s V)是统计学中常用的一项分析工具,用于测量两个分类变量之间的关系。在Python 中,我们可以使用scipy模块中的chi2_contingency函数和numpy模块中的sqrt和min函数来计算克莱默V。下面是一些详细步骤:
准备数据
首先,我们需要准备两个分类变量的数据。假设我们有一份关于男女生喜欢的水果的调查数据,以下是一个示例数据:
import numpy as np
data = np.array([
[10, 20, 30],
[15, 25, 35]
])
其中,行表示“男生”和“女生”,列表示“苹果”、“香蕉”、“橙子”,则10表示第一行第一列的“男生”喜欢“苹果”的数量,20表示第一行第二列的“男生”喜欢“香蕉”的数量,以此类推。这份数据可以通过pandas读取csv文件等方式获取。
计算卡方值
我们需要先计算卡方值(Chi-squared statistic),可以使用scipy模块中的chi2_contingency函数来计算。该函数接受一个二维数组作为输入,表示分类变量的观测值。函数的返回值包含卡方值、p值和自由度等信息。以下是一个示例代码:
from scipy.stats import chi2_contingency
chi2, p, dof, expected = chi2_contingency(data)
其中,chi2是卡方值,p是卡方分布函数的p值,dof是自由度,expected是预期频数(expected values),即如果两个变量没有关系,则期望的频数是多少。
计算克莱默V
接下来,我们需要使用卡方值和样本量计算克莱默V。克莱默V的值在[0,1]之间,通常认为越接近1,两个变量之间的关系就越强(当然,也可能是负相关,克莱默V的符号代表相关性的方向)。以下是计算克莱默V的代码:
n = data.sum()
V = np.sqrt(chi2 / (n * min(data.shape)-1))
其中,n是两个分类变量的样本总数,data.shape中的min函数会返回较小的那个尺寸(也就是行数或者列数)。
示例说明
下面给出两个示例,分别是计算大气污染和领航员胜负之间的关系的克莱默V值。
示例1:大气污染
我们有一个城市的空气质量数据,其中“好”表示空气污染水平低,“差”则表示污染水平高;而“雾霾”表示天气污染程度高,“晴天”则表示污染程度低。空气质量和天气污染之间的关系是非常重要的,因为它们可能影响人们的健康和生活质量。
下面是这份数据:
import numpy as np
data = np.array([
[300, 50],
[200, 100]
])
其中,行表示空气质量,“好”和“差”;列表示天气污染,“晴天”和“雾霾”。
计算克莱默V的代码如下:
from scipy.stats import chi2_contingency
chi2, p, dof, expected = chi2_contingency(data)
n = data.sum()
V = np.sqrt(chi2 / (n * min(data.shape)-1))
print("Cramer's V: {:.4f}".format(V))
输出结果为:
Cramer's V: 0.3333
这个值表明,空气质量和天气污染之间的关系不是非常强,但也不是不存在关系的。
示例2:领航员胜负
在某个游戏中,玩家可以操作领航员来控制他们的战斗。下面是领航员的战斗结果,其中1表示胜利,0表示失败:
import numpy as np
data = np.array([
[5, 15, 10],
[10, 20, 5],
[5, 10, 25]
])
我们可以使用相同的代码来计算克莱默V:
from scipy.stats import chi2_contingency
chi2, p, dof, expected = chi2_contingency(data)
n = data.sum()
V = np.sqrt(chi2 / (n * min(data.shape)-1))
print("Cramer's V: {:.4f}".format(V))
输出结果为:
Cramer's V: 0.2722
这个值表示胜利和失败之间有一定的关系,但是这个关系并不是特别明显。