描述性统计偏度和峰度累计值假设检验和区间估计示例1假设检验置信区间示例2假设检验置信区间
描述性统计
代码语言:javascript复制# 导入相关的包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
均值,标准差,分位数,最大,最小值
df.count() count统计非Na值的数量 df.min() min统计最小值;df.max() max统计最大值 df.quantile(q=0.75) quantile统计分位数,参数q确定位置 df.sum() sum求和 df.mean() mean求平均值 df.median() median求算数中位数,50%分位数 df.std(),df.var() 分别求标准差,方差 df.skew() skew样本的偏度 df.kurt() kurt样本的峰度
代码语言:javascript复制data = list(np.random.randn())
df=pd.DataFrame(data,columns=["分布"])
df.describe()
# 通过直方图看一下数据的分布 plt.hist(data,100,density=True,facecolor='g',alpha=0.9) plt.show()
b.偏度和峰度
利用skew方法算出偏度,是负偏,左偏,尾巴哪边厚就是偏哪边。
代码语言:javascript复制df["分布"].skew()
代码语言:javascript复制0.014596985753041842
利用kurt计算峰度
代码语言:javascript复制df["分布"].kurt()
代码语言:javascript复制0.05430326828636112
我们再生成一组正态分布的数据来看一下
代码语言:javascript复制df=pd.DataFrame(np.random.normal(,,))
df.plot(kind="hist",bins=)
代码语言:javascript复制<matplotlib.axes._subplots.AxesSubplot at 0x22a720b59b0>
偏度
代码语言:javascript复制df["分布"].skew()
代码语言:javascript复制-0.0014804168276350241
利用kurt计算峰度,正态分布的峰度K为3,一般使用时默认K-3=0,这里的数据和0很接近
代码语言:javascript复制df["分布"].kurt()
代码语言:javascript复制0.0035224240574902588
c.累计值
代码语言:javascript复制df = pd.DataFrame({'key1':np.arange(),
'key2':np.random.rand()*})
代码语言:javascript复制#累计和
df['key1_s'] = df['key1'].cumsum()
df['key2_s'] = df['key2'].cumsum()
df
# 累计积 df['key1_p'] = df['key1'].cumprod() df['key2_p'] = df['key2'].cumprod() df
df.cummax() # 累计最大值
df.cummin() #累计最小值
假设检验和区间估计
示例1
某公司研制出一种新的安眠药,要求其平均睡眠时间为23.8h。 为了检验安眠药是否达到要求,收集到一组使用新安眠药的睡眠时间(单位:h)为:26.7,22,24.1,21,27.2,25,23.4。 试问:从这组数据能否说明新安眠药达到疗效(假定睡眠时间服从正态分布,显著性水平为0.05)
代码语言:javascript复制# 先导入数据,创建数据集,进行描述性统计
dataSer = pd.DataFrame([26.7,,24.1,,27.2,,23.4])
dataSer.describe()
假设检验
设定原假设H0:新安眠药平均睡眠时间是23.8h,也就是平均值u=23.8
备择假设H1:新安眠药平均睡眠时间不是23.8h,也就是平均值u≠23.8
用统计模块stats计算P值,样本数小于30,t检验,假设是总体符合正态分布
代码语言:javascript复制from scipy import stats
pop_mean=23.8
t,p_two = stats.ttest_1samp(dataSer,pop_mean)
print('t值=',t,'双尾检验的P值',p_two)
代码语言:javascript复制t值= [0.46100295] 双尾检验的P值 [0.66103429]
代码语言:javascript复制if(p_two < 0.05):
print('拒绝原假设,也就是此新安眠药未达到疗效')
else:
print('接受原假设,也就是此新安眠药达到疗效')
代码语言:javascript复制接受原假设,也就是此新安眠药达到疗效
置信区间
下面我们再来算一下新安眠药平均睡眠时间的置信区间。 先查找置信水平对应的t值是多少,置信水平为0.05,置信度df=n-1=6,查找t表格可以得知对应的t值为2.4469,再用scipy计算出标准误差,这样就可以算出置信区间了:
代码语言:javascript复制t_ci = 2.4469
sample_mean = dataSer.mean()
sample_std = dataSer.std()
se = stats.sem(dataSer)
a = sample_mean - t_ci * se
b = sample_mean t_ci * se
print('在95的置信水平下,平均睡眠时间的置信区间 CI = (%f,%f)' % (a,b))
代码语言:javascript复制在95的置信水平下,平均睡眠时间的置信区间 CI = (22.076890,26.323110)
结果为:在95的置信水平下,平均睡眠时间的置信区间 CI = (22.076890,26.323110) 可以看到置信区间包含了23.8,进一步验证了前面假设检验的结论。
示例2
有甲、乙两台机床加工相同的产品,从这两台机床加工的产品中随机地抽取若干件,测得产品直径(单位:mm)为
机床甲:20.5,19.8,19.7,20.4,20.1,20.0,19.0,19.9
机床乙:19.7,20.8,20.5,19.8,19.4,20.6,19.2 试比较甲、乙两台机床加工的产品直径有无显著差异?假定两台机床加工的产品直径都服从正态分布,且总体方差相等。(α=0.05)
代码语言:javascript复制# 创建数据
aSer = pd.Series([20.5,19.8,19.7,20.4,20.1,20.0,19.0,19.9])
bSer = pd.Series([19.7,20.8,20.5,19.8,19.4,20.6,19.2])
代码语言:javascript复制# 看下描述性统计信息
a_mean = aSer.mean()
b_mean = bSer.mean()
print('甲机床加工的产品直径=',a_mean,'单位:mm')
print('乙机床加工的产品直径=',b_mean,'单位:mm')
a_std = aSer.std()
b_std = bSer.std()
print('甲机床加工的产品直径标准差=',a_std,'单位:mm')
print('乙机床加工的产品直径标准差=',b_std,'单位:mm')
代码语言:javascript复制甲机床加工的产品直径= 19.925 单位:mm
乙机床加工的产品直径= 19.999999999999996 单位:mm
甲机床加工的产品直径标准差= 0.4652188425123937 单位:mm
乙机床加工的产品直径标准差= 0.6298147875897069 单位:mm
假设检验
原假设:甲、乙两台机床加工的产品直径没有显著差异,也就是甲机床加工的产品直径等于乙机床加工的产品直径 备择假设:甲、乙两台机床加工的产品直径有显著差异,也就是甲机床加工的产品直径不等于乙机床加工的产品直径。
由于我们在上面使用的Scipy包的双独立样本t检验不能返回自由度,对于后面计算置信区间不方便,所以使用另一个统计包statsmodels,ttestind就是表示独立双样本检验,usevar='unequal'表示两个总体方差不一样,返回的第1个值t是计算出的t值,第2个p_two是双尾检验的p值,第3个df是独立双样本的自由度。
代码语言:javascript复制import statsmodels.stats.weightstats as st
t,p_two,df = st.ttest_ind(aSer,bSer,usevar='unequal')
print('t=',t,'p_two=',p_two,'df=',df)
if(p_two < 0.05):
print('拒绝原假设,接受备择假设,也就是甲、乙两台机床加工的产品直径有显著差异')
else:
print('接受原假设,也就是甲、乙两台机床加工的产品直径没有显著差异')
代码语言:javascript复制t= -0.25920658837461347 p_two= 0.8002815375229997 df= 10.956106306156492
接受原假设,也就是甲、乙两台机床加工的产品直径没有显著差异
置信区间
代码语言:javascript复制# 查找95%的置信区间、自由度是上面计算出的11对应的t值,为2.2010,再计算标准误差。
t_ci = 2.2010
a_n = len(aSer)
b_n = len(bSer)
se = np.sqrt(np.square(a_std)/a_n np.square(b_std)/b_n)
代码语言:javascript复制# 最后计算出甲、乙两个机床加工的产品平均直径的差值的置信区间。
sample_mean = a_mean - b_mean
a = sample_mean - t_ci * se
b = sample_mean t_ci * se
print('95置信水平下,两个平均值差值的置信区间 CI=(%f,%f)'%(a,b))
代码语言:javascript复制95置信水平下,两个平均值差值的置信区间 CI=(-0.711847,0.561847)
结果为:95置信水平下,两个平均值差值的置信区间 CI=(-0.711847,0.561847) 可以看到,置信区间包含了0,0代表两者均值相等,进一步验证了前面假设检验的结论。