Python|泰坦尼克號倖存者畫像
01 倖存者
泰坦尼克號的沉沒,是人為的悲劇,1800人罹難者近70%,讓我們一起來看看泰坦尼克號的倖存者都有哪些特徵吧。
先給出分析框架
- 一切的分析都建立在資料清洗之後
- 倖存率的分析非常重要,下面將按性別、年齡、倉位、登船碼頭4個維度分別觀察與倖存率的關係
- 然後按照倉位+性別、倉位+年齡段、年齡段+性別3個二維組合維度觀察與倖存率的關係
- 最後按倉位+性別+年齡段這個三維組合維度觀察與倖存率關係
想知道在泰坦尼克號事故中活下來的人的特徵麼?
一起來看看吧。
02 資料清洗
一切分析的前提,都是乾淨可靠的資料,所以我們先來觀察一下資料情況,進行資料清洗。
檢視資料三步走
- 資料大小 df.shape
- 欄位型別及缺失值
- 資料頭尾行
使用df.shape檢視資料大小,使用df.info()檢視資料欄位型別和缺失值情況。
- 891行,12列,佔據空間84kB
- Age欄位有20%的缺失,年齡是乘客的重要引數,後續會補全
- Cabin欄位有70%的缺失,船艙號碼不是重要引數,考慮暫不分析該欄位
df.head(), df.tail()檢視資料頭尾行情況
各欄位解釋如下:
- PassengerId: 乘客的id
- Survival: 是否倖存 0 = No, 1 = Yes
- Pclass: 艙位 class 1 = 1st, 2 = 2nd, 3 = 3rd
- Name: 姓名
- Sex: 性別
- Age: 年齡
- SibSp: 船上兄弟姐妹以及配偶的個數
- Parch: 船上父母以及子女的個數
- Ticket: 船票號碼
- Fare: 票價
- Cabin: 船艙號碼
- Embarked: 登船碼頭 C = Cherbourg, Q = Queenstown, S = Southampton
補全缺失值
Age欄位是乘客的重要引數,需要補全。
可不能直接填充0,或者某個數去補全整個資料哦,這樣做很危險,資料來源會失去客觀性!
那怎麼辦呢?考慮到不同性別的年齡層不同,不同倉位(可以理解為社會等級)的年齡層也不同,我們可以這樣做:
以性別+倉位將資料分組,用每組的中位數去補全各組的空值
#讀取原始資料 titanic=pd.read_csv(r'D:\DataScience\python\python_course\titanic.csv',sep=';') # 分組計算不同倉位、性別的年齡中位數,得到一個Series資料,索引為Pclass、Sex age_median3=titanic.groupby(["Pclass","Sex"]).Age.median() titanic.set_index(["Pclass","Sex"],inplace=True) # 使用fillna補全空值,將根據索引進行補全 titanic.Age.fillna(age_median3,inplace=True) titanic.reset_index(inplace=True) titanic.Age.describe()
這樣一波操作之後,Age欄位有891個非空值,已經被補全。
03 資料探勘
現在我們已經得到一分乾淨的資料集了,可以開動啦!
是什麼因素影響了乘客的倖存率呢?
3.1 按性別、年齡段、倉位、登船碼頭4個維度分別觀察與倖存率的關係
- 倉位-倖存率
# 資料透視表
titanic.pivot_table(values="Survived",index="Pclass",aggfunc="mean")
#視覺化呈現
sns.barplot(data=titanic,x="Pclass",y="Survived",ci=None)
果然,倉位等級越高,倖存率也越大,可能是由於高等倉位更遠離水面,乘客也更少,有更多的逃生機會吧。
- 性別-倖存率
titanic.pivot_table(values="Survived",index="Sex",aggfunc="mean")
sns.barplot(data=titanic,x="Sex",y="Survived",ci=None)
女性倖存率明顯高於男性,紳士風度在死亡面前依然存在,讓人感動。
- 年齡段-倖存率
Age欄位是一個連續變數而不是分類變數,我們需要將Age欄位離散化之後再進行分析。
# 連續變數離散化:將某個變數的所在區間分割為幾個小區間,落在同一個區間的觀測值用同一個符號表示
titanic["Ageband"]=pd.cut(titanic["Age"],5)
現在我們給titanic這個dataframe新增了一列“Ageband”,它代表Age欄位所在的年齡段
# 視覺化
sns.barplot(data=titanic,x="Ageband",y="Survived",ci=None)
plt.xticks(rotation=60)
低年齡段生存率最高,64歲以上老人生存率最低,青壯年次之,看來大家還是很有愛的——小朋友先救,青壯年讓位,老人可能體力不支或自動放棄。
- 登船碼頭-倖存率
# 用groupby也可實現資料透視表
titanic[["Embarked","Survived"]].groupby("Embarked").mean()
sns.barplot(data=titanic,x="Embarked",y="Survived",ci=None)
C碼頭登船的倖存率最高,為什麼呢?我們來看看各碼頭登船乘客的倉位情況
# 資料透視表
titanic.pivot_table(values="Name",index="Pclass",columns="Embarked",aggfunc="count")
- S碼頭登船人數最多,大部分是3等倉位
- Q碼頭登船的人90%以上是3等倉位
- C碼頭登船的人半數是1等倉位,資料來看1等倉位的倖存率較高,因此C碼頭登船的人倖存率較高可解釋
- 看來C碼頭主要是有錢人登船,S碼頭就主要是窮人了
3.2 按照倉位+性別、倉位+年齡段、年齡段+性別觀察與倖存率的關係
- 倉位+性別-倖存率
# 資料透視表走起,以數字形式觀察結果
titanic.pivot_table(values="Survived",index="Pclass",columns="Sex",aggfunc="mean")
# seaborn作圖走起,以影象形式觀察結果
sns.barplot(data=titanic,x="Pclass",y="Survived",hue="Sex",ci=None)
男性倖存率普遍低於女性,這難道是傳說中的紳士風度在起作用?
高等倉位倖存率高於低等倉位,一方面可能是因為高等倉位在上層,淹水較慢,逃生時間夠長,另一方面可能是人為因素,高等倉位更受照顧;
一二等倉的女性倖存率很高啊,二三等倉的男性倖存率極低。
- 倉位+年齡段-倖存率
sns.pointplot(data=titanic,x="Ageband",y="Survived",hue="Pclass",ci=None)
plt.xticks(rotation=60)
各年齡段1等倉位的生存率最高,3等倉位生存率最低;
低年齡段的生存率逐次高於高年齡段;
在考慮各分組生存率的同時,要考慮各分組人數,比如該分組並沒有人,那麼生存率自然是0,但我們並不能說該分組生存率最低。
- 性別+年齡段-倖存率
titanic.pivot_table(values="Survived",index="Ageband",columns="Sex",aggfunc="mean")
sns.barplot(data=titanic,x="Ageband",y="Survived",hue="Sex",ci=None)
# 設定橫軸標籤位置
plt.xticks(rotation=60)
男性生存率明顯偏低與女性,女性高年齡段的生存率逐次高於低年齡段的。
3.3 三維分析
前面的分析從一維、二維角度分析了因素與倖存率的關係,下面我們直接從三維因素來分析。
- 年齡段+性別+倉位
titanic.pivot_table(values="Survived",index="Ageband",columns=["Sex","Pclass"],aggfunc="mean")
輸出結果展示了各年齡段下,各性別分別在123等倉位的倖存率。這張表各可能會讓你暈暈的,那麼我們就視覺化呈現吧。
"""各性別下,倉位+年齡段與倖存率關係"""
# aspect設定畫布長寬比
# palette設定hue分組的顏色
sns.FacetGrid(data=titanic,row="Sex",aspect=1.5)\
.map(sns.pointplot,"Ageband","Survived","Pclass",palette="deep",ci=None)\
.add_legend()
plt.xticks(rotation=60)
男性低年齡段倖存率最高,高等倉位倖存率更高;
中老年女性倖存率最高,1、2等倉位的女性倖存率幾乎達到100%,3等倉位女性比較慘一點。
- 倉位+登船碼頭+性別
# 直接視覺化呈現吧
sns.FacetGrid(data=titanic,col="Pclass",row="Embarked")\
.map(sns.barplot,"Pclass","Survived","Sex",hue_order=["male","female"],palette="deep",ci=None)\
.add_legend()
不論從登船碼頭還是倉位來看,女性倖存率普遍高於男性;
按性別來看,高等倉位倖存率高於低等倉位;
Q碼頭登船的男乘客生存率最低,我們來看看是不是Q碼頭男乘客數量較少?
titanic.pivot_table(values="Survived",index="Embarked",columns="Sex",aggfunc="count")
Q碼頭登船男乘客多於女乘客,但幾乎都罹難了,為什麼呢?我們來看看男乘客的倉位、年齡段分佈情況,是不是這些情況導致了男乘客生存率較低.
titanic.pivot_table(values="Survived",index=["Embarked","Pclass"],columns=["Sex","Ageband"],aggfunc="count")
Q碼頭登船的男乘客,絕大部分處於16-32歲,3等倉位,這個分段的乘客倖存率是最低的,解釋了為什麼Q碼頭登船的男乘客倖存率趨於0的現象。
04 總結
本次分析針對泰坦尼克號乘客資料,我們分析了倖存者的特徵畫像:
女性,兒童,頭等艙,紳士風度
本次未對資料的直系、旁系親屬個數進行分析,下期考慮加入。
本次主要使用了資料透視表和seaborn包繪圖呈現結果,下期考慮加入特徵工程對資料進一步分析。