正規分布 関連の補強キーワード。 クリックで該当箇所へ:
🍰 まずはやさしく
ベルのような形の分布のことです。
データの集まり方を分析するために使います。
テストの点数の分布などが例です。
この章では正規分布の特徴を学びます。
正規分布(ガウス分布)は、 統計学の最重要分布と言って過言ではありません。 身長・体重・テスト点数・測定誤差など、 多くの自然現象がベル型の正規分布に近似されます。
特徴:
中心極限定理の威力:個々のデータがどんな分布であっても、 標本平均や回帰係数のような「データから計算した量」は、 サンプルサイズが大きければ正規分布に近づきます。 だから t検定、 F検定、 z検定など多くの検定が正規分布を前提に作られています。
🍰 まずはやさしく
統計学で最も大切な分布です。
データ分析のいろいろな場面で使います。
スマホの利用時間などの分析に役立ちます。
定義から実装までの流れを読み進めてください。
統計学の最重要分布。 「データが正規分布に従う」「残差が正規分布」「中心極限定理で平均は正規分布」など、 至るところで登場します。
正規分布 とは:平均を中心に左右対称、ベル型に広がる分布。多くの自然現象に近似される最重要分布。
本ページでは「normal distribution」を扱う。 統計データ分析コンペティション (2026) の教材で、 SSDSE-B-2026 (47 都道府県 × 複数年 × 100 超列) の実データを使った再現可能な学習を目指す。
「normal distribution」は統計・データサイエンスの体系における重要概念のひとつ。 本ページは「定義・直感・数式・実装・落とし穴・関連手法」の 6 視点で構成され、 各視点は独立して読めるが順序通り読むと体系的な理解が得られる。
🍰 まずはやさしく
真ん中が盛り上がった形をイメージしてください。
データがどれくらい珍しいか判断するために使います。
都道府県の平均寿命のデータで考えます。
外れ値を判定する手順を具体的に学びます。

