🔥

オーバーディスパージョン入門:原因・検出・対処法

に公開

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 ステップ診断

  1. VMR を計算する
  2. Pearson 分散比を確認する
  3. ゼロ過剰と依存の兆候を観察する

目安となる閾値

以下は経験則や実証研究に基づく目安であり、データ量や目的で変わる。

  • 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 回帰に切り替える判断が妥当である。

対処法の選択肢

  1. モデルを変える
    • 負の二項(NB)回帰: Var(Y)=μ+αμ^2 で過分散を許容する[1]
    • Quasi-Poisson: Var(Y)=φμ として分散のみ調整する[7]
    • GLMM / ランダム効果 Poisson: ヘテロジニティを構造として入れる[1]
  2. ゼロ過剰モデルを使う: ZIP / ZINB / Hurdle[6]
  3. 依存構造を入れる: 時系列なら状態空間、イベント列なら Hawkes[5]
  4. 推論を頑健化する: 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

  1. Cameron, A. C. & Trivedi, P. K., Regression Analysis of Count Data, 2nd ed., 2013. https://cameron.econ.ucdavis.edu/racd2/
  2. 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
  3. 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
  4. Cox, D. R., Some Statistical Methods Connected with Series of Events, 1955. https://academic.oup.com/jrsssb/article/17/2/129/7026707
  5. Hawkes, A. G., Spectra of Some Self-Exciting and Mutually Exciting Point Processes, 1971. https://academic.oup.com/biomet/article/58/1/83/224809
  6. Lambert, D., Zero-Inflated Poisson Regression, With an Application to Defects in Manufacturing, 1992. https://doi.org/10.1080/00401706.1992.10485228
  7. 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
  8. 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
  9. Payne, E. H. et al., Regression Modeling Strategies for Highly-Skewed Health Care Cost Data, 2018. https://pmc.ncbi.nlm.nih.gov/articles/PMC6290908/
  10. overdisp package documentation, CRAN. https://cran.r-project.org/web/packages/overdisp/overdisp.pdf
  11. UCLA Statistical Methods, Negative Binomial Regression. https://stats.oarc.ucla.edu/r/dae/negative-binomial-regression/
  12. MASS package documentation, glm.nb. https://stat.ethz.ch/R-manual/R-devel/library/MASS/html/glm.nb.html
  13. Bolker, B., Dealing with quasi-models, 2023. https://cran.r-project.org/web/packages/bbmle/vignettes/quasi.pdf
  14. Rodriguez, G., Overdispersion, GLM Notes. https://grodri.github.io/glms/notes/overdispersion

Discussion