医療統計学・医療情報学・遠隔医療

医療統計学・医療情報学・遠隔医療 · 07

比率の比較 — χ²検定・Fisher正確検定・比率差の信頼区間

Comparing Proportions: Chi-Square, Fisher's Exact Test, and the CI for a Difference

🧠 全体像:2群の比率を比べる問題は、すべて分割表に落ちる。χ²検定は「H0(無関連)のもとで期待される度数」と「実際の度数」のずれを1つの数に要約する近似の検定、はその正確版である。ただしどちらの検定も p値しか返さない。効果の大きさも向きも教えてくれない。 だから必ず比率の差とそのを併せて出す。

問いの立て方

問い:脳卒中の発生は糖尿病の有無と関連するか。糖尿病患者では脳卒中が多いのか、少ないのか。

項目 内容
H0 糖尿病あり群となし群で脳卒中の割合に差はない。P(stroke∣DM+)=P(stroke∣DM−)P(\text{stroke} \mid \text{DM}+) = P(\text{stroke} \mid \text{DM}-)
H1 差がある。P(stroke∣DM+)≠P(stroke∣DM−)P(\text{stroke} \mid \text{DM}+) \neq P(\text{stroke} \mid \text{DM}-)
効果量 2つの比率の差 p1−p2p_1 - p_2
relevance 2%ポイントの差を臨床的に意味ありとする
有意水準 α=5%\alpha = 5%(信頼水準 1−α=95%1-\alpha = 95%)
標本 Framingham 心臓研究からの 3263例。独立 = 糖尿病、従属 = 脳卒中

「独立変数・従属変数」という呼び方が持ち込むもの

問いの立て方そのものが「脳卒中が従属、糖尿病が独立」という向きを含んでいる。しかしその向きを決めているのは統計ではなく、臨床・生理・病理の予備知識である(糖尿病は慢性の状態、脳卒中は急性のイベント、という順序の知識)。

⚠️ 仮説検定それ自体は因果を判定できない。 検定が示せるのは相関・(直接または間接の)依存関係だけである。分割表を左右どちらに置き換えても χ² 値は同じ値になることが、この事実を端的に表している。→ 相関と回帰、と重回帰

まず記述統計を見る

⭐ 検定に進む前に、必ず分割表と棒グラフを描く。ここで効果の大きさと向きが分かり、検定は「その大きさがで説明できるか」を後から確かめるだけになる。

見るもの 何が分かるか
度数の棒グラフ 2群のの偏り(糖尿病あり群はずっと少数である)
割合(%)の棒グラフ 比率の差そのもの。ここで relevance の判定ができる
分割表(列%付き) 実数と割合を同時に。周辺和も確認する

💡 度数のグラフと割合のグラフの両方を見ることに意味がある。の少ない群は割合の推定が不安定(SE が大きい)なので、割合のグラフだけ見ると差が確からしく見えすぎる。

分割表の基本形は次のとおり。列に独立(曝露)、行に従属()を置き、列ごとに%を計算する(=各の中での割合になる)。

糖尿病なし 糖尿病あり 合計
脳卒中あり aa bb a+ba+b
脳卒中なし cc dd c+dc+d
合計 a+ca+c b+db+d nn

⚠️ どちらの方向で % を取るかで、まったく違う数字が出る。 列%(ごとの割合)と行%(群ごとの曝露割合)は別物である。臨床的に意味があるのはふつう前者だが、では後者しか計算できない。

χ²検定

何を計算しているか

H0(2つのが独立)が正しければ、各セルの度数は周辺和から予測できる。第 ii 行・第 jj 列の期待度数 EijE_{ij} と検定統計量は次のとおり。

Eij=Ri⋅Cjnχ2=∑i,j(Oij−Eij)2Eijdf=(r−1)(c−1)E_{ij} = \frac{R_i \cdot C_j}{n} \qquad \chi^2 = \sum_{i,j} \frac{\left(O_{ij} - E_{ij}\right)^2}{E_{ij}} \qquad df = (r-1)(c-1)

ここで OijO_{ij} は観測度数、RiR_i は行の合計、CjC_j は列の合計、rr・cc は行数・列数である。

💡 (O−E)2(O-E)^2 を EE で割るのがポイントである。期待度数が大きいセルでは、同じなずれでも「驚き」は小さい。ずれを、そのセルで予想されるゆらぎの大きさで化している。

χ² 分布は常に右に裾を引き、が大きくなるほど歪みが減ってに近づく。E(χk2)=kE(\chi^2_k) = k、Var(χk2)=2k\mathrm{Var}(\chi^2_k) = 2k。

⚠️ χ²検定は両側・片側の区別を持たない。χ² 値はずれを二乗しているので向きの情報が消えており、棄却域は常に分布の右端だけである。「差がある」ことしか分からず、「どちらが大きいか」は分割表を見なければ分からない。

2種類の χ²検定

独立性の
何を問うか 未知の分布が既知の分布と等しいか 2つ以上の分布が等しいか(=2が独立か)
の数 1 2つのカテゴリ
例 ある病院の血液型分布は全国の分布と同じか 脳卒中の割合は糖尿病の有無で違うか

使用条件 — 「小標本では使えない」は正確でない

条件は標本サイズではなく、期待度数についての規則である。

期待度数が 1 未満のセルが1つもなく、かつ 5 未満のセルが全体の 20%(1/5)以下であること。

⚠️ これは「n が小さいときは Fisher」という要約とは違う。 n = 3000 の大標本でも、曝露が非常にまれ(例: 2例)でもまれなら、期待度数が 5 を下回るセルは出る。逆に n = 40 でも、4セルにバランスよく分かれていれば期待度数はすべて 10 になり、χ²検定の条件を満たす。判定するのは n ではなく、出力に表示される期待度数の表である。

💡 条件が観測度数ではなく期待度数について書かれているのは、χ² 統計量の分母が EE だからである。EE が小さいと (O−E)2/E(O-E)^2/E が不安定に暴れ、統計量が χ² 分布に従うという近似が壊れる。

2×2 表の場合、多くのソフトウェアは既定で Yates の補正をかける。これは χ² 値を小さくして保守的にする補正だが、必要以上に検出力を落とすため、期待度数がすべて 1 以上なら補正しないほうがよいとされる1。同じ表なのに教科書と出力で p値が違うときは、まずこの補正の有無を疑う。

Fisher 正確検定

何が「正確」なのか

χ²検定は「検定統計量が χ² 分布に従う」という近似にもとづく。Fisher 正確検定は近似を使わず、周辺和を固定したもとで、観測された表と同じかそれ以上に偏った表が生じる確率を超幾何分布から直接足し上げる。したがって p値は近似ではなく厳密に計算される。

χ²検定 Fisher 正確検定
p値 近似 正確
計算量 軽い 重い(表が大きいと現実的でなくなる)
期待度数の条件 必要 不要
使えるとき 期待度数の条件を満たすとき いつでも使える

「小標本のとき Fisher」という言い方の何が足りないか

正しい条件は「χ²検定の期待度数の条件を満たさないとき」である。すなわち期待度数が 1 未満のセルがある、または期待度数 5 未満のセルが 20% を超えるときに Fisher に切り替える。標本サイズはその間接的な指標にすぎない。

⚠️ さらに、Fisher 正確検定は保守的である。周辺和を固定するという条件付けのため、実際の第1種の過誤の確率は α\alpha をしばしば大きく下回り、そのぶん検出力を失う。2×2 表では、期待度数がすべて 1 以上なら N−1N-1 補正を加えた Pearson χ²検定、すなわち

χN−12=χ2⋅N−1N\chi^2_{N-1} = \chi^2 \cdot \frac{N-1}{N}

のほうが望ましく、Fisher は期待度数 1 未満のセルがある場合に限るべきだとされる1。

⭐ 試験では「期待度数の条件を満たさないとき Fisher」と答えれば足りる。ただし「Fisher = 常により正しい」ではなく「Fisher = 近似を使わない代わりに保守的」という理解を持っておく。

効果量 — 検定の前に決まっているもの

⚠️ χ²検定も Fisher 正確検定も、返すのは p値だけである。 効果がどれくらい大きいかも、どちらの群が高いかも教えてくれない。だから p値のみを報告することは許されず、効果量と推定の精度()を併せて示す必要がある2。2×2 表から効果量を出す方法は複数あり、どれを使うかで印象が大きく変わる。

