首页 > 解决方案 > Python中样本均值的置信区间(不同于手动)

问题描述

我正在尝试为研讨会的介绍性统计创建一些材料。上面的代码计算了一个 95% 的置信区间来估计平均值,但结果与 Python 中实现的结果不同。我的数学/代码有问题吗?谢谢。

编辑:

数据是从这里采样的

import pandas as pd
import numpy as np
x = np.random.normal(60000,15000,200)
income = pd.DataFrame()
income = pd.DataFrame()
income['Data Scientist'] = x

# Manual Implementation
sample_mean = income['Data Scientist'].mean()
sample_std = income['Data Scientist'].std()
standard_error = sample_std / (np.sqrt(income.shape[0]))
print('Mean',sample_mean)
print('Std',sample_std)
print('Standard Error',standard_error)
print('(',sample_mean-2*standard_error,',',sample_mean+2*standard_error,')')


# Python Library
import scipy.stats as st
se = st.sem(income['Data Scientist'])
a = st.t.interval(0.95, len(income['Data Scientist'])-1, loc=sample_mean, scale=se)
print(a)
print('Standard Error from this code block',se)

标签: pythondata-science

解决方案


你有2个错误。

首先,您使用 2 作为 CI 的乘数。更准确的值为 1.96。“2”只是一个方便的估计。这使您手动生成的 CI 太胖了。

其次,您将正态分布与 t 分布进行比较。这可能不会造成超过十进制的差异,因为您的 t-dist 有 199 个自由度,这基本上是正常的。

下面是 1.96 的 z 分数和 CI 的计算以及与标准分布与 t 的逐一比较。

In [45]: st.norm.cdf(1.96)                                                                   
Out[45]: 0.9750021048517795

In [46]: print('(',sample_mean-1.96*standard_error,',',sample_mean+1.96*standard_error,')')  
( 57558.007862202685 , 61510.37559873406 )

In [47]: st.norm.interval(0.95, loc=sample_mean, scale=se)                                   
Out[47]: (57558.044175045005, 61510.33928589174)

推荐阅读