分析泰坦尼克號遇難數據 - 張然
背景和訴求、數據註解和整理、提出問題和調查探索、總結、限制和改進、參考資料
1.背景和訴求
泰坦尼克號1 是當時最大的客運輪船,1912年4月14日首航時撞上冰山沉船,死亡人數超 1500 人,堪稱20世紀最大的海難事件。這裡的數據來自Kaggle2,包括泰坦尼克號上 2224 名乘客和船員中 891 名的人口學數據和乘客基本信息。我嘗試分析其中的數據,探索生還率和某些因素的關係是怎樣的?
2.數據註解和整理
- 使用Python、Numpy、Pandas、Matplotlib在Conda環境下的Jupyter Notebook上運行
# 導入數據分析所需的庫、在notebook內可視化數據import numpy as npimport pandas as pdimport matplotlib.pyplot as plt%matplotlib inline# 讀取預覽數據titanic_df = pd.read_csv(titanic_data.csv)titanic_df.info()titanic_df.head()RangeIndex: 891 entries, 0 to 890Data columns (total 12 columns):PassengerId 891 non-null int64Survived 891 non-null int64Pclass 891 non-null int64Name 891 non-null objectSex 891 non-null objectAge 714 non-null float64SibSp 891 non-null int64Parch 891 non-null int64Ticket 891 non-null objectFare 891 non-null float64Cabin 204 non-null objectEmbarked 889 non-null objectdtypes: float64(2), int64(5), object(5)
數據整理
- 處理丟失的值
- 記錄清理數據所做的所有變更
# 計算缺失數據titanic_df.isnull().sum()# 去除Cabin變數titanic_df = titanic_df.drop(Cabin,axis=1)# 查看 Embarked 的值的比例titanic_df.groupby(Embarked).count()
# 對缺失 Embarked 賦值 S titanic_df.Embarked[titanic_df.Embarked.isnull()] = [S]
關於 Age 變數的整理
- 直接忽略缺失的值
- 根據平均值、標準差生成隨機值
- 使用其他相關變數來模擬Age中的缺失值
以上三種方法,前兩者簡單但是與原始值的誤差難以準確把握,後者較合理也更為複雜,綜合考慮我 暫時 使用第二種方法。
# 根據平均值、標準差生成隨機值Age_mean = titanic_df[Age].mean()Age_std = titanic_df[Age].std()Age_null = titanic_df[Age].isnull().sum()Age_random = np.random.randint(Age_mean - Age_std, Age_mean + Age_std, size = Age_null)titanic_df[Age][np.isnan(titanic_df[Age])] = Age_random# 檢查整理後的數據titanic_df.info()titanic_df.groupby(Embarked).count()RangeIndex: 891 entries, 0 to 890Data columns (total 11 columns):PassengerId 891 non-null int64Survived 891 non-null int64Pclass 891 non-null int64Name 891 non-null objectSex 891 non-null objectAge 891 non-null float64SibSp 891 non-null int64Parch 891 non-null int64Ticket 891 non-null objectFare 891 non-null float64Embarked 891 non-null objectdtypes: float64(2), int64(5), object(4)
3.提出問題和調查探索
3.1 泰坦尼克號海難的倖存率是否很低
# 查看船員遇難和生還情況titanic_df.Survived.value_counts().plot(kind=pie,autopct=%.2f%%,labels=[Castaway,Survived])plt.show()titanic_df.Survived.value_counts().plot(kind=bar)plt.xlabel(Castaway0 Survived 1)plt.ylabel(Passenger)plt.show()
3.2 泰坦尼克號上不同級別船票等級乘客的倖存概率是否不同
# 不同級別船票等級Pclass的分布比例titanic_df.groupby(Pclass)[PassengerId].count().plot(kind=pie,autopct=%.2f%%)plt.title(Pclass)plt.show()# 不同級別船票等級Pclass的生存和遇難情況Survived_0 = titanic_df.Pclass[titanic_df.Survived == 0].value_counts()Survived_1 = titanic_df.Pclass[titanic_df.Survived == 1].value_counts()pd.DataFrame({Survived:Survived_1,Castaway:Survived_0}).plot(kind=bar,stacked=True)plt.title(Survived Castaway by Pclass)plt.xlabel(Pclass)plt.ylabel(Passenger)plt.show()# 不同級別船票等級Pclass的倖存概率titanic_df[[Pclass,Survived]].groupby([Pclass]).mean().plot(kind=bar)plt.title(Survived Rate by Pclass)plt.xlabel(Pclass)plt.ylabel(Rate)plt.show()
3.3 女性的獲救概率是否高於男性 ?
# 不同性別的乘客生還遇難數據對比Survived_0 = titanic_df.Sex[titanic_df.Survived == 0].value_counts()Survived_1 = titanic_df.Sex[titanic_df.Survived == 1].value_counts()pd.DataFrame({Survived:Survived_1,Castaway:Survived_0}).plot(kind=bar,stacked=True)plt.title(Survived by Sex)plt.xlabel(Sex)plt.ylabel(Passenger)plt.show()# 不同性別的乘客生還概率titanic_df[[Sex,Survived]].groupby([Sex]).mean().plot(kind=bar)plt.title(Survived Rate by Sex)plt.xlabel(Sex)plt.ylabel(Rate)plt.show()
3.4 年齡是否對生還有影響呢 ?
# 計算船員乘客年齡、倖存遇難者年齡的統計學數據print titanic_df[[Age]].describe()print titanic_df[[Age, Survived]].groupby([Survived]).describe()
# 可視化船員乘客年齡分布plt.figure().add_subplot(1,1,1).hist(titanic_df[Age],bins=50)plt.xlabel(Age)plt.ylabel(passenger)plt.show()# 可視化不同年齡段的生還情況Age_Survived = titanic_df[[Age,Survived]]Age_Survived[i] = pd.cut(Age_Survived[Age], np.arange(0,100,10))Age_Survived.groupby([i,Survived])[Survived].count().unstack().plot(kind=bar,stacked=True)plt.xlabel(Age)plt.ylabel(passenger)plt.show()# 可視化不同年齡段生還概率Age_Survived.drop(Age,axis=1).groupby([i]).mean().plot(kind=bar)plt.xlabel(Age)plt.ylabel(Survived Rate)plt.show()
4.總結
4.1 基於樣本的船員和乘客的總體生還率僅有 38.38%
4.2 高級別船票乘客的倖存概率高於低級別的4.3 女性獲救的概率高於男性4.4 年齡小於10歲的小孩兒生還概率最高5.限制和改進
- 本次探索是基於此次數據的描述、統計和展現,不代表因果關係
- 因為對 Age 變數進行了缺失賦值,可能影響結果誤差
- 改進 Age 變數的整理:可以嘗試使用其他相關變數來模擬Age中的缺失值
- 此樣本數據只是 2241 中的 891 個,此為訓練數據集,還有測試數據集
- 是否高級別乘客有獲得信息和救生工具的優先權這還需要更多數據的印證
- 後續有待使用機器學習演算法繼續處理
- 後續還可以繼續探索這些因素和生還的關係:家庭成員、登船港口(本次雖對其數據整理但沒有探索)等
6.參考資料
- 維基百科:泰坦尼克號
- Kaggle:泰坦尼克號數據集
點擊 Follow 我的GitHub:NameZhangRan
推薦閱讀:
TAG:「泰坦尼克號」沉沒事故 | 泰坦尼克號電影 | 數據分析 |