Python
pandas

python pandas 統計 cross 集計とカイ二乗検定

1, scipyの出力の2番目がp値
chi2, p, dof, ex = stats.chi2_contingency(crossed)

2, クロス集計表を作る。
N(%)の形式のテーブルを作るのが目的だったが、これが大変。
DataFrameとDataFrameは足算するとブロードキャストできる。しかし、足す時に"("などの文字列を挿入することができない。(私にはできない)

NumpyのArrayも足算は基本的にブロードキャスト(たぶん)。しかし、同様に文字列挿入ができない。

こねくり回して、結局以下のようにデータフレームのセル(1マス?)要素に一つずつアクセスして、str()で文字列に変換して、合体。しんどい。
いいやり方見つけたら、修正する。

以下のcrはpandas はcross table(dataframe形式)

def cross_table(df,colname1,colname2):
    cr = pd.crosstab(df[colname1],df[colname2])
    #%計算
    arr = np.array([
        [cr["FALSE"][0] / (cr["FALSE"][0]+cr["FALSE"][1]),cr["TRUE"][0] / (cr["TRUE"][0]+cr["TRUE"][1])],
        [cr["FALSE"][1] / (cr["FALSE"][0]+cr["FALSE"][1]),cr["TRUE"][1] / (cr["TRUE"][0]+cr["TRUE"][1])]
        ])
    arr = arr * 100 #%に
    arr = arr.round(2) #四捨五入
    #%のテーブルと合体
    new_cross_table = np.array([
            [cr.iloc[0, 0],str(cr.at[0,"FALSE"]) + "("+ str(arr[0][0]) + ")", str(cr.at[0,"TRUE"])+"("+ str(arr[0][1]) + ")"],
            [cr.iloc[1, 0],str(cr.at[1,"FALSE"]) + "("+ str(arr[1][0]) + ")", str(cr.at[1,"TRUE"])+"("+ str(arr[1][1]) + ")"]
            ])
    #形式をデータフレームにもどす
    df_cr = pd.DataFrame(new_cross_table,columns=["Defect","FALSE","TRUE"])
    df_cr.index.name = colname1
    df_cr.columns.name = colname2
    return cr,arr,df_cr

参考リンク
http://lagrange.univ-lyon1.fr/docs/scipy/0.17.1/generated/scipy.stats.chi2_contingency.html

http://web-analytics-or-die.org/2013/07/pandas/