オーバーディスパージョン入門:原因・検出・対処法
Poisson 回帰で平均は合っているのに、標準誤差だけが妙に小さい。そんな夜があった。広告クリックのレポートで有意差が出たのに、翌週には消えた。原因は過分散だった。最後に VMR を確認したのはいつだろう?
過分散は Var(Y) > E[Y] という「平均=分散」の破れである。放置すると推定の不確実性が過小になり、意思決定がぶれる[1]。この記事では原因を分解し、最短で診断して対処する手順を示す。
TL;DR
- 過分散は Var(Y) > E[Y] の状態で、Poisson 回帰では標準誤差が小さく見えやすい[1]
- 主要因は未観測ヘテロジニティ、強度の確率変動、依存・クラスタリング、ゼロ過剰の 4 つ
- VMR と Pearson 分散比は一次診断の体温計である。1 からのずれと原因仮説を結びつける
- Quasi-Poisson は尤度がないため AIC で比較できない。QAIC など代替指標を使う[13]
- 結論は判断フローで素早く絞る。Poisson のままにしない
背景・課題(Why)
カウントデータは業務の中心にある。広告クリック、障害件数、購買回数。Poisson 回帰は便利だが「平均=分散」を前提にしている[2]。実務ではこの前提が崩れやすい。崩れたまま推定すると信頼区間が細く見え、誤った確信につながる。
課題を数式で固定する。
H0: Var(Y) = E[Y]
H1: Var(Y) > E[Y]
指標:
- VMR = Var(Y) / E[Y]
- Pearson 分散比 = χ2 / df
意思決定:
- VMR や分散比が 1 から有意に上振れたら、原因仮説を立ててモデルを切り替える
基本概念(What)
Poisson 分布の前提
X ~ Poisson(λ) なら
E[X] = λ
Var(X) = λ
したがって Poisson モデルは等分散(VMR=1)を前提にする[2]。
過分散の定義
過分散は Var(Y) > E[Y] の状態である。代表的な指標が VMR である。
VMR = Var(Y) / E[Y]
VMR > 1 なら過分散の疑いがある[1]。VMR は体温計のような一次診断であり、原因までは教えてくれない。
仕組み・設計(How)
原因は 4 つに分けると考えやすい。原因に応じて対処が変わる。
1. 未観測ヘテロジニティ(混合)
観測ごとに強度が違うのに、モデルには平均的な強度しか入っていない状態である。たとえばヘビーユーザーとライトユーザーが混在する購買回数。
Y | Θ ~ Poisson(Θ)
全分散の法則より
E[Y] = E[Θ]
Var(Y) = E[Θ] + Var(Θ)
Var(Θ) > 0 なら必ず過分散になる。負の二項回帰はこの形を明示的に許容する[1]。
2. 強度が確率的に揺れる(Cox / doubly stochastic)
強度自体が確率過程として変動する Poisson 過程を Cox 過程と呼ぶ[4]。強度が揺れると区間カウントは混合され、Var が Mean を上回る。
一方、強度が時間で決定論的に変化する非定常 Poisson では、区間カウントは Poisson のままで平均=分散が維持される[8]。ここは混同しやすい。
3. 依存・クラスタリング(自己励起など)
到着が独立でないと、直前のイベントが次を呼びやすくなる。Hawkes 過程の条件付き強度は次の形で表せる[5]。
λ(t) = μ(t) + Σ φ(t - ti)
時間的クラスタリングが起き、過分散が発生しやすい。
4. ゼロ過剰(ZIP)
一定の確率で常に 0 が出る仕組みがあると、ゼロが増えて分散が膨らむ。ZIP は次の混合で表せる[6]。
Y = 0 (p), それ以外は Poisson(λ)
平均と分散は
E[Y] = (1-p)λ
Var(Y) = (1-p)λ + p(1-p)λ^2
p > 0 なら必ず過分散になる[6]。
検出と判断(How to)
3 ステップ診断
- VMR を計算する
- Pearson 分散比を確認する
- ゼロ過剰と依存の兆候を観察する
目安となる閾値
以下は経験則や実証研究に基づく目安であり、データ量や目的で変わる。
- VMR や Pearson 分散比が 1 前後なら Poisson が妥当
- 1.2 を超えたら NB 回帰を検討した事例がある[9]
- 相対分散が 2 を超える場合は過分散と判断する経験則がある[10]
Pearson 分散比は χ2 / df で定義される[14]。df は観測数とパラメータ数で決まる。VMR と一緒に見ると誤判定が減る。
検定
Cameron-Trivedi の検定は Var(Y) = μ + φμ^2 の形で φ の有意性を見る[3]。閾値だけで迷うときの補助になる。
失敗例
Quasi-Poisson を当てたあとに AIC でモデル比較をしてしまった。Quasi-Poisson は尤度を持たないので AIC は定義されない[13]。比較するなら QAIC などの代替指標を使う。
別件では VMR を見ずに Poisson のまま出したら、週次の有意が揺れ続けた。原因を追うと、休日のクリックが 0 に張り付いていた。ゼロ過剰だった。
図 1: 平均-分散関係の模式図

