数据来源:Kaggle数据集 → 共有1309名乘客数据,其中891是已知存活情况(train.csv),剩下418则是需要进行分析预测的(test.csv)
字段意义:
PassengerId: 乘客编号
Survived :存活情况(存活:1 ; 死亡:0)
Pclass : 客舱等级
Name : 乘客姓名
Sex : 性别
Age : 年龄
SibSp : 同乘的兄弟姐妹/配偶数
Parch : 同乘的父母/小孩数
Ticket : 船票编号
Fare : 船票价格
Cabin :客舱号
Embarked : 登船港口
目的:通过已知获救数据,预测乘客生存情况
研究问题:
1、整体来看,存活比例如何?
import numpy as np import pandas as pd import matplotlib.pyplot as plt import os import warnings import seaborn as sns warnings.filterwarnings('ignore') from pylab import mpl mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体 mpl.rcParams['axes.unicode_minus'] =False #导入数据 #已知存活情况数据 df_train=pd.read_csv('C:/Users/Administrator/train.csv',engine='python') #未知待预测数据 df_test=pd.read_csv('C:/Users/Administrator/test.csv',engine='python') print(df_train.head()) print(df_test.head())
sns.set() sns.set_style('ticks') plt.figure(figsize=(10,10)) plt.pie(df_train['Survived'].value_counts(),labels=df_train['Survived'].value_counts().index,colors=['r','g'],autopct='%.2f%%') plt.show() print('存活率是38.38%')
2、结合性别和年龄数据,分析幸存下来的人是哪些人?
① 年龄数据的分布情况
② 男性和女性存活情况
③ 老人和小孩存活情况
#年龄分布情况 df_train_age=df_train[df_train['Age'].notnull()] #绘制 fig=plt.figure(figsize=(20,6),facecolor='gray') #年龄直方图 ax1=fig.add_subplot(1,2,1) df_train_age['Age'].hist(bins=70) ax2=fig.add_subplot(1,2,2) df_train_age.boxplot(column=['Age'],sym='o',#异常值以圆点显示 whis=1.5, #IQR meanline=False,#是否用线的形式显示均值,默认是点 showmeans=True#显示均值线 ) df_train_age['Age'].describe()
结论:总体年龄分布: 去掉缺失值后样本有714,平均年龄约为30岁,标准差14岁,最小年龄0.42,最大年龄80
# 男性和女性存活情况 df_train_sex=df_train[['Survived','Sex']] df_train_sex.dropna(inplace=True) df_train_sex_ch=df_train_sex.groupby(['Sex','Survived'])['Sex'].count() print(df_train_sex_ch) print('女性存活率是%.2f%%,男性的存活率是%.2ff%%'%(df_train_sex_ch.loc['female',1]/df_train_sex_ch.loc['female'].sum()*100, df_train_sex_ch.loc['male',1]/df_train_sex_ch.loc['male'].sum()*100))
#年龄已存活关系 fig=plt.figure(figsize=(20,5)) ax1=fig.add_subplot(1,2,1) sns.violinplot(x='Pclass',y='Age',hue='Survived',data=df_train_age,split=True) plt.title('不同船舱等级的存活的年龄情况') ax2=fig.add_subplot(1,2,2) sns.violinplot(x='Sex',y='Age',hue='Survived',data=df_train_age,split=True) plt.title('不同性别的存活的年龄情况') plt.show()
结论:1、按照不同船舱等级划分 → 船舱等级越高,存活者年龄越大,船舱等级1存活年龄集中在20-40岁,船舱等级2/3中有较多低龄乘客存活
2、按照性别划分 → 男性女性存活者年龄主要分布在20-40岁,且均有较多低龄乘客,其中女性存活更多
# 老人和小孩存活情况 plt.figure(figsize=(18,4)) df_train_age['Age_int'] = df_train_age['Age'].astype(int) average_age = df_train_age[["Age_int", "Survived"]].groupby(['Age_int'],as_index=False).mean() sns.barplot(x='Age_int',y='Survived',data=average_age, palette = 'BuPu') plt.grid(linestyle = '--',alpha = 0.5)
结论:灾难中,老人和小孩存活率较高
3、结合 SibSp、Parch字段,研究亲人多少与存活的关系
① 有无兄弟姐妹/父母子女和存活与否的关系
② 亲戚多少与存活与否的关系
# 有无兄弟姐妹/父母子女和存活与否的关系 df_train_SibSp=df_train[df_train['SibSp']!=0] df_train_NoSibSp=df_train[df_train['SibSp']==0] df_train_Parch=df_train[df_train['Parch']!=0] df_train_NoParch=df_train[df_train['Parch']==0] fig=plt.figure(figsize=(20,10)) ax1=fig.add_subplot(2,2,1) df_train_SibSp_count=df_train_SibSp[['Survived','SibSp']].groupby('Survived').count() df_train_SibSp_count.columns=['count'] plt.pie(df_train_SibSp_count,labels=['No Survived','Survived'],colors=['r','g'],autopct='%.2f%%') plt.title('同乘的兄弟姐妹/配偶数不为0的情况') ax1=fig.add_subplot(2,2,2) df_train_NoSibSp_count=df_train_NoSibSp[['Survived','SibSp']].groupby('Survived').count() df_train_NoSibSp_count.columns=['count'] plt.pie(df_train_NoSibSp_count,labels=['No Survived','Survived'],colors=['r','g'],autopct='%.2f%%') plt.title('同乘的兄弟姐妹/配偶数为0的情况') ax1=fig.add_subplot(2,2,3) df_train_Parch_count=df_train_Parch[['Survived','SibSp']].groupby('Survived').count() df_train_Parch_count.columns=['count'] plt.pie(df_train_Parch_count,labels=['No Survived','Survived'],colors=['r','g'],autopct='%.2f%%') plt.title('同乘的父母/小孩数不为0的情况') ax1=fig.add_subplot(2,2,4) df_train_NoParch_count=df_train_NoParch[['Survived','SibSp']].groupby('Survived').count() df_train_NoParch_count.columns=['count'] plt.pie(df_train_NoParch_count,labels=['No Survived','Survived'],colors=['r','g'],autopct='%.2f%%') plt.title('同乘的父母/小孩数为0的情况') plt.show()
结论:有兄弟姐妹、父母子女的乘客存活率更大
#亲戚多少与存活与否的关系 fig=plt.figure(figsize=(15,8)) ax1=fig.add_subplot(2,2,1) df_Parch=df_train[['Parch','Survived']].groupby('Parch').mean() plt.bar(df_Parch.index,df_Parch['Survived']) ax1.set_title('Parch and Survived') ax2=fig.add_subplot(2,2,2) df_SibSp=df_train[['SibSp','Survived']].groupby('SibSp').mean() plt.bar(df_SibSp.index,df_SibSp['Survived']) ax2.set_title('SibSp and Survived') ax3=fig.add_subplot(2,2,3) df_train['Family_total']=df_train['Parch'] + df_train['SibSp']+1 df_Family_total=df_train[['Family_total','Survived']].groupby('Family_total').mean() plt.bar(df_Family_total.index,df_Family_total['Survived']) ax3.set_title('Family_total and Survived') plt.show()
结论:若独自一人,那么其存活率比较低;但是如果亲友太多的话,存活率也会很低
4、结合票的费用情况,研究票价和存活与否的关系
① 票价分布和存活与否的关系
② 比较研究生还者和未生还者的票价情况
fig, ax=plt.subplots(1,2,figsize=(15,4)) df_train['Fare'].hist(bins=70, ax = ax[0]) df_train.boxplot(column='Fare', by='Pclass', showfliers=False,ax = ax[1]) # 查看票价分布情况 fare_not_survived = df_train['Fare'][df_train['Survived'] == 0] fare_survived = df_train['Fare'][df_train['Survived'] == 1] # 基于票价,筛选出生存与否的数据 average_fare = pd.DataFrame([fare_not_survived.mean(),fare_survived.mean()]) std_fare = pd.DataFrame([fare_not_survived.std(),fare_survived.std()]) average_fare.plot(yerr=std_fare,kind='bar',legend=False,figsize = (15,4),grid = True) # 查看票价与是否生还的关
结论:生还者的平均票价要大于未生还者的平均票价
5、利用KNN分类模型,对结果进行预测
① 模型训练字段:'Survived','Pclass','Sex','Age','Fare','Family_Size'
② 模型预测test.csv样本数据的生还率
#清洗训练数据集 df_train_knn=df_train[['Survived','Pclass','Sex','Age','Fare','Family_total']].dropna() df_train_knn[df_train_knn['Sex']=='male']=1 df_train_knn[df_train_knn['Sex']=='female']=0 #清洗预测数据集 df_test['Family_total']=df_test['Parch']+df_test['SibSp']+1 df_test_knn=df_test[['Pclass','Sex','Age','Fare','Family_total']].dropna() df_test_knn[df_test_knn['Sex']=='male']=1 df_test_knn[df_test_knn['Sex']=='female']=0 print("训练数据集数量为:%d"%(len(df_train_knn))) print(df_train_knn.head()) print("预测数据集数量为:%d"%(len(df_test_knn))) print(df_test_knn.head())
from sklearn import neighbors #导入knn分类模块 knn=neighbors.KNeighborsClassifier() knn.fit(df_train_knn[['Pclass','Sex','Age','Fare','Family_total']],df_train_knn['Survived']) #构建模型 df_test_knn['predict']=knn.predict(df_test_knn) #预测数据 print(df_test_knn)