本記事にはプロモーション(広告・アフィリエイトリンク)が含まれます。

この記事でわかること

💡 ポイント

  • Smirnov-Grubbs検定の中身:統計量 \(G=\max|x_i-\bar{x}|/s\) がどこから来て、棄却限界値がt分布からどう導かれるか。そして \(G\) には \((n-1)/\sqrt{n}\) という上限が存在すること
  • Rでの実装と出力の読み方outliers::grubbs.test() の実行結果(G = 3.00566、p値 1.886e-05)を手計算で検算するところまで
  • 検定が効かない3つの落とし穴:外れ値が2つあると検出できなくなるマスキング(実測 p = 0.103)、逐次適用による多重性、非正規データでの誤検出(対数正規で26.3%、指数分布で54.3%)
  • 既定の grubbs.test() は片側p値を返す:α=0.05で判定すると実質的な誤検出率が約10%になる、という実測シミュレーション結果
  • 規制上の使いどころ:FDAのOOSガイダンス(2022年5月改訂)が溶出試験・含量均一性への外れ値検定の適用を明確に否定していること、ICH E9 5.3節が求める「含めた解析と除いた解析の両方」の考え方

はじめに

データを眺めていて、1つだけ極端に離れた値が目に飛び込んでくることがあります。「これは測定ミスではないか」「除いてしまってよいのではないか」——そう思った瞬間が、統計解析でもっとも慎重にならなければならない場面です。

外れ値(outlier)の扱いが難しいのは、統計的な判定と、その値をどうするかという意思決定が、まったく別の問題だからです。統計は「この値はほかと比べて極端です」としか言いません。それが測定機器の不具合なのか、被験者固有の反応なのか、あるいは製品そのもののばらつきなのかは、統計量からは決してわかりません。にもかかわらず、検定が有意になったことを根拠に値を除いてしまう解析が、実務でもしばしば見られます。

製薬の現場では、この区別が規制上の要求として明文化されています。FDAのOOS(規格外試験結果)ガイダンスは外れ値検定に1つの節を割いて使ってよい場面と使ってはならない場面を書き分けており、ICH E9は外れ値の扱いを欠測値と同じ節で論じています。どちらも共通して求めているのは、「検定の結果ではなく、原因の調査と事前の取り決めで判断せよ」という一点です。

本記事では、外れ値検出の代表的手法であるSmirnov-Grubbs棄却検定(グラブス検定、Grubbs’ test)を軸に、数理的な導出、Rによる実装、そして規制上の位置づけまでを一本で扱います。掲載しているコードはすべてそのまま実行でき、出力は R 4.5.1 と outliers パッケージで実際に得られた値です。シミュレーションの数値も手元で再現できます。

とくに、検定が「効かない」場面を実測で確かめる節に力を入れました。外れ値検定は、正しく使える範囲がかなり狭い道具です。その境界を数値で把握しておくことが、実務で誤った除外をしないための最短ルートになります。

外れ値とは何か ― 「異常」と「本来のばらつき」を切り分ける

外れ値とは、データ集合の中でほかの観測値と比べて極端に離れた値のことです。ただし「極端」の基準に絶対的な定義はありません。ICH E9も、外れ値の統計的な定義はある程度恣意的なものだと明記しています。この一文は覚えておく価値があります。手法を変えれば外れ値の判定も変わる、というのが出発点だからです。

原因によって取るべき対応がまったく違う

実務で重要なのは「外れ値かどうか」ではなく「なぜその値が出たか」です。原因は大きく3つに分かれ、それぞれ対応が異なります。

原因具体例取るべき対応
測定・記録の誤り単位の取り違え、小数点位置のミス、機器の校正ずれ、試薬の劣化原因が特定できれば修正または除外。記録を必ず残す
対象そのもののばらつき個体差、製品のロット間差、代謝能力の個人差除外してはならない。それこそが評価すべき対象
別の母集団の混入選択基準を満たさない被験者、取り違えた検体、別ロットの混入解析対象集団の定義に立ち返る。感度分析で影響を示す

外れ値検定が判別できるのは「ほかと比べて離れているか」だけであり、この3つのどれに当たるかは一切教えてくれません。FDAガイダンスも、外れ値の理由を試験手順の誤りだと決めつけてはならず、対象そのものに内在するばらつきである可能性を常に考えるべきだと述べています。

⚠️ 注意
「外れ値=誤り」という前提でデータを見始めると、本来の発見を捨ててしまいます。新規性のある副作用、特定のサブグループでの反応、製造工程の異常——いずれも最初は1つの外れた値として現れます。検定は調査を始める合図であって、除外の許可証ではありません。

1つの値が推定量をどれだけ動かすか

