Python Matplotlib で CDF をプロット

Suraj Joshi 2021年1月1日
Python Matplotlib で CDF をプロット

このチュートリアルでは、Python の Matplotlib を用いて CDF のプロットを生成する方法を説明します。CDF は、y 値がランダム変数が対応する x 値以下の値を取る確率を表す関数です。

Python の Matplotlib を用いた CDF のプロット

CDF は連続確率分布と離散確率分布の両方について定義されています。連続確率分布では、乱数変数は指定された範囲から任意の値を取ることができますが、離散確率分布では指定された値の集合しか取ることができません。

Python で Matplotlib を使って離散分布の CDF をプロットする

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(1, 7)
y = [0.2, 0.1, 0.1, 0.2, 0.1, 0.3]
cdf = np.cumsum(y)

plt.plot(x, y, marker="o", label="PMF")
plt.plot(x, cdf, marker="o", label="CDF")
plt.xlim(0, 7)
plt.ylim(0, 1.5)
plt.xlabel("X")
plt.ylabel("Probability Values")
plt.title("CDF for discrete distribution")
plt.legend()
plt.show()

出力:

Python の Matplotlib を用いた離散分布の CDF のプロット

これは与えられた分布について PMFCDF をプロットします。CDF の y 値を計算するには、配列の累積和を計算するために numpy.cumsumum() メソッドを用います。

度数カウントが与えられている場合は、y 値が PDF を表すように最初に正規化しなければなりません。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(1, 7)
frequency = np.array([3, 8, 4, 5, 3, 6])
pdf = frequency / np.sum(frequency)
cdf = np.cumsum(pdf)

plt.plot(x, pdf, marker="o", label="PMF")
plt.plot(x, cdf, marker="o", label="CDF")
plt.xlim(0, 7)
plt.ylim(0, 1.5)
plt.xlabel("X")
plt.ylabel("Probability Values")
plt.title("CDF for discrete distribution")
plt.legend()
plt.show()

出力:

正規化後の Python の Matplotlib を用いた離散分布の CDF のプロット

ここでは、各 X 値に対する周波数値が与えられています。この度数値を pdf 配列の各要素を度数の和で割ることで pdf 値に変換します。次に、pdf を用いて CDF 値を計算し、与えられたデータの CDF をプロットします。

また、ヒストグラムプロットを用いて CDFPDF のプロットを表示することもできます。

import numpy as np
import matplotlib.pyplot as plt

data = [3, 4, 2, 3, 4, 5, 4, 7, 8, 5, 4, 6, 2, 1, 0, 9, 7, 6, 6, 5, 4]
plt.hist(data, bins=9, density=True)
plt.hist(data, bins=9, density=True, cumulative=True, label="CDF", histtype="step")
plt.xlabel("X")
plt.ylabel("Probability")
plt.xticks(np.arange(0, 10))
plt.title("CDF using Histogram Plot")
plt.show()

出力:

ヒストグラムプロットを用いた離散分布の CDF のプロット

与えられたデータの CDFPDFhist() メソッドを用いてプロットします。CDF をプロットするには、cumulative=Truedensity=True を設定し、合計が 1 になる確率値を表すヒストグラムを得ます。

Python の Matplotlib を用いた連続分布のための CDF のプロット

import numpy as np
import matplotlib.pyplot as plt

dx = 0.005
x = np.arange(-10, 10, dx)
y = 0.25 * np.exp((-(x ** 2)) / 8)

y = y / (np.sum(dx * y))
cdf = np.cumsum(y * dx)

plt.plot(x, y, label="pdf")
plt.plot(x, cdf, label="cdf")
plt.xlabel("X")
plt.ylabel("Probability Values")
plt.title("CDF for continuous distribution")
plt.legend()
plt.show()

出力:

Python の Matplotlib を用いた連続分布の CDF のプロット

これは与えられた連続分布の PMFCDF をプロットします。CDF の y 値を計算するには、配列の累積和を計算するために numpy.cumsumum() メソッドを用います。

配列 y の累積和に dx を乗算した値で y を除算し、CDF の値が 0 から 1 の範囲になるように正規化します。

著者: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn