あれれ〜?おかしいぞ?
あなたはとある企業の保健師です。
従業員と面談している中で、最近、やけに「不眠」の相談が多いことに気づきました。
しかも夜勤明けの人に多いような気がする。
……気がする。
「気がする」という感覚も大切ですが、それだけ言っても他の保健師に「根拠は?」と尋ねられるのがオチです。
華麗に登場、クロス集計表
果たして、本当に不眠の相談は夜勤明けの人に多いのだろうか?
その謎を解明するため、我々調査隊はアマゾンの奥地へと向かった――。
ではなく、クロス集計表を作ったーー。
こちらが、観測値のクロス集計表です。
| 不眠あり(人) | 不眠なし(人) | 合計(人) | |
| 夜勤あり | 30 | 20 | 50 |
| 夜勤なし | 20 | 30 | 50 |
| 合計 | 50 | 50 | 100 |
ここで「夜勤ある人、不眠多くね?」という疑惑が再燃しました。
でも、これだけでは断定できません。
次のステップに進みましょう。
カイ二乗検定、登場
お待たせしました。ここで現れるのが今回の主人公、カイ二乗検定です。
カイ二乗検定はχ2検定とも表記しますが、ギリシャ文字なので日本人の我々には話しかけてくれません。無口です。
でも、目で訴えてきます。
「怪しいぞ…」って。
まず、期待度数をExcelで計算してみます。
どういうことやねん、と思う方もいるかもしれませんが、今回の場合は「もし夜勤と不眠は関係ないとしたら、クロス集計表はどうなる?」と言う場合の期待値の分割表を作ります。
とある青い狸みたいなロボットが出してくれる「もしもボックス」みたいですね。
そして出来上がった期待値の分割表はこちら。
| 不眠あり(人) | 不眠なし(人) | 合計(人) | |
| 夜勤あり | 25 | 25 | 50 |
| 夜勤なし | 25 | 25 | 50 |
| 合計 | 50 | 50 | 100 |
この表では、夜勤の有無に関わらず不眠の有無の割合が変わりません。
もし夜勤と不眠が全く関係ないのだとしたら、不眠がある人の中で夜勤がある人は25人、ない人は25人になります。
では、最初に作ったクロス集計表に戻ります。
| 不眠あり(人) | 不眠なし(人) | 合計(人) | |
| 夜勤あり | 30 | 20 | 50 |
| 夜勤なし | 20 | 30 | 50 |
| 合計 | 50 | 50 | 100 |
……お分かりいただけただろうか。
実際のデータでは不眠がある人で夜勤ありは30人、夜勤なしは20人です。
さっきの期待値の分割の結果と大きくズレている気がしますね。
χ²値を出そう
観測 − 期待の ズレが大きいかどうかを「χ²値」で評価します。
χ² = Σ{(観測値 − 期待値)² ÷ 期待値}

結局どうすんねん、と思うかもしれませんが、上の図の
B3とB9(夜勤あり × 不眠あり)
C3とC9(夜勤あり × 不眠なし)
B4とB10(夜勤なし × 不眠あり)
C4とC10(夜勤なし × 不眠なし)
を比較します。
まず、B3とB9(夜勤あり × 不眠あり)を比較します。
(観測値 − 期待値)² ÷ 期待値なので、この図の場合は(B3-B9)^2/B9となります。

そして、他の組み合わせも同じように計算します。
その後、全ての組み合わせを足します。これがχ2値です。

結果、今回のχ2値は4でした。
この値が大きいほど、観測値と期待値のズレが大きくなります。
またしても登場、p値
Excelでのカイ二乗検定のp値の求め方は、
=CHISQ.DIST.RT(χ²値, 自由度)
自由度 = (行数 − 1)×(列数 − 1)
今回の自由度は、2×2のクロス表を使っているため、(2-1)×(2-1)=1です。

