前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python统计分析

Python统计分析

作者头像
用户3577892
发布2020-07-14 16:14:34
8780
发布2020-07-14 16:14:34
举报
文章被收录于专栏:数据科学CLUB数据科学CLUB

描述性统计偏度和峰度累计值假设检验和区间估计示例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代表两者均值相等,进一步验证了前面假设检验的结论。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据科学CLUB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 描述性统计
  • 假设检验和区间估计
    • 示例1
      • 示例2
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档