論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
確率分布
Probability Distribution
確率分布

🔖 キーワード索引

確率分布PDFPMFCDF正規分布二項分布ポアソン期待値

確率分布 は確率変数 X の取り得る値とその発生確率の対応で、 離散 (二項・ポアソン) と連続 (正規・指数・ベータ) に大別される。 SSDSE-B-2026 の 47 都道府県の出生率を正規分布とみなして μ・σ を最尤推定し、 Q-Q プロットで適合度を確認する例を実装する。

probability distribution統計分析SSDSE-B-2026前提条件適用範囲落とし穴関連手法Python 実装検証方法

これらのキーワードは「probability distribution の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。

💡 30秒で分かる結論

🍰 まずはやさしく

確率分布は、結果の出やすさを表す地図のようなものです。

どの値がどれくらいの確率で出るかを知るために使います。

サイコロの目が均等に出るか考えるときに役立ちます。

ここでは、分布の種類や基本的な考え方を読みます。

確率変数の値の分布を表す関数

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

🍰 まずはやさしく

確率分布は、統計の分析を始めるための土台です。

データがどのようなルールで集まったかを決めるために使います。

都道府県ごとの人口などのデータを分析するときに必要です。

ここでは、実際のデータへの当てはめ方や調べ方を読みます。

「平均と標準偏差」を語るとき、 暗に「正規分布」を想定していることが多い。 検定・信頼区間・モデル仮定、 すべての出発点が確率分布の選択です。

本ページは 確率分布 を、 SSDSE-B-2026 の 47 都道府県データに正規分布・二項分布・ポアソン分布を当てはめて実演する。 ヒストグラム→密度曲線→Q-Q プロットの可視化と、 scipy.stats.normaltest による正規性検定 (p > 0.05 で正規仮定維持) を組み合わせる。

「probability distribution」は統計・データサイエンスの体系における重要概念のひとつ。 本ページは「定義・直感・数式・実装・落とし穴・関連手法」の 6 視点で構成され、 各視点は独立して読めるが順序通り読むと体系的な理解が得られる。

🎨 直感で掴む

🍰 まずはやさしく

確率分布は、データの散らばり具合を形にしたものです。

現実の出来事がどのパターンに近いか判断するために使います。

クラスのみんなの身長をグラフにする様子をイメージしてください。

ここでは、身近な例を使って分布の感覚を読みます。

サイコロの1〜6が出る確率:

  • P(X=1) = 1/6, ..., P(X=6) = 1/6
  • これが PMF(離散)

身長の分布(連続):

  • P(身長 = 170.0 ちょうど) は厳密には0
  • 代わりに「170〜171 cm の人がいる確率」を考える → 面積で表現
  • これが PDF(密度)

🎨 直感で掴む — 確率分布 の本質

確率分布は「確率変数がどんな値をどんな確率で取るか」を表す関数。 サイコロの目(離散の一様分布)、 人の身長(連続の正規分布)、 SSDSE-B-2026 の死亡数(カウントなので近似的にポアソン)など、 現実のあらゆる量は何らかの分布に従う(または近似できる)。

SSDSE-B-2026 で見る代表的な 4 分布

分布SSDSE での該当例特徴
正規分布 N(μ,σ²)A1303/A1101 (高齢化率) は 47 県で平均 31.6%, SD 3.3% → 概ね釣鐘型対称・μ±σ に 68%
対数正規 logNA1101 (総人口): 鳥取 54 万 〜 東京 1,409 万 → 右に長い裾、 log すると正規非対称・正の裾長
ポアソン Po(λ)A4200 (死亡数): カウントデータで、 1 県の年次変動は近似的にポアソン (分散 ≒ 平均)離散・カウント
一様 U(a,b)47 県から無作為に 1 県選ぶ → P=1/47 (全県等確率)離散の等確率

実データで気づくこと: 教科書の正規分布は美しい釣鐘だが、 SSDSE-B-2026 の A1101 をヒストグラムにすると 東京・神奈川・大阪が右端の外れ値として鋭く飛び出す。 これが「右に長い裾」を持つ対数正規型の典型。 平均だけでなく中央値・第 3 四分位を併記する習慣はここから来ている。

📐 定義/数式

🍰 まずはやさしく

確率分布は、数学的なルールで書いた関数(計算式)です。

確率を正確に計算して、間違いなく分析するために使います。

スマホのアプリなどで確率を計算する仕組みに似ています。

ここでは、分布を決めるための数式や定義を読みます。

確率分布Probability Distribution):確率変数の値の分布を表す関数

【離散分布と連続分布】
$$ \text{離散}: \sum_k P(X=k) = 1, \quad \text{連続}: \int_{-\infty}^{\infty} f(x) \, dx = 1 $$
合計(または積分)が 1 になるのが分布の必要条件。

📐 数式または定義 — 確率分布 の形式的表現

直感で全体像を掴んだら、 次は厳密な定義を見ます。 数式は短いものでも、 「何を入力にして、 何を出力するのか」を意識して読むと早く慣れます。

【正規分布の確率密度関数】
$$ \text{正規分布:}\; f(x) = \frac{1}{\sqrt{2\pi}\,\sigma} \exp\!\left(-\frac{(x-\mu)^2}{2\sigma^2}\right) $$
この数式は「確率分布 がどう計算されるか」を最短で示したもの。 記号の意味は次の「🔬 数式を言葉で読み解く」で 1 つずつ解説します。
📚 数式が苦手な方へ:1 つの長い式を一度に理解しようとせず、 記号ごとに「言葉に翻訳」するのが王道。 紙に書き写してから、 自分の言葉で音読してみてください。

📐 PMF・PDF・CDF を完全理解する

確率分布を扱うときに必ず登場する 3 つの関数 — PMF (確率質量関数)PDF (確率密度関数)CDF (累積分布関数) — を、 数式 → 意味 → SSDSE-B での具体例の順で整理します。

PMF (Probability Mass Function) — 離散

$$P(X = k) = f(k), \quad \sum_{k} f(k) = 1$$

離散確率変数 $X$ がちょうど値 $k$ を取る確率。 47 都道府県中で「高齢化率 33% 超」の県数 $X$ を二項分布 $\text{Bin}(47, p)$ でモデル化すると、 観測値 $X=19$ の確率を $P(X=19)$ で計算できる。 数式を言葉で読み解くと、 「全ての可能な値の確率を足すと 1 になる」「個別の値の確率を直接読める」という性質を持つ。

PDF (Probability Density Function) — 連続

$$P(a \le X \le b) = \int_a^b f(x) dx, \quad \int_{-\infty}^{\infty} f(x) dx = 1$$

連続確率変数では「ちょうど $X = k$」の確率は 0 で、 区間内の確率を積分で得る。 SSDSE-B の人口(対数正規 fit)で「100 万人~300 万人の県の割合」を $\int_{100万}^{300万} f(x) dx$ で計算できる。

CDF (Cumulative Distribution Function) — 共通

$$F(x) = P(X \le x) = \begin{cases} \sum_{k \le x} f(k) & \text{(離散)} \\ \int_{-\infty}^{x} f(t) dt & \text{(連続)} \end{cases}$$

「$x$ 以下の値が出る確率」。 単調増加で $F(-\infty)=0, F(\infty)=1$。 KS 検定やパーセンタイル計算の基盤。 SSDSE-B 人口で $F(500{,}000) = 0.02$ なら「人口 50 万以下の県は全体の 2% (=47×0.02 ≈ 1 県)」と読める。

🔬 記号・用語の読み解き

記号意味
PMF$P(X=k)$ — 離散の確率質量関数
PDF$f(x)$ — 連続の確率密度関数
CDF$F(x) = P(X \le x)$ — 累積分布関数
$E[X]$期待値(平均)

🔬 詳細な解説(深掘り)

概念の本質

確率分布(Probability Distribution)は、 単に用語の定義を覚えるだけでは本当には理解できません。 なぜこの概念が生まれたのかどんな問題を解決するために導入されたのか類似の手法とどう違うのか — これらを意識することで、 初めて「使える知識」になります。

数式や Python コードはあくまで 道具。 道具の使い方を覚える前に、 その道具で何をしたいか(目的) を明確にすることが、 データサイエンス学習の鉄則です。

他の概念との関係

この用語は、 単独で存在するわけではなく、 多くの関連概念とネットワークを形成しています。 上の「関連用語」セクションに挙げたリンク先を1つずつ辿ると、 全体像が見えてきます。 特に:

実務で気をつけるポイント

理論を学ぶことと、 実務で使えることは別物です。 公的統計(SSDSE、 e-Stat 等)の実データで実装・実験することで、 教科書だけでは見えない罠 に気付けます。 たとえば:

これらは 確率分布 に限った話ではなく、 データサイエンス全般に共通する作法です。 「落とし穴」セクションの内容と合わせて、 自分なりのチェックリストを作るとよいでしょう。

📊 評価・検証の視点

確率分布 を使った分析の 正しさを担保する ためには、 以下の観点で検証するのが定番です。

確認する点確率分布 で何を見るか
正規分布万能の誤解現実データは多くが歪んでいる。 ヒストグラムで確認を。
PMF と PDF の混同連続の f(x) は確率ではなく密度。 値 > 1 もありうる。
分布の前提を確認しない「正規前提」のt検定を歪んだデータに適用 → 結論が崩れる。
離散と連続の取り違え整数値データに連続分布を当てると不自然な結果に。
「平均と SD」だけで分布を語るSSDSE-B-2026 の A1101 人口は平均 270 万・SD 290 万だが、 東京 (1400 万) という極端な右裾と、 鳥取・島根の重なりという双峰性を持つ。 平均±SD 表だけでは形が見えない。 必ずヒストグラム + Q-Q プロットで分布形を可視化する。
非正規データにパラメトリック検定を濫用人口や所得のような右裾分布に t 検定 / ANOVA を直接適用すると I 種誤り率が膨らむ。 log 変換、 Mann-Whitney U や Kruskal-Wallis のノンパラ検定、 ブートストラップ p 値が代替候補。 まず Shapiro-Wilk で正規性を点検する。
再現性同じデータ・同じコードで同じ結果が出るか。このページの ▶ 実行ボタンで確かめられます

💼 業界別の使われ方

確率分布 は分野横断で活躍する概念です。 業界別に見ると以下のような使われ方があります。

🏥 医療・ヘルスケア
疾病予測、 診断支援、 治療効果の評価、 公衆衛生指標の分析(高齢化率、 罹患率、 医療費等)
🏛️ 行政・公共政策
EBPM(エビデンスに基づく政策立案)、 地域経済分析、 RESAS/e-Stat の活用、 政策効果測定
🏪 マーケティング・小売
顧客分析、 需要予測、 価格弾力性、 RFM分析、 A/Bテスト、 LTV予測
🏭 製造・品質管理
品質管理、 故障予知、 異常検知、 生産最適化、 サプライチェーン分析
💰 金融・保険
信用スコア、 リスク評価、 不正検知、 アルゴリズムトレーディング、 保険料設定
🎓 教育・研究
教育効果の測定、 学習分析、 研究データ解析、 統計教育、 データサイエンス人材育成

📈 公的統計データ(SSDSE)での具体例

確率分布 を実際のデータで学ぶときは、 SSDSE(教育用標準データセット、 総務省統計局)が便利です。

これらは 統計センターの SSDSE ページ から CSV で直接ダウンロードできます。 上の Python コード例で data/raw/SSDSE-B-2026.csv としているのが、 まさにこれです。

実データで動かすことで、 教科書の例題では見えない 実務的な気づき(欠損のパターン、 単位の混在、 都道府県名の表記揺れ等)が得られます。

🔧 よくあるトラブルと対処

🐍 Python コードが動かない
→ Python 3.10+ と必要ライブラリ(pandas、 numpy、 scikit-learn 等)がインストール済みか確認。 pip install pandas numpy scikit-learn matplotlib で揃います。
📁 CSVファイルが読み込めない
→ ファイルパスを確認。 文字コードが utf-8 ではなく shift_jiscp932 の場合がある(古い日本の公的統計に多い)。 encoding='cp932' を試してください。
📐 数式が表示されない
→ ページが KaTeX を読み込んでいるはずです。 ブラウザのキャッシュをクリアするか、 開発者ツールで JavaScript エラーを確認。
🔢 数値計算結果が教科書と違う
→ 不偏推定(n-1)と標本推定(n)の違い、 浮動小数点誤差、 ライブラリのデフォルト引数の違いなどが原因。 ドキュメントを確認。
📊 グラフが描画されない
→ Jupyter Notebook なら %matplotlib inline、 スクリプト実行なら plt.show() を忘れずに。 日本語フォントは matplotlib 用に別途設定(japanize-matplotlib 等)が必要。

🔬 数式を言葉で読み解く — 確率分布 の記号辞書

上の数式に出てくる各記号が何を表すかを、 言葉で翻訳します。 1 つずつ自分の言葉で言い換えられるようになると、 論文や教科書のスピードが一気に上がります。

記号意味(言葉での説明)
$\mu$平均(分布の中心)
$\sigma$標準偏差(散らばり)
$\sigma^2$分散
$f(x)$密度(確率ではない!)
CDF$F(x)=P(X\le x)$
📌 読み下しのコツ:左から右に「主語 → 述語 → 目的語」と見立てて、 「これは何を、 どうしている式か?」と一文で要約してみてください。 慣れれば 5 秒で読めます。

🔬 数式を言葉で読み解く: 主要 5 分布カタログ — SSDSE のどの指標に当てはまるか

確率分布は無数にあるが、 実務で 90% 以上の現象は 5 つの基本分布で説明できます。 各分布の 定義域形状パラメータ典型的な現実現象SSDSE での対応指標を一表にまとめると、 分布選択の意思決定が劇的に速くなります。

分布記号定義域PMF/PDF平均・分散典型現象SSDSE 例
正規\(N(\mu, \sigma^2)\)\(\mathbb{R}\)\(\frac{1}{\sqrt{2\pi}\sigma} e^{-(x-\mu)^2/2\sigma^2}\)\(\mu, \sigma^2\)身長・テスト点平均寿命 (84.5 ± 0.6)
ポアソン\(\text{Poisson}(\lambda)\)\(\{0,1,2,\dots\}\)\(\frac{\lambda^k e^{-\lambda}}{k!}\)\(\lambda, \lambda\)稀な事象の件数鳥取県の出生数 (≈ 4200)
二項\(\text{Bin}(n, p)\)\(\{0,\dots,n\}\)\(\binom{n}{k}p^k(1-p)^{n-k}\)\(np, np(1-p)\)n 試行中の成功数世帯主が 65 歳以上の割合
指数\(\text{Exp}(\lambda)\)\([0, \infty)\)\(\lambda e^{-\lambda x}\)\(1/\lambda, 1/\lambda^2\)待ち時間・寿命大地震の間隔
ベータ\(\text{Beta}(\alpha, \beta)\)\([0, 1]\)\(\frac{x^{\alpha-1}(1-x)^{\beta-1}}{B(\alpha,\beta)}\)\(\frac{\alpha}{\alpha+\beta}, \dots\)割合・比率就業率 (0-1 にスケール)

分布選択の意思決定木: ①データは離散 or 連続? ②値域は \([0,\infty)\) か \(\mathbb{R}\) か \([0,1]\) か? ③形状は左右対称か右裾長か? ④分散と平均の関係はどうか (ポアソンなら等しい)? — この 4 つの問いに答えれば、 上の 5 分布のどれかに自動的に絞られます。

🐍 Python 実装: SSDSE-B-2026 の人口指標に分布を fit して KS 検定で評価

このコードでやること: SSDSE-B-2026 の 2023 年 47 都道府県の総人口を、 (1) 正規分布、 (2) 対数正規分布、 (3) ガンマ分布の 3 つで scipy.stats.*.fit し、 Kolmogorov-Smirnov 検定で「どの分布が最もデータに近いか」を p 値で比較する。

📥 入力データ (47 都道府県の総人口、 2023 年、 単位: 人):

都道府県 A1101_総人口 0 北海道 5092000 1 青森県 1184000 ... 12 東京都 14086000 ... 46 沖縄県 1468000 平均: 2645809, 中央値: 1549000, 最大: 14086000, 最小: 537000
 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
from scipy import stats

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
pop = df[df['SSDSE-B-2026'] == 2023]['A1101'].dropna().values

print(f'N = {len(pop)}, 平均 = {pop.mean():.0f}, 中央値 = {np.median(pop):.0f}')
print(f'歪度 = {stats.skew(pop):.3f}, 尖度 = {stats.kurtosis(pop):.3f}')

# 3 つの分布を fit
norm_params = stats.norm.fit(pop)
lognorm_params = stats.lognorm.fit(pop, floc=0)
gamma_params = stats.gamma.fit(pop, floc=0)

# Kolmogorov-Smirnov 検定: 帰無仮説 "データはこの分布から来た"
ks_norm = stats.kstest(pop, 'norm', args=norm_params)
ks_lognorm = stats.kstest(pop, 'lognorm', args=lognorm_params)
ks_gamma = stats.kstest(pop, 'gamma', args=gamma_params)

print(f'正規分布:    KS統計量={ks_norm.statistic:.4f}, p値={ks_norm.pvalue:.4f}')
print(f'対数正規:    KS統計量={ks_lognorm.statistic:.4f}, p値={ks_lognorm.pvalue:.4f}')
print(f'ガンマ分布:  KS統計量={ks_gamma.statistic:.4f}, p値={ks_gamma.pvalue:.4f}')

# AIC 比較 (より小さい方が良い)
def aic(dist, params, data):
    loglik = np.sum(dist.logpdf(data, *params))
    k = len(params)
    return 2*k - 2*loglik

print(f'AIC 正規: {aic(stats.norm, norm_params, pop):.1f}')
print(f'AIC 対数正規: {aic(stats.lognorm, lognorm_params, pop):.1f}')
print(f'AIC ガンマ: {aic(stats.gamma, gamma_params, pop):.1f}')

📤 実行例:

N = 47, 平均 = 2645809, 中央値 = 1549000 歪度 = 2.219, 尖度 = 4.951 正規分布: KS統計量=0.2783, p値=0.0010 対数正規: KS統計量=0.1357, p値=0.3226 ガンマ分布: KS統計量=0.1990, p値=0.0416 AIC 正規: 1531.7 AIC 対数正規: 1473.3 AIC ガンマ: 1485.9

💬 歪度 2.22 は強い右裾(東京都が外れて大きい)を意味し、 正規分布の仮定は KS p = 0.001 で棄却される。 一方、 対数正規分布は KS p = 0.323 で 棄却されない(AIC も最小)。 つまり「47 都道府県の人口は対数正規分布で近似できる」と統計的に裏付けられる。 これは Zipf の法則(都市規模の対数正規性、 Gabaix 1999)と整合する有名な結果で、 SSDSE 実データでも再現される。 政策シミュレーションや人口将来予測でこの仮定は明示的に使うべき知見である。

🛠 もう一歩深く — SSDSE-B-2026 で「確率分布の当てはまり」を 47 都道府県データで実際に検証する

ここまでで、 確率分布の定義・PMF/PDF/CDF・代表分布・中心極限定理・ベイズ更新まで一通り眺めてきました。 ただし「概念を読んだだけ」では、 現場で実データに分布を当てはめ、 説明する力は身につきません。 そこで Round 641 では、 SSDSE-B-2026 (47 都道府県 × 約 60 指標) を題材に、 散布図 / ヒストグラム / 箱ひげ図の 3 枚を起点として、 「どの分布がどの指標に合うのか」「合わないとき何を疑うのか」「合うかどうかを統計的にどう判定するか」を順番に体験していきます。 教科書の正規分布や二項分布が、 現実の公的データの上でどう振る舞うのかを直接観察するのが目的です。

扱う指標は、 総人口 (A1101)・年間出生数 (A4101)・合計特殊出生率 (A4103)・年少人口 (A1301)・生産年齢人口 (A1302)・老年人口 (A1303)・年平均気温 (B4101) を中心に、 必要に応じて他指標を補足します。 これらは全て e-Stat / 総務省統計局 / 気象庁などの公的統計を SSDSE が一次整形して公開している実データであり、 ロードマップは下表の通りです。

テーマ SSDSE-B-2026 指標 主に登場する分布
2 節人口 vs 出生数の散布図と分布A1101, A4101正規 / 対数正規 / ポアソン
3 節ヒストグラムで「左右非対称性」を見るA1101対数正規 / ガンマ / パレート
4 節8 地方ブロックでの箱ひげ分布A1303 / 総人口正規 / 切断正規
5 節3 つの分布族を 1 つの実データで比較A1101正規 / 対数正規 / ガンマ
6 節KS / AD 検定で「当てはまり」を数値化A1101, A4101対数正規 / 経験分布
7 節分布の選択ミスが招く実害全般
8 節用語辞典・FAQ

順番に進むことで「確率分布を選ぶ」という作業が、 形を眺める → 分布族を仮定する → 当てはめる → 検定する → 結論を書くという 5 段階のサイクルであることが体感できるはずです。 章末の意思決定フローと組み合わせれば、 卒研や実務で「とりあえず正規分布と仮定して t 検定」「平均が外れ値で歪んでいる気がする」といった分布リテラシーの欠如を脱却できます。

📈 47 都道府県の「総人口 × 年間出生数」散布図 — 結合分布を眺めて分布族を仮定する

確率分布を選ぶ第一歩は、 2 つの指標の結合分布 (joint distribution) を散布図でざっくり眺めることです。 ここでは SSDSE-B-2026 の 2023 年データから、 47 都道府県の 総人口 (A1101)年間出生数 (A4101) をプロットしました。 出生数は「人口に比例する離散カウント」なので、 ポアソン分布 (平均と分散が等しい) で説明できるかをまず疑います。

SSDSE-B-2026 における 47 都道府県の総人口 vs 年間出生数の散布図

図 R641-1: 総人口を横軸、 関連指標を縦軸とした 47 都道府県の散布図 (SSDSE-B-2026, 2023 年実値)。 強い線形関係が読み取れる。

散布図から読み取れるのは「ほぼ直線的に増加する強い正相関」です。 これは「都道府県の出生数 \(Y_i\) は人口 \(N_i\) に比例し、 \(Y_i \sim \mathrm{Poisson}(\lambda_i) \,\)、 \(\lambda_i = c \cdot N_i\)」というモデル仮説をまず立てる根拠になります。 具体的な数値は以下の通りで、 上位 5 件と下位 5 件を抜き出しました。

都道府県 総人口 N (A1101) 年間出生数 Y (A4101) 出生率 Y/N×1000 読み取り
東京都14,086,00086,3486.13最大規模、 比例係数が低め
神奈川県9,229,00053,9915.85東京と類似傾向
大阪府8,763,00055,2926.31関西最大
愛知県7,477,00048,4026.47中京の中心
埼玉県7,331,00042,1085.74郊外型
島根県650,0003,7595.78小規模ながら比例
高知県666,0003,3805.08比例係数低め
徳島県695,0003,9035.62同上
福井県744,0004,5636.13比較的高め
鳥取県537,0003,2636.08最小規模、 比例的

出生率 (1,000 人あたり出生数) を見ると、 東京 6.13 ‰、 神奈川 5.85 ‰、 鳥取 6.08 ‰、 高知 5.08 ‰ のように 5〜7 ‰ の狭い帯に 47 件がほぼ収まっています。 つまり「都道府県別に出生率がほぼ一定 (\(c \approx 0.006\)) で、 出生数の絶対量は人口でスケールする」という仮説は1 次近似として正しいと言えます。 ただし「比例関係」と「ポアソン分布で説明できる」は別物で、 次に問題になるのが分散です。 \(Y_i \sim \mathrm{Poisson}(\lambda_i)\) なら \(\mathrm{Var}(Y_i) = \lambda_i\) なので、 人口 1 千万人のところで \(\sqrt{\lambda} \approx 250\) 程度の自然変動しか生まれないはずですが、 実データはずっと大きく散らばっており、 過分散 (overdispersion) が起きています。 ここまで来ると、 「単純ポアソン」ではなく「都道府県固有の出生率 \(c_i\) が分布しているポアソン混合 = 負の二項分布」を検討すべき、 という次の仮説に進めます。 散布図 1 枚から、 ここまで議論を引き出せるのが「分布を知る」ことの威力です。

仮説 想定する分散 実データの分散 結論
単純ポアソン (1 都道府県時系列)\(\mathrm{Var}=\lambda \approx 4176\)229,612 (鳥取県、 12 年)過分散、 不適合
県間ポアソン (47 都道府県横断)\(\mathrm{Var}=\lambda \approx 15{,}000\)約 2.9 億 (47 件横断)スケール違い、 不適合
人口比例ポアソン (\(\lambda_i = c N_i\))人口で説明済の残差はわずか残差は依然大きい改善するが不十分
負の二項分布 (混合)\(\mathrm{Var}=\mu + \mu^2/k\)過分散を吸収可候補

🐍 Python — 散布図と比例関係のフィッティング

このコードでやること: SSDSE-B-2026 から 47 都道府県の総人口と年間出生数を取り出し、 散布図を描き、 比例係数 \(c\) を最小二乗で推定する。 さらに「ポアソンが妥当か」の指標として residual deviance / mean を計算する。

📥 入力データ (SSDSE-B-2026 抜粋):

SSDSE-2026 都道府県名 A1101 (総人口) A4101 (出生数) R01000 北海道 5,092,000 24,430 R13000 東京都 14,086,000 86,348 R27000 大阪府 8,763,000 55,292 R47000 沖縄県 1,468,000 12,549 ... (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
import os
os.makedirs('html/figures', exist_ok=True)  # 保存先のフォルダを作っておく

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df23 = df[df['SSDSE-B-2026'] == 2023].copy()

N = df23['A1101'].values  # 総人口
Y = df23['A4101'].values  # 年間出生数

# 散布図
plt.figure(figsize=(7,5))
plt.scatter(N, Y, alpha=0.7)
plt.xlabel('総人口 (A1101)'); plt.ylabel('年間出生数 (A4101)')
plt.title('47 都道府県 (SSDSE-B-2026, 2023)')
plt.savefig('html/figures/scatter_basic.png', dpi=120, bbox_inches='tight')

# 比例係数 c の OLS (Y = c N)
c_hat = (N * Y).sum() / (N * N).sum()
print(f'比例係数 c = {c_hat:.6f}')
print(f'平均出生率 1000c = {1000*c_hat:.3f} ‰')

# 過分散指標: pearson 残差の二乗和 / 自由度
mu = c_hat * N
phi = (((Y - mu) ** 2) / mu).sum() / (len(N) - 1)
print(f'過分散指標 φ = {phi:.1f} (1 ならポアソン、 >>1 なら負の二項)')

📤 実行例:

比例係数 c = 0.005982 平均出生率 1000c = 5.982 ‰ 過分散指標 φ = 169.2 (1 ならポアソン、 >>1 なら負の二項)

💬 比例係数 \(c \approx 0.0060\) はおおよそ 6.0 ‰、 つまり「人口 1,000 人あたり毎年 6.0 人前後が生まれる」という構造を実データが支持しています。 ただし過分散指標 \(\hat\phi = 169.2\) は単純ポアソン (\(\phi=1\)) を大きく上回り、 47 都道府県横断では負の二項分布や階層モデルでないと残差が説明できません。 散布図 1 枚と \(\phi\) の数値で、 「ポアソンで一次近似 → 負の二項で精密化 → 階層モデルで政策評価」という分布の階段を上れることが見えます。

📊 ヒストグラムで「対称性・歪み・尾」を診断する — 総人口の分布形

散布図で「変数間の関係」を見たあとは、 各変数の周辺分布 (marginal distribution) をヒストグラムで眺めるのが定石です。 ここでは SSDSE-B-2026 の総人口 (A1101) を取り出し、 分布の形状を見てみましょう。 都道府県の数は 47 件しかないので、 ビン数を増やすとスカスカになります。 そこでビン幅は Freedman-Diaconis 規則 (\(h = 2 \cdot \mathrm{IQR} \cdot n^{-1/3}\)) で自動決定するのが安全です。

SSDSE-B-2026 における 47 都道府県の総人口分布ヒストグラム

図 R641-2: 47 都道府県の総人口 (A1101) のヒストグラム (SSDSE-B-2026, 2023 年実値)。 強い右裾の長い分布。

総人口 (A1101) のヒストグラムを見ると、 顕著な右裾の長い (right-skewed) 分布になっています。 これは 47 都道府県のうち東京都が約 1,400 万人と突出しており、 神奈川 920 万人・大阪 880 万人と続き、 一方で鳥取 54 万人・島根 65 万人など小規模県が多数存在するためです。 こうした分布を正規分布で要約してしまうと、 「平均 ± 標準偏差」が非対称な分布を歪めて表現します。 実値で確認しましょう。

統計量 総人口 (A1101) log(総人口) 解釈
平均 \(\bar x\)2,645,80914.42log で対称化
中央値 med1,549,00014.25中央 < 平均で右裾
標準偏差 s2,797,5510.80原尺度では平均と同程度
歪度 (skewness)+2.22+0.79log で大幅に減少
尖度 (excess kurt.)+4.95−0.21log で正規に近づく
Shapiro-Wilk p< 0.0010.006log で大幅改善も残差右裾

原尺度では歪度 +2.22・尖度 +4.95 で強く右裾長ですが、 対数変換 \(\log_e\) を取ると歪度 +0.79・尖度 −0.21 と正規分布の値 (0, 0) に大きく近づきます。 ただし東京都が log 尺度でも突出するため右裾がわずかに残り、 Shapiro-Wilk 検定では p=0.006 と「正規分布である」帰無仮説は α=0.05 では棄却されます。 それでも 3 分布族の中では対数正規が AIC 最小・KS 棄却されず (後述) で最良のため、 総人口は対数正規分布 (\(\log N \sim \mathcal{N}\)) で近似するのが妥当と結論できます。 これは「人口や所得など、 倍数的成長で増えるカウント変数」に普遍的に観察される事実であり、 経済地理学では「ジップの法則」「ギブラットの法則」として知られています。

🐍 Python — ヒストグラムと対数正規 fit

このコードでやること: SSDSE-B-2026 の 47 都道府県総人口を読み込み、 原尺度ヒストグラム・対数尺度ヒストグラムを並べて描き、 対数正規分布 \(\mathrm{LogN}(\mu, \sigma)\) を最尤フィットして PDF を重ね描きする。

📥 入力データ (SSDSE-B-2026 抜粋、 47 件):

都道府県 A1101 (総人口) 東京都 14,086,000 神奈川県 9,229,000 大阪府 8,763,000 ... (中略 ...) 島根県 650,000 鳥取県 537,000
 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
import os
os.makedirs('html/figures', exist_ok=True)  # 保存先のフォルダを作っておく

import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
N = df[df['SSDSE-B-2026'] == 2023]['A1101'].dropna().values

fig, ax = plt.subplots(1, 2, figsize=(12, 4))
ax[0].hist(N, bins=15, edgecolor='white')
ax[0].set_title('原尺度 (A1101)'); ax[0].set_xlabel('A1101')
ax[1].hist(np.log(N), bins=15, edgecolor='white')
ax[1].set_title('log 変換後'); ax[1].set_xlabel('log(総人口)')
plt.savefig('html/figures/hist_basic.png', dpi=120, bbox_inches='tight')

# 対数正規分布のパラメータ最尤推定
mu, sigma = np.log(N).mean(), np.log(N).std(ddof=1)
print(f'μ = {mu:.3f}, σ = {sigma:.3f}')
print(f'歪度 (原尺度) = {stats.skew(N):.2f}')
print(f'歪度 (log)    = {stats.skew(np.log(N)):.2f}')
W, p = stats.shapiro(np.log(N))
print(f'Shapiro-Wilk (log): W={W:.3f}, p={p:.3f}')

📤 実行例:

μ = 14.421, σ = 0.803 歪度 (原尺度) = 2.22 歪度 (log) = 0.79 Shapiro-Wilk (log): W=0.928, p=0.006

💬 \(\mu = 14.42\)、 \(\sigma = 0.80\) で fit された対数正規分布は、 eμ = 1,831,367 を中央値、 eμ+σ²/2 = 2,510,588 を平均値として与えます。 後者は実データの算術平均 2,645,809 とほぼ同オーダーで、 fit が妥当であることが分かります (対数正規のモデル平均が実測平均をやや下回るのは、 東京都の突出で実測の右裾が対数正規より重いためです)。 一方、 もし「対数正規である」と認めず原尺度で正規分布を仮定すると、 「平均 ± 2σ 区間」が −2,949,293 ~ 8,240,911 となり負の人口を許してしまいます。 これが分布族を間違えた時の典型的な不整合です。

📦 8 地方ブロックの箱ひげ図 — 「層別すれば正規分布になる」境界線

47 都道府県全体では右裾の長い分布でも、 8 地方ブロック (北海道・東北・関東・中部・近畿・中国・四国・九州沖縄) ごとに層別すると、 ブロック内で「ほぼ正規分布に見える」「正規からズレる」が変わります。 ここでは老年人口比率 (老年人口 A1303 ÷ 総人口 A1101 × 100) を 8 ブロックで箱ひげ図にしました。

SSDSE-B-2026 における 8 地方ブロック別の老年人口比率の箱ひげ図

図 R641-3: 8 地方ブロック別 老年人口比率 (A1303/A1101×100) の箱ひげ図 (SSDSE-B-2026, 2023 年実値)。 ブロック内の分布が概ね対称になっているのが分かる。

地方ブロック 県数 老年人口比率 平均 中央値 標準偏差 代表 IQR
北海道133.0%33.0%
東北634.5%35.1%3.233.6 - 35.2
関東728.0%28.1%3.026.7 - 30.4
中部931.3%31.6%2.331.0 - 32.7
近畿730.3%30.0%2.528.7 - 31.6
中国533.0%33.3%2.331.0 - 34.9
四国434.6%34.8%1.733.7 - 35.6
九州沖縄831.5%33.0%3.730.9 - 33.9

関東は 28.0 % で全国最低、 東北・四国は 34.5 〜 34.6 % で最高、 とブロック間で 6 ポイント以上の差があります。 一方ブロック内では標準偏差 1.7 〜 3.7 ポイントに収まり、 箱ひげの上下対称性も多くのブロックで比較的保たれます。 これは「全国を一つの正規分布で要約するのは不自然でも、 ブロックごとには正規分布が良い近似になる(ものが多い)」典型的な階層構造です。 統計モデリングでは 混合正規 / 階層モデル / ランダム効果モデル を選ぶことで、 こうした構造を素直に扱えます。

なお、 沖縄県は老年人口比率が 23.8 % と全国最低レベル (関東 7 県の平均 28.0 % よりも低い) で、 九州沖縄ブロックの中で外れ値として箱ひげの下髭の外に現れます。 これは沖縄の出生率の高さと若年人口比率の高さ、 戦後の社会構造の特殊性などが寄与する公的データ上の事実です。 箱ひげ図と分布族を組み合わせることで、 こうした「ブロック内の異質さ」までを 1 枚で説明可能になります。

🐍 Python — 地方ブロック別箱ひげと正規性検定

このコードでやること: 47 都道府県を 8 地方ブロックに対応付け、 老年人口比率を計算し、 ブロックごとの箱ひげ図を描き、 各ブロックで Shapiro-Wilk 検定を実施する。

📥 入力データ (47 都道府県のブロック割当例):

都道府県 地方 A1303/A1101 × 100 北海道 北海道 33.0 青森県 東北 35.2 東京都 関東 22.8 京都府 近畿 29.7 広島県 中国 30.1 高知県 四国 36.3 沖縄県 九州沖縄 23.8
 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
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats

# 英字の項目コード(A1101 など)を使うので、2 行目の日本語名を読み飛ばす
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df23 = df[df['SSDSE-B-2026'] == 2023].copy()
df23['老年比率'] = df23['A1303'] / df23['A1101'] * 100

# 都道府県 → 地方ブロック対応 (実データの公式分類)
block_map = {
    '北海道': '北海道',
    '青森県': '東北', '岩手県': '東北', '宮城県': '東北',
    '秋田県': '東北', '山形県': '東北', '福島県': '東北',
    '茨城県': '関東', '栃木県': '関東', '群馬県': '関東', '埼玉県': '関東',
    '千葉県': '関東', '東京都': '関東', '神奈川県': '関東',
    '新潟県': '中部', '富山県': '中部', '石川県': '中部', '福井県': '中部',
    '山梨県': '中部', '長野県': '中部', '岐阜県': '中部', '静岡県': '中部', '愛知県': '中部',
    '三重県': '近畿', '滋賀県': '近畿', '京都府': '近畿', '大阪府': '近畿',
    '兵庫県': '近畿', '奈良県': '近畿', '和歌山県': '近畿',
    '鳥取県': '中国', '島根県': '中国', '岡山県': '中国', '広島県': '中国', '山口県': '中国',
    '徳島県': '四国', '香川県': '四国', '愛媛県': '四国', '高知県': '四国',
    '福岡県': '九州沖縄', '佐賀県': '九州沖縄', '長崎県': '九州沖縄', '熊本県': '九州沖縄',
    '大分県': '九州沖縄', '宮崎県': '九州沖縄', '鹿児島県': '九州沖縄', '沖縄県': '九州沖縄',
}
df23['地方'] = df23['Prefecture'].map(block_map)

# 箱ひげ図
labels = list(df23['地方'].dropna().unique())
groups = [df23[df23['地方'] == g]['老年比率'].values for g in labels]
plt.figure(figsize=(9, 5))
# ラベルは xticks で付ける(boxplot の引数名は版によって labels / tick_labels と違う)
plt.boxplot(groups)
plt.xticks(range(1, len(labels) + 1), labels)
plt.ylabel('老年人口比率 (%)'); plt.xticks(rotation=30)
plt.title('8 地方ブロック別 老年人口比率 (SSDSE-B-2026, 2023)')
import os
os.makedirs('html/figures', exist_ok=True)
plt.savefig('html/figures/box_multigroup.png', dpi=120, bbox_inches='tight')

# 各ブロックで正規性検定 (N>=3 のみ)
for g, x in zip(labels, groups):
    if len(x) >= 3:
        W, p = stats.shapiro(x)
        print(f'{g:8s} (n={len(x)}): Shapiro W={W:.3f}, p={p:.3f}')

📤 実行例:

東北 (n=6): Shapiro W=0.927, p=0.557 関東 (n=7): Shapiro W=0.912, p=0.410 中部 (n=9): Shapiro W=0.828, p=0.043 近畿 (n=7): Shapiro W=0.959, p=0.814 中国 (n=5): Shapiro W=0.907, p=0.451 四国 (n=4): Shapiro W=0.979, p=0.896 九州沖縄 (n=8): Shapiro W=0.789, p=0.022

💬 多くのブロック (東北・関東・近畿・中国・四国) で p > 0.4 と「ブロック内の老年比率は正規分布から有意に乖離しない」と判定できます。 一方、 中部 (p=0.043) と九州沖縄 (p=0.022) は α=0.05 で棄却されます。 九州沖縄は沖縄の低さ (左裾の外れ値) が、 中部も裾の非対称が効いており、 これも「分布の中の異質性」を示す貴重なシグナルです。 それでも 47 全体 (Shapiro p<0.001) に比べればブロック層別で正規性は大きく改善し、 大半のブロックでは正規近似が使える — これが階層モデルの存在理由です。

🔬 同じデータに 3 つの分布族を当てはめて比べる — 正規 / 対数正規 / ガンマ

「データには正解の分布族がある」のではなく、 「目的に合うか」で分布族を選びます。 47 都道府県の総人口 (A1101) を題材に、 正規分布・対数正規分布・ガンマ分布の 3 つを同時に最尤フィットし、 AIC で比較しましょう。 AIC が低い分布が、 「同じ自由度で、 実データをより良く再現する」モデルです。

分布族 パラメータ数 最尤推定パラメータ −log L AIC ΔAIC
正規 \(\mathcal{N}(\mu,\sigma^2)\)2μ=2,645,808, σ=2,767,630763.91531.7+60.5
対数正規 \(\mathrm{LogN}(\mu,\sigma)\)2μ=14.42, σ=0.794733.61471.30.0 (最良)
ガンマ \(\Gamma(k,\theta)\)2k=1.50, θ=1,759,219739.91483.9+12.6

対数正規分布が AIC 1471.3 で最良、 ガンマ分布が次点 (ΔAIC +12.6 = 明確に劣る)、 正規分布が最劣 (ΔAIC +60.5 = 圧倒的に不適)。 これは前節のヒストグラムで観察した「右裾長」が AIC に直接反映された結果です。 ΔAIC = +60.5 という値は 「正規分布で総人口を要約するのは事実上禁止」と読める強さです。 ガンマも ΔAIC > 10 で対数正規に明確に劣るため、 総人口の記述は対数正規分布を第一候補とするのが妥当です。

🐍 Python — 3 分布族の MLE + AIC 比較

このコードでやること: 47 都道府県の総人口に対して、 正規・対数正規・ガンマの 3 分布族を scipy.stats.*.fit でフィットし、 対数尤度から AIC を計算して比較する。

📥 入力データ:

47 都道府県の総人口 (A1101) ベクトル, 単位 [人] 最小値: 537,000 (鳥取県), 最大値: 14,086,000 (東京都) 平均: 2,645,809, 中央値: 1,549,000
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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])
N = df[df['SSDSE-B-2026'] == 2023]['A1101'].dropna().values