抽象論だけでは実感が湧かないので、数値で確認します。溶出試験を模した12ユニットのデータを使い、極端に低い1点を含む場合と除いた場合を比べてみます。

diss <- c(87.2, 89.5, 91.0, 88.3, 90.4, 86.9,
          92.1, 89.8, 88.0, 90.9, 91.5, 72.4)
diss2 <- diss[diss != min(diss)]

rbind(with_outlier = c(mean = mean(diss), sd = sd(diss),
                       lower95 = t.test(diss)$conf.int[1],
                       upper95 = t.test(diss)$conf.int[2]),
      without      = c(mean = mean(diss2), sd = sd(diss2),
                       lower95 = t.test(diss2)$conf.int[1],
                       upper95 = t.test(diss2)$conf.int[2]))
                 mean       sd  lower95  upper95
with_outlier 88.16667 5.245662 84.83373 91.49960
without      89.60000 1.774824 88.40766 90.79234

📝 解釈・補足
12点のうちたった1点を除いただけで、平均は 88.17 から 89.60 へ1.43ポイント動き、標準偏差は 5.25 から 1.77 へ約3分の1になりました。95%信頼区間の幅は 6.67 から 2.39 へ縮んでいます。

注目すべきは平均よりも標準偏差の変化です。標準偏差は検定統計量の分母、サンプルサイズ設計の入力値、管理図の管理限界——ほぼすべての計算に効いてきます。外れ値を1点除くか残すかは、その後の意思決定の広い範囲を静かに書き換えてしまう、ということです。だからこそ除外の判断は解析前に決めておく必要があります。

12ユニットの溶出率のドットプロット。11点が87〜92%に集まる中、1点だけ72.4%と大きく下方に外れており、Grubbs検定の統計量はG=3.01となる

数値のばらつきを目で確認する方法については、箱ひげ図をSASとRで実装する方法グラフで理解する統計:可視化の力もあわせてご覧ください。検定にかける前にまず図にする、という習慣が誤判定を大きく減らします。

Smirnov-Grubbs検定の数理 ― 検定統計量と棄却限界値

名前の整理から

この検定は、日本語では「スミルノフ・グラブス検定」「グラブス検定」「グラブス・スミルノフ検定」と複数の呼び方が混在しています。英語圏では Grubbs’ test、あるいは統計量の性質から ESD検定(extreme studentized deviate test) と呼ばれます。呼称は違っても中身は同じものと考えて差し支えありません。

なお、名前が似ているKolmogorov–Smirnov検定はまったく別の検定です。あちらは分布そのものが想定と一致するかを見る検定で、外れ値の検出を目的としていません。詳しくはKolmogorov–Smirnov検定:平均の差だけでは見えない「分布の違い」をとらえる方法で解説しています。

仮説と検定統計量

Smirnov-Grubbs検定は、\(n\) 個の観測値が正規分布 \(N(\mu,\sigma^2)\) からの無作為標本であることを帰無仮説とします。対立仮説は「1つだけ、その分布に属さない値が混じっている」です。

検定統計量は、平均から最も離れた値の、標準偏差で測った距離です。

\[G=\frac{\max_i|x_i-\bar{x}|}{s}\]

ここで \(\bar{x}\) は標本平均、\(s\) は標本標準偏差(不偏分散の平方根)を意味します。要するに「平均から何個分の標準偏差だけ離れているか」を測っているだけで、考え方そのものは素朴です。

棄却限界値はt分布から導かれる

\(G\) の分布は、正規性の仮定のもとで自由度 \(n-2\) のt分布と結びつきます。有意水準 \(\alpha\)(両側)に対する棄却限界値は次の形になります。

\[G_{\text{crit}}=\frac{n-1}{\sqrt{n}}\sqrt{\frac{t_{\alpha/(2n),\,n-2}^{2}}{n-2+t_{\alpha/(2n),\,n-2}^{2}}}\]

ここで \(t_{\alpha/(2n),\,n-2}\) は自由度 \(n-2\) のt分布の上側 \(\alpha/(2n)\) 点を意味します。分母に \(2n\) が現れるのは、どの観測値が外れ値になるかを事前に決めていないぶんの多重性をBonferroni的に補正しているためです。「最大の値だけを見る」のではなく「\(n\) 個のうちどれかが最大になる」ことを織り込んでいる、と読むと自然です。t分布そのものの導出についてはt検定の数理的導出とRによる実装例で扱っています。

\(G\) には理論的な上限がある

見落とされがちですが、\(G\) はいくらでも大きくなれるわけではありません。標本標準偏差は外れ値自身の影響も受けるため、\(G\) には

\[G\le\frac{n-1}{\sqrt{n}}\]

