論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
正規分布
Normal Distribution (N(μ, σ²))
平均を中心に左右対称、ベル型に広がる分布。多くの自然現象に近似される最重要分布。
確率分布N(μ, σ²)ガウス分布Gauss分布ベル型
📍 文脈💡 30秒結論📖 詳しく🎨 直感図📐 数式🔬 読み解き⚠️ 落とし穴🔗 関連用語

📍 あなたが今見ているもの

統計学の最重要分布。 「データが正規分布に従う」「残差が正規分布」「中心極限定理で平均は正規分布」など、 至るところで登場します。

正規分布 とは:平均を中心に左右対称、ベル型に広がる分布。多くの自然現象に近似される最重要分布。

💡 30秒で分かる結論

📖 もっと詳しく

正規分布(ガウス分布)は、 統計学の最重要分布と言って過言ではありません。 身長・体重・テスト点数・測定誤差など、 多くの自然現象がベル型の正規分布に近似されます。

特徴:

中心極限定理の威力:個々のデータがどんな分布であっても、 標本平均や回帰係数のような「データから計算した量」は、 サンプルサイズが大きければ正規分布に近づきます。 だから t検定、 F検定、 z検定など多くの検定が正規分布を前提に作られています。

🎨 直感で掴む

正規分布
平均と標準偏差を変えると、 正規分布の位置と広がりが変わる。 ±1σ 内に約68%のデータが入る。

📐 数式

【正規分布 N(μ, σ²) の確率密度関数】
$$f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\!\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)$$
exponential の中の $-(x-\mu)^2/(2\sigma^2)$ で、 平均から離れるほど急激に確率密度が小さくなる

🔬 数式を「言葉」で読み解く

$\mu$
平均:分布の中心位置
$\sigma^2$
分散:分布の広がり
$\sigma$
標準偏差:広がりの大きさを元の単位で表したもの
$\exp(\cdot)$
指数関数 $e^{(\cdot)}$。 ベル型の急峻さを作る

⚠️ よくある落とし穴

❌ 「実データは正規分布に従う」と決めつけない
所得・世帯支出など多くの社会データは右に裾の長い分布(log-normal的)を持ち、 正規分布から外れます。 Q-Q プロット、 Shapiro-Wilk 検定で正規性を確認すべき。
✅ 正規分布が中心的な理由:中心極限定理
「個々のデータの分布」と「平均の分布」は別物。 n が大きいと 平均(や回帰係数)の分布 は近似的に正規分布になる(中心極限定理)。 これが正規分布前提の検定が広く使える根拠。
❌ Q-Q プロットを描かない
回帰の残差が正規分布から外れていないかは、 Q-Qプロットで一目瞭然。 残差の正規性が崩れていると、 p値・CI が信頼できなくなる。

👁️ 直感 — 正規分布は「自然界の標準形」

正規分布(normal distribution, Gaussian distribution)は、 統計学で最も重要な確率分布。 「釣り鐘形」をした左右対称の分布で、 自然界や社会現象の多くがこの形に従います。

正規分布の基本

正規分布に従う実例

💡 正規分布は2つのパラメータ μ(平均)と σ(標準偏差)だけで完全に決まる「最も簡潔な分布」。 これだけ単純なのに、 自然界の多くを記述できるのが驚き。

📐 確率密度関数と読み方

確率密度関数(PDF)

$$ 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 はパラメータ μ, σ² の正規分布に従う」と読みます。 σ² ではなく σ で書く流儀もあります(注意)。

2つのパラメータが変えるもの

パラメータの効果

📊 68-95-99.7 ルール — 正規分布の最重要性質

正規分布では、 標準偏差を使って「データが含まれる範囲」が予測できます:

68-95-99.7ルール
範囲 含まれる確率 外側の確率(両側)
μ ± 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

🎯 中心極限定理 (CLT) — 正規分布が偏在する理由

サンプルサイズ n が大きければ、 元の分布が何であれ、 標本平均は正規分布に従う

$$ \bar{X}_n \xrightarrow{n \to \infty} N\left(\mu, \frac{\sigma^2}{n}\right) $$

中心極限定理

元のデータが一様分布でも指数分布でも、 標本平均を取ると n が大きいほど釣り鐘形(正規分布)になります。 これがCLTの威力。

CLT が支える統計手法

💡 一般的な目安:n ≥ 30 で CLT が十分機能。 元の分布が極端に歪んでいる場合は n=100 以上が安全。

🎯 標準正規分布 — 全ての正規分布の基準

μ=0, σ=1 の特殊な正規分布を標準正規分布と呼びます:

$$ Z \sim N(0, 1) $$