効果量 定義 性質
比率の差( / ) p1−p2p_1 - p_2 臨床判断に直結する。NNT=1/(p1−p2)NNT = 1/(p_1-p_2)
(, RR) p1p2\dfrac{p_1}{p_2} 比なので、ベースラインが小さいと差が小さくても大きく見える
(OR) p1/(1−p1)p2/(1−p2)\dfrac{p_1/(1-p_1)}{p_2/(1-p_2)} でも計算できる。が頻繁だと OR は RR より大きく出る

をとして読まない。 が 10% を超えるようになると OR は RR から系統的に離れ、効果を誇張する方向にずれる。詳しくは 疫学指標 と リスクの推定 を参照。相対的な表現がどれほど印象を左右するかについては 治療のリスクの伝え方 も参照。

比率の差の信頼区間

⭐ これが検定のを臨床の言葉に翻訳する部分である。 実習が扱うのは2つの比率の差で、その 95% を出す。2群が独立なので分散が足し算になることがポイントである。

(p^1−p^2)  ±  z1−α/2p^1(1−p^1)n1+p^2(1−p^2)n2(\hat{p}_1 - \hat{p}_2) \;\pm\; z_{1-\alpha/2}\sqrt{\frac{\hat{p}_1(1-\hat{p}_1)}{n_1} + \frac{\hat{p}_2(1-\hat{p}_2)}{n_2}}

💡 根号の中が2項の和になっているのは、2群それぞれの推定の不確かさが独立に効くからである。片方の群の n がいくら大きくても、もう片方が小さければ区間は狭くならない。この Wald 型の式は p^\hat{p} が 0 や 1 に近いと壊れるので、そのときは Newcombe 法などを使う(→ 標本抽出と推定)。

判断の仕方は2通りあり、必ず一致する。

  1. による判断:H0 が正しければ差は 0 である。区間が 0 を含まなければ H0 を棄却する
  2. p値による判断:psample<αp_{\text{sample}} < \alpha なら H0 を棄却する

さらにもう1段、臨床的relevance の判断が加わる。

  1. 区間の位置と relevance の閾値を比べる。区間全体が閾値(ここでは 2%ポイント)を超えていれば、「差は実在し、かつ臨床的に意味がある」と言い切れる
区間の位置 読み方
区間全体が relevance 閾値の外側 有意かつ relevant。最も強い
区間は 0 を含まないが、閾値をまたぐ 有意だが、relevant な差かどうかは決まっていない
区間が 0 を含み、かつ狭い 有意でなく、意味のある差も実質的に否定できる
区間が 0 を含み、かつ広い 有意でないが、何も決まっていない(→ 仮説検定の論理)

実習の結果を読む

出力 値
比率の差(効果量) 14.5%ポイント
relevance の閾値 2%ポイント
差の 95% 9.3% 〜 19.7%
χ² 値(df=1df = 1) 62.20162.201
χ²検定の p値 3.101×10−153.101 \times 10^{-15}
Fisher 正確検定の p値 6.286×10−126.286 \times 10^{-12}

💡 出力を読む順序

  1. 効果量 — 14.5%ポイントの差。糖尿病群のほうが脳卒中が多い
  2. 臨床的relevance — 閾値 2%ポイントを大きく超える。relevant
  3. — 9.3〜19.7%。0 を含まないだけでなく、区間全体が 2% を超えている。すなわち「差は実在し、しかも臨床的に意味がある」と両方言える
  4. p値 — 3.1×10−15<0.053.1 \times 10^{-15} < 0.05。有意

⚠️ p値から読み始めていたら「p が極端に小さい=効果が巨大」としかねない。p値がここまで小さいのは、差が 14.5%ポイントあることと n = 3263 が大きいことの両方によるものである。

χ²検定と Fisher 正確検定で p値が違う(3.1×10−153.1 \times 10^{-15} と 6.3×10−126.3 \times 10^{-12})が、は同じである。この差は近似と厳密計算の違いであって、どちらかが間違っているのではない。p値の大小を効果の大きさとして比べないこと。

💡 実習の出力では、差が「糖尿病なし群の非脳卒中率 − 糖尿病あり群の非脳卒中率」として計算されている。ソフトウェアはのどの水準を先に置くかで符号を変えるので、出力の見出しを読んでどちらからどちらを引いたのかを必ず確認する。符号を取り違えるとが反対になる。

