LoginSignup
4
2

More than 5 years have passed since last update.

カイ二乗検定の結果を評価する言葉を考える

Last updated at Posted at 2018-06-11

  • カイ二乗検定を行った際に、結果をどのように見れば良いのか難しかったため、日本語でクドく説明する

検定内容

  • 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の扱い方が下手くそなので、改善方法があれば教えてください。
4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2