概率统计Python计算(37)样本数据的经验分布函数

( 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+f2nf1++fm11x<axΔ1xΔ2xΔmxb
称为 ( 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}) [bk1,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算得的经验分布函数的图形,运行此程序展示下图中的折线部分。
概率统计Python计算(37)样本数据的经验分布函数_第1张图片
由上图可见,沿 F n ( x ) F_n(x) Fn(x)的边缘描绘一条光滑曲线可得总体 X X X的分布函数的近似图像。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

你可能感兴趣的:(概率论)