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()
出力:
これは与えられた分布について PMF
と CDF
をプロットします。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()
出力:
ここでは、各 X 値に対する周波数値が与えられています。この度数値を pdf
配列の各要素を度数の和で割ることで pdf
値に変換します。次に、pdf
を用いて CDF
値を計算し、与えられたデータの CDF
をプロットします。
また、ヒストグラムプロットを用いて CDF
と PDF
のプロットを表示することもできます。
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
と PDF
を hist()
メソッドを用いてプロットします。CDF
をプロットするには、cumulative=True
と density=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()
出力:
これは与えられた連続分布の PMF
と CDF
をプロットします。CDF
の y 値を計算するには、配列の累積和を計算するために numpy.cumsumum()
メソッドを用います。
配列 y
の累積和に dx
を乗算した値で y
を除算し、CDF
の値が 0 から 1 の範囲になるように正規化します。
Suraj Joshi is a backend software engineer at Matrice.ai.
LinkedIn