「ハンバーガー統計学にようこそ!」をPythonでお勉強 3.4まで
こちらのサイトを利用してPython (Anaconda) でデータ解析の勉強をさせてもらおうと思います。
ハンバーガー統計学にようこそ!
3.4 実践編:ハンバーガーを入れてみる
import pandas as pd
url = "http://kogolab.chillout.jp/elearn/hamburger/chap3/sec4.html"
dframe_list = pd.io.html.read_html(url, encoding="sjis")
grade_data = dframe_list[0].drop([0])
grade_data.columns = ['','ポテト','チキン', 'ハンバーガー', '小計']
print('観測度数: 表3.9 ポテトとチキンとハンバーガーの売り上げ数')
grade_data
観測度数: 表3.9 ポテトとチキンとハンバーガーの売り上げ数
ポテト | チキン | ハンバーガー | 小計 | ||
---|---|---|---|---|---|
1 | ワクワク | 435 | 165 | 650 | 1250 |
2 | モグモグ | 265 | 135 | 350 | 750 |
3 | 合計 | 700 | 300 | 1000 | 2000 |
#帰無仮説と対立仮説を立てる
#まず、帰無仮説を立てます。
#帰無仮説:[ここは考えなければいけないのだが・・・]
#次に、その逆である対立仮説を立てます。
#対立仮説:[ここも考えなければいけないのだが・・・]
i_grade_data = dframe_list[1].drop([0])
i_grade_data.columns = ['','ポテト','チキン', 'ハンバーガー', '小計']
i_waku_potate = (1250 / 2000) * 700
i_mogu_potate = ( 750 / 2000) * 700
i_waku_chiken = (1250 / 2000) * 300
i_mogu_chiken = ( 750 / 2000) * 300
i_waku_burger = (1250 / 2000) * 1000
i_mogu_burger = ( 750 / 2000) * 1000
i_grade_data['ポテト'][1] = str(i_waku_potate)
i_grade_data['ポテト'][2] = str(i_mogu_potate)
i_grade_data['チキン'][1] = str(i_waku_chiken)
i_grade_data['チキン'][2] = str(i_mogu_chiken)
i_grade_data['ハンバーガー'][1] = str(i_waku_burger)
i_grade_data['ハンバーガー'][2] = str(i_mogu_burger)
print('期待度数: 表3.10 ポテトとチキンとハンバーガーの売り上げの期待度数')
i_grade_data
期待度数: 表3.10 ポテトとチキンとハンバーガーの売り上げの期待度数
ポテト | チキン | ハンバーガー | 小計 | ||
---|---|---|---|---|---|
1 | ワクワク | 437.5 | 187.5 | 625.0 | 1250 |
2 | モグモグ | 262.5 | 112.5 | 375.0 | 750 |
3 | 合計 | 700 | 300 | 1000 | 2000 |
# 有意水準 = 1%
# 期待度数を計算する
# scipyを使ってカイ2乗値
from scipy import stats
waku_potate = float(grade_data.ix[1][1])
mogu_potate = float(grade_data.ix[2][1])
waku_chiken = float(grade_data.ix[1][2])
mogu_chiken = float(grade_data.ix[2][2])
waku_burger = float(grade_data.ix[1][3])
mogu_burger = float(grade_data.ix[2][3])
observed = [ waku_potate, mogu_potate, waku_chiken, mogu_chiken, waku_burger, mogu_burger ]
expected = [ i_waku_potate, i_mogu_potate, i_waku_chiken, i_mogu_chiken, i_waku_burger, i_mogu_burger ]
print( observed, expected )
chisq, p = stats.chisquare( observed, expected )
print('カイ二乗統計量 X = {:0.2f}'.format(chisq))
print('P値 = {:0.2f}'.format(p))
[435.0, 265.0, 165.0, 135.0, 650.0, 350.0] [437.5, 262.5, 187.5, 112.5, 625.0, 375.0]
カイ二乗統計量 X = 9.90
P値 = 0.08
# 一般的に、行と列がある二次元の表の場合は、
# 自由度=(行の数-1)×(列の数-1)
# 自由度の計算
free_level = (3-1) * (2-1)
print( "自由度= {}".format(free_level) )
print("カイ2乗分布表")
kai_list = dframe_list[2].drop([0])
kai_list.columns = [ "↓自由度/確率→", "0.05", "0.01" ]
kai_list
自由度= 2
カイ2乗分布表
↓自由度/確率→ | 0.05 | 0.01 | |
---|---|---|---|
1 | 1 | 3.84 | 6.63 |
2 | 2 | 5.99 | 9.21 |
3 | 3 | 7.81 | 11.34 |
4 | 4 | 9.49 | 13.28 |
5 | 5 | 11.07 | 15.09 |
6 | …以下続く… | … | … |
# カイ2乗分布表より有意水準1%のカイ2乗値は iX=9.21
# 計算で求めたカイ2乗値は X=9.90
もし表の値よりも大きければ、それは、1%よりも小さい確率でしか起こらないことが起こったということです。
したがって帰無仮説が間違っていたと考え、帰無仮説を棄却します。
もし表の値よりも小さければ、それは、1%よりも大きい確率で起こりうることだということです。
したがって帰無仮説を採択します。
X > iX なので 無帰仮説を棄却する。
(ということでいいのだろうか・・・)