统计学第九周
-
参数估计复习
参数估计,根据从总体中随机取样获得样本,根据取样样本来估计总体分布中参数的过程。
方法:估计形式上分:点估计与区间估计;估计的方法有矩法估计,最小二乘法估计,似然估计,贝叶斯估计等等
问题一般有:
🔽未知参数的估计量
🔽在一定置信度下求解估计量的精度
-
实战
2.1#coding=utf-8 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sbn from scipy import stats plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus']=False #解决负数坐标显示 df = pd.read_excel('d:\\excel\\tj-week7_data.xlsx') print(df.head()) age = df['Age'] #print(age.mean()) #29.64209269662921 #抽取100个样本 age_sam = age.sample(100) print(age_sam.describe())
count 100.000000 mean 30.635800 std 15.160597 min 0.750000 25% 22.000000 50% 28.000000 75% 41.500000 max 66.000000 Name: Age, dtype: float64
2.2 #计算置信区间 #1)、pandas.std() 默认是除以n-1 的,即是无偏的,如果想和numpy.std() 一样有偏,需要加上参数ddof=0 ,即pandas.std(ddof=0) ;DataFrame的describe()中就包含有std(); #2)、 numpy.std() 求标准差的时候默认是除以 n 的,即是有偏的,np.std无偏样本标准差方式为加入参数 ddof = 1; #正态分布下的置信区间 def norm_conf(data,confidence=0.95): sample_mean = np.mean(data) sample_std = np.std(data,ddof = 1) sample_size = len(data) conf_interval = stats.norm.interval(confidence,loc=sample_mean,scale=sample_std) print(conf_interval) norm_conf(age)
年龄在95%的置信区间维 (1.2364661816394822, 58.04771921161894)
注:scipy.stats.norm.interval
# 求正态分布95%置信区间 CI = stats.norm.interval(0.95, loc=mean, scale=std) # 随机生成1000个样本 norm_samples = stats.norm.rvs(loc=mean, scale=std, size=1000) # 求gamma置信区间 gamma(a, b) CI_gamma = stats.gamma.interval(0.95, a, scale=1/b) # 随机生成1000个样本 gamma_samples = stats.gamma.rvs(a, scale=1/b, size=1000) 此处代码原文链接:https://blog.csdn.net/weixin_41947081/article/details/80954267
可参考:
https://www.zybuluo.com/Channelchan/note/662919
https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.norm.html 正态分布官网
#T分布 #T分布下的置信区间 def ttest_conf(data,confidence=0.95): sample_mean = np.mean(data) sample_std = np.std(data,ddof=1) sample_size = len(data) conf_interval = stats.t.interval(confidence,df = (sample_size-1),loc=sample_mean,scale=sample_std) print(conf_interval) ttest_conf(age) (1.1880290866314134, 58.09615630662701)
2.3 #重复抽取数据1000次,计算正态分布下的95%置信区间范围 scale_means = [] for _ in range(1000):# for _ in range(n): _是占位符,表示不在意变量的值,只是循环n次 scale_sample = age.sample(100,replace=True) mean = scale_sample.mean() scale_means.append(mean) #print(scale_means) print(norm_conf(scale_means)) #(26.683871851503763, 32.56412034849624) print(ttest_conf(scale_means)) #t分布下 (26.82880423989253, 32.40856276010748)
2.4 #绘制数据sbn.set_palette("hls")#设置所有图颜色,hls色彩空间 sbn.distplot(scale_means,color="r",bins=10,kde=True) plt.title('Age') plt.xlim(25,35) plt.grid(True) plt.show()
本文参考自:
https://blog.csdn.net/qq_43315928/article/details/103658733,其中主要代码来自于该链接。
问题:在计算置信区间时,已知方差和未知方差,在计算时是否需要处以根号n,?
numpy.std() 样本方差,默认就是除以n的,而方差已知则是在计算时需要转化,再处以n,确实是对的