Titanic數據分析


一.材料准備

https://www.kaggle.com/c/titanic-gettingStarted/

二.提出問題

  生存率和哪些因素有關(性別,年齡,是否有伴侶,票價,艙位等級,包間,出發地點)

  1.乘客的年齡和票價的分布

  2.樣本生存的幾率是多少

  3.乘客的性別比例

  4.乘客的艙位分布

  5.性別和生還有沒有關系

  6.艙位等級和生還有沒有關系

  7.年齡和生還有沒有關系

  8.出發地點和生存率有沒有關系

  9.票價和生還有沒有關系

  10.有陪伴的乘客的生還幾率是否更高

三.編寫代碼和做出圖形來驗證所提出的的問題

  1.加載數據

1 %pylab inline
2 %matplotlib inline
3 import seaborn as sns
4 import numpy as np
5 import pandas as pd
6 import matplotlib.pyplot as plt
7 titanic_data = pd.read_csv('titanic-data.csv')
8 titanic_data.info()
View Code

 

     結論:Age,Embarked這兩列需要進行數據清洗,因為Cabin列缺失的數據太多所以不能作為分析的依據

    2.自定義函數分析數據

1 #統計變量和生存率的關系,如果需要使用堆棧圖更清晰的展示數據,stacked的值設置為True,為False默認展示該變量下的生存率
2 def visualize_survival(feature,stacked=False):
3     if stacked:
4         survived_rate = titanic_data.groupby([feature,'Survived'])['Survived'].count().unstack().plot(kind='bar',stacked='True')
5     else:
6         survived_rate = (titanic_data.groupby([feature]).sum()/titanic_data.groupby([feature]).count())['Survived']
7         survived_rate.plot(kind='bar')
8     plt.title(feature + ' V.S. Survival') 
View Code
1 #比較單個變量之間的關系,feature表示要分析的列,args表示x軸的名稱
2 def visualize_column(feature,*args):
3     fig,ax=plt.subplots(figsize=(7,5))
4     titanic_data[feature].value_counts().plot(kind='bar')
5     for i in range(len(args)):
6         ax.set_xticklabels((args[i]),rotation='horizontal')
7     ax.set_title('bar of ' + feature)
View Code

   3.分析乘客年齡和票價分布

1 fig,axes=plt.subplots(2,1,figsize=(15,5))
2 titanic_data['Age'].hist(ax=axes[0])  #年齡分布
3 axes[0].set_title('plot of age')
4 titanic_data['Fare'].hist(ax=axes[1])  #票價分布
5 axes[1].set_title('plot of fare')
View Code

結論:

  1.大部分乘客的年齡在20到40歲之間

  2.票價在主要分布在(0,100)美元之間

4.樣本的生存幾率

1 survived_rate = float(titanic_data['Survived'].sum())/titanic_data['Survived'].count()
2 print survived_rate
3 by_survived = titanic_data.groupby(['Survived'])['Survived'].count()
4 plt.pie(by_survived,labels=['Non-Survived','Survived'],autopct='%1.0f%%')
5 plt.title('Pie Chart Of Surviveness for Surviveness of Passengers')
View Code

結論:整體的存活率約等於0.384,不超過40%的存活率

5.乘客的性別比例

1 visualize_column('Sex',('Male','Female'))
View Code

結論:大部分的乘客是男性,男性比女性多50%

6.乘客的艙位分布

1 visualize_column('Pclass',('Class 3','Class 2','Class 1')) 
View Code

結論:三等艙的工人和奴隸占絕大多數,大約是一二等艙的總和

 7.性別和生還的關系

1 visualize_survival('Sex',True)
View Code

結論:女性的生還人數遠遠超過男性

8.艙位等級和生還的關系

1 visualize_survival('Pclass',True)
View Code

結論:1等艙生還的幾率超過50%,2等艙的生還幾率接近50%,而三等艙獲救的可能性最低,證實了事故發生時三等艙被第一時間鎖死

9.年齡和生還的關系

