经验累积分布函数是一个 CDF,它会在您的数据集中的值处精确跳跃。 离散分布的 CDF 会在您的每个值处放置一个质量,其中质量与值的频率成正比。由于质量总和必须为 1,因此这些约束决定了经验 CDF 中每次跳跃的位置和高度。
给定一个值数组a,您可以通过首先获取值的频率来计算经验 CDF。 numpy 函数unique() 在这里很有帮助,因为它不仅返回频率,还返回排序顺序的值。要计算累积分布,请使用cumsum() 函数,然后除以总和。以下函数按排序顺序返回值和相应的累积分布:
import numpy as np
def ecdf(a):
x, counts = np.unique(a, return_counts=True)
cusum = np.cumsum(counts)
return x, cusum / cusum[-1]
要绘制经验 CDF,您可以使用 matplotlib 的 plot() 函数。选项drawstyle='steps-post' 确保跳转发生在正确的位置。但是,您需要在最小的数据值处强制跳转,因此需要在x 和y 前面插入一个额外的元素。
import matplotlib.pyplot as plt
def plot_ecdf(a):
x, y = ecdf(a)
x = np.insert(x, 0, x[0])
y = np.insert(y, 0, 0.)
plt.plot(x, y, drawstyle='steps-post')
plt.grid(True)
plt.savefig('ecdf.png')
示例用法:
xvec = np.array([7,1,2,2,7,4,4,4,5.5,7])
plot_ecdf(xvec)
df = pd.DataFrame({'x':[7,1,2,2,7,4,4,4,5.5,7]})
plot_ecdf(df['x'])
带输出: