論文・記事に 「正規分布」「t分布」「F分布」「χ²分布」「二項分布」「ポアソン分布」 として出てくる確率分布群。 仮説検定・信頼区間・最尤推定など、 推測統計のあらゆる場面で前提となります。
分布同士には密接な派生関係(正規 → t、 χ² → F、 二項 → ポアソン → 正規 など)があり、 まとめて学ぶことで全体像がつかめます。
| 分布 | 記号 | 連続/離散 | パラメータ | 典型的な使い時 |
|---|---|---|---|---|
| 正規 | $N(\mu, \sigma^2)$ | 連続 | $\mu$, $\sigma$ | 標本平均、 測定誤差、 身長 |
| t | $t_\nu$ | 連続 | $\nu$(自由度) | 小標本平均、 回帰係数 |
| χ² | $\chi^2_k$ | 連続 | $k$(自由度) | 分散・独立性検定 |
| F | $F_{d_1, d_2}$ | 連続 | $d_1, d_2$ | 分散比、 ANOVA |
| 二項 | $\mathrm{Bin}(n, p)$ | 離散 | $n$, $p$ | コイン投げ、 A/B テスト |
| ポアソン | $\mathrm{Pois}(\lambda)$ | 離散 | $\lambda$ | 来店数、 事故件数 |
| 一様 | $U(a, b)$ | 連続/離散 | $a, b$ | 乱数、 事前分布 |
| 指数 | $\mathrm{Exp}(\lambda)$ | 連続 | $\lambda$ | 待ち時間、 寿命 |
| 対数正規 | $\mathrm{LN}(\mu, \sigma^2)$ | 連続 | $\mu, \sigma$ | 所得、 株価変動 |
「釣鐘型」の左右対称な分布。 統計学で最も重要、 自然界・標本平均の至るところに現れます。 確率密度関数(PDF):
$$ f(x) = \frac{1}{\sigma\sqrt{2\pi}} \exp\!\left(-\frac{(x-\mu)^2}{2\sigma^2}\right) $$
記号:$\mu$ は平均(位置)、 $\sigma$ は標準偏差(広がり)、 $\sigma^2$ は分散。 表記は $X \sim N(\mu, \sigma^2)$。 特に $\mu=0, \sigma=1$ を標準正規分布と呼び、 $Z \sim N(0,1)$ と書きます。
これが信頼区間・検定の基礎。 「$\pm 1.96 \times \mathrm{SE}$」が 95% 信頼区間になるのもこのため。
$X \sim N(\mu, \sigma^2)$ を $Z = (X-\mu)/\sigma$ で標準化すると $Z \sim N(0,1)$。 任意の正規分布の確率計算が、 標準正規分布の値表で済む。 例:偏差値 70($z=2$)以上の人は上位 2.5% 程度。
$d$ 次元への拡張:$\boldsymbol{X} \sim N_d(\boldsymbol{\mu}, \Sigma)$。 密度関数は
$$ f(\boldsymbol{x}) = \frac{1}{(2\pi)^{d/2} |\Sigma|^{1/2}} \exp\!\left(-\frac{1}{2}(\boldsymbol{x}-\boldsymbol{\mu})^\top \Sigma^{-1} (\boldsymbol{x}-\boldsymbol{\mu})\right) $$
$\boldsymbol{\mu} \in \mathbb{R}^d$ は平均ベクトル、 $\Sigma \in \mathbb{R}^{d \times d}$ は共分散行列。 マハラノビス距離 $(\boldsymbol{x}-\boldsymbol{\mu})^\top \Sigma^{-1} (\boldsymbol{x}-\boldsymbol{\mu})$ が指数の中身。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | from scipy import stats import numpy as np # 1次元 X = stats.norm(loc=50, scale=10) # N(50, 100) print(X.pdf(60)) # 密度 print(X.cdf(60)) # 累積確率 P(X ≤ 60) print(X.ppf(0.975)) # 上側2.5%点 ≈ 69.6 print(X.rvs(size=1000)) # ランダムサンプル # 標準化 Z = (X.rvs(1000) - 50) / 10 # 標準正規 # 多変量 mean = [0, 0] cov = [[1, 0.5], [0.5, 1]] mvn = stats.multivariate_normal(mean=mean, cov=cov) samples = mvn.rvs(size=1000) # (1000, 2) |
正規分布から派生した分布で、 標準偏差が未知の小標本での平均の検定・信頼区間に使う。 自由度 $\nu$ をパラメータに持ちます。
$$ T = \frac{Z}{\sqrt{V/\nu}}, \quad Z \sim N(0,1), \quad V \sim \chi^2_\nu \text{ (独立)} $$
正規分布より裾が重い(極端な値が出やすい)。 $\nu \to \infty$ で正規分布に収束。 実務的には $\nu \ge 30$ で正規分布近似可能。
使い時:1標本 t 検定、 2標本 t 検定、 単回帰の係数検定。 形は「$(\bar{x} - \mu_0)/(s/\sqrt{n})$」のような形をした統計量が従う。
Guinness ビール工場の品質管理担当だった William Gosset が 1908 年に発表("Student" のペンネーム)。 会社の方針で本名を出せなかったため。 ビールの品質管理が現代統計学の基礎を作った。
1 2 3 4 5 6 7 8 9 | from scipy import stats t_dist = stats.t(df=10) print(t_dist.ppf(0.975)) # 自由度10での 2.5%点 ≈ 2.228 print(t_dist.ppf(0.975) - stats.norm.ppf(0.975)) # 正規との差 # 1標本 t検定 data = [1, 2, 3, 4, 5] t_stat, p_val = stats.ttest_1samp(data, popmean=2.5) print(t_stat, p_val) |
標準正規分布の二乗和。 $Z_1, \ldots, Z_k$ が独立に $N(0,1)$ なら、 $\sum Z_i^2 \sim \chi^2_k$(自由度 $k$)。
$\chi^2$ の期待値 = $k$、 分散 = $2k$。 必ず非負(0 以上)。 自由度が大きくなると正規分布に近づく。
1 2 3 4 5 6 7 | from scipy import stats # 独立性検定(クロス集計表) import numpy as np obs = np.array([[10, 20, 30], [6, 9, 17]]) chi2, p, dof, expected = stats.chi2_contingency(obs) print(f'χ² = {chi2:.3f}, p = {p:.4f}, df = {dof}') |
2 つの独立な χ² 分布の比:$F = (U/d_1)/(V/d_2)$、 $U \sim \chi^2_{d_1}$、 $V \sim \chi^2_{d_2}$。 必ず非負、 右に裾を引く。
主な用途:
1 2 3 4 5 6 | from scipy import stats g1 = [1, 2, 3, 4] g2 = [3, 5, 7, 9] g3 = [2, 4, 6, 8] F, p = stats.f_oneway(g1, g2, g3) # ANOVA print(f'F = {F:.3f}, p = {p:.4f}') |
「成功確率 $p$ の試行を $n$ 回繰り返したときの成功回数」。 $X \sim \mathrm{Bin}(n, p)$。
$$ P(X = k) = \binom{n}{k} p^k (1-p)^{n-k}, \quad k = 0, 1, \ldots, n $$
期待値 $= np$、 分散 $= np(1-p)$。 $n$ が大で $np \ge 5$、 $n(1-p) \ge 5$ なら正規近似可能。
例:コイン 100 回投げて表が出る回数、 100 人中の購入者数(A/B テスト)、 メール 100 件の到達数。
1 2 3 4 5 6 | from scipy import stats X = stats.binom(n=100, p=0.2) print(X.pmf(20)) # P(X=20) print(X.cdf(15)) # P(X≤15) print(X.mean(), X.var()) # 20.0, 16.0 |
「単位時間(空間)あたりの稀な事象の発生数」。 $X \sim \mathrm{Pois}(\lambda)$。
$$ P(X = k) = \frac{\lambda^k e^{-\lambda}}{k!}, \quad k = 0, 1, 2, \ldots $$
期待値 = 分散 = $\lambda$(特徴的)。 二項分布 $\mathrm{Bin}(n, p)$ で $n$ 大・$p$ 小・$np = \lambda$ 固定の極限。
例:1 時間あたりの来店数、 単位面積あたりの店舗数、 1 日あたりの事故件数、 単位時間の電話呼出数。
1 2 3 4 5 | from scipy import stats X = stats.poisson(mu=3) # λ = 3 print(X.pmf(2)) # P(X=2) print(X.mean(), X.var()) # 3.0, 3.0 |
$U(a, b)$:区間 $[a, b]$ で密度一定。 期待値 $(a+b)/2$、 分散 $(b-a)^2/12$。 乱数生成、 ベイズの無情報事前分布として基本。
$\mathrm{Exp}(\lambda)$:ポアソン過程の事象間隔。 期待値 = 分散 = $1/\lambda$。 メモリーレス性が特徴:$P(X > s+t | X > s) = P(X > t)$。 待ち時間、 寿命、 故障間隔のモデル。
$\log X \sim N(\mu, \sigma^2)$ のとき $X$ は対数正規分布。 必ず正値、 右に裾を引く。 所得分布、 株価収益率、 都市人口など「掛け算過程」で生じる分布の代表。
分布は孤立せず、 多くの変換関係で繋がっています。 これを理解すると、 新しい分布に出会ったとき素早く類推できます。
| 変換 | 関係 |
|---|---|
| CLT(中心極限定理) | 任意分布 $\to$ 標本平均は正規分布 |
| 標準正規の二乗和 | $\sum_{i=1}^k Z_i^2 \sim \chi^2_k$ |
| 標準正規 / √(χ²/df) | $t$ 分布 |
| χ²/df の比 | $F$ 分布 |
| $\mathrm{Bin}(n,p)$ の極限 | $n$ 大、 $np = \lambda$ 固定 $\to$ ポアソン |
| $\mathrm{Bin}(n,p)$ の極限 | $np \ge 5$, $n(1-p) \ge 5$ $\to$ 正規 |
| ポアソンの極限 | $\lambda \to \infty$ $\to$ 正規 |
| 指数の和 | $\sum \mathrm{Exp}(\lambda) \sim \mathrm{Gamma}$ |
| 対数 | $\log(\mathrm{LN}) \sim N$ |
これらは「中心極限定理を中心とした分布の宇宙」を作ります。 特に正規分布 → t、 χ²、 F は古典統計の三大派生。
解答:$\sigma = 6$、 $z = (182-170)/6 = 2$。 標準正規で $P(Z \ge 2) \approx 2.28\%$。
解答:標準正規では 1.960、 t(10) では 2.228。 t 分布の方が大きい(裾が重いため)。 自由度が小さいほどこの差は大きくなる。 $\nu \to \infty$ で両者は一致。
解答:$X \sim \mathrm{Bin}(1000, 0.05)$。 $E[X] = 50$、 $\mathrm{Var}(X) = 1000 \cdot 0.05 \cdot 0.95 = 47.5$、 $\mathrm{SD} \approx 6.89$。 $np = 50 \ge 5$、 $n(1-p) = 950 \ge 5$ なので正規近似可能。 $X \approx N(50, 47.5)$。
解答:$X \sim \mathrm{Pois}(3)$、 $P(X \ge 5) = 1 - P(X \le 4)$。
1 2 | from scipy import stats print(1 - stats.poisson(3).cdf(4)) # ≈ 0.185 (18.5%) |
解答:平均 > 中央値。 対数正規分布は右に裾を引くため。 厚労省「国民生活基礎調査」で平均所得 約552万円・中央値 約437万円というのも、 所得が対数正規分布に近いことを示している。 「平均以下の世帯が 60% 超」になる典型例。
| ❌ 誤解 | ✅ 正しい理解 |
|---|---|
| すべて正規分布で近似できる | 所得・株価・地震被害額などは対数正規。 まずヒストグラムで確認 |
| CLT があれば n が小さくても OK | 通常 n ≥ 30 が目安。 元分布が極端に歪めばさらに大きい n が必要 |
| 68-95-99.7 ルールはあらゆる分布に適用できる | 正規分布専用。 一般分布には Chebyshev の不等式(より弱い保証) |
| 二項分布は連続値で扱ってよい | 基本は離散。 正規近似時には連続性補正(±0.5)を考慮 |
| t 分布と正規分布は同じ | t は裾が重い。 小標本では明確に差が出る |
| ポアソン分布なら期待値だけで OK | 期待値 = 分散 = λ。 「予測値±√λ」程度のばらつきが目安 |
| 対数正規の平均を直接報告 | 中央値・幾何平均の方が「典型値」を表す |
確率分布を仮定したり推定したりするときの報告例:
「47都道府県の家計食料費は概ね正規分布で近似可能(Shapiro-Wilk 検定 W=0.97, p=0.21)。 最尤推定によりパラメータは $\hat{\mu}=80.6$ 千円、 $\hat{\sigma}=3.0$ 千円。 ただし上位 3 県(東京、 神奈川、 大阪)は分布の右側に偏り、 厳密には対数正規モデルも検討の余地。 (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 26 27 28 29 30 | from scipy import stats # 共通インターフェース dist = stats.norm(loc=0, scale=1) # 正規分布の例 dist.pdf(x) # 確率密度 dist.pmf(k) # 確率質量(離散用) dist.cdf(x) # 累積確率 P(X ≤ x) dist.sf(x) # 上側確率 P(X > x) = 1 - cdf dist.ppf(q) # 分位点(CDF の逆関数) dist.rvs(size=n) # ランダムサンプリング dist.mean(), dist.var(), dist.std() # 主要分布 stats.norm(loc=μ, scale=σ) # 正規 stats.t(df=ν) # t 分布 stats.chi2(df=k) # χ² stats.f(dfn=d1, dfd=d2) # F stats.binom(n=n, p=p) # 二項 stats.poisson(mu=λ) # ポアソン stats.uniform(loc=a, scale=b-a) # 一様 stats.expon(scale=1/λ) # 指数 stats.lognorm(s=σ, scale=np.exp(μ)) # 対数正規 stats.multivariate_normal(mean=μ, cov=Σ) # 多変量正規 # 適合度検定 stats.shapiro(data) # 正規性(Shapiro-Wilk) stats.kstest(data, 'norm', args=(μ, σ)) # KS 検定 # パラメータ推定 params = stats.norm.fit(data) # 最尤推定で μ, σ |
確率分布(probability distribution)は統計学・機械学習の最重要基盤です。 関連キーワードを難易度別に整理しました。
合成データではなく公的統計を念頭に、 実データの分布の見方と適合度の確認手順を具体的な数値で示します。
1 2 3 4 5 6 7 8 9 10 11 12 | # 47 都道府県の人口総数(万人) 最小:鳥取 55、 中央値:石川 113、 最大:東京 1404 平均 ≈ 268.3、 標準偏差 ≈ 287.4 歪度 ≈ +2.8(強い右歪み)、 尖度 ≈ +9.1(裾が重い) # 正規分布なら歪度 ≈ 0、 尖度 ≈ 0 → 明らかに正規分布ではない # 対数変換 log₁₀(人口) の平均 ≈ 2.30、 標準偏差 ≈ 0.33 歪度 ≈ +0.15、 尖度 ≈ -0.05 → ほぼ正規分布、 対数正規分布が良くフィット |
# 47 都道府県の高齢化率(%、 仮想値)
最小:沖縄 22.6、 最大:秋田 38.6
平均 ≈ 30.5、 標準偏差 ≈ 3.2
歪度 ≈ +0.18、 尖度 ≈ -0.15
# Shapiro–Wilk 検定の結果(想定)
W = 0.987, p = 0.86
→ p > 0.05 なので正規分布の帰無仮説を棄却できない
→ 高齢化率は正規分布で近似してよい
# 仮想例:ある県の月別出生数 N = 12 ヶ月
データ:210, 195, 220, 188, 205, 198, 215, 230, 210, 195, 205, 218
平均 = 207.4、 分散 = 134.8
# ポアソン分布の特徴:平均 = 分散
比 = 134.8 / 207.4 ≈ 0.65 < 1
→ 過小分散(underdispersion)
→ 完全なポアソンではないが近似的には妥当
1 2 3 4 5 6 7 8 9 10 11 12 | # 47 都道府県の平均寿命(仮想:平均=84.5、 標準偏差=0.6) 標本平均の SE = 0.6 / √47 ≈ 0.0876 # 95% 信頼区間(t 分布、 df=46) t(0.025, 46) ≈ 2.013 CI = 84.5 ± 2.013·0.0876 = [84.32, 84.68] # もし正規分布で計算したら(df = ∞) z(0.025) = 1.96 CI = 84.5 ± 1.96·0.0876 = [84.33, 84.67] → ほぼ同じ(df 大)。 df = 10 だと t = 2.228 で差が出る。 |
多くの統計手法(t 検定、 ANOVA、 線形回帰)は誤差項の正規性を仮定します。 しかし実データの多く(人口、 所得、 売上、 待ち時間)は右に裾を引いた歪んだ分布で、 正規ではありません。 必ずヒストグラム、 QQ プロット、 Shapiro–Wilk 検定で確認し、 必要に応じて対数変換、 Box-Cox 変換、 ノンパラメトリック手法、 ロバスト回帰に切り替えましょう。
中心極限定理は「サンプル平均」の分布が正規に近づくことを保証するだけで、 「個別データが正規になる」わけではありません。 また、 (i) 独立性、 (ii) 同一分布、 (iii) 有限分散、 という条件が必要で、 コーシー分布のような分散発散分布では成り立ちません。 N ≥ 30 で十分とよく言われますが、 極端な裾を持つデータでは N = 1000 でも不足することがあります。
「サイコロの出目」「人口」「故障回数」は離散変数であり、 PMF(質量関数)を使うべきです。 連続として扱うと、 P(X = 3) を密度関数で計算しようとして「P(X=3) = 0」となるなど不整合が出ます。 また、 連続データを離散として扱うと(例:所得を $10K きざみのビンに)情報が失われ、 分布の解釈が歪みます。
ポアソン分布は平均 = 分散を前提とします。 しかし実データの計数データの多くは分散 > 平均(過分散)になります。 例:交通事故件数、 病気発生数、 ブログのアクセス数。 過分散を無視してポアソン回帰を当てると、 標準誤差が過小評価され p 値が偽陽性に偏ります。 対策は負の二項回帰、 準ポアソン(quasi-Poisson)。
自由度が小さい(df < 30)t 分布は、 正規分布よりも裾が重い。 これを正規で近似すると、 信頼区間が狭すぎ、 有意水準も誤算します。 例:df = 5 で 95% 信頼区間の臨界値は t = 2.571(正規なら 1.96)。 サンプルサイズが小さく、 母分散が未知のときは必ず t 分布を使ってください。
ヒストグラムを見ずに平均と標準偏差だけで分布を要約すると、 二峰・多峰性を見逃します。 例:男女混合のグループの身長分布は二峰(男女のピーク)。 平均だけで「中央付近」と判断するのは誤り。 必ず可視化し、 多峰性があれば混合モデル(GMM)や層別分析を検討してください。
金融収益、 自然災害、 SNS の拡散数などはパレート分布や対数正規分布に従い、 極端値の発生頻度が正規よりはるかに高い。 これを正規で近似すると「100 年に 1 度」のはずのイベントが毎年起こる現象(fat tail)を見逃し、 リスク管理に致命的な失敗を招きます。 Block maxima、 Peaks-over-Threshold など極値理論を検討してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import numpy as np import pandas as pd from scipy import stats # 正規分布の PDF・CDF x = np.linspace(-4, 4, 100) pdf = stats.norm.pdf(x, loc=0, scale=1) cdf = stats.norm.cdf(x, loc=0, scale=1) # t 分布(自由度 5) t_pdf = stats.t.pdf(x, df=5) # χ² 分布(自由度 3) chi2_pdf = stats.chi2.pdf(np.linspace(0, 10, 100), df=3) # 乱数生成(再現性確保のため公的データを使うのが望ましいが、 分布確認なら可) real_data = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8-sig')['人口総数'].dropna() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | from scipy.stats import norm, lognorm, expon, gamma data = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8-sig')['人口総数'].dropna().values # 正規分布フィット mu, sigma = norm.fit(data) print(f'正規: μ={mu:.1f}, σ={sigma:.1f}') # 対数正規分布フィット shape, loc, scale = lognorm.fit(data, floc=0) print(f'対数正規: shape={shape:.3f}, scale={scale:.1f}') # AIC で比較 def aic(loglik, k): return 2*k - 2*loglik ll_norm = norm(mu, sigma).logpdf(data).sum() ll_lnorm = lognorm(shape, loc, scale).logpdf(data).sum() print(f'AIC 正規 = {aic(ll_norm, 2):.1f}') print(f'AIC 対数正規 = {aic(ll_lnorm, 2):.1f}') |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | from scipy import stats # Shapiro–Wilk w, p = stats.shapiro(data) print(f'Shapiro: W={w:.4f}, p={p:.4f}') # 対数変換後 log_data = np.log10(data) w2, p2 = stats.shapiro(log_data) print(f'対数変換後 Shapiro: W={w2:.4f}, p={p2:.4f}') # Kolmogorov–Smirnov(指定分布との比較) ks, p_ks = stats.kstest(log_data, 'norm', args=(log_data.mean(), log_data.std())) print(f'KS: D={ks:.4f}, p={p_ks:.4f}') # Anderson–Darling ad = stats.anderson(data, dist='norm') print(f'AD statistic={ad.statistic:.4f}') print('臨界値:', ad.critical_values, 'at', ad.significance_level) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import matplotlib.pyplot as plt from scipy import stats fig, axes = plt.subplots(1, 2, figsize=(10, 5)) # 生データの QQ プロット(正規との比較) stats.probplot(data, dist='norm', plot=axes[0]) axes[0].set_title('生データの QQ プロット') # 対数変換後の QQ プロット stats.probplot(np.log10(data), dist='norm', plot=axes[1]) axes[1].set_title('log10 変換後の QQ プロット') plt.savefig('qq_plots.png', dpi=150) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import statsmodels.api as sm # 計数データを想定 X = sm.add_constant(df[['高齢化率']]) y_count = df['年間出生数'] # ポアソン回帰 poisson_model = sm.GLM(y_count, X, family=sm.families.Poisson()).fit() print(poisson_model.summary()) # 負の二項回帰 nb_model = sm.GLM(y_count, X, family=sm.families.NegativeBinomial()).fit() print(nb_model.summary()) # AIC 比較 print(f'AIC ポアソン: {poisson_model.aic:.1f}') print(f'AIC 負の二項: {nb_model.aic:.1f}') |
1 2 3 4 5 6 7 8 9 10 | from sklearn.mixture import GaussianMixture import numpy as np # 多峰性が疑われるデータ X = data.reshape(-1, 1) # k=1, 2, 3 で BIC 比較 for k in [1, 2, 3]: gmm = GaussianMixture(n_components=k, random_state=0).fit(X) print(f'k={k}: BIC={gmm.bic(X):.1f}, AIC={gmm.aic(X):.1f}') |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import matplotlib.pyplot as plt from scipy import stats fig, ax = plt.subplots(figsize=(8, 5)) ax.hist(data, bins=15, density=True, alpha=0.6, label='実データ') # 正規分布のフィット曲線 xs = np.linspace(data.min(), data.max(), 200) ax.plot(xs, stats.norm.pdf(xs, *stats.norm.fit(data)), 'r-', label='正規フィット') # 対数正規分布のフィット曲線 shape, loc, scale = stats.lognorm.fit(data, floc=0) ax.plot(xs, stats.lognorm.pdf(xs, shape, loc, scale), 'g-', label='対数正規フィット') ax.legend() ax.set_xlabel('人口総数(万人)') ax.set_ylabel('密度') plt.savefig('distribution_fit.png', dpi=150) |
「分布」は値の散らばり方。 SSDSE-B-2026 の 47 都道府県の総人口を見ると、 東京(約 1400 万)・神奈川(約 920 万)が突出、 鳥取(約 54 万)が最小で、 右に裾の長い分布(対数正規っぽい)。 一方で合計特殊出生率は 1.0〜1.8 の狭い範囲にほぼ正規っぽく集まる。 分布の形によって使うべき統計手法が変わる。
直感で全体像を掴んだら、 次は厳密な定義を見ます。 数式は短いものでも、 「何を入力にして、 何を出力するのか」を意識して読むと早く慣れます。
上の数式に出てくる各記号が何を表すかを、 言葉で翻訳します。 1 つずつ自分の言葉で言い換えられるようになると、 論文や教科書のスピードが一気に上がります。
| 記号 | 意味(言葉での説明) |
|---|---|
| $P(X=k)$ | 離散確率(PMF) |
| $f(x)$ | 連続確率密度(PDF) |
| $F(x)$ | 累積分布(CDF) |
| $E[X]$ | 期待値 |
| $V[X]$ | 分散 |
数式だけでは「分かった気になる」だけで終わりがち。 ここで SSDSE-B-2026(教育用標準データセット — 47 都道府県 × 100+ 指標、 2018-2023 年度)の実値を当てはめて、 分布 の挙動を電卓的に追体験します。
SSDSE-B-2026 は 統計センターの SSDSE 配布ページ から CSV を直接ダウンロードできます。 本サイトでは data/raw/SSDSE-B-2026.csv に配置している前提でコードを書いています。
以下のコードは最小限の構成です。 pd.read_csv('data/raw/SSDSE-B-2026.csv') を直書きしているので、 同じ階層に CSV を置けばそのまま動きます。 変数化しないのは、 初学者が「パスをどこに書くべきか」で迷わないようにするためです。
# 分布 を SSDSE-B-2026 で確かめる最小コード
import pandas as pd
import numpy as np
# 1) SSDSE-B-2026(教育用標準データセット)を読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
print('shape:', df.shape) # (564, 112) — 47 都道府県 × 6 年度
print('cols head:', list(df.columns[:8]))
# 2) 直近年度(2023 年度)に絞る
df23 = df[df['年度'] == 2023].copy()
print('rows in 2023:', len(df23))
# 3) 分布 を動かすために必要な列だけ取り出す
y = df23['合計特殊出生率'].astype(float)
x = df23['総人口'].astype(float)
print('y stats:', y.describe().round(3).to_dict())
print('x stats:', x.describe().round(0).to_dict())
# 4) 分布 の本処理(このページの主題)
# — 具体実装は同カテゴリの個別ページにも掲載
print('---- 分布 結果 ----')
print('mean y:', y.mean().round(3), '/ std y:', y.std().round(3))
print('mean x:', x.mean().round(0), '/ std x:', x.std().round(0))
print('corr(x, y):', y.corr(x).round(3))うまく動かないときは ①data/raw/SSDSE-B-2026.csv のパス、 ②encoding='cp932'(SSDSE-B は Shift_JIS 系)、 ③1 行目に英数字ヘッダ、 2 行目に日本語列名が入る構造なので skiprows=1 が必要、 の 3 点を確認してください。
この用語を実務で使うときにつまずきやすい点を、 失敗パターン別に整理しました。 1 度経験すれば回避できるものばかりですが、 先に知っておくと事故が大幅に減ります。
分布 と一緒に覚えておくと選択肢が広がる関連手法。 状況によって使い分けが必要なので、 それぞれの強みと弱みを 1 行で言えるようにしておきましょう。
表中の各手法は本サイト内に個別ページが用意されているものが多いです。 興味を持った概念は、 横展開的に読むと体系的な理解が早く進みます。