def aic(loglik, k):
    return 2 * k - 2 * loglik

# 正規分布
mu_n, sd_n = stats.norm.fit(N)
ll_n = stats.norm.logpdf(N, mu_n, sd_n).sum()

# 対数正規分布 (floc=0 で 2 パラ化)
shape, loc, scale = stats.lognorm.fit(N, floc=0)
ll_l = stats.lognorm.logpdf(N, shape, loc, scale).sum()

# ガンマ分布
a, loc_g, scale_g = stats.gamma.fit(N, floc=0)
ll_g = stats.gamma.logpdf(N, a, loc_g, scale_g).sum()

for name, ll in [('normal', ll_n), ('lognorm', ll_l), ('gamma', ll_g)]:
    print(f'{name:8s}: -logL={-ll:8.1f}, AIC={aic(ll,2):8.1f}')

📤 実行例:

normal : -logL= 763.9, AIC= 1531.7 lognorm : -logL= 733.6, AIC= 1471.3 gamma : -logL= 739.9, AIC= 1483.9

💬 ΔAIC は 「2 未満ならほぼ同等」「2-10 ならやや劣る」「10 以上なら明確に劣る」と Burnham & Anderson (2002) が経験則を示しています。 ここでは正規分布 vs 対数正規分布で ΔAIC = +60.5 と圧倒的に正規が劣り、 ガンマ vs 対数正規で ΔAIC = +12.6 と「明確に劣る」レベルです。 結論として「総人口は対数正規分布で記述するのが最良、 ガンマは明確に劣り、 正規分布は不可」と数値判定で言い切れます。

🔍 KS / AD 検定で「当てはまり」を定量化する

AIC は相対比較でしたが、 「対数正規が他より良い」と分かっても「対数正規分布で十分なのか」は絶対的に検定したいことがあります。 これに使うのが Kolmogorov-Smirnov 検定 (KS) と Anderson-Darling 検定 (AD) です。 帰無仮説は「データは仮定した分布族から得られた」で、 p 値が高ければ「棄却できない = 仮定が許容できる」と判定します。

対象指標 仮定分布 KS 統計量 D KS p 値 AD 統計量 結論 (α=0.05)
総人口 (A1101)正規0.2780.0015.39 (>2.49 危険値)棄却 (正規 NG)
総人口 (A1101)対数正規0.1360.3231.22 (<2.49)棄却できず (対数正規 OK)
総人口 (A1101)ガンマ0.1990.0422.48 (境界)境界的に棄却 (ガンマ NG, α=0.05)
出生数 (A4101)対数正規0.1340.3411.18 (<2.49)棄却できず (対数正規 OK)
老年人口比率正規0.0820.8860.51 (<2.49)棄却できず (正規 OK)
年少人口比率 (A1301/A1101)正規0.1310.3641.19 (<2.49)棄却できず (正規 OK)

重要なのは「同じデータでも、 仮定する分布族によって判定が変わる」という事実です。 総人口 (A1101) は正規分布では p=0.001 で明確に棄却されますが、 対数正規分布では p=0.323 と棄却できません (ガンマは p=0.042 で α=0.05 では境界的に棄却されます)。 「正規分布」と決め打って t 検定や OLS を回すと、 ここで棄却される事実を見落としてしまいます。 一方、 比率指標 (老年比率・年少人口比率) は値が 0〜100 % に収まる有界変数のため、 中央付近では正規分布で十分扱えるのも観察できます。

🐍 Python — KS / AD 検定

このコードでやること: 総人口 (A1101) に対して正規 / 対数正規 / ガンマの 3 分布で KS 検定と AD 検定を実行し、 統計量と p 値を表示する。

📥 入力データ (47 件、 A1101 のベクトル):

N = [14086000, 9229000, 8763000, ..., 650000, 537000] len(N) = 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
import pandas as pd
from scipy import stats

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
N = df[df['SSDSE-B-2026'] == 2023]['A1101'].dropna().values

# 正規 ・ 対数正規 ・ ガンマで KS 検定
# 注: パラメータをデータから fit したあとの KS 検定は
#     p 値が楽観的になることに注意 (Lilliefors 補正が本来は必要)
mu, sd = stats.norm.fit(N)
D1, p1 = stats.kstest(N, 'norm', args=(mu, sd))

shape, loc, scale = stats.lognorm.fit(N, floc=0)
D2, p2 = stats.kstest(N, 'lognorm', args=(shape, loc, scale))

a, loc_g, scale_g = stats.gamma.fit(N, floc=0)
D3, p3 = stats.kstest(N, 'gamma', args=(a, loc_g, scale_g))

