見出し画像

9-1-3 同等性の検定 ~ クロス集計表を用いてカテゴリー間の分布が同等かどうかを適合度の検定で明らかに

統計的仮説検定のトピック「適合度の検定」の3回目です。
$${r}$$行$${\times}$$$${c}$$列のクロス集計表を用いた適合度の検定にチャレンジします。
期待度数の穴埋めがポイントです。


公式問題集の準備

「公式問題集」の問題を利用します。お手元に公式問題集をご用意ください。
公式問題集が無い場合もご安心ください!
「知る」「実践する」の章で、のんびり統計をお楽しみください!

問題を解く


今回の記事の構成

この記事は、通常の記事構成と違う章立てにいたします。
「知る」「実践する」を1つの章にまとめます。
最初に「問題を解く」の章で、出題箇所にピンポイントで解答を検討します。
続く「知る・実践する」の章で、適合度の検定の一連の流れを手作業・EXCEL・Pythonで実践いたします。

📘公式問題集のカテゴリ

カイ二乗検定の分野 ~適合度検定の分野
問3 同等性の検定(イギリス・ドライバーの月別◯◯人数)

試験実施年月
統計検定2級 2016年11月 問13(回答番号25)

問題

公式問題集をご参照ください。

解き方

題意
与えられた条件に基づき、適合度の検定に関する「期待度数の一部分」と「帰無仮説を棄却できるかどうか」を解答します。

【条件】
・有意水準$${5\%}$$で夏季と冬季の人数の分布の同等性の検定を行う
・観測度数(階級併合前)は次のヒストグラム参照
・次の階級を併合する
 ・「60人以上80人未満」と「80人以上100人未満」を併合
 ・「160人以上180人未満」と「180人以上200人未満」を併合
・帰無仮説は「夏季と冬季の2つの分布は同等である」
 (観測データは仮定する分布「2つの分布は同等」と一致する)
・検定統計量は$${20.51}$$

公式問題集の記述を改変
観測度数のヒストグラム(階級併合前)

この問題の統計的仮説検定の概要を図示します。

作戦会議
すでに検定統計量が分かっているので、ひとまず、出題箇所にフォーカスを当てて、ピンポイントで解答します。

夏季の「100人以上120人未満」階級の期待度数

観測度数について、階級併合後のクロス集計表を作成しましょう。
ヒストグラムの棒の上に記載された数字が併合前の度数です。
階級を併合するとは、階級を1つにまとめるという意味なので、まとめます。
・「60人以上80人未満」と「80人以上100人未満」をまとめ
・「160人以上180人未満」と「180人以上200人未満」をまとめ

次の表が完成形の例です。

階級併合後のクロス集計表

続いて、期待度数を考えます。
仮定する分布は「夏季と冬季の人数の分布が同等」です。
これは、夏季と冬季の「各階級の比率が同じ」と読み替えちゃいましょう。

「各階級の比率が同じ」を次の図で考えてみます。
青枠の行の合計に注目しましょう。

夏季・冬季の期待度数の合計

夏季と冬季が同じ人数、同じ割合です。
これは「各階級の比率が同じ」に加えて「各階級の割合・人数も同じ」であることを意味しています。
つまり、期待度数は、各階級において、夏季と冬季の人数が$${50\%}$$づつ、あるいは、同じ人数である、なのです。

では、出題の「夏季の『100人以上120未満』階級の期待度数」に話を移します。

階級「100人以上120人未満」の人数合計

夏季+冬季の合計は$${67}$$。
これを夏季・冬季に各$${50\%}$$づつ割り当てます。

仮定した分布による割合で期待度数を計算

夏季の人数は$${33.5}$$人です。

解答選択肢(ア)は$${33.5}$$です。

なお、この問題では夏季と冬季の割合が同じ$${50\%}$$となりましたが、問題によっては、夏季$${40\%}$$・冬季$${60\%}$$などのように、異なる割合になることもあります。
異なる割合の場合は、当該割合を按分割合にして計算することとなります。

同等性の検定の結論

検定に必要な情報を並べます。
■ 既に明らかな情報
・有意水準・・・$${5\%}$$
・検定統計量$${\chi^2}$$・・・$${20.51}$$
■ 不明な情報
・検定統計量が従う$${\chi^2}$$分布の自由度
・検定統計量が従う$${\chi^2}$$分布の上側$${5\%}$$点
 (この$${5\%}$$は有意水準の$${5\%}$$を用いています)

