ecdf(x)(x)
numpy または scipy のいずれかで、Pythonの R の関数に相当するものは何ですか? 基本的にはecdf(x)(x)
次と同じです:
import numpy as np
def ecdf(x):
# normalize X to sum to 1
x = x / np.sum(x)
return np.cumsum(x)
または何か他のものが必要ですか?
編集によって使用されるビンの数をどのように制御できecdf
ますか?
OP の実装ecdf
が間違ってcumsum()
います。値を想定していません。そうではありませんys = np.cumsum(x)/np.sum(x)
が、ys = np.cumsum(1 for _ in x)/float(len(x))
またはより良いys = np.arange(1, len(x)+1)/float(len(x))
その余分な依存関係に問題がない場合はstatmodels
'sを使用するか、独自の実装を提供します。ECDF
下記参照:
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.distributions.empirical_distribution import ECDF
%matplotlib inline
grades = (93.5,93,60.8,94.5,82,87.5,91.5,99.5,86,93.5,92.5,78,76,69,94.5,
89.5,92.8,78,65.5,98,98.5,92.3,95.5,76,91,95,61)
def ecdf_wrong(x):
xs = np.sort(x) # need to be sorted
ys = np.cumsum(xs)/np.sum(xs) # normalize so sum == 1
return (xs,ys)
def ecdf(x):
xs = np.sort(x)
ys = np.arange(1, len(xs)+1)/float(len(xs))
return xs, ys
xs, ys = ecdf_wrong(grades)
plt.plot(xs, ys, label="wrong cumsum")
xs, ys = ecdf(grades)
plt.plot(xs, ys, label="handwritten", marker=">", markerfacecolor='none')
cdf = ECDF(grades)
plt.plot(cdf.x, cdf.y, label="statmodels", marker="<", markerfacecolor='none')
plt.legend()
plt.show()
これらのリンクを試してください:
サンプルコード
import numpy as np
from statsmodels.distributions.empirical_distribution import ECDF
import matplotlib.pyplot as plt
data = np.random.normal(0,5, size=2000)
ecdf = ECDF(data)
plt.plot(ecdf.x,ecdf.y)
この著者には、ユーザー作成の ECDF 関数の非常に優れた例があります: John Stachurski の Python Lectures。彼の講義シリーズは、計算経済学の大学院生を対象としています。ただし、Python で一般的な科学計算を学んでいる人にとっては、頼りになるリソースです。
編集:これは1年前ですが、あなた(または他の人)がまだ役に立つと思う場合に備えて、質問の「編集」部分にまだ答えると思いました。
ヒストグラムの場合のように、ECDF の「ビン」は実際にはありません。G がデータ ベクトル Z を使用して形成された経験的分布関数である場合、G(x) は文字通り、Z <= x の出現回数を len(Z) で割ったものです。これを決定するために「ビニング」は必要ありません。したがって、ECDF はデータセットに関するすべての可能な情報を保持しているという意味があります (計算のためにデータセット全体を保持する必要があるため) が、ヒストグラムは実際にはビニングによってデータセットに関する情報の一部を失います。このため、可能な場合はecdfsとヒストグラムを使用することを好みます。
おまけ: 非常に大きなストリーミング データからフットプリントの小さい ECDF のようなオブジェクトを作成する必要がある場合は、McDermott らによる この「データ スケルトン」論文を参照してください。