print(f'normal  : D={D1:.3f}, p={p1:.3f}')
print(f'lognorm : D={D2:.3f}, p={p2:.3f}')
print(f'gamma   : D={D3:.3f}, p={p3:.3f}')

# Anderson-Darling 検定 (正規分布)
ad = stats.anderson(N, dist='norm')
print(f'AD(normal): stat={ad.statistic:.2f}, 5% 危険値={ad.critical_values[2]:.2f}')

📤 実行例:

normal : D=0.278, p=0.001 lognorm : D=0.136, p=0.323 gamma : D=0.199, p=0.042 AD(normal): stat=5.38, 5% 危険値=0.73 → 棄却

💬 KS と AD は完全に整合し、 「総人口は正規分布で記述できない (p=0.001、 AD>危険値) が、 対数正規分布なら記述できる (p=0.323)」という結論を与えます。 注意点として、 パラメータをデータからフィットした後の KS は第一種過誤率が低くなる (楽観的) ので、 厳密には Lilliefors 補正ブートストラップ p 値を使うべき場面もあります。 ただし AD 検定はパラメトリックな危険値が用意されているため、 正規性検定では AD のほうが信頼性が高いと一般に推奨されます。

🧮 実値で計算してみる

例:正規分布 $N(170, 6^2)$ で身長 → 平均170・SD6。 P(身長 ≤ 176) = Φ(1) ≈ 0.841(約84%が176cm以下)。

🧮 実値で計算してみる — SSDSE-B-2026 で 確率分布 を体感

数式だけでは「分かった気になる」だけで終わりがち。 ここで SSDSE-B-2026(教育用標準データセット — 47 都道府県 × 100+ 指標、 2018-2023 年度)の実値を当てはめて、 確率分布 の挙動を電卓的に追体験します。

👉 計算例:SSDSE-B-2026(2023 年度)47 都道府県の年平均気温(B4101)は平均 16.8 ℃、 SD 2.0 ℃ で、 ほぼ正規分布に従う。 沖縄 23.8 ℃は $(23.8-16.8)/2.0 \approx 3.4$ で 3σ 超の外れ値。 北海道 11.0 ℃は $(11.0-16.8)/2.0 \approx -2.8σ$。 正規分布で P($X \le 11$) を計算すると約 0.3%。

SSDSE-B-2026 は 統計センターの SSDSE 配布ページ から CSV を直接ダウンロードできます。 本サイトでは data/raw/SSDSE-B-2026.csv に配置している前提でコードを書いています。

🧮 数式に値を入れて手で計算する: 5 分布の期待値と分散

合成データで主要分布のパラメータと統計量を計算する。

Step 1: 分布表

分布パラメータE[X]Var[X]
二項 B(n=10, p=0.3)n,p3.02.1
ポアソン Po(λ=5)λ55
幾何 Geo(p=0.2)p520
一様 U(0,10)a, b58.33
正規 N(0, 4)μ, σ²04

Step 2: 検算

二項: E=np=3, Var=np(1-p)=2.1 ポアソン: E=Var=λ=5 一様: E=(a+b)/2, Var=(b-a)²/12 = 100/12 ≈ 8.33

🐍 Python で再現

1
2
3
4
from scipy import stats
print(f"二項: {stats.binom.mean(10, 0.3)}, {stats.binom.var(10, 0.3)}")
print(f"ポアソン: {stats.poisson.mean(5)}, {stats.poisson.var(5)}")
print(f"一様: {stats.uniform.mean(0,10)}, {stats.uniform.var(0,10):.2f}")

📤 実行結果

二項: 3.0, 2.0999999999999996 ポアソン: 5.0, 5.0 一様: 5.0, 8.33

💬 手計算 (Step 1) と Python 出力が完全一致。

🐍 Python での実装例

まず scipy.stats だけで代表分布の CDF・PMF を触る最小コード(11 行)。 実データ (SSDSE-B-2026) を読み込む版は、 後半の「経験分布と理論分布のフィッティング」で扱います。

🎯 このコードでやること:正規分布の CDF、 二項・ポアソン分布の PMF を求め、 正規乱数を 5 個サンプリングして、 主要分布の基本操作を一通り確認する。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import numpy as np
from scipy import stats
# 正規分布のCDF
print('P(X<=176|μ=170,σ=6):', stats.norm.cdf(176, loc=170, scale=6).round(3))
# 二項分布のPMF(コイン10回中5回表)
print('B(10,0.5)でk=5:', stats.binom.pmf(5, 10, 0.5).round(3))
# ポアソン分布
print('Poisson(λ=3)でk=2:', stats.poisson.pmf(2, 3).round(3))
# サンプリング
rng = np.random.default_rng(0)
print('正規分布から5サンプル:', rng.normal(0, 1, 5).round(2).tolist())
📤 実行結果 P(X<=176|μ=170,σ=6): 0.841 B(10,0.5)でk=5: 0.246 Poisson(λ=3)でk=2: 0.224 正規分布から5サンプル: [0.13, -0.13, 0.64, 0.1, -0.54]
💬 読み方:確率の総和 (総積分) は 1。 CDF は「X 以下の確率」、 PMF は「ちょうど k の確率」。 期待値・分散はパラメータから一意に決まる。

data/raw/SSDSE-B-2026.csve-Stat SSDSE から取得した実データを想定。

📊 評価・検証チェックリスト — 確率分布 を使う前後に

確率分布 を「やってみたけど結局正しかったのか分からない」状態を避けるための、 標準的な検証観点。 SSDSE-B-2026 のような中小規模データでは特に丁寧に。

観点具体的な確認内容
前提の妥当性分布の仮定、 独立性、 線形性 / 単調性などの統計的前提を、 適合度検定や可視化で確認
サンプル数SSDSE-B では 47 県 × 12 年 = 564 行が上限。 適用手法に対し検出力分析を事前に
外れ値の影響東京 / 沖縄など極端な県が結果を支配していないか。 ロバスト指標 (Median, MAD) と比較
交差検証学習・検証分割を変えても結果が安定するか。 県単位で split し、 年度リークを防ぐ
感度分析ハイパーパラメータをわずかに変えても結論が大きく変わらないか
再現性乱数 seed・ライブラリバージョン・データバージョンを記録し、 他者が再現できる状態に
解釈の妥当性結果がドメイン知識と整合するか。 整合しない場合、 データかモデルか前提かどこに原因があるか

📝 レポート・論文での報告 — 確率分布 を含む分析結果の書き方

確率分布 を使った分析結果を、 第三者が誤読しない形でレポートに書くための標準フォーマット。 SSDSE-B-2026 を使った大学のレポートから業務報告書まで応用可能。

  1. 使ったデータ:出典(SSDSE-B-2026, 統計センター)、 期間(2023 年度)、 サンプル数(n=47 都道府県)を明記
  2. 変数の定義:列名(合計特殊出生率 A4103)、 単位、 対数変換等の前処理を明示
  3. 適用条件の確認:分布の正規性、 独立性、 サンプル数の十分性をどう確かめたか
  4. 計算結果:数値(小数 2 桁推奨)、 95% CI、 標準誤差を併記
  5. 解釈:何を意味し、 何を意味しないかを明確に区別
  6. 限界:n=47 の小ささ、 都道府県単位での集計バイアスなどを率直に書く
  7. 再現性:Python / R のバージョン、 ライブラリのバージョン、 乱数 seed を記録

この 7 点セットを書く習慣をつけると、 査読者・上司・同僚から「何が分かって何が分からないのか明確で良い」と評価されます。 数値だけ並べて「すごい結果が出ました」では、 残念ながら通用しません。

🎓 学習達成度チェック — 確率分布

以下の問いに自分の言葉で答えられれば、 確率分布 は「使える知識」として身についています。 まだ答えられない問いがあれば、 該当セクションに戻って再読しましょう。

  1. 確率分布 を、 統計を学んでいない友人に 30 秒で説明できますか?
  2. この概念が 使える場面使えない場面 を、 SSDSE-B-2026 の具体的な列名で挙げられますか?
  3. 数式の 各記号の意味 を口頭で説明できますか? 紙に書き写してみましたか?
  4. 「落とし穴」セクションで挙げた失敗パターンを、 自分の言葉で言い換えられますか?
  5. Python コード(pd.read_csv('data/raw/SSDSE-B-2026.csv') 直書き版)を手元で実行し、 出力を観察しましたか?
  6. 関連用語との 違い を 1 つ以上指摘できますか?
  7. この概念を使った分析結果を、 上の「7 点セット」フォーマットで報告できそうですか?
  8. SSDSE-B-2026 で別の列名に差し替えて、 同じコードを実行できますか?

8 問中 6 問以上「はい」と答えられれば、 この用語は実務応用レベルで理解できています。 残りは関連用語を学ぶ中で自然に補完されます。

🐍 Python 実装 — SSDSE-B-2026 の経験分布と理論分布のフィッティング

① 都道府県人口の経験分布をヒストグラム可視化

🎯 このコードでやること: 2023 年の都道府県人口について、 経験分布をヒストグラム + 累積分布の 2 連で可視化し、 分布形を視覚的に把握する。

📥 入力データ: SSDSE-B-2026 2023 年の A1101 (人口) 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
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df2023 = df[df['SSDSE-B-2026']==2023]
pop = df2023['A1101'].values / 10000  # 万人

fig, axes = plt.subplots(1, 2, figsize=(13, 4))
axes[0].hist(pop, bins=15, color='steelblue', edgecolor='black', density=True)
axes[0].set_xlabel('Population (10k people)')
axes[0].set_ylabel('Density (PDF)')
axes[0].set_title('Empirical PDF')

sorted_pop = np.sort(pop)
cdf = np.arange(1, len(sorted_pop)+1) / len(sorted_pop)
axes[1].step(sorted_pop, cdf, where='post', color='crimson')
axes[1].set_xlabel('Population (10k)')
axes[1].set_ylabel('F(x)')
axes[1].set_title('Empirical CDF')
plt.tight_layout()
plt.savefig('pd_empirical.png', dpi=100)
print(f'n={len(pop)}, mean={pop.mean():.1f}, median={np.median(pop):.1f}')
print(f'min={pop.min():.0f}, max={pop.max():.0f}')

📤 実行結果:

n=47, mean=264.6, median=154.9 min=54, max=1409 (ヒストグラム: 200万人付近にピーク、 1000万超は東京単独) (CDF: 緩やかに上昇するが、 高人口側で急に飽和)

💬 結果の読み方: ヒストグラムは 右に長い裾を持ち、 正規分布の対称形とは大きく異なる。 CDF も 200 万人付近で急上昇 → ゆっくり 1.0 へ収束。 「右歪み分布」の特徴。

② 正規分布と対数正規分布のフィッティング比較

🎯 このコードでやること: 同じ人口データに正規分布と対数正規分布を当てはめ、 PDF を重ねてフィット性能を視覚比較。 さらに Kolmogorov-Smirnov 検定で適合度を定量評価。

📥 入力データ: pop = df2023['A1101'].values(47 件、 単位: 人)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
from scipy import stats

pop_raw = df2023['A1101'].values

# 正規分布フィット
mu_n, sigma_n = stats.norm.fit(pop_raw)
# 対数正規分布フィット
sigma_ln, loc_ln, scale_ln = stats.lognorm.fit(pop_raw, floc=0)

# KS 検定で適合度評価
ks_n, p_n = stats.kstest(pop_raw, 'norm', args=(mu_n, sigma_n))
ks_ln, p_ln = stats.kstest(pop_raw, 'lognorm', args=(sigma_ln, loc_ln, scale_ln))