という上限があります。この事実は実務上とても重要です。サンプルサイズが小さいと、上限そのものが棄却限界値に近づいてしまい、どんなに極端な値が入っていても有意にならないという状況が起こります。次の表で確認しましょう。

gcrit <- function(n, alpha = 0.05, two.sided = TRUE) {
  a <- if (two.sided) alpha / (2 * n) else alpha / n
  t <- qt(a, n - 2)
  (n - 1) / sqrt(n) * sqrt(t^2 / (n - 2 + t^2))
}
ns <- c(3, 5, 8, 10, 12, 15, 20, 30, 50, 100)
data.frame(n = ns,
           Gcrit05 = round(sapply(ns, gcrit), 3),
           Gcrit01 = round(sapply(ns, gcrit, alpha = 0.01), 3),
           upper   = round((ns - 1) / sqrt(ns), 3))
     n Gcrit05 Gcrit01 upper
1    3   1.154   1.155 1.155
2    5   1.715   1.764 1.789
3    8   2.127   2.274 2.475
4   10   2.290   2.482 2.846
5   12   2.412   2.636 3.175
6   15   2.548   2.806 3.615
7   20   2.708   3.001 4.249
8   30   2.908   3.236 5.295
9   50   3.128   3.482 6.930
10 100   3.384   3.754 9.900
📝 解釈・補足
\(n=3\) では上限が 1.155 なのに対し、α=0.05 の棄却限界値は 1.154。両者の差はわずか 0.001 しかなく、実質的に3点のデータで外れ値を検出することは不可能だとわかります。α=0.01 に至っては上限と限界値が一致しており、絶対に棄却できません。

\(n=5\) でも上限 1.789 に対して限界値 1.715 と余裕がほとんどありません。一方 \(n=20\) では上限 4.249 に対し限界値 2.708 と十分な差が開きます。外れ値検定が意味を持つのは、おおむね10点以上、できれば20点以上——この感覚を持っておくと、少数例のデータで検定にかけて「有意でないから外れ値ではない」と結論する誤りを避けられます。FDAガイダンスがSOPに「統計的に意味のある評価に必要な最小の結果数」を規定せよと求めているのは、まさにこの性質があるためです。

RによるSmirnov-Grubbs検定の実装

grubbs.test() を実行する

Rでは outliers パッケージの grubbs.test() で実行できます。先ほどの12ユニットのデータを使います。

install.packages("outliers")
library(outliers)

diss <- c(87.2, 89.5, 91.0, 88.3, 90.4, 86.9,
          92.1, 89.8, 88.0, 90.9, 91.5, 72.4)
grubbs.test(diss)

	Grubbs test for one outlier

data:  diss
G = 3.00566, U = 0.10407, p-value = 1.886e-05
alternative hypothesis: lowest value 72.4 is an outlier

出力は4つの部分に分かれます。G が検定統計量、U は外れ値を除いた分散と全体の分散の比(小さいほど、その1点が分散を大きく膨らませていることを意味します)、p-value がp値、最終行が「どの値が外れ値候補か」です。ここでは最小値 72.4 が候補として挙がっています。

p値の読み方に不安がある方は、p値を正しく理解するもあわせてご覧ください。

出力を手計算で検算する

パッケージの出力をそのまま信じるのではなく、定義式から再現できるか確かめておきます。

n <- length(diss)
G <- max(abs(diss - mean(diss))) / sd(diss)
alpha <- 0.05
tcrit <- qt(alpha / (2 * n), n - 2)
Gcrit <- (n - 1) / sqrt(n) * sqrt(tcrit^2 / (n - 2 + tcrit^2))
c(G = G, Gcrit = Gcrit, reject = G > Gcrit)
       G    Gcrit   reject 
3.005658 2.411560 1.000000 
📝 解釈・補足
手計算の \(G=3.005658\) は grubbs.test()G = 3.00566 と一致しました。棄却限界値 2.411560 を上回っているため、有意水準5%で「72.4 は外れ値である」と判定されます。

なお \(n=12\) の理論的上限は 3.175 です。今回の \(G=3.01\) はその95%に達しており、この検定でこれ以上大きな値は原理的にほとんど出ません。1点が極端に外れているとき、\(G\) はすぐ天井に張り付くという感覚がつかめます。

既定では片側p値が返ることに注意

ここが実務で最も間違えやすい点です。grubbs.test() の既定は片側検定であり、返されるp値は両側の半分になります。

c(default_p  = grubbs.test(diss)$p.value,
  twosided_p = grubbs.test(diss, two.sided = TRUE)$p.value)
   default_p   twosided_p 
