何
- カイ二乗検定を行った際に、結果をどのように見れば良いのか難しかったため、日本語でクドく説明する
検定内容
- kaggleのタイタニック号のデータを使い、乗船者の年代ごとに性別による生存率に差があるかを調べる
- 帰無仮説(H0):性によって生存率は変わらない
- 対立仮説(H1):性によって生存率は変わる
import numpy as np
import pandas as pd
from scipy import stats
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
def chi_test(min_age, max_age):
# kaggleのタイタニックデータを参照
df = pd.read_csv('train.csv')
# 対象を限定する
df = df[(df.Age >= min_age) & (df.Age <= max_age)]
# sns.countplot(x='Sex', data=df, hue='Survived')
survive_count = len(df[df.Survived == 1])
dead_count = len(df[df.Survived == 0])
male_count = len(df[df.Sex == 'male'])
female_count = len(df[df.Sex == 'female'])
# 帰無仮説が正しい時の期待結果([男性生存者数, 女性生存者数])
survive_rate = survive_count/(survive_count+dead_count)
expected = [male_count*survive_rate, female_count*survive_rate]
df_survived = df[df['Survived'] == 1]
# 実際の人数([男性生存者数, 女性生存者数])
actual = [len(df_survived[df_survived.Sex == 'male']), len(df_survived[df_survived.Sex == 'female'])]
chisq,p = stats.chisquare(actual,expected)
print('----------------------------')
print('age=[{:d}-{:d}]'.format(min_age, max_age))
print('ecpected=', end='')
print(expected)
print('actual=', end='')
print(actual)
print('カイ二乗統計量= {:0.2f}'.format(chisq))
print('P値 = {:0.2f}'.format(p))
chi_test(0,5)
chi_test(0,10)
chi_test(11,15)
chi_test(16,20)
chi_test(21,100)
結果
----------------------------
age=[0-5]
ecpected=[16.204545454545457, 14.795454545454547]
actual=[15, 16]
カイ二乗統計量= 0.19
P値 = 0.66
----------------------------
age=[0-10]
ecpected=[19.59375, 18.40625]
actual=[19, 19]
カイ二乗統計量= 0.04
P値 = 0.85
----------------------------
age=[11-15]
ecpected=[4.052631578947368, 6.947368421052632]
actual=[2, 9]
カイ二乗統計量= 1.65
P値 = 0.20
----------------------------
age=[16-20]
ecpected=[21.3125, 11.6875]
actual=[8, 25]
カイ二乗統計量= 23.48
P値 = 0.00
----------------------------
age=[21-100]
ecpected=[136.32958801498128, 71.67041198501873]
actual=[64, 144]
カイ二乗統計量= 111.37
P値 = 0.00
P値と検定結果の関係
P値大:カイ二乗統計量が小さく(=帰無仮説を想定した予想データと実体の乖離が小さく)、P値が大きい(=たまたまこれくらい以上乖離することもP値%くらいありえる)。帰無仮説は棄却されず、「性によって生存率は変わらない」のかもしれない。(それが正しいとは言っていない)
P値小:カイ二乗統計量が大きく(=帰無仮説を想定した予想データと実体の乖離が非常に大きく)、P値が小さい(=たまたまこのように乖離することはP値%くらい低い確率)。帰無仮説は棄却され、「性によって生存率は変わる」と言える
P値大と小の境目は0.05を使うのが慣例らしい
評価のつけたし
- 10歳以下では期待結果と実際が似ており、「生存率に差がなくても、これくらいの数の差は出るんじゃないか」とP値が言っている。
- 11-15歳では期待結果と実際の差が出てきて「10歳以下と比較すると、乖離がひろがって、たまたまと言える確率が下がってきたが、まだ生存率の差があると言える水準ではない」。
- 16歳以上では「これだけ乖離があれば、もう生存率の差があるといわざるを得ない」。
jupyterのソース
その他
- pandasのDataFrameの扱い方が下手くそなので、改善方法があれば教えてください。