print(f'Normal:    mu={mu_n:.0f}  sigma={sigma_n:.0f}')
print(f'           KS D={ks_n:.4f}  p={p_n:.4g}')
print(f'Lognormal: sigma={sigma_ln:.3f}  scale={scale_ln:.0f}')
print(f'           KS D={ks_ln:.4f}  p={p_ln:.4g}')
print()
if p_ln > p_n:
    print('→ Lognormal fits better (higher p-value)')

📤 実行結果:

Normal: mu=2645809 sigma=2767630 KS D=0.2783 p=0.001039 Lognormal: sigma=0.794 scale=1831367 KS D=0.1357 p=0.3226 → Lognormal fits better (higher p-value)

💬 結果の読み方: 正規分布の p=0.001 (棄却) vs 対数正規の p=0.32 (棄却できない) — 都道府県人口は対数正規分布でよく説明されると分かる。 「平均 264 万、 標準偏差 277 万」と書くより、 「中央値 183 万、 対数標準偏差 0.79」と書くほうが本質を捉えている。

③ 二項分布で「高齢化超過県数」の確率を計算

🎯 このコードでやること: 「47 都道府県中、 高齢化率 33% 超の県数」を観測 (19 県) と二項分布の理論確率で比較し、 観測値の希少性を評価。

📥 入力データ: 2023 年データから高齢化率を計算、 33% 閾値で各県を 0/1 化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
aging_rate = df2023['A1303'] / df2023['A1101']
exceeds = (aging_rate > 0.33).sum()
n = len(df2023)

# 帰無仮説: 1 県あたり高齢化超過確率 p = 0.5
p_null = 0.5
prob_observed = stats.binom.pmf(exceeds, n, p_null)
prob_or_more = 1 - stats.binom.cdf(exceeds - 1, n, p_null)

# 平均超過確率を経験的に推定 (p_hat = 19/47)
p_hat = exceeds / n
print(f'Observed: {exceeds}/{n} prefectures exceed 33% aging')
print(f'Empirical p = {p_hat:.3f}')
print(f'Under H0 (p=0.5): P(X={exceeds}) = {prob_observed:.4f}')
print(f'Under H0 (p=0.5): P(X≥{exceeds}) = {prob_or_more:.4f}')
print()
print(f'Binomial mean (np) = {n * p_hat:.1f}')
print(f'Binomial std = {(n * p_hat * (1-p_hat))**0.5:.2f}')

📤 実行結果:

Observed: 19/47 prefectures exceed 33% aging Empirical p = 0.404 Under H0 (p=0.5): P(X=19) = 0.0495 Under H0 (p=0.5): P(X≥19) = 0.9281 Binomial mean (np) = 19.0 Binomial std = 3.36

💬 結果の読み方: 経験確率 p=0.404 で「47 県中で 19 県超過」は二項分布として期待値ぴったり (np=19)。 帰無仮説 p=0.5 では P(X≤19) が小さく、 「実際の超過確率は 50% より低い」と推測可能。 これが二項分布の応用。

④ ポアソン分布で「年間出生数」をモデル化

🎯 このコードでやること: 鳥取県 (人口最少) の年間出生数 (A4101) について、 ポアソン分布で確率を計算し、 想定外の高低を判定。

📥 入力データ: 鳥取県 12 年分の出生数(A4101 列、 単位: 人)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
tottori = df[df['Prefecture']=='鳥取県'].sort_values('SSDSE-B-2026')
births = tottori['A4101'].values
years = tottori['SSDSE-B-2026'].values

lam = births.mean()
print(f'Tottori birth count (2012-2023): mean λ = {lam:.0f}')
print(f'  Range: {births.min()} ~ {births.max()}')
print()
for k in [3500, 4000, 4500, 5000]:
    p = stats.poisson.pmf(k, lam)
    print(f'P(X={k}) = {p:.4g}')
print()
# 観測値の累積確率
for y, b in zip(years[-3:], births[-3:]):
    cdf = stats.poisson.cdf(b, lam)
    print(f'{y}: births={b}, F({b}) = {cdf:.3f}')

📤 実行結果:

Tottori birth count (2012-2023): mean λ = 4176 Range: 3263 ~ 4771 P(X=3500) = 4.734e-28 P(X=4000) = 0.0001471 P(X=4500) = 2.811e-08 P(X=5000) = 3.592e-36 2021: births=3708, F(3708) = 0.000 2022: births=3752, F(3752) = 0.000 2023: births=3263, F(3263) = 0.000

💬 結果の読み方: ポアソン分布の前提(独立・定常)では平均 4176 周辺に集中するはずだが、 直近 3 年は CDF ≈ 0 — 「過分散」と「トレンド減少」を示唆。 単純なポアソンでは説明できず、 負の二項分布時間トレンドモデルが必要と判断。

⚠️ よくある落とし穴

❌ 正規分布万能の誤解
現実データは多くが歪んでいる。 ヒストグラムで確認を。
❌ PMF と PDF の混同
連続の f(x) は確率ではなく密度。 値 > 1 もありうる。
❌ 分布の前提を確認しない
「正規前提」のt検定を歪んだデータに適用 → 結論が崩れる。
❌ 離散と連続の取り違え
整数値データに連続分布を当てると不自然な結果に。

⚠️ よくある落とし穴 — 確率分布 で初学者がやりがちなミス

確率分布の取り扱いで実務に頻出する 3 つの罠を、 SSDSE-B-2026 の都道府県データに当てはめて整理した。 下の「拡張版」 5 件と合わせて読むと網羅できる。

❌ 「平均と SD」だけで分布を語る
SSDSE-B-2026 の A1101 人口は平均 270 万・SD 290 万だが、 東京 (1400 万) という極端な右裾と、 鳥取・島根の重なりという双峰性を持つ。 平均±SD 表だけでは形が見えない。 必ずヒストグラム + Q-Q プロットで分布形を可視化する。
❌ 非正規データにパラメトリック検定を濫用
人口や所得のような右裾分布に t 検定 / ANOVA を直接適用すると I 種誤り率が膨らむ。 log 変換、 Mann-Whitney U や Kruskal-Wallis のノンパラ検定、 ブートストラップ p 値が代替候補。 まず Shapiro-Wilk で正規性を点検する。
❌ 標本平均の分布と母集団分布を混同
$\bar X$ (標本平均) の分布は中心極限定理で正規に近づくが、 $X$ 自体 (1 県の値) の分布はそうとは限らない。 「平均は正規に従う」と「データは正規に従う」 は別の主張。 推定 (CI 計算) には前者、 個別予測には後者を使う。
🛡 防御策まとめ:① 平均/SD だけでなく Q-Q プロット・ヒストグラム・歪度/尖度の 4 点セットで分布を可視化、 ② パラメトリック検定の前に正規性検定 + 標本サイズ評価、 ③ 標本分布と母集団分布を明示的に区別する、 の 3 点を pipeline に固定する。

⚠️ 確率分布の落とし穴(拡張版)

📈 Q-Q プロットで分布形を視覚診断

確率分布の適合度を視覚的に確認する最強ツールが Q-Q プロット (Quantile-Quantile Plot) です。 理論分布の分位点と経験分布の分位点を散布図で重ね、 直線上に並べば適合、 外れれば不適合と判定。

🎯 このコードでやること: SSDSE-B-2026 の県人口 (生スケール vs 対数スケール) について Q-Q プロットを描き、 「どちらが正規分布によく従うか」を視覚判定。

📥 入力データ: pop_raw = df2023['A1101']np.log(pop_raw)

 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 matplotlib.pyplot as plt
import numpy as np

pop_raw = df2023['A1101'].values
log_pop = np.log(pop_raw)

fig, axes = plt.subplots(1, 2, figsize=(12, 5))
stats.probplot(pop_raw, dist='norm', plot=axes[0])
axes[0].set_title('Q-Q plot: raw population (vs Normal)')
axes[0].get_lines()[0].set_markerfacecolor('steelblue')

stats.probplot(log_pop, dist='norm', plot=axes[1])
axes[1].set_title('Q-Q plot: log(population) (vs Normal)')
axes[1].get_lines()[0].set_markerfacecolor('crimson')

plt.tight_layout()
plt.savefig('pd_qqplot.png', dpi=100)

# 線形性の指標として R^2 を計算
osm, osr = stats.probplot(pop_raw, dist='norm', fit=False)
slope, intercept, r, _, _ = stats.linregress(osm, osr)
print(f'Raw population Q-Q R^2 = {r**2:.4f}')

osm2, osr2 = stats.probplot(log_pop, dist='norm', fit=False)
slope2, intercept2, r2, _, _ = stats.linregress(osm2, osr2)
print(f'Log population Q-Q R^2 = {r2**2:.4f}')

📤 実行結果:

Raw population Q-Q R^2 = 0.6803 Log population Q-Q R^2 = 0.9330 (左図: 生スケール — 右上で大きく直線から外れる、 東京都が極端) (右図: 対数スケール — ほぼ直線上に並び、 対数正規であることを示す)

💬 結果の読み方: 生スケールの R²=0.68 vs 対数スケールの R²=0.93。 視覚的にも、 対数変換後はほぼ完全な直線。 「都道府県人口は対数正規分布」と Q-Q プロットでも明白に示される。

🔗 確率分布の関係マップ — 主要分布の家系図

主要な確率分布は、 互いに「極限・特殊化・複合化」の関係で繋がっています。 暗記ではなく構造で理解しましょう。

分布 親分布 関係
ベルヌーイ二項二項(n=1) = ベルヌーイ
ポアソン二項二項(n→∞, p→0, np=λ) → ポアソン
指数ガンマガンマ(k=1) = 指数
カイ二乗ガンマガンマ(k=ν/2, θ=2) = カイ二乗(ν)
対数正規正規X が正規 ⇔ exp(X) が対数正規
t 分布正規 + カイ二乗Z/√(χ²/ν) ~ t(ν)、 ν→∞ で正規
F 分布2 つのカイ二乗(χ²₁/ν₁)/(χ²₂/ν₂) ~ F(ν₁,ν₂)
ベータガンマX,Y が独立ガンマ → X/(X+Y) ~ ベータ

💡 これら関係を知っておくと、 分布の選択・パラメータの推測・検定統計量の理解が劇的に楽になる。 とくに「t 検定の根拠は正規 + カイ二乗」「ANOVA の F 統計量はカイ二乗比」を理解できると、 統計学の見通しが一気に良くなる。

❓ FAQ — 確率分布についてよくある質問

Q. 正規分布以外も覚える必要ありますか?
A. はい。 現実データは右歪み(対数正規)、 上限あり(ベータ)、 カウントデータ(ポアソン・負の二項)など多様。 SSDSE-B-2026 でも人口は対数正規、 県数は二項、 出生数はポアソン的、 と分布が異なる。 最低限 5 種類(正規・対数正規・二項・ポアソン・ベータ)は理解すること。
Q. どの分布が当てはまるか判定する方法は?
A. ① Q-Q プロットで視覚確認、 ② Kolmogorov-Smirnov 検定や Anderson-Darling 検定で定量評価、 ③ AIC・BIC で複数候補を比較。 また理論的(出生数 → ポアソン、 比率 → ベータ)に決まる場合も多い。
Q. 中心極限定理は常に成立しますか?
A. 厳密には「分散が有限な独立同分布」が前提。 重い尾の分布(コーシー、 ある種のパレート)では分散が無限大で CLT が成立しない。 また独立性が崩れる時系列・空間データでも一般化が必要。
Q. KS 検定と Shapiro-Wilk の使い分けは?
A. Shapiro-Wilk は正規分布専用、 検出力が高い (n ≤ 5000)。 KS 検定 は任意の分布に対する適合度検定で汎用性が高い。 用途に応じて選ぶ。
Q. 分布のパラメータを推定するには?
A. 最尤推定 (MLE) が標準。 scipy.stats の各分布クラスは fit() メソッドを持ち、 1 行で MLE 推定できる。 ベイズ的アプローチでは事前分布を組み合わせる(PyMC など)。

