累積確率分布(CDF)とは?確率分布との違いと読み方をPythonの実測値で解説

機械学習を学習する上で、確率分布と累積分布の理解は避けて通れない重要な概念です。データサイエンティストや機械学習エンジニアにとって、これらの統計的概念を視覚的に理解することは、モデルの性能向上や適切なアルゴリズム選択につながります。

本記事では、確率分布と累積分布の基本概念から実際のグラフの読み方まで、初心者にもわかりやすく解説します。

確率分布とは何か

基本概念

確率分布(probability distribution)は、ある確率変数が取りうる値とその確率の関係を表したものです。簡単に言えば、「どの値がどのくらいの確率で出現するか」を示す分布のことです。

確率密度関数(PDF)

連続確率変数の場合、確率密度関数(Probability Density Function, PDF)によって分布が表現されます。PDFのグラフでは、x軸が変数の値、y軸が確率密度を表します。

確率質量関数(PMF)

離散確率変数の場合は、確率質量関数(Probability Mass Function, PMF)を使用します。PMFは各値における確率そのものを表示します。

累積分布とは

累積分布関数(CDF)

累積分布関数(Cumulative Distribution Function, CDF)は、確率変数がある値以下になる確率を表します。つまり、「ある値x以下の値が出現する確率」を示しています。

CDFの特徴

累積分布関数には以下の重要な特徴があります:

  • 単調増加関数である
  • 値の範囲は0から1の間
  • 左端(マイナス無限大)では0、右端(プラス無限大)では1になる

累積分布を数字で確かめる

CDFは「ある値以下になる確率」です。言葉で読むより、実際に数字を出したほうが早く掴めます。以下はすべて手元のPython 3.9で実行した結果です(追加のインストールは要りません。標準ライブラリのstatistics.NormalDistを使います)。

標準正規分布のCDFを並べる

from statistics import NormalDist
nd = NormalDist(0, 1)
print("z      CDF(z)=P(X<=z)   その外側")
for z in (-3, -2, -1, 0, 1, 2, 3):
    print(f"{z:+d}    {nd.cdf(z):.6f}        {1-nd.cdf(z):.6f}")
print()
for k in (1, 2, 3):
    p = nd.cdf(k) - nd.cdf(-k)
    print(f"平均±{k}σ に入る確率: {p*100:.4f}%")

実行結果:

z      CDF(z)=P(X<=z)   その外側
-3    0.001350        0.998650
-2    0.022750        0.977250
-1    0.158655        0.841345
+0    0.500000        0.500000
+1    0.841345        0.158655
+2    0.977250        0.022750
+3    0.998650        0.001350

平均±1σ に入る確率: 68.2689%
平均±2σ に入る確率: 95.4500%
平均±3σ に入る確率: 99.7300%

注目してほしいのは増え方です。z=-3から-2では0.0214しか増えないのに、z=-1から0では0.3413も増えます。中央ほど急で端ほど緩やかになる、これがS字カーブの正体です。

よく聞く「3シグマルール」もこの表から読めます。平均±3σの外側は 1 − 0.99730 = 0.0027、つまり0.27%です。1,000個の製品を測れば3個前後は外に出る計算で、「3σを超えたら即異常」と決め打つと、正常品を一定の割合で弾くことになります。

乱数10万件で、本当にその割合になるか試す

理論値が現実の標本でも再現されるかを見ます。平均170cm・標準偏差6cmの正規分布から10万件を取り出し、ある値以下が何割かを数えました。

import numpy as np
rng = np.random.default_rng(0)
x = rng.normal(170, 6, 100_000)          # 身長を模した正規分布
print("標本数:", x.size, " 平均 %.2f" % x.mean(), " 標準偏差 %.2f" % x.std())
for v in (160, 165, 170, 175, 180):
    print(f"{v}cm 以下の割合(実測): {(x <= v).mean()*100:5.2f}%")

実行結果:

標本数: 100000  平均 169.99  標準偏差 6.00
160cm 以下の割合(実測):  4.79%
165cm 以下の割合(実測): 20.24%
170cm 以下の割合(実測): 50.17%
175cm 以下の割合(実測): 79.86%
180cm 以下の割合(実測): 95.29%

170cm以下がちょうど半分(50.17%)、180cm以下が95.29%。先ほどの表の「+1σで0.8413」「約+1.67σ」といった値と一致しています。CDFとは要するに「並べて数えたときの、その値までの割合」です。

PDFを足し上げるとCDFになる

PDFとCDFの関係も、足し算で確かめられます。確率密度を細かい刻みで計算して順に足し、理論値と突き合わせます。

import numpy as np
from statistics import NormalDist
nd = NormalDist(170, 6)
lo, hi, n = 140, 200, 600_000
step = (hi - lo) / n
grid = np.linspace(lo, hi, n, endpoint=False) + step/2
pdf = np.exp(-((grid-170)**2)/(2*36)) / (6*np.sqrt(2*np.pi))   # 確率密度
cum = np.cumsum(pdf) * step                                     # 足し上げ
for v in (165, 170, 175):
    i = int((v - lo) / step)
    print(f"{v}cm 以下  足し上げ {cum[i]:.6f}   理論値 {nd.cdf(v):.6f}")

実行結果:

165cm 以下  足し上げ 0.202333   理論値 0.202328
170cm 以下  足し上げ 0.500006   理論値 0.500000
175cm 以下  足し上げ 0.797676   理論値 0.797672

