基于简单模型KNN——泰坦尼克号获救分析

数据来源:Kaggle数据集 → 共有1309名乘客数据,其中891是已知存活情况(train.csv),剩下418则是需要进行分析预测的(test.csv)
字段意义:
PassengerId: 乘客编号
Survived :存活情况(存活:1 ; 死亡:0)
Pclass : 客舱等级
Name : 乘客姓名
Sex : 性别
Age : 年龄
SibSp : 同乘的兄弟姐妹/配偶数
Parch : 同乘的父母/小孩数
Ticket : 船票编号
Fare : 船票价格
Cabin :客舱号
Embarked : 登船港口
目的:通过已知获救数据,预测乘客生存情况
研究问题:
1、整体来看,存活比例如何?
要求:
① 读取已知生存数据train.csv
② 查看已知存活数据中,存活比例如何?
提示:
① 注意过程中筛选掉缺失值之后再分析
② 这里用seaborn制图辅助研究

2、结合性别和年龄数据,分析幸存下来的人是哪些人?
要求:
① 年龄数据的分布情况
② 男性和女性存活情况
③ 老人和小孩存活情况

3、结合 SibSp、Parch字段,研究亲人多少与存活的关系
要求:
① 有无兄弟姐妹/父母子女和存活与否的关系
② 亲戚多少与存活与否的关系

4、结合票的费用情况,研究票价和存活与否的关系
要求:
① 票价分布和存活与否的关系
② 比较研究生还者和未生还者的票价情况

5、利用KNN分类模型,对结果进行预测
要求:
① 模型训练字段:‘Survived’,‘Pclass’,‘Sex’,‘Age’,‘Fare’,‘Family_Size’
② 模型预测test.csv样本数据的生还率
提示:
① 训练数据集中,性别改为数字表示 → 1代表男性,0代表女性
导入模块

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import os
import time
# 导入时间模块
% matplotlib inline

import warnings
warnings.filterwarnings('ignore') 
os.chdir('C:/Users/5467/Desktop/项目15泰坦尼克号获救问题/')
train_data = pd.read_csv('train.csv')
test_data = pd.read_csv('test.csv')

运用饼图来看存活比例

sns.set()
sns.set_style("ticks")
plt.axis('equal')
train_data['Survived'].value_counts().plot.pie(autopct='%1.2f%%')

基于简单模型KNN——泰坦尼克号获救分析_第1张图片
二、结合性别和年龄数据,分析幸存下来的人是哪些人?
要求:
① 年龄数据的分布情况
② 男性和女性存活情况
③ 老人和小孩存活情况

总体年龄分布: 去掉缺失值后样本有714,平均年龄约为30岁,标准差14岁,最小年龄0.42,最大年龄80``

train_data_age = train_data[train_data['Age'].notnull()]

plt.figure(figsize=(12,5))
plt.subplot(121)
train_data_age['Age'].hist(bins=70)
plt.xlabel('Age')
plt.ylabel('Num')
 
plt.subplot(122)
train_data.boxplot(column='Age',showfliers=False)

train_data_age['Age'].describe()

基于简单模型KNN——泰坦尼克号获救分析_第2张图片

train_data[['Sex','Survived']].groupby(['Sex']).mean().plot.bar()
survive_sex = train_data.groupby(['Sex','Survived'])['Survived'].count()
print(survive_sex)
# 女性生存率较高

print('女性存活率为%.2f%%,男性存活率为%.2f%%' % 
     (survive_sex.loc['female',1]/survive_sex.loc['female'].sum()*100, survive_sex.loc['male',1]/survive_sex.loc['male'].sum()*100))

女性存活率为74.20%,男性存活率为18.89%
基于简单模型KNN——泰坦尼克号获救分析_第3张图片
按照不同船舱等级划分 → 船舱等级越高,存活者年龄越大,船舱等级1存活年龄集中在20-40岁,船舱等级2/3中有较多低龄乘客存活
按照性别划分 → 男性女性存活者年龄主要分布在20-40岁,且均有较多低龄乘客,其中女性存活更多

