1、项目来源于up主自学udacity中的一个项目实践,up主自身能力不足,因此文章很浅显
2、泰坦尼克数据集是kaggle中一个好的可选数据集,网上有很多基于此数据集的分析&存活预测实践的文章
3、要有点python基础哦~ 没有也没关系,先下载软件跑跑代码也是好的
话不多说,这就开始
数据下载:https://d17h27t6h515a5.cloudfront.net/topher/2016/December/584bcec3_titanic-data/titanic-data.csv
软件准备:python 2.7 (安装 pandas 库)
多嘴说一句,懒得装各种库各种包的童鞋,请直接下载anaconda。
另外推荐jupyter,代码+报告结合神器
pandas --- 用过的人都说好用,没用过的小伙伴赶紧开始尝试吧~~
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data_src='titanic-data.csv'
df = pd.read_csv(data_src,header=0) # 导入数据
print df.info() # 查看数据集的基本信息,
print df.describe() # 查看数据的摘要信息
print df.head() # 查看前几行数据,方便了解数据具体情况
以 “ print df.info() ” 为例,运行后输出如下结果:
其中:
从数据集的基本信息可以看出,Age \ Cabin \ Embarked 是存在缺失值的,其中Cabin字段缺失值过多。
对于少量缺失值的情况,常用的方法是去除和补齐,数值型的数据是可以根据统计学的方法或者机器学习的方法将其进行补齐的。
对于存在大量缺失值的字段,应衡量此字段的重要程度与修复代价之间的权重。up主是果断的没有再考虑这个字段了
先看下全部样本的存活率是多少:
survived_rate = float(df['Survived'].sum()) / df['Survived'].count()
print 'survived_rate: ',survived_rate
运行代码输出:survived_rate: 0.383838383838
再看下 舱位和存活率之间的关系:
x=[df[(df.Pclass==1)]['Pclass'].size,df[(df.Pclass==2)]['Pclass'].size,df[(df.Pclass==3)]['Pclass'].size]
y=[df[(df.Pclass==1) & (df.Survived == 1)]['Pclass'].size,\
df[(df.Pclass==2) & (df.Survived == 1)]['Pclass'].size, \
df[(df.Pclass == 3) & (df.Survived == 1)]['Pclass'].size]
print '1 Pclass number:' + str(x[0]) + ' ' + '1 Pclass survive:' + str(y[0]) + ' ' + '1 Pclass survive rat:', float(y[0]) / x[0]
print '2 Pclass number:' + str(x[1]) + ' ' + '2 Pclass survive:' + str(y[1]) + ' ' + '2 Pclass survive rat:', float(y[1]) / x[1]
print '3 Pclass number:' + str(x[2]) + ' ' + '3 Pclass survive:' + str(y[2]) + ' ' + '3 Pclass survive rat:', float(y[2]) / x[2]
Pclass_survived_rate = (df.groupby(['Pclass']).sum() / df.groupby(['Pclass']).count())['Survived']
Pclass_survived_rate.plot(kind='bar')
plt.title('Pclass_survived_rate')
plt.show()
输出结果如下:
可以很清楚的看出,舱位与存活率之间的关系。三等舱的乘客们很惨
可以再简单看看性别的影响:
Sex_survived_rate = (df.groupby(['Sex']).sum() / df.groupby(['Sex']).count())['Survived']
Sex_survived_rate.plot(kind='bar')
plt.title('Sex_survived_rate')
plt.show()
数据集里面的年龄是一个数值型变量,先按照未处理的裸数据来绘图
Age_survived_rate=(df.groupby(['Age']).sum()/df.groupby(['Age']).count())['Survived']
Age_survived_rate.plot()
plt.title('Age_survived_rate')
plt.show()
得出的结果特别难懂。
对于连续型数值变量,可以先做特征离散化,将年龄分布在各个年龄段中,效果就好多了呢。
这里引出了特征工程中的概念---离散化。
最近up主刚上了一届特征工程的课,等待up主的课后笔记吧~
age_clean_date=df[~np.isnan(df['Age'])] #去除年龄数据中的NaN
ages=np.arange(0,81,5) #0~80岁,每5岁一段(年龄最大80岁)
age_cut=pd.cut(age_clean_date.Age,ages)
age_cut_grouped=age_clean_date.groupby(age_cut)
age_Survival_Rate=(age_cut_grouped.sum()/age_cut_grouped.count())['Survived'] #计算每年龄段的幸存率
age_Survival_Rate.plot(kind='bar')
plt.title('Age_group_survived_rate')
plt.show()
感兴趣的小伙伴可以多尝试几个变量,看看能不能找到更有趣的结论哦~
一个数据表象,往往是多个因素影响的结果,其中多个因素的影响力各不同(可以稍微联想主成份分析的概念)。因此复合变量的分析也是必不可少的哦~
单变量中舱位和性别对存活率的影响都很大,up主好奇到底是哪一个主要决定了乘客能否登上救生船,因此就对舱位和性别整合为复合变量,做了分析。
Pclass_Sex_survived_rate=(df.groupby(['Sex','Pclass']).sum()/df.groupby(['Sex','Pclass']).count())['Survived']
Pclass_Sex_survived_rate.plot(kind='bar')
plt.title('Pclass_Sex_survived_rate')
plt.show()
结果发现三等舱的女性存活率 高于 一等舱的男性存活率。可见当时的绅士风度啊!
再想想当时的帅哥,美男们~~ 对不起我歪楼了。。。。。
对的,你没看错,up主自认得出的结论很浅显,就不在这边现眼了,大家各自表演吧~~
写在后面的话:
1、KM小白第一篇文章,有细节问题的话请大佬指导
2、虽然自己很多时候是用sql + excel 搞定数据分析的,但是python大腿不能放
喜欢你就收藏下吧~ 数据分析同道中人赶紧私戳 up主RTX一起携手走上人生巅峰
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。