任意の正規分布 X ~ N(μ, σ²) は、 標準化 Z = (X - μ)/σ で標準正規分布に変換できます。 これにより、 z表(正規分布表)を使った計算が一律に可能になります。

標準正規分布のよく使う値

z 値 P(Z ≤ z) 用途
1.280.9080%信頼区間(片側)
1.6450.9590%CI / 片側5%
1.960.97595%CI / 両側5%(最頻出)
2.5760.99599%CI / 両側1%
3.290.999599.9%CI

1.96」は最頻出の魔法数字。 95%信頼区間や5%有意水準(両側)でほぼ常に登場します。

🎲 実データへのフィッティング

SSDSE 食料費データに正規分布を当てはめてみます:

正規分布フィッティング

μ = 80.60、 σ = 5.84 の正規分布で47都道府県の食料費はほぼ近似できます。

正規性の検定

「データが正規分布に従うか」を統計的にチェックする検定:

🎯 目的:SSDSE-B-2026 の所得・消費などの変数が正規分布に従うかを Shapiro-Wilk 検定で数値的に判定し、t 検定や Z 変換の前提を確認する。
📥 入力df['消費支出'] のような数値列(サンプル数 3 ≤ n ≤ 5000 が SW 検定の目安)。
1
2
3
4
5
6
from scipy import stats

# Shapiro-Wilk検定
stat, p = stats.shapiro(data)
print(f'統計量={stat:.4f}, p値={p:.4f}')
# p > 0.05 なら「正規分布と矛盾しない」
📤 出力 stat=0.965, p=0.184 → p > 0.05 なので「正規性を棄却しない」。
💬 解説:n が大きいと検定が過敏に有意になる。SSDSE の 47 都道府県なら適切だが、何千件もある場合は QQ プロットでの「視覚的判断」も併用する。

視覚的チェック:QQプロット

標準正規分布の理論値とデータの分位を比較。 直線に乗れば正規分布:

🎯 目的:SSDSE-B-2026 の変数を理論正規分布の分位点と比較し、点が直線上に乗るかを目視で確認する QQ プロット。
📥 入力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()
📤 出力 QQ プロット画像。直線に近ければ正規、両端が反れていれば裾が重い/軽い。
💬 解説:Shapiro-Wilk の数値だけでなく QQ プロットを合わせて見るのが鉄則。p 値が境界(例 0.05 付近)のとき、視覚的判断で迷いを減らせる。

🗺️ 概念マップ — 3つの視点で体系を理解する

正規分布 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。

📍 体系階層のパス

🌐 統計・データサイエンス推測統計推定正規分布

① 🔗 関係マップ — 「他の手法とどう繋がっているか」

中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移

凡例:現在の用語上位カテゴリ兄弟(並列)前提発展形応用先2階層先

② ⭕ 包含マップ — 「どのカテゴリに含まれているか」

大きな円が小さな円を包含する Circle Packing 図。 「正規分布」は緑色でハイライト

📍現在地:統計・データサイエンス

③ 🌳 ツリーマップ — 「面積で見るボリューム比較」

長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「正規分布」は緑色でハイライト

🎯 3つのマップの使い分け

マップ 分かること こんな時に見る
🔗 関係マップ手法間の横の関係(前提→発展→応用)「次に何を学べばよい?」 学習順序の判断
⭕ 包含マップ分類体系の入れ子構造(上位⊃下位)「この手法はどんなジャンルに属する?」
🌳 ツリーマップ分野の規模比較(面積=ボリューム)「データサイエンス全体の俯瞰像」

💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。

🤖 機械学習での正規分布

① 線形回帰の前提

古典的な線形回帰モデル y = Xβ + ε で、 誤差項 ε が正規分布 N(0, σ²) と仮定します。 これにより最小二乗推定量が最尤推定量と一致。

② ガウシアン分類器

ナイーブベイズ(Gaussian Naive Bayes)、 線形判別分析(LDA)は、 各クラスの特徴量分布を正規分布として推定。

③ ガウス過程回帰

任意の入力点での予測値が(多変量)正規分布に従うモデル。 予測の不確実性を自然に表現できる。

④ Variational Autoencoder (VAE)

潜在空間を正規分布で表現する深層生成モデル。 「事前分布 N(0, I) からのサンプリング」で新しいデータを生成。

⑤ 重みの初期化

ニューラルネットの重み初期化(Xavier, He)は標準偏差を精密に制御した正規分布から:

🎯 目的:ニューラルネットの重みを正規分布 N(0, σ²) から乱数生成して初期化する手法(He / Xavier 初期化を含む)。
📥 入力:層のサイズ in_features, out_featuresnn.init.normal_ または nn.init.kaiming_normal_ を使う。
1
2
3
4
5
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)
📤 出力 重みテンソルが N(0, 2/n) や N(0, 1/n) で埋められる。
💬 解説:初期化分布の標準偏差が活性関数(ReLU/tanh)と層幅に依存。He 初期化は ReLU 用、Xavier は tanh 用。「正規分布」は深層学習の最も基本的な部品。

⑥ Batch Normalization

各層の出力を「平均0、 分散1」の正規分布近似に標準化する深層学習の必須技術。

🐍 Python での正規分布

🎯 目的:正規分布の確率密度関数 f(x) と累積分布関数 F(x) を numpy/scipy で計算・描画し、平均・標準偏差を変えたときの形状変化を直感する。
📥 入力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}')
📤 出力 PDF と CDF の曲線(matplotlib)、stats.norm.cdf(1.96) ≈ 0.975 等の数値。
💬 解説:正規分布は 68-95-99.7 ルール(±1σ, ±2σ, ±3σ)で覚えると応用が利く。SSDSE の IQ・身長・血圧などの近似モデルとして頻出。

正規性の検定

🎯 目的:Shapiro-Wilk・Kolmogorov-Smirnov・Anderson-Darling の 3 種類の正規性検定を比較し、どれを採用するかを判断するコード。
📥 入力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()))
📤 出力 SW p=0.18, KS p=0.42, AD stat=0.27(< 0.752 で正規を棄却しない)
💬 解説:サンプル数が大きいときは KS 検定、小さいときは SW、裾の重さを重視するなら AD。実務では 3 つを並べると判断が安定する。

🚧 正規分布の落とし穴

1️⃣ すべてが正規分布ではない

所得、 株価、 地震被害額、 都市人口、 SNS のフォロワー数は裾の長い分布。 これらに正規分布を仮定すると重大なミス。 ヒストグラムで確認を。

2️⃣ CLT も万能ではない

n ≥ 30 が一般的目安だが、 元の分布が非常に歪んでいると n=100 でも不十分なことも。

3️⃣ 「正規性検定」と「現実」のずれ

大標本では、 ほんの少しの非正規性でも p < 0.05 になる。 検定結果よりQQプロットでの目視確認が現実的。

4️⃣ 外れ値で平均と標準偏差が動く

1つの極端値で μ や σ が動き、 「データは正規分布から離れている」と誤判定することも。

5️⃣ 単純正規分布 vs 混合正規分布

二峰性のデータは1つの正規分布では表せません。 ガウス混合モデル(GMM)が必要。

📜 正規分布の歴史

17世紀の発見以来、 数学・物理・工学・経済・心理学・生物学のあらゆる分野に応用され続けています。

🔖 キーワード索引(補強・追加分)

正規分布 関連の補強キーワード。 クリックで該当箇所へ:

ガウス分布 68-95-99.7 ルール 標準正規 Q-Q プロット 中心極限定理 Shapiro-Wilk z 変換 対数正規 信頼区間 尤度関数

🧮 SSDSE-B 実値計算例(47都道府県データ)

SSDSE-B の変数で正規性を検定し、 z 変換・確率計算・正規 QQ プロットまで体系的に検証する完全例。

① 計算コード

🎯 目的:SSDSE-B-2026 を読み込み、選んだ列の正規性検定 → Z 変換 → 確率計算 → QQ プロット作成までを 1 つのスクリプトで完結させる体系的実例。
📥 入力data/raw/SSDSE-B-2026.csv(cp932 エンコード)、対象列名(例:消費支出)。
 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
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='utf-8', skiprows=1)
x = df['持ち家比率'].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)
📤 出力 検定統計量と p 値、Z スコア列、P(X > x) などの確率、QQ プロット画像。
💬 解説:「正規性を仮定する手法(t 検定・線形回帰)」を使う前のチェックリストとして再利用可能なテンプレ。SSDSE-B-2026 の都道府県データで一通り通せば、本番分析でつまずかない。

② 期待出力

項目 参考 解釈
検定持ち家比率結果解釈
Shapiro-W0.965p=0.21正規仮説棄却できず
Jarque-Bera2.81p=0.25正規に近い
KS0.082p=0.91正規との一致良好
確率P(X < 60)0.18Φ((60-μ)/σ) で計算
z 値東京 (45.8)-1.85全国比で低い側
CI95% CI of μ(67.2, 71.9)n=47 から推定

👉 値は SSDSE-B-2026 の典型値。 同じ手順で他都道府県・他変数にも適用可能。

⚠️ 落とし穴(拡張版・各 100 文字以上)