fig,ax = plt.subplots(1,2, figsize = (18,8))

sns.violinplot("Pclass","Age",hue="Survived",data=train_data_age,split=True,ax=ax[0])
ax[0].set_title('Pclass and Age vs Survived')
ax[0].set_yticks(range(0,110,10))

sns.violinplot("Sex","Age",hue="Survived",data=train_data_age,split=True,ax=ax[1])
ax[1].set_title('Sex and Age vs Survived')
ax[1].set_yticks(range(0,110,10))

琴型图如下
基于简单模型KNN——泰坦尼克号获救分析_第4张图片
灾难中,老人和小孩存活率较高

plt.figure(figsize=(18,4))
train_data_age['Age_int'] = train_data_age['Age'].astype(int)
average_age = train_data_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)

基于简单模型KNN——泰坦尼克号获救分析_第5张图片
三、结合 SibSp、Parch字段,研究亲人多少与存活的关系
要求:
① 有无兄弟姐妹/父母子女和存活与否的关系
② 亲戚多少与存活与否的关系

sibsp_df = train_data[train_data['SibSp'] != 0]
no_sibsp_df = train_data[train_data['SibSp'] == 0]
# 筛选出有无兄弟姐妹数据

parch_df = train_data[train_data['Parch'] != 0]  
no_parch_df = train_data[train_data['Parch'] == 0]
# 筛选出有无父母子女数据

plt.figure(figsize=(12,3))
plt.subplot(141)
plt.axis('equal')
sibsp_df['Survived'].value_counts().plot.pie(labels=['No Survived','Survived'],autopct= '%1.1f%%',colormap = 'Blues')
plt.xlabel('sibsp')
 
plt.subplot(142)
plt.axis('equal')
no_sibsp_df['Survived'].value_counts().plot.pie(labels=['No Survived','Survived'],autopct= '%1.1f%%',colormap = 'Blues')
plt.xlabel('no_sibsp')

plt.subplot(143)  
plt.axis('equal')
parch_df['Survived'].value_counts().plot.pie(labels=['No Survived', 'Survived'], autopct= '%1.1f%%',colormap = 'Reds')  
plt.xlabel('parch')  
 
plt.subplot(144)  
plt.axis('equal')
no_parch_df['Survived'].value_counts().plot.pie(labels=['No Survived', 'Survived'], autopct = '%1.1f%%',colormap = 'Reds')  
plt.xlabel('no_parch')

结论:有兄弟姐妹、父母子女的乘客存活率更大
基于简单模型KNN——泰坦尼克号获救分析_第6张图片
亲戚多少与存活与否的关系

fig, ax=plt.subplots(1,2,figsize=(15,4))
train_data[['Parch','Survived']].groupby(['Parch']).mean().plot.bar(ax=ax[0])
ax[0].set_title('Parch and Survived')
train_data[['SibSp','Survived']].groupby(['SibSp']).mean().plot.bar(ax=ax[1])
ax[1].set_title('SibSp and Survived')
# 查看兄弟姐妹个数与存活率

train_data['Family_Size'] = train_data['Parch'] + train_data['SibSp']+1
train_data[['Family_Size','Survived']].groupby(['Family_Size']).mean().plot.bar(figsize = (15,4))

基于简单模型KNN——泰坦尼克号获救分析_第7张图片
基于简单模型KNN——泰坦尼克号获救分析_第8张图片
结论:若独自一人,那么其存活率比较低;但是如果亲友太多的话,存活率也会很低
四、结合票的费用情况,研究票价和存活与否的关系
要求:
① 票价分布和存活与否的关系
② 比较研究生还者和未生还者的票价情况

fig, ax=plt.subplots(1,2,figsize=(15,4))
train_data['Fare'].hist(bins=70, ax = ax[0])
train_data.boxplot(column='Fare', by='Pclass', showfliers=False,ax = ax[1])
# 查看票价分布情况