🌍 確率分布の実世界応用 8 例

確率分布は教科書の中の話ではなく、 政策・経営・医療・工学のあらゆる場面で意思決定の根拠になります。 主要な応用 8 例を整理します。

応用分野 使う分布 目的 SSDSE-B での発展課題
保険数理ポアソン、 ガンマ、 パレート事故発生数・損害額のモデル化県別交通事故件数の予測
品質管理 (SPC)正規、 二項3σ 管理図で異常判定県別工業出荷額の年次変動監視
金融リスク正規 → t、 GARCHVaR (Value-at-Risk) 計算人口・出生数の年次変動リスク
医療・疫学ポアソン、 指数、 ワイブル発症率・生存時間モデル県別がん罹患率の比較
マーケティングベータ、 二項A/B テストの効果検証県別キャンペーン応答率
通信工学指数、 ポアソンパケット到着・待ち行列県別通信トラフィック分析
気象・防災極値統計、 ガンベル100 年に 1 度の大雨予測県別最大降水量の年次極値
機械学習正規、 ディリクレ、 多項事前分布・尤度の構築県別特徴量のベイズ予測

🎲 ベイズ確率と分布 — 事前・尤度・事後の三位一体

確率分布は ベイズ統計 の枠組みでも中心的役割を果たします。 ベイズの定理は次のように分布で表現できます:

$$p(\theta | D) = \frac{p(D | \theta) \cdot p(\theta)}{p(D)}$$

ここで $p(\theta)$ は 事前分布(観測前の仮説)、 $p(D|\theta)$ は 尤度(仮説下でデータが得られる確率)、 $p(\theta|D)$ は 事後分布(観測後の信念)。 数式を言葉で読み解くと、 「事前の信念 × データの整合度 ÷ データの周辺確率 = 観測後の信念」となる。

共役事前分布 (Conjugate Prior)

特定の事前分布と尤度の組合せでは、 事後分布が同じ family で得られます。 これを共役関係といい、 計算が大幅に楽になります。

尤度(データ) 共役事前分布 事後分布
ベルヌーイ/二項ベータベータ(更新後)
ポアソンガンマガンマ(更新後)
正規(σ既知)正規正規(更新後)
正規(σ未知)逆ガンマ/正規-逆ガンマ正規-逆ガンマ(更新後)
多項ディリクレディリクレ(更新後)

💡 SSDSE-B-2026 で「47 都道府県中 19 県が高齢化超過」を観測したとき、 ベータ事前 Beta(1,1) (一様) と二項尤度の更新で、 事後分布は Beta(20, 29)。 平均 = 20/(20+29) = 0.408 — 経験確率 19/47=0.404 とほぼ一致。

✅ 確率分布を選ぶ意思決定フロー

どの分布を当てはめるかを系統的に決めるフローチャートです。 SSDSE-B-2026 や任意のデータに対して、 機械的に 3-5 分で候補を絞れます。

  1. データは離散か連続か?
    • 離散 → ②へ
    • 連続 → ④へ
  2. 離散の場合: 値の上限はあるか?
    • あり (例: 47 県中) → 二項分布
    • なし (例: 出来事の回数) → ③へ
  3. 分散 ≈ 平均 か?
    • YES → ポアソン分布
    • NO (分散 > 平均) → 負の二項分布
  4. 連続の場合: 値の範囲は?
    • (−∞, ∞) → ⑤へ
    • [0, ∞) → ⑥へ
    • [0, 1] → ベータ分布
  5. 対称か歪んでいるか?
    • 対称 → 正規分布
    • 右歪み → 対数正規分布
    • 重い裾 → t 分布、 コーシー分布
  6. 非負連続: 形状は?
    • 右歪み・単峰 → ガンマ分布
    • 指数減衰 → 指数分布
    • 故障時間 → ワイブル分布
    • べき乗則 → パレート分布

💡 この意思決定は 「最終決定」ではなく「初期候補」。 必ず Q-Q プロット・KS 検定で複数候補を比較し、 AIC で最適を選ぶ。

📝 まとめ — 確率分布を学んだあなたに起こる変化

確率分布を体系的に理解できると、 データを見る目が決定的に変わります。

確率分布を学ぶことは「数学を学ぶこと」ではなく、 「世界の不確実性を構造的に捉える方法を学ぶこと」です。 SSDSE-B-2026 のような実データに 1 つずつ分布を当てはめてみることで、 抽象が具体に化け、 統計学が血肉化していきます。

次のステップとして、 本ページの「🐍 Python 実装」を実際に手元で動かし、 出力数値を自分で確認してみてください。 「読んで分かる」と「動かして分かる」は段違いです。 そして他の都道府県、 他の年次、 他の指標(出生率、 死亡数、 年平均気温など)でも同じ手順を試してみてください。 同じ手順が SSDSE-B-2026 の 約 60 指標 × 47 都道府県 × 12 年のあらゆる組合せで適用できることが、 確率分布論の力の証明です。

⚠️ 分布の選択ミスが招く実害 — 公的データ分析で起きがちな 7 つの誤り

  1. 右裾長を正規で語る: 総人口や所得を「平均 ± SD」で要約すると、 平均が中央値より遥かに大きくなり「平均的な県」が存在しない事態に。 中央値・四分位を併記し、 必要なら log 変換するのが基本。
  2. カウントデータを連続分布で扱う: 出生数・救急搬送数・交通事故件数を正規分布で回帰すると、 負の予測値を生むことがある。 ポアソン回帰や負の二項回帰を選ぶべき。
  3. 過分散を無視する: ポアソン分布は「平均=分散」を要求するが、 公的データの多くで分散が平均より大きい。 \(\phi = \mathrm{Var}/\mathrm{Mean}\) を測定し、 \(\phi \gg 1\) なら負の二項分布へ。
  4. 比率を 0/1 制約なく扱う: 老年人口比率・合計特殊出生率などは [0, ∞) に有界。 正規分布で予測すると 100% を超える非実在的な結果が出る。 ベータ回帰や対数オッズ変換が有効。
  5. 小サンプルの正規性検定を過信する: 47 件しかない都道府県データでは、 Shapiro-Wilk は検出力が低く「正規である」と判定されがち。 これは「正規である証拠」ではなく「正規でない証拠が出るほどデータがない」だけ。
  6. 外れ値を機械的に除去する: 東京都・沖縄県のような「異常値」は本物のデータ点であり、 単純な z-score で除去すると「日本のばらつきの大半」が失われる。 ロバスト統計や階層モデルで扱うのが正攻法。
  7. 分布族を固定して時系列に流用する: 2010 年に対数正規だったから 2023 年も対数正規、 とは限らない。 年次ごとに歪度・尖度を監視し、 構造変化を検知する。

これらはすべて、 SSDSE-B-2026 の実データで再現できる現象です。 「分布を学ぶ」とは、 こうした現実の不一致を見抜き、 適切な分布族に修正する判断力を養うことに他なりません。

📖 章末ミニ辞典 — 分布関連の重要用語 18 件

用語 意味
経験分布関数 (ECDF)標本から構成される CDF の階段関数。 KS 検定や Q-Q プロットの基礎。
最尤推定 (MLE)尤度 \(L(\theta) = \prod f(x_i;\theta)\) を最大化するパラメータ \(\hat\theta\) を求める方法。
対数尤度\(\log L = \sum \log f(x_i;\theta)\)。 加法的になり数値計算で扱いやすい。
AIC\(\mathrm{AIC} = 2k - 2\log L\)。 同一データで分布族・モデルを比較する基準。
BIC\(\mathrm{BIC} = k\log n - 2\log L\)。 サンプルサイズで罰則を強める。
KS 検定経験 CDF と理論 CDF の最大乖離 \(D\) で適合度を測る。 連続分布向き。
AD 検定CDF の尾部に重みを置いた適合度検定。 KS より裾の検出力が高い。
Shapiro-Wilk 検定正規性検定。 n ≤ 50 で最も検出力が高いとされる。
過分散理論分散 < 観測分散。 ポアソン仮定が壊れているシグナル。
負の二項分布ポアソン分布の \(\lambda\) がガンマ分布に従う混合分布。 過分散カウントの定番。
対数正規分布\(\log X \sim \mathcal{N}\)。 人口・所得・株価・売上で頻出。
ガンマ分布正の連続量、 待ち時間や所得など。 形状 \(k\) で多様な形を取れる。
ベータ分布[0,1] 上の連続分布。 比率・確率・割合の事前分布として有用。
混合分布複数の分布を重み付き和で組み合わせた分布。 GMM の基本要素。
階層モデルパラメータが上位分布から生成される多層モデル。 県別データなどで強力。
Q-Q プロット経験分位点 vs 理論分位点。 直線になれば分布族の仮定 OK。
パラメトリック有限個のパラメータで指定する分布族。 正規・ポアソン等。
ノンパラメトリック分布族を仮定しない方法。 KDE や経験分布が代表例。

❓ FAQ — 確率分布の選び方

質問 答え
「とりあえず正規分布」で良い場面は?サンプルが大きく (n≥100)、 平均近傍だけが知りたい場合は CLT で許容できることが多い。 ただし裾の確率や予測区間が必要なら絶対に駄目。
対数正規かガンマかで迷ったら?「倍数的に増減するか」(対数正規)、 「待ち時間や累積か」(ガンマ) で選ぶ。 AIC が拮抗するなら扱いやすさで決めて良い。
分布フィットの p 値が高いのは安心?小サンプルでは「棄却できない=支持」ではない。 むしろ「証拠不十分」と読む。 図表 (Q-Q プロット、 ヒストグラム重ね描き) と併用する。
混合分布はどうやって fit する?EM アルゴリズム (sklearn.mixture.GaussianMixture) や MCMC を使う。 成分数は BIC で選ぶのが標準。
分布族を仮定したくない場合は?KDE (カーネル密度推定) や経験分布で十分なことが多い。 ただし極端な尾部の予測は KDE は弱い点に注意。

🎯 Round 641 のまとめ — 確率分布リテラシーを実装する 6 つの原則

  1. 散布図 → ヒストグラム → 箱ひげ図の順で「結合分布 → 周辺分布 → 層別分布」を観察してから分布族を仮定する。
  2. 原尺度で歪んでいる指標 (人口・所得) は対数変換を試し、 \(\log X\) が対称になれば対数正規分布の仮定が許容される。
  3. 分布族の相対比較は AIC / BIC絶対適合度は KS / AD / Shapiro-Wilk。 役割を混同しない。
  4. カウント変数はポアソン → 過分散指標 \(\phi\) → 負の二項分布の流れで「分布の階段」を上る。
  5. 全国を 1 つの分布で語れなくても、 地方ブロックで層別すると正規分布で語れることが多い (階層モデルの存在理由)。
  6. 「正規分布で十分」はサンプルが大きく中心の議論だけの特権で、 裾や予測区間が要るなら正しい分布族に必ず置き換える。

この 6 原則を持ち帰れば、 SSDSE のような公的データだけでなく、 業務で扱うログデータ・実験データに対しても、 「とりあえず正規分布」「とりあえず平均」を脱して、 実態に即した分布モデルを選べるようになります。 確率分布は覚える対象ではなく、 実データに当てはめて使う道具です。

🗺 概念マップ — 確率分布 の位置づけ

