Python(Scipy)によるカイ二乗検定の実装を解説していく

スポンサーリンク

読者の今回は、Pythonでカイ二乗検定を取り上げます。

スポンサーリンク

データサイエンスと機械学習のための統計的検定の理解

データサイエンスと機械学習の領域では、統計的検定が重要な役割を果たす。

統計的検定により、統計的分布の観点からデータについてあるレベルの理解を推定することができる。

変数の種類、すなわち連続かカテゴリーかに基づいて様々な統計が存在します。

連続的なデータ値に対しては、以下が最もよく使われる検定です。

  • T-検定
  • 相関回帰検定

一方、カテゴリデータ変数については、以下が一般的な統計検定です。

  • ANOVA 検定
  • カイ二乗検定

今日は、Pythonでカイ二乗検定を見てみましょう。

カイ二乗検定とは?

カイ2乗検定は、データ集合のカテゴリ変数間の関係を理解することを可能にするノンパラメトリック統計検定です。

つまり、グループ化されたカテゴリ・データ間の相関を定義します。

カイ2乗検定を用いると、我々はデータ集合のカテゴリ変数間の相関のレベル、すなわち関連を推定することができる。

これは、変数の1つのカテゴリの他の独立カテゴリへの依存を分析するのに役立ちます。

ここで,仮説の観点からカイ2乗検定を理解しよう.

カイ二乗検定のための仮説設定

  • 帰無仮説は以下のように設定される。グループ化変数には、それらの間に関連性や相関がない。
  • 対立仮説は、以下のように組み立てられる。グループ化された変数は互いに関連し、たまたま変数間に相関がある。

scipy.stats ライブラリを使ってカイ二乗検定を実装する

この例では、以下のようなテーブルを作成しました – ‘info’. さらに、scipy.statsライブラリが提供する chi2_contingency() 関数を使用して、カイ二乗検定を実装しています。

例えば、以下の様になります。

from scipy.stats import chi2_contingency
 
info = [[100, 200, 300], [50, 60, 70]]
print(info)
stat, p, dof= chi2_contingency(info)
 
print(dof)
 
significance_level = 0.05
print("p value: " + str(p))
if p <= significance_level:
    print('Reject NULL HYPOTHESIS')
else:
    print('ACCEPT NULL HYPOTHESIS')

出力として、統計量(臨界値と比較して仮説を決定するのに使用)、p値、自由度(自由に変化する変数の数)の3つの値を得ることができます。

我々は、カイ2乗検定を解釈するために、p-値を利用します。

結果を出力すると、以下の様になります。

[[100, 200, 300], [50, 60, 70]]
2
p value: 0.001937714203415323
Reject NULL HYPOTHESIS

p-値が仮定した有意値(0.05)より小さい場合、変数間に関連がないことを認めない。

つまり、我々はNULL仮説を棄却し、対立仮説の主張を受け入れる。

したがって、この場合は、NULL仮説を棄却し、通過したデータの間に関係があると仮定します。

データセットでカイ二乗検定を使う

この例では、Bike rental count データセットを使用します。

さて、独立したカテゴリ変数の間の関係を分析するために、カイ二乗検定を実装します。

まず、データセットを環境にロードし、カテゴリデータの変数名を表示します。

import os
import pandas
#Changing the current working directory
os.chdir("D:/Ediwsor_Project - Bike_Rental_Count")
BIKE = pandas.read_csv("day.csv")
categorical_col = ['season', 'yr', 'mnth', 'holiday', 'weekday', 'workingday',
       'weathersit']
print(categorical_col)
['season', 'yr', 'mnth', 'holiday', 'weekday', 'workingday', 'weathersit']

さらに、我々は、crosstab()関数を使用して、’holiday’ と ‘weathersit’ で作業するために選択された2つの変数の分割表を作成します。

chisqt = pandas.crosstab(BIKE.holiday, BIKE.weathersit, margins=True)
print(chisqt)
weathersit    1    2   3  All
holiday                     
0           438  238  20  696
1            15    6   0   21
All         453  244  20  717

最後に、この表に対して chi2_contingency() 関数を適用して、統計量、p値、自由度の値を取得します。

from scipy.stats import chi2_contingency
import numpy as np
chisqt = pandas.crosstab(BIKE.holiday, BIKE.weathersit, margins=True)
value = np.array([chisqt.iloc[0][0:5].values,
                  chisqt.iloc[1][0:5].values])
print(chi2_contingency(value)[0:3])

結果は以下の通りです。

(1.0258904805937215, 0.794987564022437, 3)

上記から、0.79がp値、1.02が統計値、3が自由度であることがわかる。

p値は0.05より大きいので、NULL仮説を受け入れ、変数’holiday’ と ‘weathersit’ は互いに独立であると仮定します。

まとめ

ここまでで、このトピックは終了です。

何か疑問があれば、お気軽にコメントください。

それでは、Happy Analyzing!

タイトルとURLをコピーしました