まず自由度を検討しましょう。
本問のような2次元のクロス集計表を用いて、同等性の検定(適合度の検定)を行う場合、自由度の計算式は次のようになります。

■自由度の公式
(行のカテゴリの数-1)×(列のカテゴリの数-1)
もしくは
$${(r-1)(c-1)}$$
ただし、$${r}$$:行のカテゴリの数、$${c}$$:列のカテゴリの数

クロス集計表を再掲します。

クロス集計表(再掲)

行は横、列は縦です。
行のカテゴリ$${r}$$は「夏季」と「冬季」の2つです。
列のカテゴリ$${c}$$は階級の数であり、5つです。
従いまして、自由度は$${(r-1)(c-1)=(2-1)(5-1)=1 \times 4=4}$$です。

続いて、自由度$${4}$$の$${\chi^2}$$分布の上側確率$${5\%}$$点を探しに行きましょう!
$${\chi^2}$$分布のパーセント点表を開きます。

カイ二乗分布のパーセント点表

自由度$${4}$$の$${\chi^2}$$分布の上側確率$${5\%}$$点は$${9.49}$$です。

いよいよ結論のときが来ました。
上側確率$${5\%}$$点の$${9.49}$$に対して、$${\chi^2}$$値$${20.51}$$は上回っています。
これは、$${\chi^2}$$値が棄却域に含まれていることを意味しています。

よって、帰無仮説「夏季と冬季の2つの分布は同等である」は棄却され、対立仮説「2つの分布は同等でない」と言えます。

解答選択肢(イ)は「帰無仮説を棄却できるので、2つの分布は同等でないと言える」です。

最後に、自由度$${4}$$の$${\chi^2}$$分布の上側確率$${5\%}$$点・棄却域・$${\chi^2}$$値を可視化して、帰無仮説が棄却される状況を感じましょう。

自由度4のカイ二乗分布の上側確率5%点とカイ二乗値

自由度$${4}$$の$${\chi^2}$$分布の確率密度関数は美しい曲線ですね!
波が立っているかのようです(北斎)。

青塗りのエリアが有意水準$${5\%}$$の棄却域です。
$${\chi^2}$$値$${20.51}$$の位置を見て、確率(に相当する$${p}$$値)はかなり小さな値だろう、と感じます。

解答

④ です。

難易度 やさしい

・知識:適合度の検定、$${\chi^2}$$分布のパーセント点表
・計算力:数式組み立て(低)、電卓(低)
・時間目安:1分


知る・実践する


おしながき

公式問題集の問題について、適合度の検定の一連の流れを手作業・EXCEL・Pythonで実践していきましょう。

📕公式テキスト:6.2 適合度の検定(203ページ~)

読み解き

条件から統計的仮説検定の主題を読み解きます。

  • 条件より「分布の同等性の検定」、すなわち「適合度の検定」を行います。
    適合度の検定は「片側検定(上側)」です。

  • 仮定した確率分布「夏季と冬季の人数の分布は同等」に基づいて期待度数を計算します。

  • 観測度数と期待度数を用いて、検定統計量$${\chi^2}$$を計算します。

  • 検定統計量$${\chi^2}$$が従う$${\chi^2}$$分布の自由度を計算します。

  • $${\chi^2}$$分布のパーセント点表より、有意水準$${5\%}$$のパーセント点を取得して、帰無仮説を棄却できるかどうか結論づけます。

この問題の統計的仮説検定の概要を図示します(再掲)。

観測度数は次のとおりです。


手計算で検定

ステップ1:期待度数を計算する

期待度数は、理論的な確率や想定する確率といった「仮定する分布」の下でカウントされる度数です。

本問の仮定する分布は「夏季と冬季の人数の分布は同等」です。
期待度数の行の合計・列の合計をもとにして、夏季と冬季に同じ割合で計算して、観測度数を求めます。

夏季と冬季の合計(行合計)は、同一の値である$${96}$$であり、割合にすると$${50\%}$$づつとなります。
この割合で、各階級の合計値(列合計)を夏季と冬季に按分して、期待度数を求めます。

・ 60人以上100人未満階級 $${31人\times 0.5 = 15.5}$$
・100人以上120人未満階級 $${67人\times 0.5 = 33.5}$$
・120人以上140人未満階級 $${47人\times 0.5 = 23.5}$$
・140人以上160人未満階級 $${30人\times 0.5 = 15.0}$$
・160人以上200人未満階級 $${17人\times 0.5 = 8.5}$$

