背景
先日まで「とけたろうさんのチートシート」を参考に学習させてもらっていました。例題も豊富でとても良いのですが、Pythonで学習したい私は、それからPythonでの計算方法を調べるというステップを踏んでいまして理解するまでに少し時間がかかるのがネックでした。そういえばプロ棋士の谷合さんが「Pythonで理解する統計解析の基礎」を出版されていたのを思い出しました。今回は、こちらから引用(ほぼそのままですが)させて頂きたいと思います。
問題
Aさんはよく学校帰りにコンビニでフライドポテトを買って帰ります。このフライドポテトの重さの平均は130gと公表されていますが、とある日、Aさんがフライドポテトの重さを量ってみたら122.02gしか入っていませんでした。このコンビニのフライドポテトは実際には平均が130gより少ないのではないかと疑い始めたAさんは、その日から2週間毎日ポテトを買い、重さを量ることにしました。そして2週間後、集まった14個の標本の平均を計算したところ128.451gとなりました。14個の標本平均が130gより明らかに少ないと思ったAさんはコンビニにクレームをつけにいったのですが、ただの偶然だと一蹴されてしまいました。はたして14個の標本の平均が128.451gとなったのは本当にただの偶然なのでしょうか。
解答
まずは標本の平均を算出します。必要なライブラリをインポートしてデータを読み込んでいます。
import numpy as np
import pandas as pd
from scipy import stats
%precision 3
np.random.seed(1111)
df = pd.read_csv('python_stat_sample/data/ch11_potato.csv')
sample = np.array(df['重さ'])
s_mean = np.mean(sample)
s_mean
確かめたい事は母平均が130gより少ないかどうかです。前提として正規分布に従っていて、母分散は9とわかっているとします。
まず、「母平均が130g」という仮定をします。この時、フライドポテト14個の標本は N(130,9) に従い、標本平均 X¯ は N(130,9/14) に従うことになります。
ここでは、公表している母平均130g、母分散9の正規分布と、自分で集めた標本の正規分布を比べます。
標本分布より臨界点を算出します。
rv = stats.norm(130, np.sqrt(9/14))
rv.isf(0.95)
臨界点は128.681になります。
検定量であるZ値を求めます。Z値は次のように求められます。
$$
Z=\frac{\bar{X}-\mu}{\sqrt{\frac{\sigma^2}{n}}}
$$
z = (s_mean - 130) / np.sqrt(9/14)
検定量は「-1.932」となりました。
次に臨界値を求めます。この場合、臨界値は標準正規分布の5%の地点です。
rv = stats.norm()
#rv.isf(0.95) #逆生存関数
rv.ppf(0.05)
検定量が臨界値より小さくなりました。これより、帰無仮説は棄却されます。
最後にp値を求めます。p値は標準正規分布における検定量Zまでの面積です。
rv.cdf(z)
p値が有意水準0.05より小さい値になったので、p値でも帰無仮説は棄却されました。
参考
谷合(2020),Pythonで理解する統計解析の基礎,技術評論社
感想
統計自体素人な私にとって、プログラミングをしながら統計を学ぶのに理解に苦しんでいます。前回までは実際、問題を解いてからプログラミングに落とし込んでいました。ただ、私の様にこんがらがったニューロンの構造を持った私には体系的に理解するのが難しく、場当たり的になっています。今回は、昔見かけた谷合棋士の著書を思い出し、参考にさせて頂きました。自分で書いた記事をまとめられるように考えて行きたいと思います。