1. ホーム
  2. python

[解決済み] Pythonで累積分布関数(CDF)を計算する

2022-03-01 22:07:07

質問

を計算するには、pythonでどうすればよいですか? 累積分布関数(CDF) ?

scipyなどにある連続分布ではなく、私が持っている点の配列(離散分布)から計算したいのです。

どのように解決するのですか?

(私の解釈が間違っている可能性もありますが)。もし質問が、離散PDFから離散CDFに変換する方法であれば np.cumsum を適当な定数で割ったもので、サンプルが等間隔に配置されていれば、それで十分です。もし、配列が等間隔でない場合は np.cumsum に各点間の距離を乗じたものです)。

サンプルの離散配列があり、サンプルのCDFを知りたい場合、配列をソートすればよいのです。ソート結果を見ると、最小の値が0%、最大の値が100%を表していることがわかります。分布の 50 % の値を知りたい場合は,ソートされた配列の中央の要素を見ればよいのです.

簡単な例で詳しく見てみましょう。

import matplotlib.pyplot as plt
import numpy as np

# create some randomly ddistributed data:
data = np.random.randn(10000)

# sort the data:
data_sorted = np.sort(data)

# calculate the proportional values of samples
p = 1. * np.arange(len(data)) / (len(data) - 1)

# plot the sorted data:
fig = plt.figure()
ax1 = fig.add_subplot(121)
ax1.plot(p, data_sorted)
ax1.set_xlabel('$p$')
ax1.set_ylabel('$x$')

ax2 = fig.add_subplot(122)
ax2.plot(data_sorted, p)
ax2.set_xlabel('$x$')
ax2.set_ylabel('$p$')

これは次のようなプロットとなり、右側のプロットは伝統的な累積分布関数となります。これは点の背後にあるプロセスのCDFを反映しているはずですが、点の数が有限である限り当然ながらそうではありません。

この関数は簡単に反転させることができ、どのような形が必要かは用途によって異なります。