Python:怎么画出均值和置信区间的图

1. 基础数学知识

1.1. 什么是置信区间(Confidence Interval, CI)

按照维基百科上说的是:在统计学上,置信区间是从已观测到的数据中统计出来的一个估计。它给出了未知参数可能落在的区域。

而通俗的讲,就是我们去估计一个参数(大部分情况是一个平均值或期望),但是估计一定会有误差,所以置信区间就告诉我们,这个平均值的误差范围。

比如 95% 置信区间,就是我们估计出来的平均值,会有 95% 的可能性落在这个区间。

1.2. 如何计算置信区间?

置信区间会用到标准误差,而标准误差会用到标准差,它们的计算如下:

总体标准差:

σ = ∑ i = i n ( x i − x ˉ ) 2 n \sigma=\sqrt{\frac{\sum_{i=i}^{n}(x_i-\bar{x})^2}{n}} σ=ni=in(xixˉ)2

样本标准差:

S = ∑ i = i n ( x i − x ˉ ) 2 n − 1 S = \sqrt{\frac{\sum_{i=i}^{n}(x_i-\bar{x})^2}{n-1}} S=n1i=in(xixˉ)2

标准误差:

σ n = σ n or σ n = S n \sigma_n=\frac{\sigma}{\sqrt{n}} \quad \text{or} \quad \sigma_n=\frac{S}{\sqrt{n}} σn=n σorσn=n S

假设有一个随机变量 X ∼ N ( μ , σ 2 ) X\sim \mathcal{N}(\mu,\sigma^2) XN(μ,σ2),其均值为 μ \mu μ,标准偏差为 σ \sigma σ,那么其期望 X ˉ ∼ N ( μ , σ 2 n ) \bar{X}\sim \mathcal{N}(\mu,\frac{\sigma^2}{n}) XˉN(μ,nσ2).

如果把 X ˉ \bar{X} Xˉ 标准化,那么 Z = X ˉ − μ σ 2 / n ∼ N ( 0 , 1 ) Z=\frac{\bar{X}-\mu}{\sqrt{\sigma^2/n}}\sim\mathcal{N}(0,1) Z=σ2/n XˉμN(0,1),令

P { ∣ X ˉ − μ σ 2 / n ∣ ≤ Z α 2 } = 1 − α P\left\{ \left| \frac{\bar{X}-\mu}{\sqrt{\sigma^2/n}} \right| \le Z_{\frac{\alpha}{2}}\right\}=1-\alpha P{σ2/n XˉμZ2α}=1α

这样得到了一个区间, [ X ˉ − σ n Z α 2 , X ˉ + σ n Z α 2 ] \left[\bar{X}-\frac{\sigma}{\sqrt{n}}Z_{\frac{\alpha}{2}},\bar{X}+\frac{\sigma}{\sqrt{n}}Z_{\frac{\alpha}{2}}\right] [Xˉn σZ2α,Xˉ+n σZ2α]

那么我们就需要计算,随机变量的均值 X ˉ \bar{X} Xˉ,标准误差 σ / n \sigma/\sqrt{n} σ/n ,并且当 α = 0.05 \alpha=0.05 α=0.05 的时候, Z 0.025 ≈ 1.96 Z_{0.025}\approx 1.96 Z0.0251.96.

需要注意的是: α \alpha α 是显著性水平,如果想要获得 95% 的置信度,那么 α = 0.05 \alpha=0.05 α=0.05.

2. 在 Python 上画出置信区间

import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
import scipy.stats as st
matplotlib.rcParams.update({'font.size': 12})

# generate dataset
data_points = 50
sample_points = 10000
Mu = (np.linspace(-5, 5, num=data_points)) ** 2
Sigma = np.ones(data_points) * 8
data = np.random.normal(loc=Mu, scale=Sigma, size=(100, data_points))

# predicted expect and calculate confidence interval
predicted_expect = np.mean(data, 0)
low_CI_bound, high_CI_bound = st.t.interval(0.95, data_points - 1,
                                            loc=np.mean(data, 0),
                                            scale=st.sem(data))

# plot confidence interval
x = np.linspace(0, data_points - 1, num=data_points)
plt.plot(predicted_expect, linewidth=3., label='estimated value')
plt.plot(Mu, color='r', label='grand truth')
plt.fill_between(x, low_CI_bound, high_CI_bound, alpha=0.5,
                label='confidence interval')
plt.legend()
plt.title('Confidence interval')
plt.show()

最终结果

Python:怎么画出均值和置信区间的图_第1张图片

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