我们能用Python生成卡方检验的列联表吗?
我正在使用scipy.stats.chi2_contingency这个方法来获取卡方统计量。我们需要传入一个频率表,也就是列联表作为参数。但是我现在有一个特征向量,想要自动生成这个频率表。请问有没有这样的函数可以用呢?
我现在是这样做的:
def contigency_matrix_categorical(data_series,target_series,target_val,indicator_val):
observed_freq={}
for targets in target_val:
observed_freq[targets]={}
for indicators in indicator_val:
observed_freq[targets][indicators['val']]=data_series[((target_series==targets)&(data_series==indicators['val']))].count()
f_obs=[]
var1=0
var2=0
for i in observed_freq:
var1=var1+1
var2=0
for j in observed_freq[i]:
f_obs.append(observed_freq[i][j]+5)
var2=var2+1
arr=np.array(f_obs).reshape(var1,var2)
c,p,dof,expected=chi2_contingency(arr)
return {'score':c,'pval':p,'dof':dof}
这里的数据系列和目标系列是列的值,另外两个是指标的名称。有没有人能帮帮我?谢谢!
1 个回答
11
你可以使用 pandas.crosstab
来从一个数据表(DataFrame)生成一个列联表。根据文档的说明:
计算两个(或更多)因素的简单交叉表。默认情况下,会计算这些因素的频率表,除非你提供了一组值和一个聚合函数。
下面是一个使用示例:
import numpy as np
import pandas as pd
from scipy.stats import chi2_contingency
# Some fake data.
n = 5 # Number of samples.
d = 3 # Dimensionality.
c = 2 # Number of categories.
data = np.random.randint(c, size=(n, d))
data = pd.DataFrame(data, columns=['CAT1', 'CAT2', 'CAT3'])
# Contingency table.
contingency = pd.crosstab(data['CAT1'], data['CAT2'])
# Chi-square test of independence.
c, p, dof, expected = chi2_contingency(contingency)
以下是 data
表格
生成了以下的 contingency
表格
然后,使用 scipy.stats.chi2_contingency(contingency)
会返回 (0.052, 0.819, 1, array([[1.6, 0.4],[2.4, 0.6]]))
。