Search

Travel Tips

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Lifestyle

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Hotel Review

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Python数据分析实战——泰坦尼克号获救问题

Python数据分析实战——泰坦尼克号获救问题

泰坦尼克号获救问题


数据来源: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') 
# 不发出警告

'''

1、整体来看,存活比例如何?

要求:

① 读取已知生存数据train.csv

② 查看已知存活数据中,存活比例如何?

提示:

① 注意过程中筛选掉缺失值之后再分析

② 这里用seaborn制图辅助研究


'''


# 读取数据


os.chdir('/home/zty/Documents/python/Python进阶数据分析及可视化/实战/练习09_泰坦尼克号获救问题/')
train_data = pd.read_csv('train.csv')
test_data = pd.read_csv('test.csv')
train_data.head()


image.png

test_data.head()

image.png

# 已知数据中存活比例


sns.set()
sns.set_style("ticks")
plt.axis('equal')
train_data['Survived'].value_counts().plot.pie(autopct='%1.2f%%')
print('存活比例为38.38%')

image.png

'''

2、结合性别和年龄数据,分析幸存下来的人是哪些人?

要求:
① 年龄数据的分布情况
② 男性和女性存活情况
③ 老人和小孩存活情况
'''
# 年龄数据的分布情况
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)
print('总体年龄分布: 去掉缺失值后样本有714,平均年龄约为30岁,标准差14岁,最小年龄0.42,最大年龄80.')
train_data_age['Age'].describe()

image.png

# 男性和女性存活情况


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))

image.png

# 年龄与存活的关系


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))
print('按照不同船舱等级划分 → 船舱等级越高,存活者年龄越大,船舱等级1存活年龄集中在20-40岁,船舱等级2/3中有较多低龄乘客存活')
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))
print('按照性别划分 → 男性女性存活者年龄主要分布在20-40岁,且均有较多低龄乘客,其中女性存活更多')

image.png

# 老人和小孩存活情况


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)
print('灾难中,老人和小孩存活率较高')

image.png

'''

3、结合 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')
print('有兄弟姐妹、父母子女的乘客存活率更大')

image.png

# 亲戚多少与存活与否的关系


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))
# 查看父母子女个数与存活率
print('若独自一人,那么其存活率比较低;但是如果亲友太多的话,存活率也会很低')

image.png

'''

4、结合票的费用情况,研究票价和存活与否的关系

要求:

① 票价分布和存活与否的关系

② 比较研究生还者和未生还者的票价情况


'''


# 票价分布和存活与否的关系
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)
# 查看票价与是否生还的关系
print('生还者的平均票价要大于未生还者的平均票价')

image.png

'''

5、利用KNN分类模型,对结果进行预测

要求:

① 模型训练字段:'Survived','Pclass','Sex','Age','Fare','Family_Size'

② 模型预测test.csv样本数据的生还率

提示:

① 训练数据集中,性别改为数字表示 → 1代表男性,0代表女性


'''


# 数据清洗,提取训练字段


knn_train = train_data[['Survived','Pclass','Sex','Age','Fare','Family_Size']].dropna()
knn_train['Sex'][knn_train['Sex'] == 'male'] = 1 
knn_train['Sex'][knn_train['Sex'] == 'female'] = 0
test_data['Family_Size'] = test_data['Parch'] + test_data['SibSp']+1
knn_test = test_data[['Pclass','Sex','Age','Fare','Family_Size']].dropna()
knn_test['Sex'][knn_test['Sex'] == 'male'] = 1 
knn_test['Sex'][knn_test['Sex'] == 'female'] = 0
print('清洗后训练集样本数据量为%i个' % len(knn_train))
knn_train.head()

image.png

print('清洗后测试集样本数据量为%i个' % len(knn_test))
knn_test.head()

image.png

# 模型预测test.csv样本数据的生还率


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']
# 预测存货情况
print('finished!')
pre_survived

image.png


Tags:

这是一个简介
    互联网冲浪金牌选手。赖床世锦赛纪录保持者,拖延俱乐部顶级VIP,夜宵外卖一级鉴赏师,国家脱单脱贫重点扶持对象,中央戏精学院优秀学生,亚洲酸柠檬推广大使,国家一级退堂鼓表演艺术家。
评论 (125)
评论

我是 s enim interduante quis metus. Duis porta ornare nulla ut bibendum

Rosie

6 minutes ago

Sed ac lorem felis. Ut in odio lorem. Quisque magna dui, maximus ut commodo sed, vestibulum ac nibh. Aenean a tortor in sem tempus auctor

Agatha Christie

December 4, 2020 at 3:12 pm

Sed ac lorem felis. Ut in odio lorem. Quisque magna dui, maximus ut commodo sed, vestibulum ac nibh. Aenean a tortor in sem tempus auctor

Steven

December 4, 2020 at 3:12 pm

Donec in ullamcorper quam. Aenean vel nibh eu magna gravida fermentum. Praesent eget nisi pulvinar, sollicitudin eros vitae, tristique odio.

Danielle Steel

December 4, 2020 at 3:12 pm