fare_not_survived = train_data['Fare'][train_data['Survived'] == 0]
fare_survived = train_data['Fare'][train_data['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)
# 查看票价与是否生还的关系

结论:生还者的平均票价要大于未生还者的平均票价
基于简单模型KNN——泰坦尼克号获救分析_第9张图片
基于简单模型KNN——泰坦尼克号获救分析_第10张图片
五、利用KNN分类模型,对结果进行预测
要求:
① 模型训练字段:‘Survived’,‘Pclass’,‘Sex’,‘Age’,‘Fare’,‘Family_Size’
② 模型预测test.csv样本数据的生还率
提示:
① 训练数据集中,性别改为数字表示 → 1代表男性,0代表女性

from sklearn import neighbors  
# 导入KNN分类模块

knn = neighbors.KNeighborsClassifier() 
knn.fit(knn_train[['Pclass','Sex','Age','Fare','Family_Size']], knn_train['Survived'])
# 构建模型

knn_test['predict'] = knn.predict(knn_test)
pre_survived = knn_test[knn_test['predict'] == 1].reset_index()
del pre_survived['index']
Pclass	Sex	Age	Fare	Family_Size	predict

0 3 1 27.00 8.6625 1 1
1 2 1 26.00 29.0000 3 1
2 3 1 21.00 24.1500 3 1
3 1 0 23.00 82.2667 2 1
4 1 0 47.00 61.1750 2 1
5 2 0 24.00 27.7208 2 1
6 3 1 9.00 3.1708 2 1
7 1 1 21.00 61.3792 2 1
8 1 0 48.00 262.3750 5 1
9 1 0 22.00 61.9792 2 1
10 2 1 50.00 26.0000 2 1
11 2 1 24.00 31.5000 3 1
12 1 1 30.00 57.7500 2 1
13 1 0 45.00 52.5542 2 1
14 1 0 60.00 76.2917 1 1
15 3 0 36.00 15.9000 3 1
16 1 1 24.00 60.0000 2 1
17 2 0 20.00 23.0000 4 1
18 1 0 28.00 263.0000 6 1
19 1 0 36.00 262.3750 1 1
20 2 1 32.00 13.5000 1 1
21 3 0 22.00 7.7250 1 1
22 1 1 13.00 262.3750 5 1
23 1 0 60.00 263.0000 6 1
24 1 0 35.00 211.5000 1 1
25 1 1 32.50 211.5000 1 1
26 3 1 6.00 15.2458 3 1
27 1 1 67.00 221.7792 2 1
28 1 1 49.00 26.0000 1 1
29 3 0 27.00 7.8792 1 1
… … … … … … …
96 3 1 27.00 7.8958 1 1
97 1 1 30.00 26.0000 1 1
98 2 1 32.00 13.0000 1 1
99 2 1 25.00 31.5000 1 1
100 1 0 58.00 512.3292 2 1
101 3 0 16.00 7.6500 1 1
102 1 0 45.00 63.3583 2 1
103 2 1 49.00 65.0000 4 1
104 3 0 0.17 20.5750 4 1
105 1 1 50.00 26.0000 1 1
106 1 0 59.00 51.4792 3 1
107 3 1 27.00 8.6625 1 1
108 1 0 25.00 55.4417 2 1
109 1 0 31.00 134.5000 1 1
110 2 1 44.00 13.0000 1 1
111 1 0 54.00 81.8583 3 1
112 1 0 45.00 262.3750 1 1
113 3 0 22.00 8.6625 3 1
114 2 0 24.00 65.0000 4 1
115 3 1 6.00 21.0750 5 1
116 1 1 23.00 93.5000 1 1
117 1 0 18.00 60.0000 2 1
118 1 0 48.00 79.2000 3 1
119 1 0 30.00 164.8667 1 1
120 2 1 38.00 21.0000 2 1
121 1 0 22.00 59.4000 2 1
122 1 1 50.00 211.5000 3 1
123 3 0 3.00 13.7750 3 1
124 1 0 37.00 90.0000 2 1
125 1 0 39.00 108.9000 1 1

你可能感兴趣的:(基于简单模型KNN——泰坦尼克号获救分析)