期待度数をクロス集計表にしましょう。

期待度数のクロス集計表

ちなみに、仮定する分布の確率を表にすると次のようになります。
縦計・横計が固定されて(自由度が減って)、内訳としての確率が決まる様子をご堪能ください。

仮定する分布の確率のクロス集計表

次の計算で観測度数と期待度数を用いるので、両方の度数をまとめて掲載しましょう。

観測度数と期待度数

観測度数は夏季と冬季の凸凹が見られますが、期待度数は平坦です。
棒グラフで観測度数と期待度数の違いを可視化しましょう。

観測度数と期待度数の棒グラフ

階級「100人以上120人未満」と「160人以上200人未満」は夏季と冬季が大きく相違する印象です。
さて、適合度検定の結果はいかに・・・。

ステップ2:検定統計量$${\boldsymbol{\chi^2}}$$を計算する

カテゴリ(分類)ごとに「観測度数と期待度数の差の2乗」を「期待度数で割り」、全カテゴリを合計します。

カイ二乗検定統計量の計算式

本問のカテゴリは行2×列5で合計10のカテゴリがあります。
・行:夏季と冬季の2つ
・列:階級の数は5つ

検定統計量$${\chi^2}$$は次の計算式を用いて計算します。
電卓計算力が試されます・・・。

10カテゴリから、カイ二乗検定統計量を計算する

先程まとめた観測度数と期待度数の値を当てはめて、検定統計量$${\chi^2}$$を計算しましょう。

検定統計量の計算

検定統計量の計算で得られた$${\chi^2}$$値は$${20.51}$$です。

ところで、3行目と4行目に注目してください。
上下に夏季と冬季の同一階級を並べています。
上下の組み合わせでは分子・分母が同一であり、同じ計算結果になります。
各階級の合計値(縦計)を夏季と冬季に半分づつ按分したからです。

計算時短法として、夏季または冬季の片方を計算して2倍する方法が考えられます。

ステップ3:検定統計量$${\boldsymbol{\chi^2}}$$が従う$${\boldsymbol{\chi^2}}$$分布の自由度

2次元のクロス集計表を用いて、同等性の検定(適合度の検定)を行う場合、自由度の計算式は次のようになります。

■自由度の公式
(行のカテゴリの数-1)×(列のカテゴリの数-1)
もしくは
$${(r-1)(c-1)}$$
ただし、$${r}$$:行のカテゴリの数、$${c}$$:列のカテゴリの数

本問で取り扱う観測度数のカテゴリ数は「行$${r}$$:夏季・冬季の2つ」「列$${c}$$:階級の数は5つ」です。
自由度は$${(r-1)(c-1)=(2-1)\times(5-1)=1\times4=4}$$で、$${4}$$です。

ステップ4:検定統計量$${\boldsymbol{\chi^2}}$$が従う$${\boldsymbol{\chi^2}}$$分布の上側パーセント点

続いて上側パーセント点を取得して棄却域を確認します。
ここで重要なお知らせ。

【重要ポイント】
・適合度検定は片側・上側検定です。

適合度検定は片側・上側検定ですので、有意水準$${5\%}$$の棄却域を求める際には、自由度$${4}$$の$${\chi^2}$$分布のパーセント点表より上側確率$${5\%}$$点を取得します。

カイ二乗分布のパーセント点表

自由度$${4}$$の上側確率$${5\%}$$点は$${9.49}$$です。

$${\chi^2}$$分布の確率密度関数をグラフで確認しましょう。

自由度4のカイ二乗分布、上側確率5%点、棄却域

ステップ5:結論を出す

$${\chi^2}$$値$${=20.51}$$と上側確率$${5\%}$$点$${=9.49}$$を比べます。
$${\chi^2}$$値は上側確率$${5\%}$$点より大きいため、棄却域の区間内です。
よって、帰無仮説は棄却されます。

具体的には、帰無仮説「夏季と冬季の2つの分布は同等である」は棄却され、対立仮説「夏季と冬季の2つの分布は同等でない」と言えます。

最後にグラフで棄却域と$${\chi^2}$$値の関係を確認しましょう。

カイ二乗値と棄却域

$${\chi^2}$$値は棄却域のずーっと奥(上側)に位置しています。
おそらく$${p}$$値は小さな値でしょう。