1.886159e-05 3.772318e-05 
⚠️ 注意
両側p値は片側のちょうど2倍です。「上振れも下振れもありうる」という通常の設定で既定のまま α=0.05 と比べてしまうと、実質的には10%水準で検定していることになります。後述のシミュレーションで、この影響が実際にどれだけ出るかを数値で確認します。上側だけ(あるいは下側だけ)を問題にする明確な理由がない限り、two.sided = TRUE を明示してください。

正規性の確認と逐次適用

Smirnov-Grubbs検定は正規性を仮定するため、外れ値候補を除いた残りが正規分布とみなせるかを確認しておきます。

diss2 <- diss[diss != min(diss)]
shapiro.test(diss2)

	Shapiro-Wilk normality test

data:  diss[diss != min(diss)]
W = 0.94327, p-value = 0.5596

p値 0.5596 で正規性は棄却されず、残りの11点は正規分布として扱ってよさそうだと判断できます。この確認を先にやっておくと、検定結果の解釈が一段確かなものになります。

続いて、除いたあとの11点にもう一度検定をかけてみます。

grubbs.test(diss2)

	Grubbs test for one outlier

data:  diss2
G = 1.52128, U = 0.74543, p-value = 0.6241
alternative hypothesis: lowest value 86.9 is an outlier

📝 解釈・補足
2回目のG値は 1.52128、p値は 0.6241 で有意ではありません。「次の候補」として挙がった 86.9 は、単に11点の中で平均から最も遠かっただけの通常の値です。

ここで重要なのは、検定は常に「最も離れた値」を候補として名指しするという点です。出力の最終行に値が表示されること自体は、その値が異常であることを意味しません。有意でなければ、そこで手を止めるのが正しい読み方です。

検定が効かない3つの落とし穴

ここからが本題です。Smirnov-Grubbs検定は、正しく使える範囲がかなり限られています。3つの典型的な失敗を実測で確認します。

外れ値が2つあると検出できなくなる(マスキング)

先ほどのデータで、低い側の外れ値をもう1点増やしてみます。直感的には「より明らかに外れている」はずです。

mask <- c(87.2, 89.5, 91.0, 88.3, 90.4, 86.9,
          92.1, 89.8, 88.0, 90.9, 72.4, 71.8)
grubbs.test(mask)

	Grubbs test for one outlier

data:  mask
G = 2.12718, U = 0.55125, p-value = 0.1029
alternative hypothesis: lowest value 71.8 is an outlier

マスキングの図解。外れ値1点ではp=0.0000189で検出できるが、外れ値が2点になるとp=0.103となり検出できなくなることを2枚の散布図で比較
⚠️ 注意:これがマスキングです
外れ値が1つのときは p = 0.0000189 で明確に検出できたのに、外れ値を2つに増やした途端 p = 0.1029 となり、有意ではなくなりました。より異常なデータなのに検出できないという、直感に反する結果です。

理由は分母にあります。2つ目の外れ値が標準偏差を 5.25 から 6.92 へ押し上げるため、\(G\) が 3.01 から 2.13 へ下がってしまうのです。外れ値どうしが互いを隠してしまうこの現象をマスキング(masking)と呼びます。「Grubbs検定が有意でなかったので外れ値はない」という結論が、いかに危ういかがわかります。

対処法の1つは、2点同時を対象とする type = 20 の検定を使うことです。

grubbs.test(mask, type = 20)

	Grubbs test for two outliers

data:  mask
U = 0.052227, p-value < 2.2e-16
alternative hypothesis: lowest values 71.8 , 72.4 are outliers

2点まとめて評価すると p < 2.2e-16 で明確に検出できました。ただし、これは「外れ値が2つあるらしい」と事前に見当をつけられた場合の話です。何点あるかわからない状況では、後述の一般化ESD検定やロバストな指標のほうが現実的です。まず図にするという基本が、ここでも効いてきます。

逐次適用と片側既定による誤検出率の上昇

「有意なら除いて、また検定する」という逐次適用は広く行われていますが、多重性の問題を抱えます。正規分布から発生させたデータ(=外れ値が1つもないデータ)に対して、どれくらいの割合で誤って外れ値を検出してしまうかを実測しました。

fp <- function(n, two.sided, sequential, alpha = 0.05, B = 10000) {
  mean(replicate(B, {
    x <- rnorm(n, 100, 5); flagged <- FALSE
    repeat {
      if (length(x) < 3) break
      p <- grubbs.test(x, two.sided = two.sided)$p.value
      if (is.na(p) || p >= alpha) break
      flagged <- TRUE
      if (!sequential) break
      x <- x[-which.max(abs(x - mean(x)))]
    }
    flagged
  }))
}
rbind(
  `1回のみ` = c(片側既定 = fp(20, FALSE, FALSE), 両側 = fp(20, TRUE, FALSE)),
  `逐次適用` = c(片側既定 = fp(20, FALSE, TRUE),  両側 = fp(20, TRUE, TRUE))
)
         片側既定   両側
