【实验目的】
1.掌握Python软件数据预处理(缺失值、异常值、重编码、数据标准化);
2.掌握Python软件进行描述统计分析。
3.掌握Python软件进行假设检验分析。
【实验要求】
掌握本章讲授数据分析方法的基本Python编程操作。
【实验过程】(必要的实验步骤、绘图、代码注释、数据分析)
实验步骤
- 1、读入数据
- 2、数据预处理
- 3、数据分析方法介绍
- 4、编程实现数据分析方法,含代码注释
- 5、重要结果的图表绘制
- 6、必要的结果解释
1. 数据data_titanic.csv中存放了泰坦尼克号部分乘客生还情况记录,具体表格列信息见下表,要求完成下列数据预处理和分析工作。
Survived | Pclass | Sex | Age | SibSp | Parch | Fare | Embarked |
生还与否 1-生还 0-死亡 | 客舱等级 | 性别 0-male 1-female | 年龄 | 同船旁系亲属人数 | 同船直系亲友人数 | 票价 | 登船港口 C = Cherbourg; Q = Queenstown; S = Southampton |
(1)报告各列数据缺失值情况
(2)对Age列中缺失值进行插补,方法为使用该列平均值填补缺失值
(3)对Sex列,Embarked列进行重编码,变为0,1,2这种数值型变量。
代码:(不要截图,要文本格式代码,下同)
import numpy as np
from numpy import mean
import pandas as pd
data = pd.read_csv('data_titanic.csv')
# 查看特征(列)名
print(data.columns)
# 查看各列缺失情况
print(data.isnull().sum())
# 查看各列缺失情况
print(data.isnull().sum())
mean_age=mean(data.iloc[:,4])
data1 = data.fillna(value = {'Age':mean_age},inplace = False)
# 再次查看各列缺失情况
print(data1.isnull().sum())
# 重编码
data2 = data1.copy()
data2['Sex'] = pd.Categorical(data1['Sex']).codes
data2['Embarked'] = pd.Categorical(data1['Embarked']).codes
print(data2)
2. 数据集data_health.xlsx中存放了某高校四个年级学生体重和肺活量的数据,要求完成下列分析。
(1)计算1年级同学体重的平均值、最小值、最大值、标准差、变异系数;
(2)作出2年级男生和女生的肺活量箱线图(每个性别一个箱线图);
(3)不同性别学生平均体重(假设服从正态分布)之间是否存在显著差异?(独立样本T检验);
(4)不同年级学生肺活量(假设服从正态分布)之间是否存在显著差异?(方差分析)
代码:
import numpy as np
from numpy import mean,median,ptp,var,std
import pandas as pd
from scipy.stats import ttest_ind, levene
from scipy import stats
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
from statsmodels.stats.multicomp import pairwise_tukeyhsd
data = pd.read_excel('data_health.xlsx')
#均值
mean_d1 = mean(data.iloc[0:52,2])
print('一年级体重平均值',np.round(mean_d1,2))
print('一年级体重最大值',np.max(data.iloc[0:52,2]))
print('一年级体重最小值',np.min(data.iloc[0:52,2]))
#计算标准差
std_d1 = std(data.iloc[0:52,2])
print('一年级体重的标准差为',np.round(std_d1,2))
#变异系数
vc_d1 = std(data.iloc[0:52,2]) /mean(data.iloc[0:52,2])
print('一年级体重的变异系数为:',np.round(vc_d1,2))
# 箱线图
import matplotlib.pyplot as plt
plt.boxplot(data.iloc[53:58,3])#男生肺活量
plt.show()
plt.boxplot(data.iloc[59:81,3])#女生肺活量
plt.show()
x=[]
y=[]
#男生体重
for i in range(0,17):
x.append(data.iloc[i,2])
for i in range(53,58):
x.append(data.iloc[i,2])
for i in range(82,87):
x.append(data.iloc[i,2])
#女生体重
for j in range(18,52):
y.append((data.iloc[j,2]))
for j in range(59,81):
y.append((data.iloc[j,2]))
for j in range(88,106):
y.append((data.iloc[j,2]))
#Step3 前提性检验:方差齐性检验
a = levene(x,y)
print('方差齐性检验结果:')
print('\n T统计量的值为:',np.round(a.statistic,3))
print('\n P值为:',np.round(a.pvalue,3))
print('----------------')
#Step4 独立样本T检验,默认方差齐性
res = ttest_ind(x, y)
print('方差齐性情况下,均值比较结果(P值):\n',
np.round(res.pvalue,3))
print('----------------')
#Step4' 如果方差不齐性,则equal_var=False
'''res2 =ttest_ind(x,y,equal_var=False)
print('方差不具有齐性情况下,均值比较结果(P值):\n',np.round(res2.pvalue,3))'''
df=data
'''step3 前提性检验:levene检验'''
res_v = stats.levene(df['肺活量'][df['年级'] == 1],
df['肺活量'][df['年级'] == 2],
df['肺活量'][df['年级'] == 3])
print('方差齐性检验P值:',np.round(res_v.pvalue,3))
'''Step4 单因素方差分析'''
formula = '肺活量~年级'
anova_results = anova_lm(ols(formula,df).fit())
print('\n方差分析结果(ANOVA表):\n',anova_results)
'''Step5 多重比较'''
# 逐对比较差异,原假设:二者之间无显著差异
'''res_post = pairwise_tukeyhsd(df['肺活量'],
df['年级'],alpha=0.05)
print('\n多重比较结果:\n',res_post)'''
结果:
(1)一年级体重平均值 17.68
一年级体重最大值 21.2
一年级体重最小值 13.6
一年级体重的标准差为 1.61
一年级体重的变异系数为: 0.09
(2)
(3)方差齐性检验结果:
T统计量的值为: 0.174
P值为: 0.678
p值>0.05 方差具有齐性
方差齐性情况下,均值比较结果(P值):
0.877
P值>0.05 服从原假设,不同性别学生的平均体重不存在显著差异
方差齐性检验P值: 0.334
p值>0.05 方差具有齐性
方差分析结果:
ANOVA表 | df | sum_sq | mean_sq | F | PR(>F) |
年级 | 1.0 | 7.559653e+04 | 75596.530155 | 2.626569 | 0.108117 |
Residual | 104.0 | 2.993273e+06 | 28781.470229 | NaN | NaN |
p值=0.108>0.05 服从原假设,不同年级同学肺活量不存在显著差异。
3. 已知某减肥俱乐部推荐的减肥茶经过部分志愿者使用前后体重数据(data_tea.xlsx),假设服用前后志愿者体重均服从正态分布,试用配对样本T检验分析减肥茶是否有效?
代码:
from numpy import mean,median,ptp,var,std
from scipy.stats import ttest_rel
import pandas as pd
import numpy as np
'''step2 读(导)入数据'''
data = pd.read_excel('data_tea.xlsx',engine='openpyxl')
before=[]
after=[]
for i in range(0,35):
before.append(data.iloc[i,0])
after.append(data.iloc[i,1])
print(before)
print(after)
'''Step3 配对样本t检验'''
res = ttest_rel(before, after)
print('T统计量值为:',np.round(res.statistic,2))
print('\n P值为:',np.round(res.pvalue,3))
'''Step4 若有显著差异,进一步分析'''
print('\n 样本均值之差:',np.round(mean(data.iloc[:,0])-mean(data.iloc[:,1])))
结果:
T统计量值为: 14.25
P值为: 0.0
样本均值之差: 19.0
减肥茶有减肥效果