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 數據分析超簡單入門 : 項目實踐篇