2014-07-15 24 views
3

我正在使用scipy.stats.chi2_contingency方法来获得卡方统计。我们需要通过频率表,即应急表作为参数。但我有一个特征向量,并希望自动生成频率表。我们有这样的功能吗? 我做它像这样目前:我们可以使用python为chisquare测试生成列联表吗?

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} 

如果数据系列和目标系列的列值,另两个是指标的名称。 任何人都可以帮忙吗? 谢谢

+0

现在我只有两个csv cols作为输入,即数据系列和目标系列。 – icm

回答

2

您可以使用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 table这产生此contingency tablescipy.stats.chi2_contingency返回(0.052, 0.819, 1, array([[1.6, 0.4],[2.4, 0.6]]))

相关问题