注: 模式図のため数値スケールは例
図表タイトル: 平均-分散関係の模式図
Why: Poisson の等分散前提がどこで破れるかを直感で把握したい
What: 平均に対する分散の増え方が線形か二次かを見る
So What: 直線なら Quasi-Poisson、曲線なら負の二項が候補になる
判断フロー(実務の最短ルート)
VMR と分散比で一次診断を行い、原因の仮説を順に潰す。迷ったらゼロ過剰と依存の有無から確認するのが速い。
実装例(How to)
過分散の簡易チェック(Python)
uv add numpy pandas statsmodels
from __future__ import annotations
import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.base.model import LikelihoodModelResults
def dispersion_index(y: pd.Series) -> float:
"""分散 / 平均 (VMR) を返す。
Args:
y: カウント系列。
Returns:
VMR。
Raises:
ValueError: 平均が0の場合。
"""
mean = float(y.mean())
if mean == 0.0:
raise ValueError("VMR is undefined when the mean is 0.")
return float(y.var(ddof=1) / mean)
def fit_poisson(y: pd.Series) -> LikelihoodModelResults:
x = np.ones((len(y), 1))
model = sm.GLM(y, x, family=sm.families.Poisson())
return model.fit()
def fit_nb(y: pd.Series) -> LikelihoodModelResults:
x = np.ones((len(y), 1))
model = sm.NegativeBinomial(y, x)
return model.fit(disp=0)
def main() -> None:
rng = np.random.default_rng(42)
n = 1_000
# Gamma-Poisson混合(過分散)を生成
theta = rng.gamma(shape=2.0, scale=2.0, size=n)
y = rng.poisson(theta)
s = pd.Series(y, name="count")
print("mean:", s.mean())
print("var:", s.var(ddof=1))
print("VMR:", dispersion_index(s))
poisson = fit_poisson(s)
nb = fit_nb(s)
print("Poisson dispersion:", poisson.pearson_chi2 / poisson.df_resid)
print("AIC (Poisson, NB):", poisson.aic, nb.aic)
if __name__ == "__main__":
main()
出力例と判断
mean: 4.018
var: 8.17
VMR: 2.03
Poisson dispersion: 1.98
AIC (Poisson, NB): 4521.3 3842.1
VMR が 2.03、Pearson 分散比が 1.98 で 1.2 を超えている。AIC も NB の方が低い。この場合は NB 回帰に切り替える判断が妥当である。
対処法の選択肢
- モデルを変える
- 負の二項(NB)回帰: Var(Y)=μ+αμ^2 で過分散を許容する[1]
- Quasi-Poisson: Var(Y)=φμ として分散のみ調整する[7]
- GLMM / ランダム効果 Poisson: ヘテロジニティを構造として入れる[1]
- ゼロ過剰モデルを使う: ZIP / ZINB / Hurdle[6]
- 依存構造を入れる: 時系列なら状態空間、イベント列なら Hawkes[5]
- 推論を頑健化する: Sandwich 標準誤差やクラスタ標準誤差[1]
パラメータ対応の注意
実装で混乱しやすいので、R と Stata の対応だけ押さえる。
| ソフトウェア | パラメータ名 | 分散式 | 換算 |
|---|---|---|---|
| R glm.nb() | theta | μ + μ^2 / theta | theta = 1 / alpha |
| Stata nbreg | alpha | μ + alpha μ^2 | — |
R の theta は Stata の alpha の逆数である[11]。R の glm.nb は分散が μ+μ^2/theta に収束する形で定義されている[12]。
まとめ
- Poisson の等分散前提は実務で崩れやすい
- VMR と Pearson 分散比で一次診断し、原因仮説を立てる
- 原因に応じて NB、ZIP、GLMM、依存モデルに切り替える
- Quasi-Poisson は AIC で比較しない。QAIC などを使う
References
- Cameron, A. C. & Trivedi, P. K., Regression Analysis of Count Data, 2nd ed., 2013. https://cameron.econ.ucdavis.edu/racd2/
- McCullagh, P. & Nelder, J. A., Generalized Linear Models, 2nd ed., 1989. https://www.routledge.com/Generalized-Linear-Models-Second-Edition/McCullagh-Nelder/p/book/9780412317606
- Cameron, A. C. & Trivedi, P. K., Regression-Based Tests for Overdispersion in the Poisson Model, 1990. https://www.sciencedirect.com/science/article/abs/pii/030440769090014K
- Cox, D. R., Some Statistical Methods Connected with Series of Events, 1955. https://academic.oup.com/jrsssb/article/17/2/129/7026707
- Hawkes, A. G., Spectra of Some Self-Exciting and Mutually Exciting Point Processes, 1971. https://academic.oup.com/biomet/article/58/1/83/224809
- Lambert, D., Zero-Inflated Poisson Regression, With an Application to Defects in Manufacturing, 1992. https://doi.org/10.1080/00401706.1992.10485228
- Wedderburn, R. W. M., Quasi-likelihood functions, generalized linear models, and the Gauss-Newton method, 1974. https://academic.oup.com/biomet/article-abstract/61/3/439/249095
- Statistics LibreTexts, Non-homogeneous Poisson Processes. https://stats.libretexts.org/Bookshelves/Probability_Theory/Probability_Mathematical_Statistics_and_Stochastic_Processes_(Siegrist)/14:_The_Poisson_Process/14.06:_Non-homogeneous_Poisson_Processes
- Payne, E. H. et al., Regression Modeling Strategies for Highly-Skewed Health Care Cost Data, 2018. https://pmc.ncbi.nlm.nih.gov/articles/PMC6290908/
- overdisp package documentation, CRAN. https://cran.r-project.org/web/packages/overdisp/overdisp.pdf
- UCLA Statistical Methods, Negative Binomial Regression. https://stats.oarc.ucla.edu/r/dae/negative-binomial-regression/
- MASS package documentation, glm.nb. https://stat.ethz.ch/R-manual/R-devel/library/MASS/html/glm.nb.html
- Bolker, B., Dealing with quasi-models, 2023. https://cran.r-project.org/web/packages/bbmle/vignettes/quasi.pdf
- Rodriguez, G., Overdispersion, GLM Notes. https://grodri.github.io/glms/notes/overdispersion
Discussion