泰坦尼克号获救问题

数据来源: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)
 
 

猜你喜欢

转载自www.cnblogs.com/beiyizimu/p/10310707.html