私は大学では、博士号を取得するまでずっと物理学専攻でした。専門は非線形力学系でしたので、学生時代に推測統計を使ったことはありません。その後、研究分野を変えて、生体情報の研究を始めたばかりのころは、「統計検定は、みんな意味もよく分からずに使っているようで、何だかうさんくさいな」と感じていました。しかし、年を重ねるにつれ、研究発表や論文の出版において、面倒な文句を避けるために「とりあえず何か検定をして、p値を書いておこう」と考えるようになりました。
「みんなが信じているのだから、これでいいじゃないか」と自分に言い聞かせていますが、それでも、心の中のもやもやは消えません。
ということで、「真実はいつも... p値で判定できるとは限らない」というとで、今回は t検定 を簡単におさらいして、t検定のp値の分布を調べてみます。
言いたいポイントを先に言っておくと、下の図の数値実験結果のように、サンプル数が30例 vs 30例くらいあって、効果量が中程度と言われるような場合、p値が0.05以下になる割合は半分もないということです。もちろん差がでかい (効果量が大きい)と、p値が0.05未満になる割合が大きくなります。
以下の過去の記事も参考にしてください。
p値って何なの?:もう「統計的に有意」とは言わないで - ケィオスの時系列解析メモランダム
多重比較の問題を考える前に,p値の分布を見ておく - ケィオスの時系列解析メモランダム
どのようなときにt検定を使うか?
t検定は、2つのグループの平均値を比較するときに使う統計手法です。
例えば、次のような場合に使われます:
- 新しい薬が従来の薬よりも効果があるかどうかを調べる
- A社とB社の従業員の平均年収に差があるかを確認する
- 学生のテストの点数が、男子と女子で異なるかどうかを調べる
このように、2つのグループの平均値の違いが偶然なのか、それとも意味のある差なのかを判断するためにt検定を使います。
t検定の考え方
標本(サンプル)から平均値を計算するとき、それは偶然の誤差を含みます。そのため、2つの標本の平均が異なっていても、それが「本当に」異なるのか、単なる偶然なのかを確かめる必要があります。
統計的には、以下の仮説を立てて検定します:
- 帰無仮説(H₀): 2つの母集団の平均は同じである
- 対立仮説(H₁): 2つの母集団の平均は異なる
このタイプの検定では、標本の平均値の差が、帰無仮説が正しいとすれば、説明がどの程度困難かを考えます。つまり、「偶然では説明できないほど大きな差があるのか」を調べるために、t分布を使い、偶然の程度をp値を使って評価します。
t検定の数式
t検定では、以下の統計量を計算します。
独立2標本t検定
t値のわかりやすい解説は、どこにでもあると思いますので、今回は、2つの独立したグループの平均値を比較する場合のみ例として考えます。
この場合、t値は以下の式で計算されます:
ここで、
- ,
:2つのグループの標本平均
-
,
:2つのグループの不偏分散
-
,
:各グループのサンプルサイズ
また、自由度(df: degree of freedom)は次のように計算されます:
このt値と自由度を用いて、t分布を参照し、p値を計算します。
p値の計算方法
p値は、帰無仮説が正しいと仮定した場合に、観測されたt値以上の極端な値が得られる確率です。
p値は、次のようにして計算されます:
ここで、 は、自由度 df のt分布における両側確率です。
Rでは pt()
関数を使ってp値を求めることができます。
p_value <- 2 * (1 - pt(abs(t_value), df=df))
効果量(Cohenのd)の考え方と計算
p値が統計的に有意でも、その差が実際にどの程度重要なのかはわかりません。そこで、効果量(Cohenのd) を計算することで、差の大きさを測ります。
Cohenのdは、以下の式で計算されます:
ここで、
はプールされた標準偏差(pooled standard deviation)です。
Cohenのdの目安
よく使われる、Cohenのdの値の目安は次の通りです:
- 0.2:小さい効果
- 0.5:中程度の効果
- 0.8以上:大きな効果
私は、こんなの現象や、読む人によって感じ方が違うと思います。
Rを用いたt検定と効果量の計算
t検定の実施
# サンプルデータを作成 new_drug <- rnorm(20, mean=5, sd=2) # 新薬グループ old_drug <- rnorm(20, mean=3, sd=2) # 従来薬グループ # t検定の実施 t_result <- t.test(new_drug, old_drug) t_result
効果量の計算(Cohen's d)
# 各群の平均の計算 mean_new <- mean(new_drug) mean_old <- mean(old_drug) # 各群の標本サイズ n_new <- length(new_drug) n_old <- length(old_drug) # 各群の標本分散の計算 var_new <- var(new_drug) var_old <- var(old_drug) # プールされた標準偏差の計算 pooled_sd <- sqrt(((n_new - 1) * var_new + (n_old - 1) * var_old) / (n_new + n_old - 2)) # コーエンのdの計算 cohens_d <- (mean_new - mean_old) / pooled_sd # 結果の表示 cohens_d
3つ以上のグループを比較する場合
t検定は2群の比較ですが、3群以上を比較する場合は分散分析(ANOVA) など他の方法を使います。
p値とコーエンのdの分布
ここからが本題です。
各群の例数が10のときと、20のときの数値実験結果をのせておきます。30例の場合は、上の方にある最初の図です。
最後に一言
確率というのは、私たちの直感に反することが多く、理解するのがとても難しいものです。例えば、宝くじの1等が当たる確率は約1,000万分の1と、ほとんどゼロに近いように思えます。それでも、実際に当選者がいるため、「もしかしたら自分も」と期待してしまいます。しかし、同じ確率で何か悪いことが起こると言われると、「そんなことが起こるはずがない」と楽観視する人もいます。このように、確率の大きさを直感的に正しく使いこなすことは容易ではありません。
「リスク」も確率によって評価されますが、確率が低いからといって、人が必ずしも安心できるわけではありません。私は、原発事故があったとき福島県に住んでいました。科学的な知見では、放射性物質による健康への影響が出る確率は非常に低いとされています。しかし、それを聞いても、恐怖が消えるわけではありません。確率が低くても「ゼロではない」となると、不安が膨らんでしまうのです。これは、飛行機事故や地震などのリスクとも似ています。発生確率は低いと分かっていても、一度でも起これば命に関わるため、過剰に恐れてしまうのです。
確率は非常に抽象的な概念であり、私たちはそれを感覚的に捉えるのが苦手です。確率は便利ですが、使い方はとても難しいということです。