1回のみ    0.0989 0.0673
逐次適用   0.1027 0.0701
📝 解釈・補足
外れ値が1つも存在しない純粋な正規データ(n=20)を10,000回生成した結果です。

まず既定のまま1回だけ適用しても誤検出率は9.89%で、公称の5%の約2倍になっています。原因は前述の片側p値です。two.sided = TRUE を指定すると 6.73% まで下がります(それでも5%をやや上回るのは、この実装のp値が近似計算であるためです)。

逐次適用による上乗せは、片側既定で 9.89%→10.27%、両側で 6.73%→7.01% と、0.3ポイント程度にとどまりました。つまり実務でよく心配される「逐次適用の多重性」よりも、片側既定を見落としていることのほうが影響が大きいという結果です。まず two.sided = TRUE を書く。これだけで誤検出はおよそ3ポイント減ります。多重性という考え方そのものについては多重比較法の基礎と活用で整理しています。

正規分布でないデータでの誤検出

3つ目の落とし穴が最も深刻です。Smirnov-Grubbs検定は正規性を前提としているため、右に裾を引く分布に適用すると、正常な値を次々と外れ値と判定してしまいます。

sim_dist <- function(gen, B = 10000, alpha = 0.05) {
  mean(replicate(B, grubbs.test(gen())$p.value < alpha))
}
c(normal      = sim_dist(function() rnorm(20, 100, 5)),
  lognormal   = sim_dist(function() rlnorm(20, log(100), 0.30)),
  exponential = sim_dist(function() rexp(20, 1 / 100)))
     normal   lognormal exponential 
     0.0981      0.2625      0.5428 
⚠️ 注意
正規分布では 9.81%(前述のとおり既定は片側なので約10%)だった誤検出率が、対数正規分布では 26.25%、指数分布では 54.28% まで跳ね上がります。指数分布では2回に1回以上、外れ値でもない値が「外れ値だ」と判定されている計算です。

これは製薬の実務で決して他人事ではありません。薬物動態のAUCやCmax、抗体価、細菌数、酵素活性、そして多くのバイオマーカーは対数正規に近い分布をとります。生データのままGrubbs検定にかけると、正常な高値を機械的に除外してしまう危険があります。対処は単純で、対数変換してから正規性を確認し、その上で検定します。

他の外れ値検出法との使い分け

Smirnov-Grubbs検定だけに頼らず、性質の違う方法を組み合わせるのが実務的です。先ほどマスキングが起きたデータで、代表的な3つの方法を比較してみます。

detect <- function(x) {
  q <- quantile(x, c(0.25, 0.75)); iqr <- q[2] - q[1]
  box <- x < q[1] - 1.5 * iqr | x > q[2] + 1.5 * iqr
  sd3 <- abs(x - mean(x)) > 3 * sd(x)
  hmp <- abs(x - median(x)) / mad(x) > 3
  data.frame(value = x, boxplot = box, sd3 = sd3, hampel = hmp)
}
subset(detect(mask), boxplot | sd3 | hampel)
   value boxplot   sd3 hampel
11  72.4    TRUE FALSE   TRUE
12  71.8    TRUE FALSE   TRUE
📝 解釈・補足
Grubbs検定が見逃した2点(71.8 と 72.4)を、箱ひげ図の1.5×IQR基準とHampel基準(中央値からのずれをMADで割る)はどちらも正しく検出しました

一方、よく使われる「平均±3SD」は2点とも FALSE、つまり1つも検出できていません。平均も標準偏差も外れ値自身に引きずられるためで、これをスワンピング(swamping)と呼びます。中央値とMADは外れ値の影響をほとんど受けないので、この弱点がありません。

実務上の含意は明快です。外れ値が複数あるかもしれない状況では、平均と標準偏差に基づく方法(3SD法・Grubbs検定)を単独で使わないこと。まず箱ひげ図とHampel基準で当たりをつける、という順序が安全です。

手法前提強み弱み・注意
Smirnov-Grubbs検定正規分布・外れ値は1つp値が出るので事前規定した判定基準に載せやすいマスキングに弱い。n<10では検出力がほぼない
Dixonのq検定正規分布・小標本(n=3〜30程度)標準偏差を使わないため計算が簡単やはりマスキングに弱い。outliers::dixon.test()
一般化ESD検定正規分布・外れ値は最大k個個数を決め打ちせずに複数検出できる上限kの指定が必要。EnvStats::rosnerTest()
箱ひげ図(1.5×IQR)なし(分布によらない)マスキングに強い。図でそのまま示せるp値が出ない。歪んだ分布では検出が増えやすい
Hampel基準(中央値・MAD)なし(分布によらない)最も頑健。複数外れ値でも崩れない閾値3の根拠は慣習的。同値が多いとMAD=0になる
平均±3SD正規分布計算が容易で説明しやすいスワンピングに極めて弱い。単独使用は非推奨

