import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_iris
sns.set(style='darkgrid')
plt.rcParams['font.family']='SimHei'
plt.rcParams['axes.unicode_minus']=False
iris = load_iris()
data = np.concatenate([iris.data,iris.target.reshape(-1,1)],axis=1)
data = pd.DataFrame(data,
columns=['sepal_length','sepal_widht','petal_length','petal_width','type'])
print(data['petal_length'].mean())
3.4~3.8cm
就是置信区间,70%
就是置信度如果要确定置信区间与置信度,我们首先要知道:总体与样本之间存在着怎样的联系。
在数学上,中心极限定理给出了解释说明:
如果总体(总体的分布不重要)均值为μ,方差为 σ 2 \sigma^2 σ2,当n增大时,则样本均值逐渐趋近服从正态分布:
X ‾ \overline{X} X~N(μ, σ 2 \sigma^2 σ2/2)
由此可以得到如下结论:
# 生成总体数据
# loc:均值
# scale:标准差
# size:数组中含有的元素的个数
all_ = np.random.normal(loc = 50,scale=99,size=10000)
'''
np.random.normal():
生成一个平均值为50,
标准差为99,
含有10000个元素的正态分布数组
'''
# 创建一个含有1000个元素的数组,用来存放每次抽样(每个样本)的均值
mean_arr = np.zeros(1000)
# 通过循环获取1000个原本:
for i in range(len(mean_arr)):
# 随机抽样,计算每个样本的均值,并存入数组中
# size:样本容量
# replace:是否放回抽取的样本,默认True,此处为False,表示不放回,每次抽取的样本的个体互不重复
mean_arr[i] = np.random.choice(all_,size=80,replace=False).mean()
# 样本的均值构成正态分布,该正态分布的均值等于总体均值
# 该正态分布的标准误等于总体的标准差/根号n
print('样本均值构成的正态分布的均值:{}'.format(mean_arr.mean()))
print('样本均值构成的正态分布的标准误:{}'.format(mean_arr.std()))
print('样本均值构成的正态分布的偏度:{}'.format(pd.Series(mean_arr).skew()))
# 可视化样本均值
sns.distplot(mean_arr)
在正态分布中,均值、中位数与众数是相等的。
越靠近均值的数据越多,反之越少。
如下图:
# 定义总体数据的标准差
scale = 50
# 定义总体数据
data = np.random.normal(loc=0,scale=scale,size=10000)
# 定义标准差倍数:1~3
for i in range(1,4):
result = data[(data > -i * scale) & (data < i * scale)]
print("{} 倍标准差".format(i))
print("包含 {:.2f}% 的数据".format(len(result) / len(data) * 100 ))
某事曾经统计过该市所有年龄在10~15岁儿童的平均身高,结论是标准差为13.3CM,由于某些原因,均值丢失,现对各学校中100个符合条件的学生进行测量,得出平均值为155cm,标准差为12.4cm。问:该城市在规定年龄段儿童的平均身高可能为多少?(95%置信度)
13.3CM
100
155cm
# 使用随机数生成总体均值,值未知
data_mean = np.random.randint(-10000,10000)
# 总体标准差
data_std = 50
# 样本容量
sam_n = 99
# 随机生成总体数据
data = np.random.normal(loc=data_mean,scale=data_std,size=10000)
# 从总体中抽取n个样本,不放回抽取
sam = np.random.choice(data,size=sam_n,replace=False)
sam_mean = sam.mean()
print("总体均值:{}".format(data_mean))
print("样本均值:{}".format(sam_mean))
# 计算标准误差
se = data_std / np.sqrt(sam_n)
# 可视化
plt.plot(data_mean,0,marker='*',color='black',ms=15,label='总体均值')
plt.plot(sam_mean,0,marker='o',color='r',ms=15,label='样本均值')
min_ = sam_mean - 2 * se
max_ = sam_mean + 2 * se
print("置信区间(95.4%置信度):[{},{}]".format(min_,max_))
# 绘制0轴线
plt.hlines(0,xmin=min_,xmax=max_,colors='b',label='置信区间')
# 绘制垂线,标识95.4%置信区间范围
plt.axvline(min_,ymin=0.4,ymax=0.6,color='r',label='左边界')
plt.axvline(max_,ymin=0.4,ymax=0.6,color='g',label='右边界')
plt.legend()