Dev Study
← 評価のための統計
レッスン 6 / 10·約 8 分·第22期 評価のための統計

p値は、何も変わっていない世界での珍しさ

リクエストがアプリケーションに届くまで
  1. ブラウザURL入力
  2. DNS名前→IP
  3. ルータ経路選択
  4. ロードバランサ振り分け
  5. Nginx受け口
  6. アプリ処理今ここ
  7. DB保存

この差は、何も変えなくても出る大きさではないのか。その問いを1つの数にしたのがp値です。

まず結論

p値は「何も変わっていない世界」で、いま見た差と同じかそれ以上の差が出る割合です。効果の大きさでも、改善が本物である確率でもありません。

統計的に有意になった結果のうち本物がどれだけあるかは、試す案のうち本当に効くものの割合と検出力で大きく変わります。p値だけからは出てきません。

? 読む前に予測

成約率が A 群 50/1000(5.0%)、B 群 68/1000(6.8%)でした。何も変わっていない(どちらの画面でも成約は同じ)と仮定したとき、1.8ポイント以上の差が出る割合はどれくらいでしょうか。

当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。

抽象原理

何も変わっていない世界を作って、数える

A 群 50/1000、B 群 68/1000。差は1.8ポイントです。問うべきは「この差は、何も変えなくても出る大きさではないのか」でした。

p値はこの問いを1つの数にします。ASA(米国統計協会)の声明は次のように定義しています。

Informally, a p-value is the probability under a specified statistical model that a statistical summary of the data (e.g., the sample mean difference between two compared groups) would be equal to or more extreme than its observed value.

「指定した統計モデルのもとで」が要です。ここでのモデルが「何も変わっていない世界」、つまりどちらの画面でも成約は同じという仮定です。ただしモデルには、利用者を無作為に割り付けた・1人の結果が他人に影響しない、といった前提も含まれます。p値が小さいとき疑わしくなるのは、「差が無い」かこれらの前提のどちらかです。

何も変わっていないなら、ある人に付いた「A」「B」のラベルは結果と無関係です。ならばラベルを混ぜて1000人ずつに分け直しても、同じ世界の別の1回になります。これを何度も繰り返し、1.8ポイント以上の差が出た割合を数える——これが並べ替え検定です。

並べ替え検定で「何も変わっていない世界」を作る
観測A 50/1000・B 68/1000、差 1.8pt
差が無いなら、ラベルは結果と無関係
成約118件を2000人に配り直す1000人ずつ A と B に分け直す
何度も繰り返して数える
1.8pt 以上の差が出た割合これがp値。厳密値 0.106
  • ・p値はデータの側の割合で、「差が無い」という仮説が正しい確率ではない
  • ・無作為割付・独立などの前提も、モデルの一部として仮定されている
具体実物

標準ライブラリだけで並べ替える

スクリプトは乱数の seed を引数に取り、2万回並べ替えます。後半では、ありうる分け方をすべて数えた厳密値と、よく使われる正規近似も出します。

l6-perm.py(全文)設定ファイル
# L6: permutation test A 50/1000 vs B 68/1000, seed from argv; plus exact (hypergeometric) value
import random, math, sys
from statistics import NormalDist
seed=int(sys.argv[1]); R=int(sys.argv[2]) if len(sys.argv)>2 else 20000
rng=random.Random(seed)
a=[1]*50+[0]*950; b=[1]*68+[0]*932
obs=sum(b)/1000-sum(a)/1000; pool=a+b; ext=0
for _ in range(R):
rng.shuffle(pool); d=sum(pool[1000:])/1000-sum(pool[:1000])/1000
ext+= abs(d)>=abs(obs)-1e-12
print(f"seed={seed} R={R} obs diff={obs*100:.1f}pt permutation p={ext/R:.4f}")
# exact: X = successes landing in B, hypergeometric N=2000 K=118 n=1000; |2X-118|>=18 <=> X>=68 or X<=50
N,K,n=2000,118,1000
den=math.comb(N,n)
pX=lambda x: math.comb(K,x)*math.comb(N-K,n-x)/den
exact=sum(pX(x) for x in range(0,K+1) if abs(2*x-K)>=18)
print(f"exact permutation (hypergeometric/Fisher two-sided symmetric) p={exact:.5f}")
p=(118)/2000; se=math.sqrt(p*(1-p)*2/1000); z=obs/se
print(f"pooled z={z:.4f} two-sided normal p={2*(1-NormalDist().cdf(abs(z))):.5f}")
$ python3 l6-perm.py 1 / 2 / 3(macOS・Python 3.14.6。Python 3.8.20 でも同一)コマンド出力
seed=1 R=20000 obs diff=1.8pt permutation p=0.1072
exact permutation (hypergeometric/Fisher two-sided symmetric) p=0.10633
pooled z=1.7082 two-sided normal p=0.08760
seed=2 R=20000 obs diff=1.8pt permutation p=0.1090
exact permutation (hypergeometric/Fisher two-sided symmetric) p=0.10633
pooled z=1.7082 two-sided normal p=0.08760
seed=3 R=20000 obs diff=1.8pt permutation p=0.1092
exact permutation (hypergeometric/Fisher two-sided symmetric) p=0.10633
pooled z=1.7082 two-sided normal p=0.08760

