2014-07-15 21 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]]))

相關問題