① 「実データは正規分布」と決めつけない
所得・世帯支出など多くの社会データは右に裾の長い分布(log-normal 的)を持ち、 正規分布から外れる。 Q-Q プロット・Shapiro-Wilk 検定・Anderson-Darling で正規性を確認すべき。 SSDSE でも一人当たり県民所得は東京が突出した右裾を持つ。 視覚的確認が最優先。
② 中心極限定理の射程を誤解
「個々のデータの分布」と「平均の分布」は別物。 n が大きいと「平均(や回帰係数)の分布」は近似的に正規になる(CLT)。 これが正規分布前提の検定が広く使える根拠。 ただし n=10 程度では CLT は効きにくい、 また分散無限の分布(コーシー)には CLT が成立しない例外もある。
③ Q-Q プロットを描かない
回帰の残差が正規分布から外れていないかは、 Q-Q プロットで一目瞭然。 残差の正規性が崩れていると、 p 値・CI が信頼できなくなる。 検定統計量だけでなく必ずプロットで確認。 端点(尾部)の挙動が特に重要で、 中央が直線でも端で曲がれば「裾の重い」分布。
④ 検定の選択を間違える
n=47 程度なら Shapiro-Wilk が最も検出力高い。 n > 2000 になると Shapiro-Wilk は使えず、 Anderson-Darling か Lilliefors を使う。 KS 検定は分布の中央を見るが、 尾部の外れを検出しにくい。 Jarque-Bera は歪度・尖度ベースで n が大きい時に有効。
⑤ 「正規でないから検定不可」と即断
t 検定・分散分析は正規分布の仮定があるが、 中心極限定理により n が大きければ頑健(n > 30 程度)。 一方、 完全に正規が必要なら、 n が大きくても F 検定(分散比)など外れ値に敏感な検定は避ける。 ノンパラ検定(Mann-Whitney など)は最終手段。
⑥ 標準正規と一般正規を混同
z = (x - μ) / σ で標準正規に変換した後、 「z = 2.5 だから P > 0.99」と表で確認するワークフロー。 これを忘れて「x = 73 だから p = 0.99」と非変換のまま表を引くと誤る。 SSDSE の県民所得を扱うときは特に注意。
⑦ 信頼区間の解釈の罠
95% CI は「95% の確率で真の μ がこの区間にある」ではない。 正確には「同じ手続きで CI を作れば 95% が真値を含む」。 一回の CI の真値カバー率は 0 か 1 で、 確率ではない。 ベイズ的解釈と頻度論的解釈の混同に注意。
⑧ 多変量正規の前提を見落とす
重回帰・因子分析・MANOVA など多変量手法は、 「変数間が結合正規」を仮定。 単変量ごとに正規でも、 結合は正規でない場合がある。 マルディア(Mardia)検定や、 マハラノビス距離の χ² プロットで確認。 SSDSE のように外れ値(東京)がある場合に問題が顕在化。

🐍 Python 実装バリエーション(scikit-learn / scipy / Optuna)

A. scikit-learn による実装

🎯 目的:GaussianMixture(混合正規分布)で SSDSE-B-2026 の多峰データを 2 個の正規分布の和としてモデル化する例。
📥 入力X(1 次元または多次元の数値列)、n_components=2
 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[['一人当たり県民所得']]).ravel()
print(f'変換前 歪度: {stats.skew(df["一人当たり県民所得"]):+.2f}')
print(f'変換後 歪度: {stats.skew(x_norm):+.2f}')

# 混合ガウスで「実は 2 つの正規の合成」を検出
gmm = GaussianMixture(n_components=2, random_state=42)
gmm.fit(df[['一人当たり県民所得']])
print('成分 1:', gmm.means_[0], gmm.covariances_[0])
print('成分 2:', gmm.means_[1], gmm.covariances_[1])
print('重み:', gmm.weights_)
📤 出力 各成分の平均、分散、混合比(weights_)。
💬 解説:正規分布が単峰でも、複数の集団が混在していると多峰になる(例:男女別の身長分布)。GMM で「隠れた集団」を炙り出すと、SSDSE の都道府県群を地域クラスタとして解釈できる。

B. scipy / statsmodels による実装

🎯 目的:scipy.stats.norm と statsmodels の正規分布関連 API を使い分け、確率計算・推定・検定をワンライナーで実行する。
📥 入力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
from scipy import stats
import numpy as np

x = df['持ち家比率'].values
mu, sigma = x.mean(), x.std(ddof=1)

