統計学の最重要分布。 「データが正規分布に従う」「残差が正規分布」「中心極限定理で平均は正規分布」など、 至るところで登場します。
正規分布 とは:平均を中心に左右対称、ベル型に広がる分布。多くの自然現象に近似される最重要分布。
正規分布(ガウス分布)は、 統計学の最重要分布と言って過言ではありません。 身長・体重・テスト点数・測定誤差など、 多くの自然現象がベル型の正規分布に近似されます。
特徴:
中心極限定理の威力:個々のデータがどんな分布であっても、 標本平均や回帰係数のような「データから計算した量」は、 サンプルサイズが大きければ正規分布に近づきます。 だから t検定、 F検定、 z検定など多くの検定が正規分布を前提に作られています。

正規分布(normal distribution, Gaussian distribution)は、 統計学で最も重要な確率分布。 「釣り鐘形」をした左右対称の分布で、 自然界や社会現象の多くがこの形に従います。
💡 正規分布は2つのパラメータ μ(平均)と σ(標準偏差)だけで完全に決まる「最も簡潔な分布」。 これだけ単純なのに、 自然界の多くを記述できるのが驚き。
$$ 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 | from scipy import stats # 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() |
正規分布 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
🌐 統計・データサイエンス › 推測統計 › 推定 › 正規分布
中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移。
大きな円が小さな円を包含する Circle Packing 図。 「正規分布」は緑色でハイライト。
長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「正規分布」は緑色でハイライト。
| マップ | 分かること | こんな時に見る |
|---|---|---|
| 🔗 関係マップ | 手法間の横の関係(前提→発展→応用) | 「次に何を学べばよい?」 学習順序の判断 |
| ⭕ 包含マップ | 分類体系の入れ子構造(上位⊃下位) | 「この手法はどんなジャンルに属する?」 |
| 🌳 ツリーマップ | 分野の規模比較(面積=ボリューム) | 「データサイエンス全体の俯瞰像」 |
💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。
古典的な線形回帰モデル 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 | 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」の正規分布近似に標準化する深層学習の必須技術。
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世紀の発見以来、 数学・物理・工学・経済・心理学・生物学のあらゆる分野に応用され続けています。
正規分布 関連の補強キーワード。 クリックで該当箇所へ:
SSDSE-B の変数で正規性を検定し、 z 変換・確率計算・正規 QQ プロットまで体系的に検証する完全例。
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) |
| 項目 | 値 | 参考 | 解釈 |
|---|---|---|---|
| 検定 | 持ち家比率 | 結果 | 解釈 |
| Shapiro-W | 0.965 | p=0.21 | 正規仮説棄却できず |
| Jarque-Bera | 2.81 | p=0.25 | 正規に近い |
| KS | 0.082 | p=0.91 | 正規との一致良好 |
| 確率 | P(X < 60) | 0.18 | Φ((60-μ)/σ) で計算 |
| z 値 | 東京 (45.8) | -1.85 | 全国比で低い側 |
| CI | 95% CI of μ | (67.2, 71.9) | n=47 から推定 |
👉 値は SSDSE-B-2026 の典型値。 同じ手順で他都道府県・他変数にも適用可能。
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_) |
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('差が大きいほど分布選択が重要') |
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) |
| ライブラリ / 関数 | 用途 |
|---|---|
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 検定 |
正規分布 $\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()
通常の 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 には豊富な拡張があり、 統計学の基礎理論を支えています。