5

カイ二乗統計を取得するために 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}

データ シリーズとターゲット シリーズは列の値で、他の 2 つはインジケーターの名前です。誰でも助けることができますか?ありがとう

4

1 に答える 1

11

pandas.crosstabDataFrame から分割表を生成するために使用できます。ドキュメントから:

2 つ (またはそれ以上) の因子の単純なクロス集計を計算します。デフォルトでは、値の配列と集計関数が渡されない限り、因子の度数分布表を計算します。

以下に使用例を示します。

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]]))

于 2016-09-18T07:57:29.663 に答える