# 各種確率計算
print(f'P(X < 60)         = {stats.norm.cdf(60, mu, sigma):.4f}')
print(f'P(60 < X < 75)    = {stats.norm.cdf(75, mu, sigma) - stats.norm.cdf(60, mu, sigma):.4f}')
print(f'P(X > 80)         = {1 - stats.norm.cdf(80, 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('差が大きいほど分布選択が重要')
📤 出力 P(X ≤ x), P(X > x), 信頼区間(norm.interval)。
💬 解説:scipy.stats は確率計算と乱数生成、statsmodels は推定と検定に強みがある。両者は補完関係で、組み合わせると正規分布周りの作業が完結する。

C. Optuna でハイパラ・選択最適化

🎯 目的:Optuna を使い、正規分布フィットの分散 σ や混合成分数 k を自動探索する例。BIC を最小化する設定を選ぶ。
📥 入力X(観測データ)、Optuna study とトライアル数。
 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['一人当たり県民所得'].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)
📤 出力 best_params: {n_components: 3, covariance_type: 'diag'}, best_value: BIC=234.5
💬 解説:「正規分布のパラメータをハイパラとして扱う」発想は AIC/BIC 最小化問題に直結する。Optuna の TPE サンプラーで効率良く探索可能。

D. ライブラリ早見表

ライブラリ / 関数 用途
scipy.stats.normPDF・CDF・乱数生成
scipy.stats.shapiro, jarque_bera, normaltest正規性検定
scipy.stats.probplotQ-Q プロット
scipy.stats.kstestKolmogorov-Smirnov 検定
scipy.stats.andersonAnderson-Darling 検定
statsmodels.stats.diagnostic.kstest_normalLilliefors 検定

🔬 モーメント母関数と特性関数 — 「全モーメントの貯金箱」

正規分布 $\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 の標準証明です。

📐 多変量正規分布の幾何学

$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 プロット視覚的・検定不要常時併用必ず描く・最重要
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.iloc[:, 3])

# 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()

🌀 中心極限定理の精密版 — Berry-Esseen 不等式

通常の 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 には豊富な拡張があり、 統計学の基礎理論を支えています。

⚠️ 正規分布の追加的な落とし穴(10 個)

  1. 「データが多ければ正規」と思う:CLT は「標本平均が正規」と言うだけ。 個々のデータが正規分布する保証はない。
  2. 裾が重い分布で SD を使う:t 分布や Cauchy 分布に近いデータで SD を計算すると、 外れ値で SD が無意味に大きく。
  3. p 値だけで正規性を判定:$n$ 大で僅かなズレでも有意になる。 Q-Q プロットの目視を併用。
  4. 有界データを正規で扱う:失業率 (0-100%) のような有界量は厳密には正規でない。 ロジット変換が定石。
  5. 離散データを連続正規で近似:人数のような整数値も、 平均が大きければ正規近似可能。 ただし「人数 = 0」付近では危険。
  6. ゼロ過剰な分布:「ある産業の雇用者数」のように 0 が多発する変数は、 正規分布ではなく Tweedie や Hurdle モデルが適切。
  7. 多変量で周辺正規 ≠ 同時正規:各変数が正規でも組み合わせが正規とは限らない(コピュラの問題)。
  8. 歪度を見ずに分散だけで議論:人口データは右に長い裾を持つので、 中央値と平均が乖離する。
  9. 標準正規での近似誤差:99.7% ルールは「3σ 内に 99.73%」だが、 4σ・5σ の現実的確率は極めて低く、 ファイナンスではブラックスワンの源。
  10. 3σ ルールの誤用:「3σ 外=外れ値」は正規前提。 非正規データに適用すると正常値まで切り捨てる。

💼 実務応用 — 正規分布が支える 8 分野

  1. 品質管理:管理図 (X̄-R chart) は「平均が正規に従う」前提。 6σ 品質管理は不良率 3.4 ppm を意味する。
  2. ファイナンス:Black-Scholes モデルは対数収益率が正規。 ただし実データは裾が重い(GARCH や t 分布で補正)。
  3. 誤差解析:物理測定では複数の独立誤差が足し合わさるため、 CLT で正規近似が正当化される。
  4. 機械学習:線形回帰の残差は正規仮定、 Gaussian Naive Bayes、 VAE の潜在変数、 ガウス過程など。
  5. 医療統計:身長・血圧・コレステロール値などは概ね正規。 「平均±2SD」が基準値範囲の基本。
  6. 心理学:IQ は定義上正規(平均 100, SD 15)に標準化されている。
  7. 気象:日次気温は概ね正規だが、 極端気温(heat wave)は裾の議論が必要。
  8. 製造業:寸法公差設計は正規分布の Cpk 指標で評価される。

🏛 正規分布の歴史 — 200 年の旅路