p値を計算した結果、0.0455002638963584でした。有意水準の0.05を下回っています。
つまり、観測値と期待値のズレは「たまたま」では片付けられないレベルだったのです。
ただし、カイ二乗検定は観測値と期待値が「ズレていること」は密かに教えてくれますが、「因果関係」までは教えてくれません。
人間関係で言うと、「一緒にいることが多い」≠「付き合っている」です。
そのため、今回は
❌「夜勤が不眠の元凶である」
⭕️「夜勤と不眠の間に統計的に有意な関連が認められた(p < 0.05)」と結論づけます。
カイ二乗検定の前提条件ってあるの?
今回はカイ二乗検定を使用しましたが、実は使うための前提条件があります。
- 変数がカテゴリ(名義尺度)であること
例:夜勤あり/なし、不眠あり/なしなど
- 各セルの期待度数が5以上
通常、「すべてのセルが5以上」が推奨されます(特に今回のような2×2表では)
もし期待度数が5未満のセルがある場合は、フィッシャーの正確確率検定(Fisher’s Exact Test)が推奨されます。
カイ二乗検定(χ²検定)は、実際の分布を、理想的な分布(カイ二乗分布)で近似する方法です。
この「近似」が上手くいくには、ある程度データが大きくないといけないのです。
- 観測値が独立している
例:同じ人が複数回カウントされていない
- サンプルサイズが十分にある
少なくとも表全体の人数が20人以上推奨
- ランダムに抽出されたサンプル
理想的には母集団から無作為抽出されたもの
まとめ
「気のせい」と「気のせいじゃない」の境界線を、 ただただ冷静に炙り出す。
それがカイ二乗検定です。
あなたの「気のせい」が本当かどうか、カイ二乗検定に確かめてもらいませんか?
おまけ Pythonを使ったカイ二乗検定
import numpy as np
from scipy.stats import chi2_contingency
# 観測度数(実際のデータ)
# 行:夜勤あり・夜勤なし
# 列:不眠あり・不眠なし
data = np.array([
[30, 20], # 夜勤あり
[20, 30] # 夜勤なし
])
# カイ二乗検定(Yates補正なし)
chi2, p, dof, expected = chi2_contingency(data, correction=False)
# 結果表示
print("Yates補正なし")
print(f"カイ二乗値: {chi2:.3f}")
print(f"p値: {p:.5f}")
print(f"自由度: {dof}")
print("期待度数:")
print(expected)
# カイ二乗検定(Yates補正あり)
chi2, p, dof, expected = chi2_contingency(data)
# 結果表示
print("Yates補正あり")
print(f"カイ二乗値: {chi2:.3f}")
print(f"p値: {p:.5f}")
print(f"自由度: {dof}")
print("期待度数:")
print(expected)
出力:
Yates補正なし
カイ二乗値: 4.000
p値: 0.04550
自由度: 1
期待度数:
[[25. 25.]
[25. 25.]]
Yates補正あり
カイ二乗値: 3.240
p値: 0.07186
自由度: 1
期待度数:
[[25. 25.]
[25. 25.]]
Yates補正とは?
カイ二乗検定は「連続値で近似」する検定ですが、今回のような2×2表のデータは「離散的(整数)」です。
2×2表の現実のデータは「カクカク」してるのに、無理矢理なめらかな曲線に当てはめて評価しようとしています。
そのため、χ²分布での近似が少し過剰になる(=偽陽性が起きやすい)傾向があります。
そのため、「観測値と期待値の差を少し縮めて調整する」のがYates補正です。
Yates補正がある場合、
(|観測値 – 期待値| – 0.5)^2 / 期待値
でχ²値を求めます。そのため、Yates補正では全体のχ²値が小さくなります。
データ数が少ない2×2表では、Yates補正ありを使うのが「保守的で安全」とされます。
ただし、補正が過剰すぎてp値が有意水準を超えてしまうことがあります。
そのため、まずはYates補正ありのカイ二乗検定を行い、フィッシャー検定と一緒に見ることもあります。
今回のExcelを使った分析はYates補正なしですが、PythonのデフォルトはYates補正ありです。