回帰分析の文脈では、単に値が離れているかではなく「その1点がモデルの推定にどれだけ影響しているか」を見る必要があります。てこ比(leverage)やCookの距離といった指標が使われる領域で、線形回帰の“本質”をつかむで残差診断とあわせて解説しています。また、外れ値の影響を受けにくい解析に切り替えるという発想も有効で、順位に基づく手法をまとめたノンパラメトリック検定の代表格:ウィルコクソン検定の数理と実装や、スペアマンの順位相関係数が参考になります。

規制の観点 ― FDAとICH E9が求める外れ値の扱い

ここまで統計的な性質を見てきましたが、製薬の実務では「検定で有意だったから除外する」は通りません。規制側の要求は、統計的判定よりもはるかに厳格です。

FDAのOOSガイダンスは適用範囲を明確に限定している

FDAの「Investigating Out-of-Specification (OOS) Test Results for Pharmaceutical Production」(2022年5月、Revision 1)は、試験結果の報告と解釈に関する節の中で、外れ値検定に独立した項目を設けています。要点は次のとおりです。

場面FDAの立場
ばらつきの大きい生物学的アッセイ外れ値検定は適切な統計解析になりうる。USP<111>が方法を記載しており、この場合は計算から除外される
バリデート済みの化学試験(均質な試料)検定は原因を特定しないため、疑わしい結果を無効化する根拠に使ってはならない。平均からの距離を把握する参考情報としてのみ許容
溶出試験・含量均一性・放出速度適用できない。製品のばらつきそのものを評価する試験であり、外れ値に見える値が不均一な製品の正確な測定結果である可能性がある
共通の要求使用の可否を事前に決め、SOPに具体的な検定名・パラメータ・統計的評価に必要な最小結果数まで規定しておくこと
⚠️ 本記事の例題は「使ってはいけない」典型例です
ここまで溶出率のデータでGrubbs検定を実行してきましたが、溶出試験はFDAが外れ値検定の適用を明確に否定している用途です。統計量は G = 3.01、p = 0.0000189 と明確に有意でしたが、この結果をもって 72.4 を除外することは規制上認められません。溶出のばらつきこそが評価対象だからです。

「統計的に有意であること」と「除外してよいこと」がまったく別物であることを示すために、あえてこの題材を使いました。外れ値検定はデータの性質を理解する道具であって、結果を消す道具ではありません。なお、化学試験における外れ値検定でのアッセイ結果の無効化は、1993年のBarr Laboratories判決を参照する形で明確に否定されています。

ICH E9は「両方の解析を示せ」と求めている

臨床試験の側では、ICH E9「臨床試験のための統計的原則」の5.3節が、欠測値と外れ値をまとめて扱っています。同節の要点は4つです。

  • 外れ値の統計的な定義は、ある程度恣意的なものである
  • ある値を外れ値と明確に位置づけられるのは、統計的だけでなく医学的にも正当化できる場合であり、医学的な文脈がしばしば適切な対応を決める
  • 実施計画書や統計解析計画書に定める外れ値の処理手順は、いずれの治療群にも事前に有利にならないものでなければならない
  • 事前に手順が定められていなかった場合は、実測値を用いた解析と、外れ値の影響を除外または低減した解析の少なくとも2つを実施し、その差を議論する

最後の項目が実務上もっとも重要です。事前規定がないまま外れ値を除いた解析だけを提出することは認められません。含めた解析と除いた解析の両方を示し、結論が変わらないことを確認する——これは欠測値の扱いと同じ発想であり、感度分析そのものです。関連して多重代入法(Multiple Imputation)とは?もあわせて読むと、ICH E9が両者を同じ節で扱っている理由が見えてきます。

外れ値に出会ったときの判断フロー図。まず図にする、分布を確認する、検定は補助として使う、原因を調査する、と進み、溶出・含量均一性・放出速度ではFDAの基準により除外しない、臨床試験ではICH E9に従い含めた解析と除いた解析の両方を示す、最後に判断の根拠を記録に残す

🔑 まとめ・実務ポイント
外れ値に出会ったときの手順を、順序どおりに整理します。