首先年齡這一列存在多個空值,要進行數據的清洗,利用非空的年齡字段計算出平均年齡來填充到空值字段,其次分段是在(0,80]之間,所以以10年作為分段點可以更直觀的看出年齡和生存率的關聯

1 titanic_data.Age.fillna(titanic_data.Age.mean(),inplace=True)   #使用均值來填充Age中的空值
2 ages = np.arange(0,90,10) #年齡分段
3 titanic_data['age_cut'] = pd.cut(titanic_data.Age,ages)
4 visualize_survival('age_cut',True)
View Code

結論:嬰兒的生存比例較高,其次(20,40)歲之間的成年人生存所占比例較高,50歲以上老人和10歲左右的兒童少年生存率偏低

10.出發地點和生存率的關系

     發現有個上船地點是空值,要進行數據的清洗,因為空值的票價接近於瑟堡的中位數,所以以C填充空值

1 titanic_data.Embarked[titanic_data.Embarked.isnull()]
2 print titanic_data[titanic_data['Embarked'].isin(['S','C','Q'])==False]
3 titanic1 = titanic_data[titanic_data['Pclass']==1]
4 ax=sns.boxplot(titanic1.Embarked,titanic1.Fare)
5 plt.plot((-100,100),(80,80),'r-')
View Code

     做出結論圖形

1 titanic_data.Embarked=titanic_data.Embarked.fillna('C')
2 visualize_survival('Embarked')
View Code

結論:從瑟堡,皇后鎮,南安普頓的上船的生存率依次下降

11.票價和生存率的關系

    根據問題1的分析可得出票價的分段在(0,500]美金之間,但是根據數據分組來看票價有異常值,如果票價大於100美金則為異常值,需要舍棄否則會影響統計結果的表達,

1 fares = np.arange(0,600,50) #划分票價區間
2 fares_cut = pd.cut(titanic_data.Fare,fares)
3 fares_cut_group = titanic_data.groupby(fares_cut)
4 fares_cut_group.count().PassengerId #獲取異常數據
5 titanic_data.Fare.sort_values(ascending=False).head() #查看異常數據
6 #進行IQR運算找出異常數據
7 q75,q25 = np.percentile(titanic_data.Fare,[75,25])
8 iqr = q75-q25
9 print q75+iqr*3  #確定異常數據的值
View Code

結論:超過100.27美金的票價都是異常值,在接下來的分析中要舍棄

    重新進行票價的統計分區,做出圖形

1 fares_count = titanic_data.Fare[titanic_data.Fare<100.27] #舍棄異常數據
2 fares_count_range = np.arange(0,110,10) #重新計算票價區間
3 titanic_data['new_fare'] = pd.cut(titanic_data.Fare,fares_count_range)
4 visualize_survival('new_fare')
View Code

  

結論:總體來說票價越高生還的幾率越大

12.有陪伴的乘客的生還幾率是否更高

1 #通過SibSp+Parch總體計算出陪伴的生還率
2 titanic_data['family_member'] = titanic_data.SibSp+titanic_data.Parch
3 visualize_survival('family_member')
View Code

結論:當有1,2個家庭成員結伴出行的時候,生存率較高,但不是主要提高生存的途徑

四.總結:

由上述一系列圖表可知

  1.樣本整體的存活率大約為39%

  2.性別是影響生存率的最主要的因素

  3.票價和艙位是影響生存率的第二要因

  4.年齡和生存率沒有太大的關系

  5.上船地點和是否家人結伴略微地影響了生存率

五.分析限制討論:

  1.此樣本並非是泰坦尼克號全部乘客的數據,據了解,泰坦尼克號一共有2224名乘客,本數據一共是891名乘客,如果是891名乘客根據是從2224名乘客中隨機選出,根據中心極限定理,該樣本足夠大,分析結論具有代表性,如果不是隨機抽取,那么分析的結果就不可靠

  2.可能還有其他影響生存的情況,比如國籍是否影響生存率,是否會游泳會不會影響生存率,不同的職業會不會影響生存率

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM