2019年5月11日土曜日

[Statistics] III 分割表の検定

Pythonで学ぶあたらしい統計学の教科書のまとめやコードを実行してみた際のメモです.

分割表に対する独立性の検定は,統計的仮説検定の重要な応用です.この手法は,χ$^2$検定と呼ばれます.

例として,Webサイトのボタンのクリック率がボタンの色によって変わるのかを統計的検定を用いて判断することを目的として分割表の検定を行うことにします.

色によってボタンの押されやすさが変わるのかを統計的検定を用いて判断することを目的として分割表の検定を行います.下表のようなボタンの押されやすさのデータがあったとします.

pusheddid not pushedtotal
Blue20230250
Red104050
total30270300

まず,ボタンの色によって押されやすさが全く変わらないとしたら,どのような結果になるのかを考えます.この時に期待される度数を期待度数と呼びます.

上記のボタンの押されやすさのデータの最下段を見ると,ボタンの色を無視したとすると,全体の1割の人がボタンを押していることになります.実験対象となっているのは
  • 青いボタン:250人
  • 赤いボタン:50人
です.この一割の人がボタンを押すので,ボタンを押す人の期待度数は
  • 青いボタンを押す人:25人
  • 赤いボタンを押す人:5人
となります.このことから,期待度数は以下のようになります.


pushdo not push
Blue20230
Red1040

これらの期待度数と実際に観測された度数の違いを調べて,違いが大きければボタンの色によって押されやすさが変わると言うことができます.

統計的検定の手法としては,χ$^2$検定を用います.なお,χ$^2$検定を行う際には期待度数が全て5以上であることが求められます.χ$^2$統計量は下式で得られます.
χ$^2 = \cfrac{(20 - 25)^{2}}{25} + \cfrac{(230 - 225)^{2}}{225} + \cfrac{(10 - 5)^{2}}{5} + \cfrac{(40 - 45)^{2}}{45} = 1 + \cfrac{1}{9} + 5 + \cfrac{5}{9} $
ここに,$O_{ij}$はi行j列の観測度数で,$E_{ij}$は期待度数です.

実際に計算してみると,以下のようになります.
χ$^2 =  \sum_{i=1}^{2} \sum_{j=1}^{2} \cfrac{(O_{ij} E_{ij})^{2}}{E_{ij}} \fallingdotseq 6.667$

上記の例のような2行2列の分割表におけるχ$^2$統計量の標本分布は,自由度1のχ$^2$分布に漸近的に従うことが証明されています.

これらをPythonで実装してみます.まずは,必要なモジュールのインポートを行います.
>>> import numpy as np
>>> import pandas as pd
>>> import scipy as sp
>>> from scipy import stats

p値*を計算します.
>>> 1 - sp.stats.chi2.cdf(x = 6.667, df = 1)
0.009821437357809604
p値が0.05を下回っています.このことから,色によってボタンの押されやすさが優位に変わると判断できます.

分割表の検定を行います.まずはデータ(3-10-1-click_data.csv**)の読み込みです.
>>> click_data = pd.read_csv("3-10-1-click_data.csv")
>>> print(click_data)
  color  click  freq
0  blue  click    20
1  blue    not   230
2   red  click    10
3   red    not    40

データを分割表に変換します.
>>> cross = pd.pivot_table(
...     data = click_data, 
...     values = "freq", 
...     aggfunc = "sum", 
...     index = "color", 
...     columns = "click"
... )
>>> print(cross)
click  click  not
color            
blue      20  230
red       10   40

検定を行います.sp.stats.chi2_contingency関数を用います.デフォルトだと補正がかかるので,引数の設定に correction = False として補正を行わないように設定します.

>>> sp.stats.chi2_contingency(cross, correction = False)

(6.666666666666666, 0.009823274507519247, 1, array([[ 25., 225.],

       [  5.,  45.]]))
計算結果は,χ$^2$統計量,p値,自由度,期待度数の順に出力されており,先の計算結果などとほぼ一致しています.

上記の事柄をJupyter Notebookで実行した結果はGitHubで見ることができます.

*p値:標本と帰無仮説との矛盾の目安となる指標.p値が小さいほど帰無仮説と標本が矛盾していると考え,p値は確率として表現される.

**3-10-1-click_data.csvの中身
color,click,freq
blue,click,20
blue,not,230
red,click,10
red,not,40

0 件のコメント :

コメントを投稿