確率分布 は確率変数 X の取り得る値とその発生確率の対応で、 離散 (二項・ポアソン) と連続 (正規・指数・ベータ) に大別される。 SSDSE-B-2026 の 47 都道府県の出生率を正規分布とみなして μ・σ を最尤推定し、 Q-Q プロットで適合度を確認する例を実装する。
これらのキーワードは「probability distribution の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。
🍰 まずはやさしく
確率分布は、結果の出やすさを表す地図のようなものです。
どの値がどれくらいの確率で出るかを知るために使います。
サイコロの目が均等に出るか考えるときに役立ちます。
ここでは、分布の種類や基本的な考え方を読みます。
確率変数の値の分布を表す関数
🍰 まずはやさしく
確率分布は、統計の分析を始めるための土台です。
データがどのようなルールで集まったかを決めるために使います。
都道府県ごとの人口などのデータを分析するときに必要です。
ここでは、実際のデータへの当てはめ方や調べ方を読みます。
「平均と標準偏差」を語るとき、 暗に「正規分布」を想定していることが多い。 検定・信頼区間・モデル仮定、 すべての出発点が確率分布の選択です。
本ページは 確率分布 を、 SSDSE-B-2026 の 47 都道府県データに正規分布・二項分布・ポアソン分布を当てはめて実演する。 ヒストグラム→密度曲線→Q-Q プロットの可視化と、 scipy.stats.normaltest による正規性検定 (p > 0.05 で正規仮定維持) を組み合わせる。
「probability distribution」は統計・データサイエンスの体系における重要概念のひとつ。 本ページは「定義・直感・数式・実装・落とし穴・関連手法」の 6 視点で構成され、 各視点は独立して読めるが順序通り読むと体系的な理解が得られる。
🍰 まずはやさしく
確率分布は、データの散らばり具合を形にしたものです。
現実の出来事がどのパターンに近いか判断するために使います。
クラスのみんなの身長をグラフにする様子をイメージしてください。
ここでは、身近な例を使って分布の感覚を読みます。
サイコロの1〜6が出る確率:
身長の分布(連続):
確率分布は「確率変数がどんな値をどんな確率で取るか」を表す関数。 サイコロの目(離散の一様分布)、 人の身長(連続の正規分布)、 SSDSE-B-2026 の死亡数(カウントなので近似的にポアソン)など、 現実のあらゆる量は何らかの分布に従う(または近似できる)。
| 分布 | SSDSE での該当例 | 特徴 |
|---|---|---|
| 正規分布 N(μ,σ²) | A1303/A1101 (高齢化率) は 47 県で平均 31.6%, SD 3.3% → 概ね釣鐘型 | 対称・μ±σ に 68% |
| 対数正規 logN | A1101 (総人口): 鳥取 54 万 〜 東京 1,409 万 → 右に長い裾、 log すると正規 | 非対称・正の裾長 |
| ポアソン Po(λ) | A4200 (死亡数): カウントデータで、 1 県の年次変動は近似的にポアソン (分散 ≒ 平均) | 離散・カウント |
| 一様 U(a,b) | 47 県から無作為に 1 県選ぶ → P=1/47 (全県等確率) | 離散の等確率 |
実データで気づくこと: 教科書の正規分布は美しい釣鐘だが、 SSDSE-B-2026 の A1101 をヒストグラムにすると 東京・神奈川・大阪が右端の外れ値として鋭く飛び出す。 これが「右に長い裾」を持つ対数正規型の典型。 平均だけでなく中央値・第 3 四分位を併記する習慣はここから来ている。
🍰 まずはやさしく
確率分布は、数学的なルールで書いた関数(計算式)です。
確率を正確に計算して、間違いなく分析するために使います。
スマホのアプリなどで確率を計算する仕組みに似ています。
ここでは、分布を決めるための数式や定義を読みます。
確率分布(Probability Distribution):確率変数の値の分布を表す関数
直感で全体像を掴んだら、 次は厳密な定義を見ます。 数式は短いものでも、 「何を入力にして、 何を出力するのか」を意識して読むと早く慣れます。
確率分布を扱うときに必ず登場する 3 つの関数 — PMF (確率質量関数)、 PDF (確率密度関数)、 CDF (累積分布関数) — を、 数式 → 意味 → SSDSE-B での具体例の順で整理します。
$$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 になる」「個別の値の確率を直接読める」という性質を持つ。
$$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$ で計算できる。
$$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)$ — 離散の確率質量関数 |
| $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 で正規性を点検する。 |
| 再現性 | 同じデータ・同じコードで同じ結果が出るか。このページの ▶ 実行ボタンで確かめられます |
確率分布 は分野横断で活躍する概念です。 業界別に見ると以下のような使われ方があります。
確率分布 を実際のデータで学ぶときは、 SSDSE(教育用標準データセット、 総務省統計局)が便利です。
これらは 統計センターの SSDSE ページ から CSV で直接ダウンロードできます。 上の Python コード例で data/raw/SSDSE-B-2026.csv としているのが、 まさにこれです。
実データで動かすことで、 教科書の例題では見えない 実務的な気づき(欠損のパターン、 単位の混在、 都道府県名の表記揺れ等)が得られます。
pip install pandas numpy scikit-learn matplotlib で揃います。utf-8 ではなく shift_jis や cp932 の場合がある(古い日本の公的統計に多い)。 encoding='cp932' を試してください。%matplotlib inline、 スクリプト実行なら plt.show() を忘れずに。 日本語フォントは matplotlib 用に別途設定(japanize-matplotlib 等)が必要。上の数式に出てくる各記号が何を表すかを、 言葉で翻訳します。 1 つずつ自分の言葉で言い換えられるようになると、 論文や教科書のスピードが一気に上がります。
| 記号 | 意味(言葉での説明) |
|---|---|
| $\mu$ | 平均(分布の中心) |
| $\sigma$ | 標準偏差(散らばり) |
| $\sigma^2$ | 分散 |
| $f(x)$ | 密度(確率ではない!) |
| CDF | $F(x)=P(X\le x)$ |
確率分布は無数にあるが、 実務で 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 分布のどれかに自動的に絞られます。
このコードでやること: SSDSE-B-2026 の 2023 年 47 都道府県の総人口を、 (1) 正規分布、 (2) 対数正規分布、 (3) ガンマ分布の 3 つで scipy.stats.*.fit し、 Kolmogorov-Smirnov 検定で「どの分布が最もデータに近いか」を p 値で比較する。
📥 入力データ (47 都道府県の総人口、 2023 年、 単位: 人):
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}') |
📤 実行例:
💬 歪度 2.22 は強い右裾(東京都が外れて大きい)を意味し、 正規分布の仮定は KS p = 0.001 で棄却される。 一方、 対数正規分布は KS p = 0.323 で 棄却されない(AIC も最小)。 つまり「47 都道府県の人口は対数正規分布で近似できる」と統計的に裏付けられる。 これは Zipf の法則(都市規模の対数正規性、 Gabaix 1999)と整合する有名な結果で、 SSDSE 実データでも再現される。 政策シミュレーションや人口将来予測でこの仮定は明示的に使うべき知見である。
ここまでで、 確率分布の定義・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 検定」「平均が外れ値で歪んでいる気がする」といった分布リテラシーの欠如を脱却できます。
確率分布を選ぶ第一歩は、 2 つの指標の結合分布 (joint distribution) を散布図でざっくり眺めることです。 ここでは SSDSE-B-2026 の 2023 年データから、 47 都道府県の 総人口 (A1101) と 年間出生数 (A4101) をプロットしました。 出生数は「人口に比例する離散カウント」なので、 ポアソン分布 (平均と分散が等しい) で説明できるかをまず疑います。
図 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,000 | 86,348 | 6.13 | 最大規模、 比例係数が低め |
| 神奈川県 | 9,229,000 | 53,991 | 5.85 | 東京と類似傾向 |
| 大阪府 | 8,763,000 | 55,292 | 6.31 | 関西最大 |
| 愛知県 | 7,477,000 | 48,402 | 6.47 | 中京の中心 |
| 埼玉県 | 7,331,000 | 42,108 | 5.74 | 郊外型 |
| 島根県 | 650,000 | 3,759 | 5.78 | 小規模ながら比例 |
| 高知県 | 666,000 | 3,380 | 5.08 | 比例係数低め |
| 徳島県 | 695,000 | 3,903 | 5.62 | 同上 |
| 福井県 | 744,000 | 4,563 | 6.13 | 比較的高め |
| 鳥取県 | 537,000 | 3,263 | 6.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\) | 過分散を吸収可 | 候補 |
このコードでやること: SSDSE-B-2026 から 47 都道府県の総人口と年間出生数を取り出し、 散布図を描き、 比例係数 \(c\) を最小二乗で推定する。 さらに「ポアソンが妥当か」の指標として residual deviance / mean を計算する。
📥 入力データ (SSDSE-B-2026 抜粋):
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 \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}\)) で自動決定するのが安全です。
図 R641-2: 47 都道府県の総人口 (A1101) のヒストグラム (SSDSE-B-2026, 2023 年実値)。 強い右裾の長い分布。
総人口 (A1101) のヒストグラムを見ると、 顕著な右裾の長い (right-skewed) 分布になっています。 これは 47 都道府県のうち東京都が約 1,400 万人と突出しており、 神奈川 920 万人・大阪 880 万人と続き、 一方で鳥取 54 万人・島根 65 万人など小規模県が多数存在するためです。 こうした分布を正規分布で要約してしまうと、 「平均 ± 標準偏差」が非対称な分布を歪めて表現します。 実値で確認しましょう。
| 統計量 | 総人口 (A1101) | log(総人口) | 解釈 |
|---|---|---|---|
| 平均 \(\bar x\) | 2,645,809 | 14.42 | log で対称化 |
| 中央値 med | 1,549,000 | 14.25 | 中央 < 平均で右裾 |
| 標準偏差 s | 2,797,551 | 0.80 | 原尺度では平均と同程度 |
| 歪度 (skewness) | +2.22 | +0.79 | log で大幅に減少 |
| 尖度 (excess kurt.) | +4.95 | −0.21 | log で正規に近づく |
| Shapiro-Wilk p | < 0.001 | 0.006 | log で大幅改善も残差右裾 |
原尺度では歪度 +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}\)) で近似するのが妥当と結論できます。 これは「人口や所得など、 倍数的成長で増えるカウント変数」に普遍的に観察される事実であり、 経済地理学では「ジップの法則」「ギブラットの法則」として知られています。
このコードでやること: SSDSE-B-2026 の 47 都道府県総人口を読み込み、 原尺度ヒストグラム・対数尺度ヒストグラムを並べて描き、 対数正規分布 \(\mathrm{LogN}(\mu, \sigma)\) を最尤フィットして PDF を重ね描きする。
📥 入力データ (SSDSE-B-2026 抜粋、 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 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}') |
📤 実行例:
💬 \(\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 となり負の人口を許してしまいます。 これが分布族を間違えた時の典型的な不整合です。
47 都道府県全体では右裾の長い分布でも、 8 地方ブロック (北海道・東北・関東・中部・近畿・中国・四国・九州沖縄) ごとに層別すると、 ブロック内で「ほぼ正規分布に見える」「正規からズレる」が変わります。 ここでは老年人口比率 (老年人口 A1303 ÷ 総人口 A1101 × 100) を 8 ブロックで箱ひげ図にしました。
図 R641-3: 8 地方ブロック別 老年人口比率 (A1303/A1101×100) の箱ひげ図 (SSDSE-B-2026, 2023 年実値)。 ブロック内の分布が概ね対称になっているのが分かる。
| 地方ブロック | 県数 | 老年人口比率 平均 | 中央値 | 標準偏差 | 代表 IQR |
|---|---|---|---|---|---|
| 北海道 | 1 | 33.0% | 33.0% | — | — |
| 東北 | 6 | 34.5% | 35.1% | 3.2 | 33.6 - 35.2 |
| 関東 | 7 | 28.0% | 28.1% | 3.0 | 26.7 - 30.4 |
| 中部 | 9 | 31.3% | 31.6% | 2.3 | 31.0 - 32.7 |
| 近畿 | 7 | 30.3% | 30.0% | 2.5 | 28.7 - 31.6 |
| 中国 | 5 | 33.0% | 33.3% | 2.3 | 31.0 - 34.9 |
| 四国 | 4 | 34.6% | 34.8% | 1.7 | 33.7 - 35.6 |
| 九州沖縄 | 8 | 31.5% | 33.0% | 3.7 | 30.9 - 33.9 |
関東は 28.0 % で全国最低、 東北・四国は 34.5 〜 34.6 % で最高、 とブロック間で 6 ポイント以上の差があります。 一方ブロック内では標準偏差 1.7 〜 3.7 ポイントに収まり、 箱ひげの上下対称性も多くのブロックで比較的保たれます。 これは「全国を一つの正規分布で要約するのは不自然でも、 ブロックごとには正規分布が良い近似になる(ものが多い)」典型的な階層構造です。 統計モデリングでは 混合正規 / 階層モデル / ランダム効果モデル を選ぶことで、 こうした構造を素直に扱えます。
なお、 沖縄県は老年人口比率が 23.8 % と全国最低レベル (関東 7 県の平均 28.0 % よりも低い) で、 九州沖縄ブロックの中で外れ値として箱ひげの下髭の外に現れます。 これは沖縄の出生率の高さと若年人口比率の高さ、 戦後の社会構造の特殊性などが寄与する公的データ上の事実です。 箱ひげ図と分布族を組み合わせることで、 こうした「ブロック内の異質さ」までを 1 枚で説明可能になります。
このコードでやること: 47 都道府県を 8 地方ブロックに対応付け、 老年人口比率を計算し、 ブロックごとの箱ひげ図を描き、 各ブロックで Shapiro-Wilk 検定を実施する。
📥 入力データ (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 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}') |
📤 実行例:
💬 多くのブロック (東北・関東・近畿・中国・四国) で p > 0.4 と「ブロック内の老年比率は正規分布から有意に乖離しない」と判定できます。 一方、 中部 (p=0.043) と九州沖縄 (p=0.022) は α=0.05 で棄却されます。 九州沖縄は沖縄の低さ (左裾の外れ値) が、 中部も裾の非対称が効いており、 これも「分布の中の異質性」を示す貴重なシグナルです。 それでも 47 全体 (Shapiro p<0.001) に比べればブロック層別で正規性は大きく改善し、 大半のブロックでは正規近似が使える — これが階層モデルの存在理由です。
「データには正解の分布族がある」のではなく、 「目的に合うか」で分布族を選びます。 47 都道府県の総人口 (A1101) を題材に、 正規分布・対数正規分布・ガンマ分布の 3 つを同時に最尤フィットし、 AIC で比較しましょう。 AIC が低い分布が、 「同じ自由度で、 実データをより良く再現する」モデルです。
| 分布族 | パラメータ数 | 最尤推定パラメータ | −log L | AIC | ΔAIC |
|---|---|---|---|---|---|
| 正規 \(\mathcal{N}(\mu,\sigma^2)\) | 2 | μ=2,645,808, σ=2,767,630 | 763.9 | 1531.7 | +60.5 |
| 対数正規 \(\mathrm{LogN}(\mu,\sigma)\) | 2 | μ=14.42, σ=0.794 | 733.6 | 1471.3 | 0.0 (最良) |
| ガンマ \(\Gamma(k,\theta)\) | 2 | k=1.50, θ=1,759,219 | 739.9 | 1483.9 | +12.6 |
対数正規分布が AIC 1471.3 で最良、 ガンマ分布が次点 (ΔAIC +12.6 = 明確に劣る)、 正規分布が最劣 (ΔAIC +60.5 = 圧倒的に不適)。 これは前節のヒストグラムで観察した「右裾長」が AIC に直接反映された結果です。 ΔAIC = +60.5 という値は 「正規分布で総人口を要約するのは事実上禁止」と読める強さです。 ガンマも ΔAIC > 10 で対数正規に明確に劣るため、 総人口の記述は対数正規分布を第一候補とするのが妥当です。
このコードでやること: 47 都道府県の総人口に対して、 正規・対数正規・ガンマの 3 分布族を scipy.stats.*.fit でフィットし、 対数尤度から AIC を計算して比較する。
📥 入力データ:
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}') |
📤 実行例:
💬 ΔAIC は 「2 未満ならほぼ同等」「2-10 ならやや劣る」「10 以上なら明確に劣る」と Burnham & Anderson (2002) が経験則を示しています。 ここでは正規分布 vs 対数正規分布で ΔAIC = +60.5 と圧倒的に正規が劣り、 ガンマ vs 対数正規で ΔAIC = +12.6 と「明確に劣る」レベルです。 結論として「総人口は対数正規分布で記述するのが最良、 ガンマは明確に劣り、 正規分布は不可」と数値判定で言い切れます。
AIC は相対比較でしたが、 「対数正規が他より良い」と分かっても「対数正規分布で十分なのか」は絶対的に検定したいことがあります。 これに使うのが Kolmogorov-Smirnov 検定 (KS) と Anderson-Darling 検定 (AD) です。 帰無仮説は「データは仮定した分布族から得られた」で、 p 値が高ければ「棄却できない = 仮定が許容できる」と判定します。
| 対象指標 | 仮定分布 | KS 統計量 D | KS p 値 | AD 統計量 | 結論 (α=0.05) |
|---|---|---|---|---|---|
| 総人口 (A1101) | 正規 | 0.278 | 0.001 | 5.39 (>2.49 危険値) | 棄却 (正規 NG) |
| 総人口 (A1101) | 対数正規 | 0.136 | 0.323 | 1.22 (<2.49) | 棄却できず (対数正規 OK) |
| 総人口 (A1101) | ガンマ | 0.199 | 0.042 | 2.48 (境界) | 境界的に棄却 (ガンマ NG, α=0.05) |
| 出生数 (A4101) | 対数正規 | 0.134 | 0.341 | 1.18 (<2.49) | 棄却できず (対数正規 OK) |
| 老年人口比率 | 正規 | 0.082 | 0.886 | 0.51 (<2.49) | 棄却できず (正規 OK) |
| 年少人口比率 (A1301/A1101) | 正規 | 0.131 | 0.364 | 1.19 (<2.49) | 棄却できず (正規 OK) |
重要なのは「同じデータでも、 仮定する分布族によって判定が変わる」という事実です。 総人口 (A1101) は正規分布では p=0.001 で明確に棄却されますが、 対数正規分布では p=0.323 と棄却できません (ガンマは p=0.042 で α=0.05 では境界的に棄却されます)。 「正規分布」と決め打って t 検定や OLS を回すと、 ここで棄却される事実を見落としてしまいます。 一方、 比率指標 (老年比率・年少人口比率) は値が 0〜100 % に収まる有界変数のため、 中央付近では正規分布で十分扱えるのも観察できます。
このコードでやること: 総人口 (A1101) に対して正規 / 対数正規 / ガンマの 3 分布で KS 検定と AD 検定を実行し、 統計量と p 値を表示する。
📥 入力データ (47 件、 A1101 のベクトル):
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}') |
📤 実行例:
💬 KS と AD は完全に整合し、 「総人口は正規分布で記述できない (p=0.001、 AD>危険値) が、 対数正規分布なら記述できる (p=0.323)」という結論を与えます。 注意点として、 パラメータをデータからフィットした後の KS は第一種過誤率が低くなる (楽観的) ので、 厳密には Lilliefors 補正やブートストラップ p 値を使うべき場面もあります。 ただし AD 検定はパラメトリックな危険値が用意されているため、 正規性検定では AD のほうが信頼性が高いと一般に推奨されます。
数式だけでは「分かった気になる」だけで終わりがち。 ここで SSDSE-B-2026(教育用標準データセット — 47 都道府県 × 100+ 指標、 2018-2023 年度)の実値を当てはめて、 確率分布 の挙動を電卓的に追体験します。
SSDSE-B-2026 は 統計センターの SSDSE 配布ページ から CSV を直接ダウンロードできます。 本サイトでは data/raw/SSDSE-B-2026.csv に配置している前提でコードを書いています。
合成データで主要分布のパラメータと統計量を計算する。
| 分布 | パラメータ | E[X] | Var[X] |
|---|---|---|---|
| 二項 B(n=10, p=0.3) | n,p | 3.0 | 2.1 |
| ポアソン Po(λ=5) | λ | 5 | 5 |
| 幾何 Geo(p=0.2) | p | 5 | 20 |
| 一様 U(0,10) | a, b | 5 | 8.33 |
| 正規 N(0, 4) | μ, σ² | 0 | 4 |
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}") |
💬 手計算 (Step 1) と Python 出力が完全一致。
まず scipy.stats だけで代表分布の CDF・PMF を触る最小コード(11 行)。 実データ (SSDSE-B-2026) を読み込む版は、 後半の「経験分布と理論分布のフィッティング」で扱います。
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()) |
※ data/raw/SSDSE-B-2026.csv は e-Stat SSDSE から取得した実データを想定。
確率分布 を「やってみたけど結局正しかったのか分からない」状態を避けるための、 標準的な検証観点。 SSDSE-B-2026 のような中小規模データでは特に丁寧に。
| 観点 | 具体的な確認内容 |
|---|---|
| 前提の妥当性 | 分布の仮定、 独立性、 線形性 / 単調性などの統計的前提を、 適合度検定や可視化で確認 |
| サンプル数 | SSDSE-B では 47 県 × 12 年 = 564 行が上限。 適用手法に対し検出力分析を事前に |
| 外れ値の影響 | 東京 / 沖縄など極端な県が結果を支配していないか。 ロバスト指標 (Median, MAD) と比較 |
| 交差検証 | 学習・検証分割を変えても結果が安定するか。 県単位で split し、 年度リークを防ぐ |
| 感度分析 | ハイパーパラメータをわずかに変えても結論が大きく変わらないか |
| 再現性 | 乱数 seed・ライブラリバージョン・データバージョンを記録し、 他者が再現できる状態に |
| 解釈の妥当性 | 結果がドメイン知識と整合するか。 整合しない場合、 データかモデルか前提かどこに原因があるか |
確率分布 を使った分析結果を、 第三者が誤読しない形でレポートに書くための標準フォーマット。 SSDSE-B-2026 を使った大学のレポートから業務報告書まで応用可能。
この 7 点セットを書く習慣をつけると、 査読者・上司・同僚から「何が分かって何が分からないのか明確で良い」と評価されます。 数値だけ並べて「すごい結果が出ました」では、 残念ながら通用しません。
以下の問いに自分の言葉で答えられれば、 確率分布 は「使える知識」として身についています。 まだ答えられない問いがあれば、 該当セクションに戻って再読しましょう。
pd.read_csv('data/raw/SSDSE-B-2026.csv') 直書き版)を手元で実行し、 出力を観察しましたか?8 問中 6 問以上「はい」と答えられれば、 この用語は実務応用レベルで理解できています。 残りは関連用語を学ぶ中で自然に補完されます。
🎯 このコードでやること: 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}') |
📤 実行結果:
💬 結果の読み方: ヒストグラムは 右に長い裾を持ち、 正規分布の対称形とは大きく異なる。 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)') |
📤 実行結果:
💬 結果の読み方: 正規分布の 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}') |
📤 実行結果:
💬 結果の読み方: 経験確率 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}') |
📤 実行結果:
💬 結果の読み方: ポアソン分布の前提(独立・定常)では平均 4176 周辺に集中するはずだが、 直近 3 年は CDF ≈ 0 — 「過分散」と「トレンド減少」を示唆。 単純なポアソンでは説明できず、 負の二項分布や 時間トレンドモデルが必要と判断。
確率分布の取り扱いで実務に頻出する 3 つの罠を、 SSDSE-B-2026 の都道府県データに当てはめて整理した。 下の「拡張版」 5 件と合わせて読むと網羅できる。
確率分布の適合度を視覚的に確認する最強ツールが 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}') |
📤 実行結果:
💬 結果の読み方: 生スケールの 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 統計量はカイ二乗比」を理解できると、 統計学の見通しが一気に良くなる。
fit() メソッドを持ち、 1 行で MLE 推定できる。 ベイズ的アプローチでは事前分布を組み合わせる(PyMC など)。確率分布は教科書の中の話ではなく、 政策・経営・医療・工学のあらゆる場面で意思決定の根拠になります。 主要な応用 8 例を整理します。
| 応用分野 | 使う分布 | 目的 | SSDSE-B での発展課題 |
|---|---|---|---|
| 保険数理 | ポアソン、 ガンマ、 パレート | 事故発生数・損害額のモデル化 | 県別交通事故件数の予測 |
| 品質管理 (SPC) | 正規、 二項 | 3σ 管理図で異常判定 | 県別工業出荷額の年次変動監視 |
| 金融リスク | 正規 → t、 GARCH | VaR (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)$ は 事後分布(観測後の信念)。 数式を言葉で読み解くと、 「事前の信念 × データの整合度 ÷ データの周辺確率 = 観測後の信念」となる。
特定の事前分布と尤度の組合せでは、 事後分布が同じ 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 分で候補を絞れます。
💡 この意思決定は 「最終決定」ではなく「初期候補」。 必ず Q-Q プロット・KS 検定で複数候補を比較し、 AIC で最適を選ぶ。
確率分布を体系的に理解できると、 データを見る目が決定的に変わります。
確率分布を学ぶことは「数学を学ぶこと」ではなく、 「世界の不確実性を構造的に捉える方法を学ぶこと」です。 SSDSE-B-2026 のような実データに 1 つずつ分布を当てはめてみることで、 抽象が具体に化け、 統計学が血肉化していきます。
次のステップとして、 本ページの「🐍 Python 実装」を実際に手元で動かし、 出力数値を自分で確認してみてください。 「読んで分かる」と「動かして分かる」は段違いです。 そして他の都道府県、 他の年次、 他の指標(出生率、 死亡数、 年平均気温など)でも同じ手順を試してみてください。 同じ手順が SSDSE-B-2026 の 約 60 指標 × 47 都道府県 × 12 年のあらゆる組合せで適用できることが、 確率分布論の力の証明です。
これらはすべて、 SSDSE-B-2026 の実データで再現できる現象です。 「分布を学ぶ」とは、 こうした現実の不一致を見抜き、 適切な分布族に修正する判断力を養うことに他なりません。
| 用語 | 意味 |
|---|---|
| 経験分布関数 (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 や経験分布が代表例。 |
| 質問 | 答え |
|---|---|
| 「とりあえず正規分布」で良い場面は? | サンプルが大きく (n≥100)、 平均近傍だけが知りたい場合は CLT で許容できることが多い。 ただし裾の確率や予測区間が必要なら絶対に駄目。 |
| 対数正規かガンマかで迷ったら? | 「倍数的に増減するか」(対数正規)、 「待ち時間や累積か」(ガンマ) で選ぶ。 AIC が拮抗するなら扱いやすさで決めて良い。 |
| 分布フィットの p 値が高いのは安心? | 小サンプルでは「棄却できない=支持」ではない。 むしろ「証拠不十分」と読む。 図表 (Q-Q プロット、 ヒストグラム重ね描き) と併用する。 |
| 混合分布はどうやって fit する? | EM アルゴリズム (sklearn.mixture.GaussianMixture) や MCMC を使う。 成分数は BIC で選ぶのが標準。 |
| 分布族を仮定したくない場合は? | KDE (カーネル密度推定) や経験分布で十分なことが多い。 ただし極端な尾部の予測は KDE は弱い点に注意。 |
この 6 原則を持ち帰れば、 SSDSE のような公的データだけでなく、 業務で扱うログデータ・実験データに対しても、 「とりあえず正規分布」「とりあえず平均」を脱して、 実態に即した分布モデルを選べるようになります。 確率分布は覚える対象ではなく、 実データに当てはめて使う道具です。
確率分布 はデータサイエンスの大きな体系の中で、 「前提となる基礎」と「発展先」を持ちます。 自分が今どこにいて、 次にどこへ進めば良いかが見えるマップ。
📚 大カテゴリ(データサイエンス全体)
┗ 関連する基礎概念群(数学・統計・前処理)
┗ 確率分布(このページ)
┗ 派生・発展(より高度な手法・応用)
┗ 周辺概念群(並列に語られる手法)
概念マップ全体は こちら から閲覧できます。
確率分布は 「離散分布」と「連続分布」の 2 大カテゴリに分けられ、 さらに「サンプルが何を表すか」によって細かく分類されます。 SSDSE-B-2026 を含む現実のデータに、 どの分布を当てるべきかを判断する基準を示します。
| 分布 | 用途 | 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) | 過分散カウントデータのモデル |
| 分布 | 用途 | 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) | 県民所得分布の右裾 |
スライダーを動かすと、 確率分布の 曲線 (PDF/PMF)・累積分布 (CDF)・平均・分散・歪度 が同時に更新されます。 タブで 5 つの代表分布を切り替え、 連続と離散の違い と パラメータが形をどう決めるか を体感してください。 影を付けた領域が 区間確率 P(a ≤ X ≤ b) です。 外部ライブラリを使わず、 すべてブラウザ内で正確に計算しています。
| 種類 | |
| 平均 μ | |
| 分散 σ² | |
| 標準偏差 σ | |
| 歪度 | |
| P(a ≤ X ≤ b) |
確率分布とは、 確率変数がとりうる各値に 「起こりやすさ」を割り当てるルール です。 配れる確率の総量は必ず 1 で、 離散なら棒の高さ (PMF) の合計が 1、 連続なら曲線の下の面積 (PDF の積分) が 1 になります。 平均はその重心 (バランスの取れる位置)、 分散は広がり具合、 歪度は左右非対称の度合いを表します。 上の図で σ を大きくすると山が低く広くなるのは、 「同じ 1 の面積を広い範囲に薄く配り直している」からです。
これらの分布はバラバラではなく一つの体系です。 二項分布は n を大きく p を小さくし np=λ を一定に保つとポアソン分布に近づき、 n を大きくすると正規分布に近づきます (ド・モアブル–ラプラスの定理)。 上のタブで二項の n を増やしながらポアソン (同じ λ) や正規と山の形を見比べると、 この収束が体感できます。 より一般に、 独立な確率変数の和や平均は元の分布によらず正規分布に近づく——これが中心極限定理で、 正規分布が自然界・社会統計に遍在する理由です。 平均や分散の定義そのものは代表値・分散のページも参照してください。
確率分布は確率変数の値がどう散らばるかを示す関数で、 正規分布・二項分布・ポアソン分布など具体分布と一体で運用される。
SSDSE-B-2026 を用いた演習では、 「確率分布」 を中核に据えて上記の上流・並列・下流の手法を実データで連結する経験を積むと、 単独の手法暗記より実務的応用力が身につく。
「確率分布」を実際に使うとき、 何をどう選ぶかを順に判断する。 上から順に答えていくと、 使うべき手法と評価の仕方が決まる。
分布を仮定すると、 少ないデータからでも裾の確率を推定できる。 その代わり仮定が外れれば結論も外れるので、 当てはまりの確認とセットで使う。
本ページの各節(🎨 直感で掴む・⚠️ よくある落とし穴・🐍 Python 実装)では、SSDSE-B-2026 のデータに 正規分布・対数正規・ガンマなどの理論分布を当てはめて評価する話を扱いました。 この追補ではそこであえて触れなかったもう一段手前の問い――「そもそも 47 都道府県のデータに確率分布を当てはめるとは、確率的にどういう意味なのか」という角度から、既存の解説を置き換えずに補います。
確率分布とは、「どんな値が」「どのくらいの確からしさで」現れるかを一枚に束ねた地図です。 いちばん素朴で確実な確率分布は、実は数式ではなく手元データそのものが作る経験分布(empirical distribution)です。 「47 都道府県から 1 県を等確率でランダムに選ぶ」という試行を考えると、各県はちょうど質量 1/47 ≈ 0.0213 を持つ点になり、これが完全に定義された 1 つの離散確率分布になります。 SSDSE-B-2026(2023 年・47 都道府県・総人口 A1101)で「選んだ県の人口がしきい値を超える確率」は、母集団パラメータの推定ではなく数え上げによる厳密値として求まります:
| 事象(1 県を等確率で選ぶ) | 該当県数 | 厳密確率 |
|---|---|---|
| 人口 > 100 万人 | 37 | 37/47 = 0.7872 |
| 人口 > 平均(2,645,809 人) | 12 | 12/47 = 0.2553 |
| 人口 > 500 万人 | 9 | 9/47 = 0.1915 |
注目すべきは「平均を上回る県は 12/47(約 26%)しかない」点。過半(35 県)が平均以下で、少数の巨大県が平均を引き上げています。 これは分布が右に強く歪んでいる(実測の歪度 +2.22)ためで、平均が「真ん中」を表さない典型例です。中央値は 1,549,000 人と平均のおよそ 6 割にとどまります。
確率分布の議論はふつう「無限に広い母集団から標本をランダムに抽出する」場面を前提にします。 ところが 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 節と同じ読み込み規約):
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 |