1. まず図にする:検定の前に散布図・箱ひげ図で全体を見る。外れ値が1つなのか複数なのかで、使うべき手法が変わります
2. 分布を確認する:右に裾を引くなら対数変換してから。生データのままの検定は誤検出の温床です
3. 検定は補助として使うtwo.sided = TRUE を明示し、n が10未満なら検定の結論には頼らない
4. 原因を調査する:ここが本体です。試験記録、機器のログ、被験者背景を確認する。統計量は原因を教えません
5. 除外の可否を規制の観点で判断する:溶出・含量均一性・放出速度では除外しない。臨床試験なら事前規定の有無を確認する
6. 両方の解析を示す:含めた場合と除いた場合の結果を並べ、結論が頑健であることを示す
7. すべて記録する:判断の根拠と経緯を文書に残す。後から説明できない除外は、除外しなかった場合より大きなリスクになります

よくある質問

Q. 何点あれば外れ値検定を使えますか。
理論的には3点から計算できますが、前掲の表のとおり n=3 では棄却限界値と統計量の上限がほぼ一致し、検出は事実上不可能です。n=5 でも余裕がわずかしかありません。10点以上、できれば20点以上を目安にしてください。FDAガイダンスがSOPに最小結果数の規定を求めているのは、この性質を踏まえたものです。

Q. 有意だった値を除いて、また検定してよいですか。
逐次適用による誤検出率の上乗せは、実測では0.3ポイント程度と大きくありませんでした。ただし、マスキングによって2回目以降の結果が信頼できなくなる問題は残ります。外れ値が複数疑われる場合は、逐次適用ではなく EnvStats::rosnerTest() による一般化ESD検定を使うほうが素直です。

Q. Dixonのq検定とGrubbs検定はどちらを使うべきですか。
どちらも正規性を仮定し、マスキングに弱いという点で同じ弱点を持ちます。Dixonは小標本向けに簡便さを優先した方法で、Grubbsのほうが汎用的です。重要なのはどちらを選ぶかより、SOPや解析計画書に「どちらを、どのパラメータで使うか」を事前に書いておくことです。

Q. 対数正規に見えるデータは、対数変換してからGrubbs検定にかけてよいですか。
はい、それが標準的な対処です。変換後に shapiro.test() で正規性を確認してから検定してください。生データのまま実行すると、実測のとおり26%前後の誤検出が生じます。

Q. 臨床試験の検査値データに使ってよいですか。
データクリーニングの段階で「確認すべき値を洗い出す」目的なら有用です。ただし解析対象から値を落とす根拠にはなりません。ICH E9 5.3節が求めるとおり、事前規定がなければ含めた解析と除いた解析の両方を示す必要があります。

Q. 検定が有意でなければ、外れ値はないと言えますか。
言えません。マスキングの例では、外れ値を2つに増やしたほうが p = 0.103 と有意でなくなりました。有意でないことは「外れ値がないこと」の証明にはなりません。図とロバストな指標による確認を併用してください。

参考書籍

外れ値の扱いは、統計手法の知識と規制・実務の知識が交差する領域です。次の3冊を、目的別に挙げておきます。

『医学への統計学』古川俊之 監修・丹後俊郎 著(朝倉書店)
医学・製薬の現場で使う統計を、考え方から順に説明してくれる定番書です。本記事で扱った「調査や実験の計画段階で取り決めを決めておく」という発想が全体を貫いており、外れ値をどう扱うかを解析前に決めるべき理由が、統計手法の側から理解できます。記述統計・分布・検定と積み上がる構成なので、Grubbs検定の前提である正規性の仮定がどこから来ているのかを確認する用途にも向きます。実務で判断を求められる立場の方に、手元に置いておく1冊としておすすめします。
『入門 機械学習による異常検知 ― Rによる実践ガイド ―』井手剛(コロナ社)
本記事で扱った内容を、そのまま先へ延長できる一冊です。第2章が正規分布に従うデータからの異常検知にあてられており、本記事のGrubbs検定はその入口に位置します。続く第3章では非正規データを扱うので、対数正規で誤検出が26%に達した節の答えがここにあります。すべてRのコード付きで進むため、grubbs.test() の次に何を書けばよいかがわかります。多変量や時系列への拡張まで含めて、外れ値検出を体系として学びたい方に最適です。
『統計学入門(基礎統計学Ⅰ)』東京大学教養学部統計学教室 編(東京大学出版会)
本記事の数理パートを土台から支える定番教科書です。標本平均と標本標準偏差の分布、t分布の導出、そして検定の考え方が順に積み上がるので、棄却限界値がなぜt分布から出てくるのかが腑に落ちます。中央値・四分位範囲といった記述統計の章は、Hampel基準や箱ひげ図がなぜ頑健なのかを理解する助けになります。手法を1つずつ覚えるのではなく、前提と限界をセットで判断できるようになりたい方に。

