设 ( x 1 , x 2 , ⋯ , x n ) (x_1,x_2,\cdots,x_n) (x1,x2,⋯,xn)是总体 X X X的一个样本观测值。与绘制直方图相仿,记 a = m i n { x 1 , x 2 , ⋯ , x n } a=min\{x_1,x_2,\cdots,x_n\} a=min{ x1,x2,⋯,xn}, b = m a x { x 1 , x 2 , ⋯ , x n } b=max\{x_1,x_2,\cdots,x_n\} b=max{ x1,x2,⋯,xn}。将区间 [ a , b ] [a, b] [a,b]等分成 m ( ≤ n ) m(\leq n) m(≤n)个小区间,约定除最后一个小区间为闭区间外,其余均为半闭半开区间。统计第 k k k个小区间中所含个体观测值 x i x_i xi的个数,即个体观测值落在该区间内的频数,记为 f k f_k fk, k = 1 , 2 , ⋯ , m k=1,2,\cdots,m k=1,2,⋯,m。函数
F n ( x ) = { 0 x < a f 1 n x ∈ Δ 1 f 1 + f 2 n x ∈ Δ 2 ⋮ f 1 + ⋯ + f m − 1 n x ∈ Δ m 1 x ≥ b F_n(x)=\begin{cases}0&xFn(x)=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧0nf1nf1+f2⋮nf1+⋯+fm−11x<ax∈Δ1x∈Δ2x∈Δmx≥b
称为 ( x 1 , x 2 , ⋯ , x n ) (x_1,x_2,\cdots,x_n) (x1,x2,⋯,xn)的经验分布函数 F n ( x ) F_n(x) Fn(x)。
除了matplotlib包中的pyplot对象提供的绘制数据数组的直方图的函数hist,numpy包也提供了一个histogram的函数,该函数的调用接口为:
histogram(x, bins) \text{histogram(x, bins)} histogram(x, bins)
参数x的意义是接受数据数组,bins也是确定分组个数。假定传递给bins的置为 m m m,该函数返回一个二元组(f, b),其中f为含有 m m m个整数的数组,每个元素表示对应小区间所含个体观测值个数。b也是一个数组其中含有 m + 1 m+1 m+1个元素 { b 0 , b 1 , ⋯ , b m } \{b_0, b_1, \cdots, b_m\} { b0,b1,⋯,bm}, [ b k − 1 , b k ) [b_{k-1},b_{k}) [bk−1,bk)为第 k k k个小区间, k = 1 , 2 , ⋯ , m k=1, 2,\cdots,m k=1,2,⋯,m。下列代码就是利用numpy的这一函数,计算样本观测值的经验分布函数 F n ( x ) F_n(x) Fn(x)。
import numpy as np #导入numpy
def Fn(x, sample, m): #定义函数Fn
n=sample.size #样本容量n
f, b=np.histogram(sample, bins=m) #计算样本分组及频数
f=f/n #计算各组频率
for k in range(m-1): #计算累积频率
f[k+1]+=f[k]
y=np.zeros(x.size) #函数值初始化为0
for i in range(1, m): #计算每个分组区间内的函数值
d=np.where((x>b[i-1])&(x<=b[i]))
y[d]=f[i-1]
d=np.where(x>b[m-1]) #计算最后小区间及其以后的函数值
y[d]=1
return y #返回y
程序中第2~14行定义计算由参数sample传递的样本数据,分成m组的经验分布函数,其中参数x表示自变量,这是一个数组类对象。第3行计算样本容量n。第4行调用numpy的histogram函数,计算样本sanple分成m组的频数数据f和分组数据b。第5行计算各组频率(频数/样本容量)。第6~7行计算各分组的累积频率。第8行将函数值y初始化为0。第9~11行的for循环用存储在f中的累积频率数据计算x中所含前m个小区间的函数值。第12行计算x中包含的最后一个区间及其以右部分设置为d,第13行将d对应的函数值1。
例1 下面列出84个伊特拉斯坎(Etruscan)人男子的头颅的最大宽度(mm)。
141 | 148 | 132 | 138 | 154 | 142 | 150 | 146 | 155 | 158 | 150 | 140 | 147 | 148 |
144 | 150 | 149 | 145 | 149 | 158 | 143 | 141 | 144 | 144 | 126 | 140 | 144 | 142 |
141 | 140 | 145 | 135 | 147 | 146 | 141 | 136 | 140 | 146 | 142 | 137 | 148 | 154 |
137 | 139 | 143 | 140 | 131 | 143 | 141 | 149 | 148 | 135 | 148 | 152 | 143 | 144 |
141 | 143 | 147 | 146 | 150 | 132 | 142 | 142 | 143 | 153 | 149 | 146 | 149 | 138 |
142 | 149 | 142 | 137 | 134 | 144 | 146 | 147 | 140 | 142 | 140 | 137 | 152 | 145 |
计算其经验分布函数,并绘制函数图像。
解: 下列代码利用上列程序定义的函数Fn完成本例的计算。
import numpy as np #导入numpy
from matplotlib import pyplot as plt #导入绘图对象plt
sample=np.array([141,148,132,138,154,142,150,146,155,158, #设置样本数据数组
150,140,147,148,144,150,149,145,149,158,
143,141,144,144,126,140,144,142,141,140,
145,135,147,146,141,136,140,146,142,137,
148,154,137,139,143,140,131,143,141,149,
148,135,148,152,143,144,141,143,147,146,
150,132,142,142,143,153,149,146,149,138,
142,149,142,137,134,144,146,147,140,142,
140,137,152,145])
x=np.linspace(120, 160, 256) #设置绘图横轴
plt.plot(x,Fn(x, sample, 8)) #绘制Fn(x)图形
plt.show()
程序的第3~11行设置样本观测值数据sample。的第12行设置绘图的横坐标区间 x = ( 120 , 160 ) x=(120,160) x=(120,160),第13行调用pyplot的plot函数,利用上列程序定义的函数Fn,绘制由数据数组sample算得的经验分布函数的图形,运行此程序展示下图中的折线部分。
由上图可见,沿 F n ( x ) F_n(x) Fn(x)的边缘描绘一条光滑曲线可得总体 X X X的分布函数的近似图像。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!