Pythonでクラメールの連関係数を計算するモジュールが見当たらなかったので自作しました.
計算方法はこちらを参考にしました.
cramerV.py
# -*- coding: utf-8 -*-
import numpy as np
def cramersV(x, y):
"""
Calc Cramer's V.
Parameters
----------
x : {numpy.ndarray, pandas.Series}
y : {numpy.ndarray, pandas.Series}
"""
table = np.array(pd.crosstab(x, y)).astype(np.float32)
n = table.sum()
colsum = table.sum(axis=0)
rowsum = table.sum(axis=1)
expect = np.outer(rowsum, colsum) / n
chisq = np.sum((table - expect) ** 2 / expect)
return np.sqrt(chisq / (n * (np.min(table.shape) - 1)))
if __name__ == "__main__":
import pandas as pd
data = pd.DataFrame(
{'science': ['like', 'like', 'like', 'like', 'like', 'like', 'like',
'like', 'like', 'like', 'like', 'like', 'like', 'like',
'like', 'like', 'like', 'like', 'like', 'like', 'like',
'like', 'like', 'like', 'like', 'like', 'like', 'like',
'like', 'like', 'like', 'dislike', 'dislike', 'dislike',
'dislike', 'dislike', 'dislike', 'dislike', 'dislike',
'dislike', 'dislike', 'dislike', 'dislike', 'dislike',
'dislike', 'dislike', 'dislike', 'dislike', 'dislike',
'dislike'],
'math': ['like', 'like', 'like', 'like', 'like', 'like', 'like',
'like', 'like', 'like', 'like', 'like', 'like', 'like',
'like', 'like', 'like', 'like', 'like', 'like', 'like',
'like', 'like', 'like', 'dislike', 'dislike', 'dislike',
'dislike', 'dislike', 'dislike', 'dislike', 'like', 'like',
'like', 'like', 'like', 'like', 'dislike', 'dislike',
'dislike', 'dislike', 'dislike', 'dislike', 'dislike',
'dislike', 'dislike', 'dislike', 'dislike', 'dislike',
'dislike']})
print cramersV(data['science'], data['math'])