小数第5位まで一致しました。PDFは「その一点のあたりの濃さ」、CDFは「そこまでを全部足した量」という関係が、そのまま数字に出ています。PDFのグラフで山が高い区間ほど、CDFが急に立ち上がります。

ここまでの数字は乱数の種(default_rng(0))を固定しているので、同じコードを実行すれば同じ結果になります。手元で動かして確かめてください。

グラフによる視覚的理解

確率分布のグラフの読み方

確率分布のグラフを読む際のポイントは以下の通りです:

山の高さ: その値の出現確率の高さを表します。山が高いほど、その値が出現しやすいことを意味します。

山の幅: データの散らばり具合を表します。幅が狭いほど、特定の値の周辺に集中していることを示します。

対称性: グラフが左右対称かどうかで、データの偏りを判断できます。

累積分布のグラフの特徴

累積分布のグラフは常にS字カーブを描きます:

急な上昇部分: 確率密度が高い部分に対応します。この部分では値が急激に累積されます。

なだらかな部分: 確率密度が低い部分に対応し、累積の増加が緩やかになります。

機械学習での活用場面

データの前処理

機械学習プロジェクトにおいて、確率分布の理解は以下の場面で重要です:

外れ値の検出: 正規分布を仮定した場合、平均から3標準偏差以上離れた値は外れ値として扱われることが多いです。

データの正規化: 多くの機械学習アルゴリズムは、データが正規分布に従うことを前提としています。

特徴量エンジニアリング: データの分布を理解することで、適切な変換方法を選択できます。

モデル選択とハイパーパラメータ調整

確率分布の知識は、適切なモデル選択にも役立ちます:

線形回帰: 残差が正規分布に従うことを仮定しています。

ロジスティック回帰: ベルヌーイ分布やカテゴリ分布を扱います。

ベイズ統計: 事前分布と事後分布の概念が中核となります。

評価指標の理解

モデルの性能評価においても分布の理解は重要です:

信頼区間: 予測結果の不確実性を表現する際に使用されます。

統計的有意性: A/Bテストなどでモデルの改善効果を検証する際に必要です。

代表的な確率分布

正規分布(ガウス分布)

最も重要で頻繁に使用される分布です。多くの自然現象や測定誤差がこの分布に従います。特徴として、平均値を中心とした対称な釣鐘型の形状を持ちます。

二項分布

成功確率pの試行をn回実行した場合の成功回数の分布です。分類問題やA/Bテストでよく使用されます。

ポアソン分布

単位時間あたりに発生する稀な事象の回数を表す分布です。ウェブサイトのアクセス数やシステム障害の発生回数などをモデル化する際に使用されます。

指数分布

事象が発生するまでの待ち時間を表す分布です。機械の故障時間や顧客の到着間隔などをモデル化する際に使用されます。

分布の選択基準

データの性質による選択

適切な分布を選択するためには、データの性質を理解することが重要です:

連続値か離散値か: 連続値なら正規分布や指数分布、離散値なら二項分布やポアソン分布を検討します。

値の範囲: 非負の値のみなら指数分布やガンマ分布、0から1の間なら一様分布やベータ分布を考えます。

対称性: データが対称なら正規分布、非対称なら対数正規分布や指数分布を検討します。

統計的検定による検証

選択した分布が適切かどうかは、統計的検定により検証できます:

コルモゴロフ・スミルノフ検定: 標本が特定の分布に従うかを検定します。

シャピロ・ウィルク検定: 正規性の検定に特化した手法です。

アンダーソン・ダーリング検定: 分布の適合度を検定する手法の一つです。

実践的な応用例

異常検知システム

製造業における品質管理では、製品の寸法や性能が正規分布に従うと仮定し、3シグマルール(99.7%の範囲)を超える製品を異常として検出します。

リスク管理

金融業界では、株価の変動をモデル化する際に対数正規分布を使用し、Value at Risk(VaR)を計算してリスクを定量化します。

マーケティング分析

顧客の購買行動をモデル化する際、購入までの日数を指数分布でモデル化し、マーケティング施策のタイミングを最適化します。

グラフ作成時の注意点

適切なビン幅の選択

ヒストグラムを作成する際、ビン幅の選択は分布の形状理解に大きく影響します。ビン幅が狭すぎるとノイズが強調され、広すぎると重要な特徴が見えなくなります。

標本サイズの考慮

小さな標本サイズでは分布の真の形状を正確に把握することが困難です。信頼性の高い分析のためには、十分な標本サイズが必要です。

外れ値の処理

外れ値がグラフの読み取りを困難にする場合があります。外れ値を除外するか、対数変換などの前処理を検討しましょう。

まとめ

確率分布と累積分布の理解は、機械学習における成功の鍵となります。データの性質を正しく把握し、適切なモデルを選択することで、より精度の高い予測や分析が可能になります。

グラフによる視覚的理解は、直感的な理解を促進し、ステークホルダーとのコミュニケーションも円滑にします。継続的な学習と実践を通じて、これらの概念をマスターし、データサイエンスのスキルを向上させていきましょう。

統計学と機械学習の橋渡しとなる確率分布の知識は、AI時代において益々重要性を増しています。今後のプロジェクトにおいて、本記事で学んだ知識を積極的に活用していただければと思います。

■テックジム「AIエンジニア養成コース」

機械学習の全体像は機械学習とは?仕組み・種類・できることを簡単に解説|Pythonで動く例つきにまとめています。

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら