「一起學」Udaicty 數據分析(入門)P2 項目總結

失蹤人口回歸了~

是的~你沒看錯,遲早會更新專欄終於更新了,經歷了搬家、業務線調整,上完李叫獸的課後,又順手去 Udacity 修了數據分析(入門)課程和機器學習(進階)。真心沒有時間啊~ 順利三個月完成了 Udacity 的數據分析課程~ 學完後開始擼機器學習了~不過因為學習的過程比較快,所以想通過寫文章的方式重新過一下所學的東西,夯實下~ 如果有任何疑問也歡迎留言~ 最後,最重要的就是如果你也想在 Udacity 學習數據分析或者機器學習的話,可以輸入這個優惠碼哦:28716825 ,便宜300塊~


P2 項目背景

完成了 P1項目後,我就從統計學課程轉移到 Python 課程,課程期間學習使用 Python 庫 NumPy、Pandas 以及 Matplotlib。

所以 P2 階段項目當然就是要使用 Pandas 和 NumPy 做啦~ 在 P2 項目中,我需要從兩個數據集中選擇一個來分析,最後我選擇了網上比較流行的泰坦里克號數據。我需要通過分析數據,調查哪些因素會讓船上的人生還率更高?


一、基本信息

本次分析的數據,來源於 Kaggle 網站上的泰坦尼克號生還者數據。包括泰坦尼克號上 2224 名乘客和船員中 891 名的人口學數據和乘客基本信息。

從 Kaggle 網站上可以得到船上每位旅客的特徵:

  • Survived:是否存活(0代表否,1代表是)
  • Pclass:船票等級(1代表貴賓倉,2代表商務倉,3代表底經濟倉)
  • Name:船上乘客的名字
  • Sex:船上乘客的性別
  • Age: 船上乘客的年齡
  • SibSp:乘客在船上的兄弟姐妹和配偶的數量
  • Parch:乘客在船上的父母以及小孩的數量
  • Ticket:乘客船票的編號
  • Fare:乘客為船票支付的費用
  • Cabin:乘客所在船艙的編號
  • Embarked:乘客上船的港口(C 代表從 Cherbourg 登船,Q 代表從 Queenstown 登船,S 代表從 Southampton 登船)

二、確定問題

希望通過數據分析出「哪些因素會讓船上的人生還率更高?」

三、數據加工

import numpy as npnimport pandas as pdnfrom IPython.display import displaynimport matplotlib.pyplot as pltn%matplotlib inlinenfrom collections import Counternnimport seaborn as snsnsns.set(color_codes=True)nn# 載入數據集nin_file = titanic-data.csvnfull_data = pd.read_csv(in_file)nn# 預覽下前幾項乘客數據ndisplay(full_data.head())n

上述代碼運行結果

# 我們發現像在 Cabin 里的數據有 NaN 的數據,使用 .isnull() 來看看有多少預設數據。nn#data.isnull().sum()將缺失項的數據全部加起來nprint(full_data.isnull().sum())n

上述代碼運行結果

# Age、Cabin 和 Embarked 有缺失,特別是 Cabin,雖然船艙編號可以反映船艙所處的位置,但是預設太多。n# 而且在缺少泰坦尼克號設計圖的情況下,此欄位對我幫助不大,所以決定刪除 Cabin 欄位。nnclean_data = full_data.drop([Cabin], axis=1)nn# 對於 Age 的處理就比較麻煩了,按照常識估計,年齡對於生還率影響肯定非常大,當然不能刪除此欄位。n# 所以基於此,我決定使用隨機值的方式填充預設值。同時考慮到隨機值的合理性。n# 我決定從(均值 - 標準差)和(均值 + 標準差)之間取隨機值:nnaverage_age_clean_data = clean_data["Age"].mean()nstd_age_clean_data = clean_data["Age"].std()ncount_nan_age_clean_data = clean_data["Age"].isnull().sum()nnrandonNum = np.random.randint(average_age_clean_data - std_age_clean_data, average_age_clean_data + std_age_clean_data, size = count_nan_age_clean_data)nn# 將 Age 中的 NaN 替換成隨機值:nnclean_data["Age"][np.isnan(clean_data["Age"])] = randonNumnn# 對於 Embarked 來說,它缺失的比較少,而且此欄位只有三種可能 —— C、Q、S。n# 這裡我採用了偷懶的方法就是將眾數填填充到預設內。n# 找到眾數:nnembarked_mode = full_data["Embarked"].mode()nprint embarked_moden

接著

# 將眾數填充到預設內:nclean_data["Embarked"] = clean_data["Embarked"].fillna("S」)nn# 最後看看清洗過後的數據nprint(clean_data.isnull().sum())n

上述代碼運行結果

清洗完數據後,我們就可以進入探索數據階段。

四、探索數據

此部分開始我們通過數據可視化的方式,分析「哪些因素會讓船上的人生還率更高?」

4.1 考慮年齡因素

# 先看看整體數據的年齡分布情況:nnclean_data[Age].hist(bins=40)nplt.title(Distribution of Age)nplt.xlabel(Age)nplt.ylabel(Number of people)n

上述代碼運行結果