正規分布の身近な実感は、 SSDSE-B-2026 で 47 都道府県の男平均寿命(C2101)を眺めると掴みやすい。 最大は長野県 81.8 歳、 最小は青森県 78.7 歳、 平均 80.7 歳・標準偏差 0.6 歳。 ヒストグラムを描くと中央が膨らんで両裾が薄くなる左右対称形になり、 ±1σ(80.1〜81.3 歳)に約 32 県、 ±2σ(79.5〜81.9 歳)に 45 県以上が入る。 「平均の周りに集中し、 大きく外れる県は少ない」という観察そのものが正規分布の直感である。
本ページでは正規分布を「平均寿命の 47 都道府県データから、 ある県の値が起こりにくい外れ値か否かを判定する」プロセスに位置付け、 (1) 平均と分散の推定、 (2) 密度・累積分布の計算、 (3) z スコアと裾確率、 (4) 仮説検定・信頼区間 の 4 段階で順に解説する。
具体例として、 SSDSE-B-2026 のデータを使い、 normal distribution を実際に動かすイメージを次節以降で示す。 数式 → 値代入 → 手計算 → Python 実装 の流れで、 抽象と具体を行き来しながら理解を深める。
下のスライダーで平均 μ と標準偏差 σ を動かすと、 正規分布の曲線がその場で描き直されます。 μ を変えると左右にスライドし(形は不変)、 σ を変えると幅と高さが変わる(面積は常に 1)という 2 つのパラメータの役割を、 手を動かして体感してください。 ±1σ / ±2σ / ±3σ の帯には 68 / 95 / 99.7% のデータが入り(帯の面積=確率)、 評価点 x のスライダーで確率密度 f(x)・累積確率 P(X≤x)・上側確率 P(X>x)・z スコアが更新されます。
「実データ」を選ぶと、 SSDSE-B-2026(2023 年・47 都道府県)の実測ヒストグラムに正規曲線を重ねられます。 合計特殊出生率はきれいな釣鐘型、 年平均気温は中央に集中しすぎて裾が重く、 総人口(log10)は右に歪む —— 「正規で近似できる/できない」の違いを目で確かめましょう。
📖 読み解き方:帯の色が濃い中心ほどデータが密集します。 ±1σ(濃い青)に約 2/3、 ±2σ まで広げるとほぼ全て(95%)が入り、 ±3σ の外に出る値は 0.3%(1000 個に 3 個)しかありません。 実データモードで正規曲線が棒(ヒストグラム)から大きくずれるほど「正規で近似するのは危うい」というサインです。
上のプレイグラウンドの 3 変数について、 実際に正規性検定(Shapiro-Wilk)と歪度・尖度を計算した結果です(すべて実測値):
| 変数(列コード) | 平均 μ | SD σ | 歪度 | 超過尖度 | Shapiro-Wilk | 判定 |
|---|---|---|---|---|---|---|
| 合計特殊出生率(A4103) | 1.293 | 0.133 | −0.04 | −0.44 | W=0.989, p=0.945 | ✅ 正規と矛盾しない |
| 年平均気温(B4101) | 16.80 | 2.05 | −0.15 | +2.80 | W=0.886, p=0.0003 | ❌ 正規を棄却(裾が重い) |
| 総人口 原数値(A1101) | 264.6 万 | 279.8 万 | +2.22 | +4.95 | W=0.689, p<0.0001 | ❌ 強い右歪み |
| 総人口 log10(A1101) | 6.263 | 0.349 | +0.79 | −0.21 | W=0.928, p=0.006 | △ 対数化で大きく改善 |
⚠️ よくある誤解 —「なんでも正規」の過信:気温は一見「平均 16.8℃ の左右対称」に見えますが、 超過尖度 +2.80 と Shapiro p=0.0003 が示すとおり中央に集中しすぎ・沖縄(23.8℃)など裾が重く、 正規は棄却されます。 ヒストグラムの見た目だけで「正規っぽい」と判断せず、 検定と Q-Q プロットで裏を取るのが鉄則です。 一方、 合計特殊出生率(p=0.945)は正規で扱ってよい好例です。
🔬 発展 — 対数正規と歪度:総人口の原数値は東京 1409 万〜鳥取 54 万と桁が違い、 歪度 +2.22 の強い右裾(=対数正規型)です。 常用対数 log10 を取ると歪度は +0.79 まで縮み、 Shapiro も W=0.689→0.928 と大きく改善します(Jarque-Bera では p=0.081 まで上昇)。 「掛け算・比率で効くデータ(人口・所得・面積)は対数変換で正規に近づく」という中心極限定理の乗法版が、 このプレイグラウンドの log10 モードで体感できます。
🍰 まずはやさしく
分布の形を数式で表したものです。
正確な確率を計算するために使います。
部活の記録などのばらつきを数式にします。
平均や標準偏差などの記号の意味を読みます。
$$ f(x) = \frac{1}{\sigma \sqrt{2 \pi}} \exp\left( -\frac{(x - \mu)^2}{2 \sigma^2} \right) $$
| 記号 | 読み方 | 意味 |
|---|---|---|
| f(x) | エフ オブ エックス | 値 x での確率密度 |
| μ | ミュー | 平均(分布の中心位置) |
| σ | シグマ | 標準偏差(広がりの大きさ) |
| σ² | シグマの二乗 | 分散 |
| exp | エクスポーネンシャル(自然対数の底 e のべき) | 指数関数 |
| √(2π) | ルート 2 パイ ≈ 2.507 | 正規化定数 |
$$ X \sim N(\mu, \sigma^2) $$
「X はパラメータ μ, σ² の正規分布に従う」と読みます。 σ² ではなく σ で書く流儀もあります(注意)。
正規分布では、 標準偏差を使って「データが含まれる範囲」が予測できます:
| 範囲 | 含まれる確率 | 外側の確率(両側) |
|---|---|---|
| μ ± 1σ | 68.27% | 31.7% |
| μ ± 2σ | 95.45% | 4.6% |
| μ ± 1.96σ | 95.00% | 5.0%(信頼区間で使用) |
| μ ± 3σ | 99.73% | 0.27% |
| μ ± 6σ | 99.9999998% | 3.4 ppm |
「サンプルサイズ n が大きければ、 元の分布が何であれ、 標本平均は正規分布に従う」
$$ \bar{X}_n \xrightarrow{n \to \infty} N\left(\mu, \frac{\sigma^2}{n}\right) $$
元のデータが一様分布でも指数分布でも、 標本平均を取ると n が大きいほど釣り鐘形(正規分布)になります。 これがCLTの威力。
💡 一般的な目安:n ≥ 30 で CLT が十分機能。 元の分布が極端に歪んでいる場合は n=100 以上が安全。
μ=0, σ=1 の特殊な正規分布を標準正規分布と呼びます:
$$ Z \sim N(0, 1) $$
任意の正規分布 X ~ N(μ, σ²) は、 標準化 Z = (X - μ)/σ で標準正規分布に変換できます。 これにより、 z表(正規分布表)を使った計算が一律に可能になります。
| z 値 | P(Z ≤ z) | 用途 |
|---|---|---|
| 1.28 | 0.90 | 80%信頼区間(片側) |
| 1.645 | 0.95 | 90%CI / 片側5% |
| 1.96 | 0.975 | 95%CI / 両側5%(最頻出) |
| 2.576 | 0.995 | 99%CI / 両側1% |
| 3.29 | 0.9995 | 99.9%CI |
「1.96」は最頻出の魔法数字。 95%信頼区間や5%有意水準(両側)でほぼ常に登場します。
SSDSE 食料費データに正規分布を当てはめてみます:
μ = 80.60、 σ = 5.84 の正規分布で47都道府県の食料費はほぼ近似できます。
「データが正規分布に従うか」を統計的にチェックする検定:
df['消費支出'] のような数値列(サンプル数 3 ≤ n ≤ 5000 が SW 検定の目安)。1 2 3 4 5 6 7 8 9 10 11 12 | import numpy as np import pandas as pd from scipy import stats # ── この抜粋で検定する data を用意する(2023 年 47 都道府県の総人口の対数)── _df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) data = np.log(_df[_df['SSDSE-B-2026'] == 2023]['A1101'].astype(float).values) # Shapiro-Wilk検定 stat, p = stats.shapiro(data) print(f'統計量={stat:.4f}, p値={p:.4f}') # p > 0.05 なら「正規分布と矛盾しない」 |
標準正規分布の理論値とデータの分位を比較。 直線に乗れば正規分布:
df['消費支出'](数値列)。scipy.stats.probplot を使用。1 2 3 4 5 | import matplotlib.pyplot as plt from scipy import stats stats.probplot(data, dist='norm', plot=plt) plt.show() |
$p$ 次元の多変量正規分布 $\mathcal{N}_p(\boldsymbol\mu, \Sigma)$ の密度関数は
$$f(\boldsymbol x) = \frac{1}{(2\pi)^{p/2} |\Sigma|^{1/2}} \exp\!\left(-\tfrac{1}{2}(\boldsymbol x - \boldsymbol\mu)^\top \Sigma^{-1} (\boldsymbol x - \boldsymbol\mu)\right)$$
等高線は $\Sigma$ の固有ベクトル方向を軸とする楕円。 主軸の長さは固有値の平方根に比例します。 SSDSE-B-2026 の「総人口・生産年齢人口・高齢人口」を多変量正規でモデル化すると、 $\Sigma$ の最大固有値は「人口総量軸」に対応し、 47 都道府県は概ねこの軸上に並びます(離散的だが連続近似が有効)。
条件付き分布の閉形式公式も極めて重要。 $\boldsymbol X = (\boldsymbol X_1, \boldsymbol X_2)$ で分割し、 $\Sigma$ も $\Sigma_{11}, \Sigma_{12}, \Sigma_{22}$ にブロック分割すると、
$$\boldsymbol X_1 \mid \boldsymbol X_2 = \boldsymbol x_2 \sim \mathcal{N}\!\left(\boldsymbol\mu_1 + \Sigma_{12} \Sigma_{22}^{-1} (\boldsymbol x_2 - \boldsymbol\mu_2),\ \Sigma_{11} - \Sigma_{12} \Sigma_{22}^{-1} \Sigma_{21}\right)$$
これは カルマンフィルタ、 ガウス過程回帰、 ベイズ線形回帰の心臓部。 「条件付けも正規」「条件付き期待値は線形」「条件付き分散は新情報に依らず一定」という三つの性質がアルゴリズムを閉じた形に保ちます。
| 検定 | 特徴 | $n$ 適用 | SSDSE で使うとき |
|---|---|---|---|
| Shapiro-Wilk | 小標本で最も強力 | $n \le 5000$ | 47 都道府県($n=47$)に最適 |
| Kolmogorov-Smirnov | 理論分布との最大距離 | 全範囲 | $\mu, \sigma$ 推定時は Lilliefors 補正必要 |
| Anderson-Darling | 裾の差に敏感 | 全範囲 | 外れ値検出と組合せ有用 |
| Jarque-Bera | 歪度・尖度ベース | $n$ 大 | 大規模センサスデータに |
| D'Agostino's K² | 歪度・尖度の Z 値合成 | $n \ge 20$ | SSDSE-B にちょうど良い |
| Q-Q プロット | 視覚的・検定不要 | 常時併用 | 必ず描く・最重要 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import numpy as np import pandas as pd from scipy import stats df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) pop_log = np.log(df[df['SSDSE-B-2026'] == 2023]['A1101'].astype(float)) # Shapiro-Wilk(n=47 で最強) W, p = stats.shapiro(pop_log) print(f'Shapiro-Wilk: W={W:.4f}, p={p:.4f}') # Anderson-Darling A2 = stats.anderson(pop_log, dist='norm') print(f'AD: A²={A2.statistic:.4f}, critical at 5%={A2.critical_values[2]}') # Q-Q プロット(最も信頼すべき判定) import matplotlib.pyplot as plt stats.probplot(pop_log, dist='norm', plot=plt) plt.title('Q-Q plot: log(人口)'); plt.show() |
通常の CLT は「$n \to \infty$ で正規分布に収束」と言うだけですが、 収束の速さを定量化するのが Berry-Esseen の定理:
$$\sup_x \left| F_n(x) - \Phi(x) \right| \le \frac{C \cdot \rho}{\sigma^3 \sqrt{n}}, \quad C \le 0.4748, \rho = \mathbb{E}|X - \mu|^3$$
「ズレは $O(1/\sqrt{n})$」、 つまり $n = 100$ なら最大誤差は約 0.05、 $n = 10000$ なら約 0.005。 SSDSE-B-2026 の 47 都道府県平均を計算するとき、 $n=47$ なら最大誤差 0.07 程度――「ほぼ正規」だが厳密な確率計算には注意が必要、 という肌感覚を持てます。
さらに $X_i$ が独立でも同分布でなくてよい「Lindeberg-Feller の CLT」、 弱従属でも成り立つ「マルチンゲール CLT」など、 CLT には豊富な拡張があり、 統計学の基礎理論を支えています。
正規分布 $\mathcal{N}(\mu, \sigma^2)$ のモーメント母関数 (MGF) は
$$M_X(t) = \mathbb{E}[e^{tX}] = \exp\!\left(\mu t + \tfrac{1}{2}\sigma^2 t^2\right)$$
この MGF を $t$ で微分して $t=0$ を代入すれば、 全モーメントが取り出せます。 1 次:$\mathbb{E}[X] = \mu$、 2 次:$\mathbb{E}[X^2] = \mu^2 + \sigma^2$、 3 次中心モーメント=0(左右対称)、 4 次中心モーメント=$3\sigma^4$(尖度=3 が正規分布の指標)。 SSDSE-B-2026 の年齢別人口比のような「ほぼ正規」とされる量も、 4 次モーメントの 3 からのズレで「真の正規からの距離」を測れます。
特性関数 $\varphi_X(t) = \mathbb{E}[e^{itX}] = \exp(i\mu t - \tfrac{1}{2}\sigma^2 t^2)$ は MGF と違って必ず存在し、 中心極限定理の証明で本質的役割を果たします。 $n$ 個の i.i.d. 確率変数の和の特性関数は $\varphi(t)^n$ で、 これが $n \to \infty$ で正規分布の特性関数に収束する――これが CLT の標準証明です。
正規分布 PDF $f(x) = \frac{1}{\sqrt{2\pi}\sigma}\exp\!\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)$ を、 一語ずつ翻訳します。 $f(x)$:「$x$ における確率密度」。 確率「質量」ではないので $f(x) = 0.3$ といった値そのものは確率ではありません。 区間 $[x, x+dx]$ に入る確率が $f(x)\, dx$ で近似されると考えます。 $\frac{1}{\sqrt{2\pi}\sigma}$:正規化定数。 「全積分が 1 になる」ように調整するバランサー。 $\sigma$ が大きいほど密度はなだらかに、 小さいほど鋭い山になります。 SSDSE-B-2026 の合計特殊出生率は $\sigma \approx 0.13$ と小さく、 県ごとの差はおおむね $\mu \pm 0.3$ に収まり、 中心が高い細い山型になります。 $\exp\!\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)$:核となる「ベル型」を作る指数項。 $(x - \mu)^2$ は中心 $\mu$ からの距離の 2 乗で、 これが大きい(外側)ほど指数の値は急速に 0 に近づく、 すなわち発生確率は急減します。 「2 乗」が効くため、 たとえば $\mu$ から 2 標準偏差離れた点と 3 標準偏差離れた点では、 密度比が劇的に変わります。 これが「正規分布の裾は意外に薄い」直感の数学的根拠です。 さらに $\frac{1}{2\sigma^2}$ で割ることで、 単位を消し標準化された距離(マハラノビス距離の 1 次元版)に直しています。 SSDSE-B-2026 の例で、 合計特殊出生率 $\mu=1.30, \sigma=0.13$ とすると、 1.69 = $\mu + 3\sigma$ より大きい県は存在確率 0.15% 程度しか期待されません。 実際 47 都道府県を見ると 1.7 を超える県は 1-2 県のみで、 この理論予測と整合します。 これが正規分布の「3σ ルールの実用性」の根拠です。
🎯 ねらい:正規分布の「形」を SSDSE-B-2026 の合計特殊出生率で実感し、 「3σ で外れ値を判定」「z スコアで他県と比較」といった頻出技を体感します。
📥 入力:47 都道府県 × 合計特殊出生率(B1116)の 1 次元ベクトル。 必要に応じて 1980-2020 年の経時データに拡張。
📤 出力:(1) 平均・標準偏差、 (2) 各県の z スコア表、 (3) ヒストグラム + 正規曲線重ね描き、 (4) Shapiro-Wilk 検定の p 値、 (5) 3σ 外を超える県のリスト。
💬 解釈:沖縄が高水準($\mu + 3\sigma$ 近辺)、 東京が低水準($\mu - 2\sigma$ 程度)。 z スコアが ±2 を超える県は「統計的に有意に他県と異なる」と判定でき、 政策議論の出発点になります。
正規分布の理解は 「形」「数式」「実データへの適用」 の三本柱で判定する。 紙とペンで答えてから自己採点しよう。
解答の要点(自己採点用)
🛠 5 分でできる自分で確かめる課題
SSDSE-B-2026 の「合計特殊出生率 (B1116)」と「人口 (A1101)」を選び、 それぞれヒストグラムを描いてみよう。 一方は正規分布に近く、 もう一方は強い右の裾を持つ。 scipy.stats.shapiro の p 値と scipy.stats.probplot の QQ プロットで「正規っぽさ」を視覚と数値の両方で確かめると、 「正規分布が成り立つ条件」が体に染み込む。
SSDSE-B の変数で正規性を検定し、 z 変換・確率計算・正規 QQ プロットまで体系的に検証する完全例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy import stats df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023] x = df['A4103'].values # 基本統計 mu, sigma = x.mean(), x.std(ddof=1) print(f'平均 μ = {mu:.2f}, SD σ = {sigma:.2f}') # 正規性検定(複数の検定を併用) sw_w, sw_p = stats.shapiro(x) jb_s, jb_p = stats.jarque_bera(x) ks_d, ks_p = stats.kstest(x, 'norm', args=(mu, sigma)) print(f'Shapiro-Wilk : W={sw_w:.3f}, p={sw_p:.4f}') print(f'Jarque-Bera : JB={jb_s:.2f}, p={jb_p:.4f}') print(f'KS 検定 : D={ks_d:.3f}, p={ks_p:.4f}') # 可視化 fig, axes = plt.subplots(1, 2, figsize=(12, 4)) ax = axes[0] ax.hist(x, bins=12, density=True, alpha=0.7, edgecolor='black') xs = np.linspace(x.min(), x.max(), 200) ax.plot(xs, stats.norm.pdf(xs, mu, sigma), 'r-', lw=2, label='正規 fit') ax.set_xlabel('合計特殊出生率'); ax.legend() ax = axes[1] stats.probplot(x, dist='norm', plot=ax) ax.set_title('Q-Q プロット') plt.tight_layout(); plt.savefig('normal_check.png', dpi=110) |
data/raw/SSDSE-B-2026.csv(cp932 エンコード)、対象列名(例:消費支出)。| 項目 | 値 | 参考 | 解釈 |
|---|---|---|---|
| 検定 | 合計特殊出生率 | 結果 | 解釈 |
| Shapiro-W | 0.989 | p=0.94 | 正規仮説棄却できず |
| Jarque-Bera | 0.40 | p=0.82 | 正規に近い |
| KS | 0.066 | p=0.98 | 正規との一致良好 |
| 確率 | P(X < 1.2) | 0.24 | Φ((1.2-μ)/σ) で計算 |
| z 値 | 東京 (0.99) | -2.27 | 全国比で低い側 |
| CI | 95% CI of μ | (1.255, 1.331) | n=47 から推定 |
👉 値は SSDSE-B-2026・2023年度・47都道府県の合計特殊出生率 (A4103) の実測値。 同じ手順で他都道府県・他変数にも適用可能。
合成 N(μ=50, σ=10) で確率と分位点を計算する。
1 2 3 4 5 6 7 8 9 | from scipy.stats import norm mu, sigma = 50, 10 p1 = norm.cdf(60, mu, sigma) - norm.cdf(40, mu, sigma) p2 = norm.cdf(70, mu, sigma) - norm.cdf(30, mu, sigma) ci_low = norm.ppf(0.025, mu, sigma) ci_hi = norm.ppf(0.975, mu, sigma) print(f"P(40-60): {p1:.4f}") print(f"P(30-70): {p2:.4f}") print(f"95% CI: [{ci_low:.2f}, {ci_hi:.2f}]") |
💬 手計算 (Step 1,2) と Python 出力が完全一致。
mu(平均)、sigma(標準偏差)、x の評価点(np.linspace)。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import numpy as np from scipy import stats # 確率密度(PDF) stats.norm.pdf(0, loc=0, scale=1) # f(0) = 0.3989 stats.norm.pdf(1.96, loc=0, scale=1) # 0.0584 # 累積分布関数(CDF) stats.norm.cdf(1.96, loc=0, scale=1) # 0.975 stats.norm.cdf(0) # 0.5 # 逆累積分布関数(quantile / ppf) stats.norm.ppf(0.975) # 1.96 stats.norm.ppf(0.5) # 0.0 # ランダムサンプリング samples = np.random.normal(loc=50, scale=10, size=1000) samples_scipy = stats.norm.rvs(loc=50, scale=10, size=1000, random_state=0) # パラメータ推定(最尤推定) data = np.array([45, 50, 55, 60, 65]) mu_hat, sigma_hat = stats.norm.fit(data) print(f'μ = {mu_hat:.2f}, σ = {sigma_hat:.2f}') |
df['消費支出'] 等の数値列。1 2 3 4 5 6 7 8 9 10 11 12 | from scipy import stats # Shapiro-Wilk W, p = stats.shapiro(data) # Anderson-Darling result = stats.anderson(data, dist='norm') print(result.statistic) print(result.critical_values) # Kolmogorov-Smirnov ks, p = stats.kstest(data, 'norm', args=(data.mean(), data.std())) |
所得、 株価、 地震被害額、 都市人口、 SNS のフォロワー数は裾の長い分布。 これらに正規分布を仮定すると重大なミス。 ヒストグラムで確認を。
n ≥ 30 が一般的目安だが、 元の分布が非常に歪んでいると n=100 でも不十分なことも。
大標本では、 ほんの少しの非正規性でも p < 0.05 になる。 検定結果よりQQプロットでの目視確認が現実的。
1つの極端値で μ や σ が動き、 「データは正規分布から離れている」と誤判定することも。
二峰性のデータは1つの正規分布では表せません。 ガウス混合モデル(GMM)が必要。
17世紀の発見以来、 数学・物理・工学・経済・心理学・生物学のあらゆる分野に応用され続けています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | from sklearn.mixture import GaussianMixture from sklearn.preprocessing import StandardScaler, QuantileTransformer import numpy as np # 正規でないデータを「正規化」する変換 qt = QuantileTransformer(output_distribution='normal', random_state=42) x_norm = qt.fit_transform(df[['A1101']]).ravel() print(f'変換前 歪度: {stats.skew(df["A1101"]):+.2f}') print(f'変換後 歪度: {stats.skew(x_norm):+.2f}') # 混合ガウスで「実は 2 つの正規の合成」を検出 gmm = GaussianMixture(n_components=2, random_state=42) gmm.fit(df[['A1101']]) print('成分 1:', gmm.means_[0], gmm.covariances_[0]) print('成分 2:', gmm.means_[1], gmm.covariances_[1]) print('重み:', gmm.weights_) |
X(1 次元または多次元の数値列)、n_components=2。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | from scipy import stats import numpy as np x = df['A4103'].values mu, sigma = x.mean(), x.std(ddof=1) # 各種確率計算 print(f'P(X < 1.2) = {stats.norm.cdf(1.2, mu, sigma):.4f}') print(f'P(1.2 < X < 1.4) = {stats.norm.cdf(1.4, mu, sigma) - stats.norm.cdf(1.2, mu, sigma):.4f}') print(f'P(X > 1.5) = {1 - stats.norm.cdf(1.5, mu, sigma):.4f}') # 分位点 for q in [0.025, 0.25, 0.5, 0.75, 0.975]: print(f' {int(q*100)}%-tile (正規) = {stats.norm.ppf(q, mu, sigma):.2f}') # 信頼区間(平均の) n = len(x) ci_low = mu - stats.t.ppf(0.975, n-1) * sigma / np.sqrt(n) ci_high = mu + stats.t.ppf(0.975, n-1) * sigma / np.sqrt(n) print(f'\n95% CI of μ: ({ci_low:.2f}, {ci_high:.2f})') # 尤度比検定の例:正規 vs t 分布 ll_norm = np.sum(stats.norm.logpdf(x, mu, sigma)) ll_t = np.sum(stats.t.logpdf(x, df=5, loc=mu, scale=sigma)) print(f'\nlog-Lik 正規 = {ll_norm:.2f}') print(f'log-Lik t(5) = {ll_t:.2f}') print('差が大きいほど分布選択が重要') |
mu, sigma, 観測値 x。norm.cdf(x, mu, sigma) で確率を計算。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import optuna from scipy import stats # 正規分布の MLE 推定 + 分布族の選択 def objective(trial): dist = trial.suggest_categorical('dist', ['norm', 'lognorm', 't', 'gamma']) x = df['A1101'].values if dist == 'norm': params = stats.norm.fit(x) ll = np.sum(stats.norm.logpdf(x, *params)) k = 2 elif dist == 'lognorm': params = stats.lognorm.fit(x) ll = np.sum(stats.lognorm.logpdf(x, *params)) k = 3 elif dist == 't': params = stats.t.fit(x) ll = np.sum(stats.t.logpdf(x, *params)) k = 3 else: # gamma params = stats.gamma.fit(x) ll = np.sum(stats.gamma.logpdf(x, *params)) k = 3 # AIC return -2 * ll + 2 * k study = optuna.create_study(direction='minimize') study.optimize(objective, n_trials=10) print('Best distribution:', study.best_params, ' AIC:', study.best_value) |
X(観測データ)、Optuna study とトライアル数。| ライブラリ / 関数 | 用途 |
|---|---|
scipy.stats.norm | PDF・CDF・乱数生成 |
scipy.stats.shapiro, jarque_bera, normaltest | 正規性検定 |
scipy.stats.probplot | Q-Q プロット |
scipy.stats.kstest | Kolmogorov-Smirnov 検定 |
scipy.stats.anderson | Anderson-Darling 検定 |
statsmodels.stats.diagnostic.kstest_normal | Lilliefors 検定 |
「正規分布を仮定する」と書くのは簡単だが、 実データを前にすると 本当に正規なのか(検定)、 正規でないならどう扱うのか(変換)、 パラメータはどう決めるのか(推定)という 3 つの問いが必ず出てくる。 ここでは SSDSE-B-2026 を使い、 Shapiro-Wilk 検定・対数正規分布・尤度関数を 実際に走るコードと実測値で確認する。
ヒストグラムを見て「正規っぽい」と言うのは主観である。 Shapiro-Wilk 検定は 「母集団は正規分布である」を帰無仮説とし、 データがその仮説とどれだけ整合するかを p 値で返す。 p が小さければ正規を棄却、 大きければ「正規を否定する 根拠は無い」となる。 ここで重要なのは、 「棄却できない」は「正規である」と 同じ意味ではないということ ── 証明できていないだけである。
📥 入力: SSDSE-B-2026 の 2023 年 47 都道府県から総人口・合計特殊出生率・年平均気温。 加えて、 検出力を確かめるための合成データ(自由度 8 の t 分布)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import pandas as pd import numpy as np from scipy import stats df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) d = df[df['SSDSE-B-2026'] == 2023] cols = {'A1101': '総人口', 'A4103': '合計特殊出生率', 'B4101': '年平均気温'} print(f'{"変数":<12}{"n":>4}{"W 統計量":>12}{"p 値":>12} 判定 (α=0.05)') for c, name in cols.items(): v = pd.to_numeric(d[c], errors='coerce').dropna().values W, p = stats.shapiro(v) verdict = '正規と言えない' if p < 0.05 else '正規を棄却できない' print(f'{name:<12}{len(v):>4}{W:>12.4f}{p:>12.3e} {verdict}') # 対数変換すると総人口はどうなるか v = d['A1101'].values.astype(float) W, p = stats.shapiro(np.log(v)) print(f'\nlog(総人口) {len(v):>4}{W:>12.4f}{p:>12.3e} ' f'{"正規と言えない" if p < 0.05 else "正規を棄却できない"}') # 同じ「わずかなズレ」でも n が増えると棄却されることを確かめる。 # 1 回の結果は運に左右されるので、 各 n で 200 回試して棄却率(=検出力)を出す。 print('\n--- 正規から少しだけずれた分布(自由度 8 の t 分布)を 200 回検定 ---') rng = np.random.default_rng(20260614) for n in (20, 47, 200, 2000): rejected = sum(stats.shapiro(rng.standard_t(8, n))[1] < 0.05 for _ in range(200)) print(f' n={n:>5}: 200 回中 {rejected:>3} 回棄却 → 棄却率 {rejected/2:>5.1f}%') print(' ズレの大きさは 4 つとも同じ。 変わったのは n だけ。') |
📤 実行するとこの出力が得られる:
💬 結果の読み方: 3 変数のうち合計特殊出生率だけが p = 0.945 で正規を棄却できない。 総人口は p = 1.1e-8 で明確に非正規(東京という極端な外れ値があるため W が 0.69 と低い)、 年平均気温も p = 2.7e-4 で棄却される(沖縄が離れているため)。 総人口は対数を取っても p = 0.0064 とまだ棄却されており、 「対数を取れば正規になる」は常には成り立たない。
後半がこの検定の最大の注意点である。 ズレの大きさをまったく変えずに n だけ増やすと、 棄却率は n=20 で 11.5%、 n=47 で 20.0%、 n=200 で 51.0%、 n=2000 で 100% と上がっていく。 つまり n が大きいと、 実用上どうでもいい微小なズレでも必ず棄却される。 逆に n が小さいと、 かなり歪んでいても棄却できない。 正規性は検定の p 値だけで判断せず、 Q-Q プロットで「どこがどうずれているか」を目で見るのが実務の作法である。
人口・所得・都市の規模といった量は、 負の値を取らず、 右に長い裾を引く という共通の形をしている。 これらは正規分布では表せないが、 対数を取ると正規に近づくことが多い。 このとき元の変数は 対数正規分布に従うという。 多くの要因が足し算で効くと 正規分布に、 掛け算で効くと対数正規分布になる ── これが両者を分ける本質である。
📥 入力: SSDSE-B-2026 の 2023 年 47 都道府県の総人口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | import pandas as pd import numpy as np import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt from scipy import stats df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) d = df[df['SSDSE-B-2026'] == 2023] x = d['A1101'].values.astype(float) # 総人口 print(f'元データ : 歪度 {stats.skew(x):.3f} 尖度 {stats.kurtosis(x):.3f}') print(f'対数変換後 : 歪度 {stats.skew(np.log(x)):.3f} 尖度 {stats.kurtosis(np.log(x)):.3f}') # 対数正規分布のパラメータ(対数を取った後の平均と標準偏差) mu, sigma = np.log(x).mean(), np.log(x).std(ddof=1) print(f'\n推定した対数正規のパラメータ: μ = {mu:.4f}, σ = {sigma:.4f}') # 対数正規の理論値と実測を比べる theo_mean = np.exp(mu + sigma**2 / 2) theo_median = np.exp(mu) theo_mode = np.exp(mu - sigma**2) print(f'理論 平均 = {theo_mean:>12,.0f} 人 実測 {x.mean():>12,.0f} 人') print(f'理論 中央値 = {theo_median:>12,.0f} 人 実測 {np.median(x):>12,.0f} 人') print(f'理論 最頻値 = {theo_mode:>12,.0f} 人') print('→ 対数正規では 最頻値 < 中央値 < 平均 の順に必ず並ぶ(右に裾を引くため)') W1, p1 = stats.shapiro(x) W2, p2 = stats.shapiro(np.log(x)) print(f'\nShapiro-Wilk 元データ p = {p1:.3e}(正規と言えない)') print(f'Shapiro-Wilk 対数変換後 p = {p2:.4f}' f'({"正規を棄却できない" if p2 >= 0.05 else "まだ正規と言えない"})') fig, axes = plt.subplots(1, 2, figsize=(11, 4.2)) axes[0].hist(x / 1e4, bins=15, color='#90CAF9', edgecolor='white') axes[0].set_title('元の総人口'); axes[0].set_xlabel('総人口(万人)') axes[1].hist(np.log(x), bins=15, color='#A5D6A7', edgecolor='white') axes[1].set_title('対数を取った総人口'); axes[1].set_xlabel('log(総人口)') plt.tight_layout(); plt.savefig('nd_lognormal.png', dpi=120) |
📤 実行するとこの出力が得られる:
💬 結果の読み方: 歪度は 2.219 → 0.793、 尖度は 4.951 → −0.211 と、 対数を取るだけで裾の重さが大きく緩和される。 推定したパラメータ μ = 14.42、 σ = 0.803 から 理論値を計算すると 最頻値 96 万人 < 中央値 183 万人 < 平均 253 万人 と並ぶ。 対数正規ではこの順序が必ず成り立ち、 だからこそ「平均年収」と「中央値年収」が 食い違う現象が起きる。
ただし正直に書いておくと、 対数変換後も Shapiro-Wilk は p = 0.0064 で棄却される。 47 県の人口は「きれいな対数正規」ではない(東京がなお外れている)。 理論中央値 183 万人と実測中央値 155 万人のズレもそこから来ている。 「対数正規で近似できる」と「対数正規に従う」は別のことで、 前者は実務上とても有用だが、 後者を主張するには根拠が足りない。
正規分布の平均 μ と標準偏差 σ は、 データからどう決めるのか。 その答えが 尤度である。 尤度とは 「そのパラメータのもとで、 手元のデータが得られる確率密度」で、 これを最大にする値を採用するのが 最尤推定。 確率は積で効くため、 実際には対数を取った 対数尤度 $\log L(\mu,\sigma) = -\frac{n}{2}\log(2\pi\sigma^2) - \frac{\sum (x_i-\mu)^2}{2\sigma^2}$ を最大化する。
📥 入力: SSDSE-B-2026 の 2023 年 47 都道府県の年平均気温 (B4101)。 前節の Shapiro-Wilk では棄却されたが、 3 変数の中では最も正規に近い量である。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | import pandas as pd import numpy as np import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt from scipy import stats df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) d = df[df['SSDSE-B-2026'] == 2023] x = pd.to_numeric(d['B4101'], errors='coerce').dropna().values # 年平均気温 (℃) n = len(x) print(f'データ: 年平均気温 {n} 県 平均 {x.mean():.4f}℃ 標準偏差 {x.std(ddof=0):.4f}℃') # 対数尤度 logL(μ, σ) = -n/2 * log(2πσ²) - Σ(x-μ)² / (2σ²) def loglik(mu, sigma): return (-n / 2 * np.log(2 * np.pi * sigma**2) - ((x - mu)**2).sum() / (2 * sigma**2)) # μ を動かして対数尤度がどう変わるか(σ は最尤推定値で固定) sigma_hat = x.std(ddof=0) mu_hat = x.mean() print(f'\n最尤推定値: μ̂ = {mu_hat:.4f} σ̂ = {sigma_hat:.4f}') print(f'最大対数尤度 logL(μ̂, σ̂) = {loglik(mu_hat, sigma_hat):.4f}') print('\n μ を動かしたときの対数尤度(σ は σ̂ で固定)') for mu in [mu_hat - 2, mu_hat - 1, mu_hat, mu_hat + 1, mu_hat + 2]: print(f' μ={mu:7.4f}: logL = {loglik(mu, sigma_hat):10.4f}' f' 最大との差 {loglik(mu, sigma_hat) - loglik(mu_hat, sigma_hat):8.4f}') # 最尤推定値が「標本平均」と一致することを数値で確認 grid = np.linspace(mu_hat - 3, mu_hat + 3, 60001) best = grid[np.argmax([loglik(m, sigma_hat) for m in grid])] print(f'\n格子探索で対数尤度を最大にする μ = {best:.4f}') print(f'標本平均 = {mu_hat:.4f} → 一致する') # scipy の最尤推定と突き合わせる mu_sp, sd_sp = stats.norm.fit(x) print(f'\nscipy.stats.norm.fit → μ = {mu_sp:.4f}, σ = {sd_sp:.4f}') print(f'手計算 → μ = {mu_hat:.4f}, σ = {sigma_hat:.4f} → 一致する') fig, ax = plt.subplots(figsize=(7, 4.5)) ms = np.linspace(mu_hat - 3, mu_hat + 3, 300) ax.plot(ms, [loglik(m, sigma_hat) for m in ms], lw=2) ax.axvline(mu_hat, color='crimson', ls='--', label=f'最尤推定値 μ = {mu_hat:.3f}') ax.set_xlabel('平均 μ'); ax.set_ylabel('対数尤度 log L'); ax.legend() plt.tight_layout(); plt.savefig('nd_likelihood.png', dpi=120) |
📤 実行するとこの出力が得られる:
💬 結果の読み方: まず式の形を読む。 μ が入っているのは $-\sum (x_i-\mu)^2 / (2\sigma^2)$ の項だけで、 これを最大にするのは二乗和を最小にする μ、 すなわち標本平均である。 実際、 格子探索で対数尤度を最大にする μ = 16.8021 は標本平均 16.8021 と一致し、 scipy.stats.norm.fit の結果とも小数第 4 位まで揃った。 「平均を使う」のは慣習ではなく、 正規分布を仮定した最尤推定の帰結である。
対数尤度の値そのもの(−99.88)に意味は無く、 意味があるのは差だけである。 μ を 1℃ ずらすと −5.72、 2℃ ずらすと −22.89 と、 ズレの二乗に比例して急速に落ちる(2 倍ずらすと落ち込みは 4 倍)。 この落ち方の鋭さが推定の精度そのもので、 尖った尤度関数ほど μ を狭く絞り込めている。 AIC や尤度比検定が「対数尤度の差」だけを使うのも、 同じ理由による。
正規分布(normal distribution, Gaussian distribution)は、 統計学で最も重要な確率分布。 「釣り鐘形」をした左右対称の分布で、 自然界や社会現象の多くがこの形に従います。
💡 正規分布は2つのパラメータ μ(平均)と σ(標準偏差)だけで完全に決まる「最も簡潔な分布」。 これだけ単純なのに、 自然界の多くを記述できるのが驚き。
正規分布 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
🌐 統計・データサイエンス › 推測統計 › 推定 › 正規分布
中心に 正規分布 を置き、 そこから ヒストグラム・分散・平均・標準偏差・標準化・信頼区間 など 計 24 個の用語へ、 前提・兄弟・発展形といった関係を矢印で結んでいます。 線がどちら向きかを見れば、 先に読むべき用語とあとから読む用語が分かります。 ノードはドラッグで動かせ、 ホイールでズーム、 クリックでその用語のページへ遷移します。
大きな円が小さな円を包含する Circle Packing 図。 「正規分布」は緑色でハイライト。
長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「正規分布」は緑色でハイライト。
| マップ | 分かること | こんな時に見る |
|---|---|---|
| 🔗 関係マップ | 手法間の横の関係(前提→発展→応用) | 「次に何を学べばよい?」 学習順序の判断 |
| ⭕ 包含マップ | 分類体系の入れ子構造(上位⊃下位) | 「この手法はどんなジャンルに属する?」 |
| 🌳 ツリーマップ | 分野の規模比較(面積=ボリューム) | 「データサイエンス全体の俯瞰像」 |
💡 3 つの図は同じ位置関係を別の角度から描いています。 関係マップは 正規分布 の隣に何が並ぶかを、 包含マップとツリーマップは 統計・データサイエンス → 推定 → 正規分布 という入れ子の位置を示します。 「推定には他に何があったか」を思い出したいときは包含マップを、 「次に何を読むか」を決めたいときは関係マップを開いてください。
正規分布から、 統計学の核となる多くの分布が導出されます:
| 分布 | 導出 | 用途 |
|---|---|---|
| χ² 分布 | 独立な標準正規の二乗和 | 分散の信頼区間、 適合度検定 |
| t 分布 | N(0,1) / √(χ²/k) | 小標本での平均の検定 |
| F 分布 | χ²₁/χ²₂ の比 | 分散分析、 回帰の有意性検定 |
| 対数正規分布 | log(X) が正規分布 | 所得、 株価、 都市人口 |
| 多変量正規 | 多次元への拡張 | 多変量解析、 機械学習 |
古典的な線形回帰モデル y = Xβ + ε で、 誤差項 ε が正規分布 N(0, σ²) と仮定します。 これにより最小二乗推定量が最尤推定量と一致。
ナイーブベイズ(Gaussian Naive Bayes)、 線形判別分析(LDA)は、 各クラスの特徴量分布を正規分布として推定。
任意の入力点での予測値が(多変量)正規分布に従うモデル。 予測の不確実性を自然に表現できる。
潜在空間を正規分布で表現する深層生成モデル。 「事前分布 N(0, I) からのサンプリング」で新しいデータを生成。
ニューラルネットの重み初期化(Xavier, He)は標準偏差を精密に制御した正規分布から:
in_features, out_features。nn.init.normal_ または nn.init.kaiming_normal_ を使う。1 2 3 4 5 6 7 8 | # 入力 5 次元・出力 1 次元の全結合層を例にする in_features, out_features = 5, 1 import torch.nn as nn # He 初期化(ReLU 用) linear = nn.Linear(in_features, out_features) nn.init.normal_(linear.weight, mean=0, std=(2/in_features)**0.5) |
各層の出力を「平均0、 分散1」の正規分布近似に標準化する深層学習の必須技術。
「正規分布」は単独で完結せず、 前後の手法と組み合わさって価値が発揮される。 入力データの準備 (上流)・同目的の代替手法との比較 (並列)・結果の活用 (下流) という 3 軸で隣接領域を整理する。
この上流・並列・下流の対応を地図化することで、 「正規分布」を中核に据えた分析パイプライン (データ準備 → 手法選択 → 結果の検証と展開) の全体像が見えてくる。
「normal distribution」を含む手法選択は、 データの性質・分析目的・運用制約の 3 軸で決まる。 以下に典型シナリオと対応する手法の組合せを示す。
| シナリオ | 重視する観点 | 候補手法 |
|---|---|---|
| データが大規模 (n が多い、 高次元) | 計算コスト / メモリ / 並列化が必要 | 正規近似・z 検定(中心極限定理) |
| 外れ値が多い / ノイズあり | 頑健性 / 外れ値除去 / 中央値ベース | ロバスト統計(中央値・MAD) |
| 解釈性を重視する | 線形 / 木構造 / ルールベース | 正規分布(パラメトリック) |
| 予測精度を最優先する | アンサンブル / ハイパラ調整 / 交差検証 | 混合正規分布(GMM) |
| データが少ない | 正則化 / ベイズ / 転移学習 / 簡素なモデル | t 分布・ベイズ推定 |
| リアルタイム/オンライン処理 | ストリーミング / 軽量モデル / 逐次更新 | 逐次更新(オンライン平均・分散) |
正規分布は平均 μ(山の位置)と分散 σ²(山の幅)の 2 つだけで形が完全に決まる、 統計学で最もシンプルな連続分布です。 「平均のまわりに集まり、 大きく外れる値ほど急速に珍しくなる」という素朴な直感が、 そのまま数式 $f(x)\propto e^{-(x-\mu)^2/2\sigma^2}$ の「$(x-\mu)^2$ を指数に載せて急減させる」構造に対応します。 ここでは、 その中核である 68-95-99.7 則が実データでどこまで成り立つ/崩れるかを SSDSE-B-2026 で確かめます。
各変数について「平均 ±1σ / ±2σ / ±3σ の帯に実際に入った都道府県の割合」を数え、 正規分布の理論値と並べました。 理論に近いほど「正規で近似してよい」のサインです。
| 変数(列コード) | ±1σ 内 | ±2σ 内 | ±3σ 内 | Shapiro p | 読み取り |
|---|---|---|---|---|---|
| 理論値(正規分布) | 68.3% | 95.4% | 99.7% | — | 基準 |
| 合計特殊出生率(A4103) | 63.8% (30/47) | 95.7% (45/47) | 100% | 0.945 | ✅ 理論とほぼ一致 |
| 年平均気温(B4101) | 83.0% (39/47) | 91.5% | 97.9% | 0.0003 | ❌ ±1σ に集中しすぎ(尖り) |
| 総人口 原数値(A1101) | 87.2% (41/47) | 93.6% | 97.9% | <0.0001 | ❌ 右歪み(中央密・裾に東京) |
| 総人口 log10(A1101) | 66.0% (31/47) | 95.7% | 100% | 0.006 | △ 対数化で 68-95 則が理論に接近 |
💡 読み解き:合計特殊出生率は 63.8% / 95.7% / 100% と理論の 68 / 95 / 99.7 にほぼ乗り、 「正規の直感がそのまま使える」好例です。 一方、 年平均気温や総人口原数値では ±1σ に 83〜87% が集中し、 これは「中央に尖って裾が薄い(気温:超過尖度 +2.8)」あるいは「片側に長い裾(人口:右歪み)」のサイン。 「±1σ に入る割合が 68% より大幅に多い=正規ではなく尖った/歪んだ分布」という、 見た目に頼らない量的な判定基準として使えます。
個々のデータが正規でなくても、 「たくさん足し合わせた量」「平均を取った量」は近似的に正規になる——これが CLT の直感です。 SSDSE でも、 月別出生数(各月は非正規でも)を年合計すれば 12 個の変動が加算されて正規に近づき、 47 都道府県の平均を推定量として扱うときも $\bar X \approx N(\mu,\sigma^2/47)$ と近似できます。 だから t 検定・z 検定・信頼区間といった「平均をめぐる推測」は、 元データの分布形にあまり依存せず広く使えるのです。 逆に言えば、 CLT が保証するのはあくまで「平均・合計の分布」であって「個票データそのものの分布」ではない点が、 次節の落とし穴につながります。
「なんでも正規」の過信は、 統計分析で最も多い失敗の一つです。 既存の落とし穴セクションを補強する形で、 実データでつまずきやすい 6 つの罠を SSDSE の実測値つきで整理します。
正規分布を軸に、 前提の確認手法・親戚の分布・多次元への拡張までを地図化します。 各項目の詳細は末尾の関連ページへ。
任意の $X\sim N(\mu,\sigma^2)$ は $Z=(X-\mu)/\sigma$ で標準正規 $N(0,1)$ に変換でき、 単位の違う指標どうしを同じ物差しで比較できます。 SSDSE で年平均気温を標準化すると北海道 z=−2.83、 沖縄 z=+3.42 となり、 「全国のばらつきの中でどこに位置するか」を σ 単位で定量化できます(外れ値判定は分布形の確認が前提)。
標本平均は $\bar X\approx N(\mu,\sigma^2/n)$、 標本和は $\approx N(n\mu,n\sigma^2)$ に近づきます。 二項分布・ポアソン分布も n(λ)が大きければ正規で近似でき、 これが z 検定・信頼区間の土台です。 目安は n≥30、 元分布が強く歪む場合は n≥100。 収束の速さは Berry-Esseen 不等式で $O(1/\sqrt n)$ と定量化されます。
| 分布 | いつ使うか | 正規との関係 |
|---|---|---|
| t 分布 | 小標本で SE を推定するとき | 裾が重い。 自由度 ∞ で正規に収束 |
| 対数正規 | 正の量・掛け算で効く量(人口・所得) | $\log X\sim N(\mu,\sigma^2)$ |
| 歪正規(skew-normal) | やや非対称だが正規に近い量 | 歪度パラメータ α=0 で正規に一致 |
| 裾の重い分布(t・べき乗則・Cauchy) | 極端値が頻出(金融リターン等) | Cauchy は分散が無限で CLT が効かない |
$p$ 次元の $\mathcal N_p(\boldsymbol\mu,\Sigma)$ は、 等高線が共分散行列 $\Sigma$ の固有ベクトル方向を軸とする楕円になります。 「条件付き分布もまた正規」「条件付き期待値は線形」という性質が、 回帰・カルマンフィルタ・ガウス過程・混合正規(GMM)の理論的な心臓部です。 単変量の各成分が正規でも同時分布が正規とは限らない(周辺正規 ≠ 同時正規)点は、 重回帰・因子分析の前提確認で重要になります。