import numpy as np
from scipy import stats
from statsmodels.stats.proportion import confint_proportions_2indep

tab = np.array([[15, 60],      # 行: アウトカムあり / なし、列: 曝露あり / なし(数値は説明用)
                [85, 340]])
chi2, p, df, expected = stats.chi2_contingency(tab, correction=False)
print(chi2, p, df); print(expected)          # ⚠️ expected(期待度数)で使用条件を判定する
print(stats.fisher_exact(tab))               # 期待度数の条件を満たさないとき
print(confint_proportions_2indep(15, 100, 60, 400, method="wald"))   # 比率差の95% CI

検定の選び方

flowchart TD
  A["2つのカテゴリ<span class='jp-term jp-term-diagram' title='variables'>変数</span>の関連を見たい"] --> B["分割表と割合の棒グラフを描く<br>効果量(比率の差)を出す"]
  B --> C["期待度数の表を確認する"]
  C --> D{"期待度数が 1 未満のセルがある<br>または 5 未満が 20% を超える?"}
  D -->|"いいえ"| E["χ²検定(独立性)<br>2×2 なら<span class='jp-term jp-term-diagram' title='continuous'>連続性</span>補正は外す"]
  D -->|"はい"| F["Fisher 正確検定<br>(近似を使わない・保守的)"]
  E --> G["⭐ 比率の差と 95% <span class='jp-term jp-term-diagram' title='confidence interval'>信頼区間</span>を必ず併記する"]
  F --> G

⚠️ 1つのカテゴリを既知の分布と比べたいときは独立性の検定ではなく適合度検定、1つの2値の比率をと比べたいときは二項検定(→ 仮説検定の論理)である。表の形を先に決めれば、検定は自動的に決まる。

対応のあるカテゴリデータには χ²検定を使わない。 同一個体を2回測ったデータ(治療前後の陽性・陰性など)は独立ではないので、McNemar 検定を使う。連続量における対応のある t検定と同じ論点である。

まとめ

  • 2群の比率の比較はすべて分割表の問題になる。検定の前に分割表・棒グラフ・比率の差を見る。
  • χ²検定は χ2=∑(O−E)2/E\chi^2 = \sum (O-E)^2/E、df=(r−1)(c−1)df = (r-1)(c-1)。期待度数は周辺和から計算される。
  • は標本サイズではなく期待度数:1 未満のセルがなく、5 未満が 20% 以下。出力の期待度数の表で判定する。
  • Fisher 正確検定は近似を使わないのでいつでも使えるが、保守的で計算が重い。2×2 では期待度数がすべて 1 以上なら N−1N-1 補正の χ² のほうが検出力が高い。
  • 2×2 表の χ²検定における Yates 補正は不要に保守的。ソフトの既定を確認する。
  • χ² も Fisher も p値しか返さない。 効果の大きさも向きも別に計算する。
  • 効果量は比率の差(臨床判断に直結)、RR、OR。が頻繁なとき OR は RR を誇張する。
  • 比率の差のがの中心。0 を含まなければ有意、区間全体が relevance の閾値を超えていれば「有意かつ relevant」。
  • 読む順序は 効果量 → relevance → → p値。実習例では 14.5%ポイント(閾値 2% 超)、CI 9.3〜19.7%(0 も 2% も含まない)、p=3.1×10−15p = 3.1 \times 10^{-15}。
  • 検定は関連を示すだけで、因果の向きは臨床的な予備知識が決めている。

出典

  1. 1.Chi-squared and Fisher-Irwin tests of two-by-two tables with small sample recommendations(Statistics in Medicine・2007)2×2分割表では、期待度数がすべて1以上ならばN−1補正のPearson χ²検定を用いるべきであり、Fisher正確検定は保守的で検出力を失うため期待度数が1未満の場合に限るべきであること、およびYates連続性補正が不要に保守的であること閲覧 2026-08-17
  2. 2.The ASA Statement on p-Values: Context, Process, and Purpose(The American Statistician (American Statistical Association)・2016)p値だけでは効果の大きさも推定の精度も分からないため、効果量と信頼区間を併せて報告すべきであること閲覧 2026-08-17