数据集:数据有四列 ID、年龄、价格、港口
操作环境:jupyter notebook
分析一:按照港口分类,求出各类港口数据年龄和价格的统计量(包括均值、方差、标准差、变异系数等)
1.导入数据
import numpy as np
import pandas as pd
df=pd.read_excel("C:/../data.xlsx",index_col=0,header=0,encoding="utf-8-sig")
print(df)
2.求统计量
df.groupby("Embarked").describe( )
df.groupby("Embarked").mean( ) #求均值
df.groupby("Embarked").var( ) #求方差
df.groupby("Embarked").std( ) #求标准差
#求变异系数
df1=df.groupby("Embarked").std( )
df2=df.groupby("Embarked").mean( )
df3=df1/df2
print(df3)
分析二:画出价格的分布图像,验证数据服从何种分布?正态/卡方/T分布?
1.价格数据的分布图像
import matplotlib.pyplot as plt
#让图表直接在jupyter notebook中展示出来
%matplotlib inline
#解决中文乱码问题
plt.rcParams["font.sans-serif"]='SimHei'
#解决负号无法正常显示的问题
plt.rcParams['axes.unicode_minus']=False
#绘制价格数据的密度直方图
df["Fare"].hist(bins=10,alpha=0.7)
df["Fare"].plot(kind='kde',secondary_y=True)
plt.xlabel("价格")
plt.ylabel("密度")
plt.title('密度直方图')
plt.legend()
plt.show()
2.检验价格数据是否服从正态分布
先用kstest方法检验数据是否服从正态分布
from scipy import stats
u = df["Fare"].mean()
std = df["Fare"].std()
stats.kstest(df["Fare"].values,'norm',args=(u,std))
结果: KstestResult(statistic=0.28363501066241253, pvalue=0.0)
因为p<0.05,故价格不服从正态分布
2.检验价格是否服从卡方分布
可用ks_2samp检验两个样本是否服从同一分布来检验价格数据是否服从卡方分布或者T分布
fare=df["Fare"].copy().values
df,loc,scale=stats.chi2.fit(fare)
x2=stats.chi2.rvs(df=df,loc=loc,scale=scale,size=len(fare))
ks, p=stats.ks_2samp(fare,x2)
print("ks=%.4f,p=%.4f" % (ks,p))
结果:ks=0.1756,p=0.0000
因为p<0.05,所以拒绝两个样本服从同一分布的假设,故价格不服从卡方分布
3.检验价格是否服从T分布
df,loc,scale=stats.t.fit(fare)
x1=stats.t.rvs(df=df,loc=loc,scale=scale,size=len(fare))
ks, p=stats.ks_2samp(fare,x1)
print("ks=%.4f,p=%.4f" % (ks,p))
结果:ks=0.2823,p=0.0000
因为p<0.05,所以拒绝两个样本服从同一分布的假设,故价格不服从T分布
分析三:按照港口分类,验证S和Q两个港口间的价格之差是否服从某种分布
先看数据中的港口类别及个数
df["Embarked"].value_counts()
结果:S 554
C 130
Q 28
获取各个类别港口的价格数据:
s_fare=df[df["Embarked"]=="S"]["Fare"].copy().values
q_fare=df[df["Embarked"]=="Q"]["Fare"].copy().values
c_fare=df[df["Embarked"]=="C"]["Fare"].copy().values
虽然价格总体数据不服从正态分布,但是当样本容量n比较大时(一般n>=30),两个样本均值之差的抽样分布近似为正态分布。
但是从以上港口类别数据来看,Q港口的样本容量小于30,因此S和Q港口两个样本数据均值之差的抽样分布不能近似服从正态分布,而S和C港口两个样本数据均值之差的抽样分布近似服从正态分布。
mu=np.mean(s_fare)-np.mean(c_fare)
sigma=np.sqrt(np.var(s_fare,ddof=1)/len(s_fare) + np.var(c_fare,ddof=1)/len(c_fare))
print(mu)
print(sigma)
#结果:-40.820482446542634
8.0927962600833
# 绘制密度曲线
x=np.arange(-80,0)
y=stats.norm.pdf(x,mu,sigma)
plt.plot(x,y)
plt.xlabel("s c港口价格之差")
plt.ylabel("密度")
plt.title("s和c港口价格之差的密度曲线")
plt.show()
可看出,S和C 港口之间的价格之差服从正态分布。
部分参考:https://github.com/Emerald-Stejneger/data_tea_break/blob/master/com/study_team/6th_week/Titanic_analysis.py