並べ替えの推定は seed ごとに 0.1072・0.1090・0.1092 と小数第3位で揺れます。厳密値は 0.10633 で動きません。p値の推定そのものにもばらつきがあるので、小数3桁を議論の芯にしないでください。

正規近似では 0.0876 と少し小さく出ますが、どの方法でも「10回に1回前後」です。相対で3割以上の改善に見える差が、何も変わっていない世界でもこの頻度で出ます。

✓ ここまでの確認

上の A/B 比較で p = 0.106 と出ました。この数の読み方として正しいのはどれですか。

抽象原理

p値が答えていない問い

p値は「差が無いとしたら、これ以上の差はどれだけ出るか」です。ところが知りたいのはたいてい逆向きの「差が出たとき、本当に効いているのはどれだけか」です。

ASA 声明の原則2は、p値は仮説が正しい確率でも、データが偶然だけで生じた確率でもないと述べます。原則5は、効果の大きさも結果の重要さも測らないと述べます。

逆向きの割合は、Kohavi らが Rule #2 の節で式にしています。有意水準を α、検出力を 1−β、試す案のうち本当に効くものの割合を π とすると、統計的に有意な結果のうち本物の割合は

(1−β)π ÷ ((1−β)π + α(1−π))

です。分子と分母に π が入っています。 p値の計算に π は出てこないので、p値だけからこの割合は出せません。

具体実物

同じ基準で、本物の割合を並べる

α = 0.05 に固定し、π と検出力を変えて計算しました。

有意な結果のうち本物の割合(α = 0.05)表
効く案の割合 π 検出力 有意のうち本物
1/3 0.8 0.889 (Kohavi らの 89%)
0.1 0.8 0.640
0.1 0.5 0.526
1/500 0.8 0.031 (Kohavi らの 3.1%)

1/3 は、Microsoft の複数実験で報告した平均の成功率として論文が挙げる値です。1/500 は、論文の Rule #1 が挙げる大きな躍進がその程度だとしたら、という仮定です。基準も検出力も同じまま、本物の割合が89%から3.1%まで動きます。

π = 0.1・検出力0.8を件数にすると構造が見えます。1000案のうち効く100案から80件、効かない900案から45件が有意になり、本物は 80 ÷ 125 = 0.64 です。

第15期で扱う警報の適合率も同じ形です。適合率は「鳴った警報のうち重大だった割合」、つまり鳴ったものを分母に取る量です。統計的に有意になることを「鳴った」と読み替えると、上の割合は有意という警報の適合率です。

✓ ここまでの確認

Kohavi らは、有意水準0.05・検出力80%という同じ条件でも、有意な結果のうち本物の割合が89%にも3.1%にもなると書いています。何が違うからですか。

⇄ 2つを見比べる
具体例 A

統計的に有意になった実験

p値は、効果が無いとしたら観測以上の差が出る割合。有意な実験のうち本物の割合は、試す案のうち効くものの割合 π と検出力で決まり、同じ α = 0.05 でも 0.031 から 0.889 まで動く。

具体例 B

鳴った警報

適合率は鳴った警報のうち重大な事象だった割合で、分母は鳴ったもの。再現率は重大な事象のうち鳴った割合で、分母は起きたもの。分母が違えば、同じ警報でも別の量になる。

p値が小さいことと、警報がよく当たることは、どこで同じ構造になっているでしょうか。

それぞれの割合で、分母に何を取っているかを比べてください。

この章のまとめ

  • p値は「何も変わっていない世界」で、観測と同じかそれ以上の差が出る割合。モデルには無作為割付などの前提も入る。
  • 5.0% 対 6.8%(各1000人)は、厳密値 p = 0.106。並べ替えの推定は seed で小数第3位が揺れる。
  • p値は仮説が正しい確率でも、偶然だけで生じた確率でも、効果の大きさでもない。
  • 有意のうち本物の割合は π と検出力 で決まり、同じ α でも 0.031 から 0.889 まで動く。警報の適合率と同じ「分母が鳴ったもの」の量。
  • p値を捨てるのも、閾値だけで決めるのも、どちらも外れ。

自分の現場で確かめる

読んだだけでは身につきません。手元の環境で実際に見てみてください。

環境:

理解度チェック

読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。

問題 1 / 2正解: 0

ASA 声明(2016)の原則5の説明に沿うのはどれですか。

用語集(3語)
p値
指定した統計モデル(ふつうは「何も変わっていない」という仮定と、無作為割付などの前提)のもとで、観測した要約値と同じかそれ以上に極端な値が出る確率。
並べ替え検定
群のラベルが結果と無関係だと仮定し、ラベルを並べ替えたときに観測以上の差が出る割合を数えてp値とする方法。
(統計的)検出力
本当に効果があるときに、統計的に有意になる割合。