Python统计分析

2020-07-14 16:14:34 浏览数 (1)

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

0 人点赞