python 数据分析超简单入门 : 项目实践篇-36大数据
作者:刘妍
写在前面的话:
- 项目来源于up主自学udacity中的一个项目实践,up主自身能力不足,因此文章很浅显
- 泰坦尼克数据集是kaggle中一个好的可选数据集,网上有很多基于此数据集的分析&存活预测实践的文章
- 要有点python基础哦~ 没有也没关系,先下载软件跑跑代码也是好的
话不多说,这就开始
一、前期准备
数据下载: https://d17h27t6h515a5.cloudfront.net/topher/2016/December/584bcec3_titanic-data/titanic-data.csv
软件准备:python 2.7 (安装 pandas 库)
多嘴说一句,懒得装各种库各种包的童鞋,请直接下载anaconda。
另外推荐jupyter,代码+报告结合神器
pandas — 用过的人都说好用,没用过的小伙伴赶紧开始尝试吧~~
二、分析开始
1、导入数据&查看基本信息
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() ” 为例,运行后输出如下结果:
其中:
- PassengerId => 乘客ID
- Survived => 是否生还
- Pclass => 乘客等级(1/2/3等舱位)
- Name => 乘客姓名
- Sex => 性别
- Age => 年龄
- SibSp => 堂兄弟/妹个数
- Parch => 父母与小孩个数
- Ticket => 船票信息
- Fare => 票价
- Cabin => 客舱
- Embarked => 登船港口
从数据集的基本信息可以看出,Age \ Cabin \ Embarked 是存在缺失值的,其中Cabin字段缺失值过多。
对于少量缺失值的情况,常用的方法是去除和补齐,数值型的数据是可以根据统计学的方法或者机器学习的方法将其进行补齐的。
对于存在大量缺失值的字段,应衡量此字段的重要程度与修复代价之间的权重。up主是果断的没有再考虑这个字段了
2、分析 乘客存活率与各单变量之间的关系
先看下全部样本的存活率是多少:
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()
感兴趣的小伙伴可以多尝试几个变量,看看能不能找到更有趣的结论哦~
3、分析 乘客存活率与复合变量之间的关系
一个数据表象,往往是多个因素影响的结果,其中多个因素的影响力各不同(可以稍微联想主成份分析的概念)。因此复合变量的分析也是必不可少的哦~
单变量中舱位和性别对存活率的影响都很大,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()
结果发现三等舱的女性存活率 高于 一等舱的男性存活率。可见当时的绅士风度啊!
再想想当时的帅哥,美男们~~ 对不起我歪楼了。。。。。
4、挑选更有意思的分析角度,得出让人信服的数据结论
对的,你没看错,up主自认得出的结论很浅显,就不在这边现眼了,大家各自表演吧~~
End.
转载请注明来自36大数据(36dsj.com): 36大数据 » python 数据分析超简单入门 : 项目实践篇