手計算は以上となります。



EXCELで検定

計算シートを用いて適合度検定を行います。

計算シートの全体像
左側の表には、観測度数と仮定する分布(確率)を登録します。
紙面の関係上、クロス集計表の行と列を入れ替えて作成しました。

観測度数と仮定する分布の割合に基づいて期待度数を計算しています。
また、カテゴリごとに$${(観測度数-期待度数)^2/期待度数}$$の計算を行って合計を取り、$${\chi^2}$$値にしています。
右側の入力パラメータは「有意水準」です。

観測度数・期待度数・有意水準より、$${\chi^2}$$値、上側確率%点、$${p}$$値を求めて、判定します。

適合度検定の実行

上記の計算シートには既に必要なデータ、パラメータを設定済みです。
計算値によると、自由度は$${4}$$、$${\chi^2}$$値は$${20.51}$$、上側確率$${5\%}$$点は$${9.488}$$です。
$${\chi^2}$$値が上側確率$${5\%}$$点よりも大きいので、帰無仮説は棄却されます。
$${p}$$値は$${0.000}$$とかなり小さな値になりました。

まとめ

$${\chi^2}$$値は$${20.51}$$、$${p}$$値は$${0.000}$$です。
有意水準$${5\%}$$で帰無仮説は棄却され、対立仮説「夏季と冬季の2つの分布は同等でない」と言えます。

EXCELの関数

EXCELの CHISQ.TEST 関数を用いて、適合度検定の$${p}$$値を算出できます。
引数は、CHISQ.TEST ( 観測度数のデータ範囲, 期待度数のデータ範囲 ) です。
2次元のクロス集計表の場合も、観測度数の期待度数の行と列を揃えておくことで、データ範囲の指定を容易に行なえます。
シンプルなのでぜひ使ってみてください!

EXCELは以上となります。

EXCELサンプルファイルのダウンロード
こちらのリンクからEXCELサンプルファイルをダウンロードできます。



Pythonで検定

scipy.stats の chi2_contingency を用いて、クロス集計表に基づく適合度検定を実行します。

①インポート

### インポート
import numpy as np
import pandas as pd
from scipy import stats
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Meiryo'

②度数分布データの登録
問題で与えられた「観測度数」を登録します。

### 度数分布データの登録
# 夏季
summer = np.array([2, 16, 42, 24, 11, 1, 0])
# 冬季
winter = np.array([1, 12, 25, 23, 19, 10, 6])
# 階級名
class_name = ['60-80', '80-100', '100-120', '120-140', '140-160',
              '160-180', '180-200']

③ヒストグラムの描画
夏季・冬季の観測度数(階級併合前)に基づいて、ヒストグラム(風の棒グラフで)を描画します。
グラフのバーの上に度数(数値)を表示するために、
ax[0].bar_label(bar1, fontsize=14)
を用いています。
このbar_labelを利用するために、1行前の棒グラフプロットコード(ax[0].bar)をbar1に代入しています。

### ヒストグラム(風の棒グラフ)の描画
fig, ax = plt.subplots(1, 2, figsize=(12, 5), sharey=True)

# 夏季
bar1 = ax[0].bar(class_name, summer, width=1, ec='white')
ax[0].bar_label(bar1, fontsize=14)
ax[0].set_xlabel('人数:以上-未満')
ax[0].set_ylabel('度数(月数)')
ax[0].set_title('夏季')

# 冬季
bar2 = ax[1].bar(class_name, winter, width=1, ec='white')
ax[1].bar_label(bar2, fontsize=14)
ax[1].set_xlabel('人数:以上-未満')
ax[1].set_title('冬季')
plt.tight_layout()

plt.show()
出力イメージ

④階級の併合とクロス集計表データフレームの作成
階級の併合を「numpy配列の要素の足し算」と「不要になった要素の削除」で乗り切りました。
後段の observed_tab が階級併合後のクロス集計表データです。
出力イメージの上段がこのクロス集計表データです。
このobserved_tab を用いて適合度検定のコードを書く予定です。

### 階級の併合
# 夏季データ
summer_merge = summer.copy()
summer_merge[0] += summer_merge[1]
summer_merge[5] += summer_merge[6]
summer_merge = np.delete(summer_merge, [1, 6])

# 冬季データ
winter_merge = winter.copy()
winter_merge[0] += winter_merge[1]
winter_merge[5] += winter_merge[6]
winter_merge = np.delete(winter_merge, [1, 6])