# 從圖中可以得出,大部分的乘客是 20 ~ 35歲。nn# 我們再來看看不同年齡段的乘客的獲救情況:nnnonsurv_age = clean_data[clean_data[Survived] == 0][Age]nsurv_age = clean_data[clean_data[Survived] == 1][Age]nnplt.hist(nonsurv_age, color = r, alpha=0.8, label = Did not survive)nplt.hist(surv_age, color = g, alpha=0.8, label = Survived)nnplt.title(Number of Survived Passenger and Number of Nonsurvived Passenger)nplt.xlabel(Age)nplt.ylabel(Number of people)n

上述代碼運行結果

從上圖可以看到,20歲以下的乘客獲救人數高於未獲救人數,但是這還不足以完全說明年紀越小生還率越高。我們還需要看看各年齡段的生還率如何。

# 因為年齡是個連續值,所以我們在計算生還率的時候,需要先分組。nbins=np.arange(0,90,10)nclean_data[Age_group] = pd.cut(clean_data[Age], bins)nclean_data.groupby([Age_group,Survived])[Survived].count().unstack().plot(kind=bar,stacked=True)nnplt.title(Distribution of Survived and Nonsurvived by Age Group)nplt.xlabel(Age Group)nplt.ylabel(Number of people)n

上述代碼運行結果

#計算每組的生還率nnclean_data.groupby(Age_group)[Survived].mean().plot(kind=bar)nnplt.title(Survival rate by Age Group)nplt.xlabel(Age Group)nplt.ylabel(Number of people)n

上述代碼運行結果

從上圖可以看到,0 到 10 歲年齡段的人生還率遠高於其他年齡段的人。所以我們可以得出第一個解決:年紀對獲救的概率有影響。

4.2 考慮船票等級因素

我們再來看看等級因素對獲救率的影響。

首先我們統計下各等級的船艙的人數,以及獲救人數和未獲救人數。

####################################n# 第二次提交 #n####################################nn#根據評審建議,將上述代碼寫成函數方便後續調用。ndef survival_count(key):n clean_data.groupby([key,Survived])[Survived].count().unstack().plot(kind=bar,stacked=True)n plt.ylabel(Count)n plt.title(Number of Survived Passenger Number by {}.format(key))nn# 調用nsurvival_count(Pclass)n

上述代碼運行結果

#同時再將生還率的計算改寫成函數。ndef survival_rate(key):n clean_data.groupby(key)[Survived].mean().plot(kind=bar)n plt.ylabel(Survival rate)n plt.title(Survival rate by {}.format(key))nn# 調用nsurvival_rate(Pclass)n

上述代碼運行結果

由上方柱圖可以看出,一等艙的獲救率高於其他等級的船艙,且從圖中可以看出獲救率隨等級的降低而降低。所以我們可以得出一個結論就是:船艙等級越高獲救的概率越高。

4.3 考慮性別因素

最後我們再來看看性別因素對獲救的率的影響。

首先我們來統計下男、女人數和獲救及未獲救人數。

# 調用前面所寫函數nsurvival_count(Sex)n

上述代碼運行結果

由上方的堆疊柱狀圖可以看出,女性的獲救比例較高,所以性別也會對獲救率有影響。

# 再來看看獲救率情況nnsurvival_rate(Sex)n

上述代碼運行結果

由上方的柱狀圖可以看出,女性的獲救率遠高於男性。所以我們可以得出:女性獲救率高於男性

4.4 綜合考慮船艙等級和性別因素

clean_data.groupby([Pclass, Sex]).count()[Survived].unstack().plot(kind=bar)nplt.ylabel(Count)nplt.title(Number of passenger by Pclass and Sex)n

上述代碼運行結果

# 我們再來看看生還率情況nclean_data.groupby([Pclass, Sex]).mean()[Survived].unstack().plot(kind=bar)nplt.ylabel(Survival Rate)nplt.title(Survival rate of passenger by Pclass and Sex)n

上述代碼運行結果

由上方的柱狀圖可以看出,一等艙的女性的獲救率遠高於男性。

五、總結

總結上述分析,我們可以得出以下三個結論:

  1. 年齡對獲救率有影響,一般兒童的獲救率比較高。
  2. 船艙等級對獲救率有影響,等級越高獲救率越高。
  3. 性別對獲救有影響。女性獲救率高於男性。

但是我們也要看到這些結論背後的限制:

  1. 樣本是從鐵達尼號災難中 2224 名乘客和船員中 891 名,樣本容量足夠。
  2. 第一條結論中的 Age 欄位預設較多,我是通過從(均值 - 標準差)和(均值 + 標準差)之間取隨機值的方式填充預設數值,這樣不一定能夠很好地反應事實。
  3. 在探索年齡對生還情況的影響的時候,發現 50 ~ 60 歲這個年齡段的生還率出現一些異常,其生還率比 20 ~ 30 歲的年輕人還要高。懷疑還有一些數據集中不存在的其他變數也會對存活率有影響。

推薦閱讀:

怎樣發揮你在團隊中的優勢?
To Be A Product Manager | Week 46
To Be A Product Manager | Day 71
隱喻(產品設計的思考方式_臨界點_連載11)
To Be A Product Manager | Week 32

TAG:数据分析 | 优达学城Udacity | 产品经理 |