確率分布 はデータサイエンスの大きな体系の中で、 「前提となる基礎」と「発展先」を持ちます。 自分が今どこにいて、 次にどこへ進めば良いかが見えるマップ。

📚 大カテゴリ(データサイエンス全体)

┗ 関連する基礎概念群(数学・統計・前処理)

確率分布(このページ)

┗ 派生・発展(より高度な手法・応用)

┗ 周辺概念群(並列に語られる手法)

概念マップ全体は こちら から閲覧できます。

🧠 もう一歩深く — 確率分布の体系的分類

確率分布は 「離散分布」「連続分布」の 2 大カテゴリに分けられ、 さらに「サンプルが何を表すか」によって細かく分類されます。 SSDSE-B-2026 を含む現実のデータに、 どの分布を当てるべきかを判断する基準を示します。

離散分布 (Discrete Distribution)

分布 用途 PMF SSDSE での例
ベルヌーイ単独事象の成否p^x(1-p)^(1-x)県別「高齢化率 33% 超か否か」
二項 (Binomial)n 回中 k 回成功C(n,k) p^k (1-p)^(n-k)47 都道府県中で高齢化超過の県数 (19/47)
ポアソン (Poisson)単位時間あたりの発生数λ^k e^(-λ) / k!1 年間の交通事故死亡数(人口比一定)
幾何 (Geometric)初成功までの試行数(1-p)^(k-1) p特定都道府県を訪問するまでの調査回数
負の二項r 回成功までの試行数C(k-1,r-1) p^r (1-p)^(k-r)過分散カウントデータのモデル

連続分布 (Continuous Distribution)

分布 用途 PDF SSDSE での例
正規 (Normal)対称・中心極限定理1/√(2πσ²) e^(-(x-μ)²/2σ²)気温の年平均(指標 B4101)
対数正規 (Lognormal)右歪み・乗算過程1/(xσ√(2π)) e^(-(ln x-μ)²/2σ²)都道府県人口 A1101 (KS p=0.32 で適合)
指数 (Exponential)事象間隔・寿命λe^(-λx)地震発生間隔の理論モデル
ベータ (Beta)[0,1] 区間の確率x^(α-1) (1-x)^(β-1) / B(α,β)高齢化率の県別変動 (0-1 値)
ガンマ (Gamma)非負・右歪みx^(k-1) e^(-x/θ) / (Γ(k)θ^k)病院当たり患者数
ワイブル (Weibull)寿命・故障時間(k/λ)(x/λ)^(k-1) e^(-(x/λ)^k)高齢者の生存時間モデル
パレート (Pareto)べき乗則・上位集中α x_m^α / x^(α+1)県民所得分布の右裾
probability distribution 正規分布 二項分布 ポアソン分布 指数分布 ガンマ分布 中心極限定理

🎮 触って理解する

スライダーを動かすと、 確率分布の 曲線 (PDF/PMF)・累積分布 (CDF)・平均・分散・歪度 が同時に更新されます。 タブで 5 つの代表分布を切り替え、 連続と離散の違いパラメータが形をどう決めるか を体感してください。 影を付けた領域が 区間確率 P(a ≤ X ≤ b) です。 外部ライブラリを使わず、 すべてブラウザ内で正確に計算しています。

種類
平均 μ
分散 σ²
標準偏差 σ
歪度
P(a ≤ X ≤ b)
上段(青)= PDF/PMF、 下段(緑)= CDF。 オレンジの影の面積 (連続) / 棒の合計 (離散) が区間確率。 曲線はマウス/タッチでドラッグしても区間を動かせます。

💡 直感 — 「起こりやすさ」を全体で 1 に配る

確率分布とは、 確率変数がとりうる各値に 「起こりやすさ」を割り当てるルール です。 配れる確率の総量は必ず 1 で、 離散なら棒の高さ (PMF) の合計が 1、 連続なら曲線の下の面積 (PDF の積分) が 1 になります。 平均はその重心 (バランスの取れる位置)、 分散は広がり具合、 歪度は左右非対称の度合いを表します。 上の図で σ を大きくすると山が低く広くなるのは、 「同じ 1 の面積を広い範囲に薄く配り直している」からです。

⚠️ よくある落とし穴

🚀 発展 — 分布どうしのつながり

これらの分布はバラバラではなく一つの体系です。 二項分布は n を大きく p を小さくし np=λ を一定に保つとポアソン分布に近づき、 n を大きくすると正規分布に近づきます (ド・モアブル–ラプラスの定理)。 上のタブで二項の n を増やしながらポアソン (同じ λ) や正規と山の形を見比べると、 この収束が体感できます。 より一般に、 独立な確率変数の和や平均は元の分布によらず正規分布に近づく——これが中心極限定理で、 正規分布が自然界・社会統計に遍在する理由です。 平均や分散の定義そのものは代表値分散のページも参照してください。

🔗 隣接手法への橋渡し

確率分布は確率変数の値がどう散らばるかを示す関数で、 正規分布・二項分布・ポアソン分布など具体分布と一体で運用される。

SSDSE-B-2026 を用いた演習では、 「確率分布」 を中核に据えて上記の上流・並列・下流の手法を実データで連結する経験を積むと、 単独の手法暗記より実務的応用力が身につく。

🌳 手法選択フロー

「確率分布」を実際に使うとき、 何をどう選ぶかを順に判断する。 上から順に答えていくと、 使うべき手法と評価の仕方が決まる。

  1. データは離散か、 連続か
    件数(出生数・世帯数)なら離散、 測定値(気温・比率)なら連続。 離散には確率質量関数、 連続には確率密度関数を使う。 密度は「その値をとる確率」ではない。
  2. 分布の形を見たか
    ヒストグラムと歪度を先に見る。 47 都道府県の総人口は歪度 2.22 の右に長い裾を持ち、 正規分布は当てはまらない。
  3. どの分布を当てるか
    右裾が長い量(人口・所得)は対数正規、 まれな事象の件数はポアソン、 成功回数は二項。 複数の候補を当てはめ、 AIC や KS 検定で比べる。
  4. 当てはまりをどう確かめるか
    KS 検定の p 値だけでなく、 Q-Q プロットで目で見る。 n=47 では検定の検出力が低く、 「棄却されなかった」は「当てはまる」ではない。

分布を仮定すると、 少ないデータからでも裾の確率を推定できる。 その代わり仮定が外れれば結論も外れるので、 当てはまりの確認とセットで使う。

🧭 深掘り:直感・落とし穴・発展(追補)

本ページの各節(🎨 直感で掴む⚠️ よくある落とし穴🐍 Python 実装)では、SSDSE-B-2026 のデータに 正規分布・対数正規・ガンマなどの理論分布を当てはめて評価する話を扱いました。 この追補ではそこであえて触れなかったもう一段手前の問い――「そもそも 47 都道府県のデータに確率分布を当てはめるとは、確率的にどういう意味なのか」という角度から、既存の解説を置き換えずに補います。

🎨 直感 — 確率分布は「取りうる値」と「その起こりやすさ」の対応表

確率分布とは、「どんな値が」「どのくらいの確からしさで」現れるかを一枚に束ねた地図です。 いちばん素朴で確実な確率分布は、実は数式ではなく手元データそのものが作る経験分布(empirical distribution)です。 「47 都道府県から 1 県を等確率でランダムに選ぶ」という試行を考えると、各県はちょうど質量 1/47 ≈ 0.0213 を持つ点になり、これが完全に定義された 1 つの離散確率分布になります。 SSDSE-B-2026(2023 年・47 都道府県・総人口 A1101)で「選んだ県の人口がしきい値を超える確率」は、母集団パラメータの推定ではなく数え上げによる厳密値として求まります:

事象(1 県を等確率で選ぶ)該当県数厳密確率
人口 > 100 万人3737/47 = 0.7872
人口 > 平均(2,645,809 人)1212/47 = 0.2553
人口 > 500 万人99/47 = 0.1915

注目すべきは「平均を上回る県は 12/47(約 26%)しかない」点。過半(35 県)が平均以下で、少数の巨大県が平均を引き上げています。 これは分布が右に強く歪んでいる(実測の歪度 +2.22)ためで、平均が「真ん中」を表さない典型例です。中央値は 1,549,000 人と平均のおよそ 6 割にとどまります。

⚠️ 落とし穴(重要)— 47 都道府県は「標本」ではなく「悉皆(全数)」

確率分布の議論はふつう「無限に広い母集団から標本をランダムに抽出する」場面を前提にします。 ところが 47 都道府県は日本の都道府県のすべて――標本ではなく悉皆(全数・センサス)です。 この違いを忘れると、次の 3 つを取り違えます。

論点標本のつもりだと悉皆として正しくは
平均 2,645,808.5 人母平均 μ の推定値 x̄μ そのもの(誤差ゼロ)
ばらつきの分母標本 SD=2,797,551(÷46, ddof=1)母 SD=2,767,630(÷47, ddof=0)
KS 検定などの p 値「母集団が正規か」の検定抽出が無いので本来の意味を持たない

標本 SD と母 SD の比はちょうど √(47/46) = 1.0108。N=47 では約 1% しか違いませんが、「なぜ ÷(n−1) するのか=母平均を推定に使った自由度の補正」という理屈が悉皆では成り立たない点が本質です。 悉皆なら 分散・SD は素直に ÷N(ddof=0)で構いません。

もう 1 つの落とし穴が「経験分布 ≠ 理論分布」の混同です。 経験分布では平均 ± 1 SD(母 SD)の帯に入る県は 41/47 = 87.2%もあり、正規分布が言う 68.3% と大きく食い違います。 これは 正規分布を当てはめても実態を写せないことの直接の証拠で、右裾の長い分布(対数変換後に 正規性へ近づく型)であることを示します。 理論分布はあくまで経験分布の近似モデルであって、真実そのものではありません。

🚀 発展 — 「超母集団」という考え方で確率を取り戻す

「悉皆なら確率も統計的検定も無意味なのか?」というとそうではありません。 現代の統計学では、観測された 47 県を「ある確率的な生成過程(データ生成メカニズム)が生み出した 1 回の実現値」とみなす超母集団モデル(superpopulation model)を置きます。 このとき確率分布は「他にもあり得た日本」を支える仮想的な母集団を表し、KS 検定や分布フィッティングは「この生成過程は対数正規的か」というモデル評価として意味を回復します。

より実データに即して「繰り返し」を手に入れる方法もあります。 SSDSE-B-2026 は 2012〜2023 年の 12 時点を含むので、同じ県の人口を時系列として並べれば、空間の 1 断面だけでなく時間方向の変動という別の確率的側面を観察できます。 「空間の分布(47 県の散らばり)」と「時間の分布(1 県の年次変動)」は別物である、という切り分けは、確率分布を実データへ応用するときの重要な視点です。 再現用の最小コード(既存の Python 節と同じ読み込み規約):

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) 北海道 5,092,000 東京都 14,086,000 沖縄県 1,468,000 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import pandas as pd, numpy as np
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
d = df[df['SSDSE-B-2026'] == 2023]
pop = d['A1101'].astype(float).values          # 47 県の総人口(悉皆)
N = len(pop)                                    # 47
mu = pop.mean()                                 # 2645808.5 = 母平均そのもの
print(N, mu, pop.std(ddof=0), pop.std(ddof=1)) # 母SD 2767630.2 / 標本SD 2797551.4
# 経験分布による厳密確率(推定ではなく数え上げ)
print((pop > 5_000_000).sum() / N)             # 0.1915 = 9/47
sd = pop.std(ddof=0)
print(((pop >= mu-sd) & (pop <= mu+sd)).sum() / N)  # 0.8723 ≠ 正規の 0.6827

🔗 関連ページ