生物統計家のキャリアについて相談したい方へ

製薬企業・CROでのキャリア、未経験からの転職、実務で必要になるスキルの伸ばし方について、現役の生物統計家が個別にご相談をお受けしています。

キャリア相談の詳細を見る →

関連記事・次のステップ

外れ値の話は、記述統計・検定・回帰診断・規制対応のすべてに接しています。関心のある方向から読み進めてください。

まず手元のデータを目で確かめたい方には、箱ひげ図をSASとRで実装する方法が本記事の直接の続きになります。1.5×IQR基準がどう描かれているかを知っておくと、検定の結果と図の見え方のずれを説明できるようになります。可視化全般はグラフで理解する統計:可視化の力にまとめています。

分布そのものを検定する話に興味が向いた方は、名前の似ているKolmogorov–Smirnov検定へ。外れ値検出とは目的がまったく違うことがはっきりします。検定の土台であるt分布と、p値そのものの意味はt検定の数理的導出とRによる実装例p値を正しく理解するで扱っています。

外れ値に強い解析へ切り替えたい方には、順位に基づくウィルコクソン検定の数理と実装スペアマンの順位相関係数が実践的です。回帰の文脈で影響の大きい観測値を扱うなら線形回帰の“本質”をつかむを。

規制・実務の側面を深めたい方は、外れ値と同じICH E9 5.3節で扱われる欠測値の多重代入法(Multiple Imputation)とは?、多重性の考え方を整理した多重比較法の基礎と活用が近いテーマです。再試験をすると値が中心に戻りやすいという現象の背景は平均への回帰とは何かで解説しており、OOS調査の再試験を解釈する際に効いてきます。

検定手法をひととおり見直したい方は、母相関係数の検定と信頼区間比率の差の検定と信頼区間統計検定準1級「ノンパラメトリック法」攻略統計検定準1級「分散分析・実験計画法」攻略もあわせてどうぞ。

まとめ

本記事では、外れ値検出の代表的手法であるSmirnov-Grubbs棄却検定を、数理・実装・規制の3方向から整理しました。

統計量 \(G=\max|x_i-\bar{x}|/s\) は平均からの距離を標準偏差で測った素朴な指標であり、棄却限界値は自由度 \(n-2\) のt分布から、どの点が外れるかわからないぶんの多重性を織り込んで導かれます。\(G\) には \((n-1)/\sqrt{n}\) という上限があるため、n=3 では棄却限界値 1.154 と上限 1.155 がほぼ一致し、検出は事実上不可能でした。Rでの実行結果 G = 3.00566 は手計算の 3.005658 と一致し、定義式から再現できることも確認しました。

同時に、この検定が効かない場面を実測で示しました。外れ値を1点から2点に増やすと p = 0.0000189 が p = 0.1029 に転じるマスキング、既定が片側p値であるために誤検出率が9.89%に達すること、対数正規データでは26.25%、指数分布では54.28%まで跳ね上がる正規性からの逸脱への脆さ。そして平均±3SD法は2つの外れ値をどちらも検出できず、箱ひげ図とHampel基準は両方を検出しました。外れ値が複数あるかもしれない状況で、平均と標準偏差に基づく手法を単独で使ってはいけない——これが実測から得られる最も実務的な教訓です。

規制の観点はさらに厳格でした。FDAのOOSガイダンスは、溶出試験・含量均一性・放出速度への外れ値検定の適用を明確に否定しています。本記事で溶出率のデータを使い、統計的には p = 0.0000189 で有意になったにもかかわらず、その値を除外できないことを示したのは、この一点を実感していただきたかったためです。ICH E9も、外れ値の統計的定義は恣意的であり、医学的な正当化を伴って初めて説得力を持つと述べ、事前規定がない場合には含めた解析と除いた解析の両方を求めています。

結局のところ、外れ値検定が答えるのは「ほかと比べて離れているか」という限られた問いだけです。その値をどう扱うかを決めるのは、原因の調査と、解析前に定めた取り決めです。検定は調査の入口を教えてくれる道具として使い、判断の根拠は必ず記録に残す。この姿勢を保つことが、統計的にも規制的にも説明できる解析につながっていきます。まずは手元のデータを図にするところから、本記事のコードを試していただければと思います。

ABOUT ME
tomokichi
外資系製薬会社で生物統計家として働ている1児のパパ。生物統計家とは何か、どのようなスキルが必要か、何を行っているのかを共有していきたいと思っております!生物統計に関する最新情報を皆様にお届けすべく、日々奮闘中です。趣味は筋トレ、温泉巡り、家族と散歩。