# 階級名
class_name = ['60-100', '100-120', '120-140', '140-160', '160-200',]

# 階級併合後のクロス集計表(データフレーム)の作成
observed_tab = pd.DataFrame(data={'夏季': summer_merge, '冬季': winter_merge},
                            index=class_name).T

# 合計付きデータフレームの作成(表示用)
observed_tab2 = observed_tab.copy()
observed_tab2['合計'] = observed_tab2.sum(axis=1)
observed_tab2.loc['合計'] = observed_tab2.sum(axis=0)

display(observed_tab)
display(observed_tab2)
出力イメージ

⑤適合度検定の実施
scipy.stats の chi2_contingency を用いて適合度検定を行います。
引数は、chi2_contingency ( 観測データのクロス集計表, correction ) です。
期待度数を用意する必要が無いので、とても手軽に検定を実行できます。
correction=False はイエーツの補正を実施しない、というオマジナイです。
戻り値は、$${\chi^2}$$値、$${p}$$値、自由度、期待度数です。

### 適合度検定の実施 χ^2値、p値、自由度、期待度数表を取得
chi2_value, p_value, df, expected = stats.chi2_contingency(observed_tab,
                                                           correction=False)

# カイ二乗統計量、p値、自由度の表示
print(f'χ^2値:{chi2_value:.4f}, p値:{p_value:.4f}, 自由度:{df}')

# 期待度数の表示(データフレーム化)
expected_tab = pd.DataFrame(expected, columns=observed_tab.columns,
                            index=observed_tab.index)
print('\n期待度数:')
display(expected_tab)
出力イメージ

(予告)
$${p}$$値が$${0.0004}$$と非常に小さな値なので、きっと帰無仮説を棄却できるでしょう。

⑥適合度検定の追加設定
有意水準を設定して、$${\chi^2}$$分布の上側パーセント点を取得します。

## 初期値設定
# 有意水準
alpha = 0.05

# 有効水準のカイ二乗分布の上側パーセント点
critical_value = stats.chi2.isf(alpha, df)

⑦結論の表示
有意水準と$${p}$$値を比較して、帰無仮説を棄却できるかどうかを判定します。

### 結論の表示
if p_value < alpha:  # p値が有意水準より小さい場合:棄却できる
    result = ('棄却される', '言える')
else:                # p値が有意水準以上の場合:棄却できない
    result = ('棄却されない', '言えない')
print(f'結論\n有意水準{alpha:.1%}で帰無仮説は{result[0]}\n'
      f'対立仮説「観測データは仮定する確率分布に一致しない」と{result[1]}')

### 統計量の表示
print('\n統計量')
print(f'自由度{df}のカイ二乗分布の上側{alpha:.1%}点:{critical_value:.3f}, '
      f'カイ二乗値:{chi2_value:.3f}')
print(f'有意水準{alpha:.3f}, p値:{p_value:.4f}')
出力イメージ

やはり帰無仮説を棄却できました。

まとめ
観測度数のクロス集計表データを整えて、scipy.stats の chi2_contingency を実行するだけで、$${p}$$値を取得して適合度検定の結論を出せることが分かりました。
(その他のコードは付加的なものかもです・・・)

$${p}$$値が有意水準$${5\%}$$より小さいので、有意水準$${5\%}$$で帰無仮説は棄却され、対立仮説「夏季と冬季の2つの分布は同等でない」と言えます。

Pythonサンプルファイルのダウンロード
こちらのリンクからJupyter Notebook形式のサンプルファイルをダウンロードできます。

以上で終了です。
お疲れ様でした。



おわりに

適合度の検定の3記事目になりました。

この記事で取り扱ったのは「クロス集計表」を用いた2次元の適合度の検定です。
2つのカテゴリー変数からクロス集計表を作成して、カテゴリー(グループ、群)間の分布が同等かどうかを統計的に確かめることができます。

たとえばアンケート集計・分析のシーンを思い浮かべます。
比較するグループ間の分布・確率が同等で無いことを確認するときに使える手法だと思います。

次回は適合度の検定の最後の記事になります。

最後までお読みいただきまして、ありがとうございました。


のんびり統計シリーズの記事

次の記事

前の記事

目次

この記事が参加している募集

沼落ちnote

この記事が気に入ったらサポートをしてみませんか?