Python|泰坦尼克號幸存者畫像

01 幸存者

泰坦尼克號的沉沒,是人為的悲劇,1800人罹難者近70%,讓我們一起來看看泰坦尼克號的幸存者都有哪些特征吧。

先給出分析框架

  1. 一切的分析都建立在數(shù)據(jù)清洗之后
  2. 幸存率的分析非常重要,下面將按性別、年齡、倉位、登船碼頭4個維度分別觀察與幸存率的關系
  3. 然后按照倉位+性別、倉位+年齡段、年齡段+性別3個二維組合維度觀察與幸存率的關系
  4. 最后按倉位+性別+年齡段這個三維組合維度觀察與幸存率關系

想知道在泰坦尼克號事故中活下來的人的特征么?

一起來看看吧。

02 數(shù)據(jù)清洗

一切分析的前提,都是干凈可靠的數(shù)據(jù),所以我們先來觀察一下數(shù)據(jù)情況,進行數(shù)據(jù)清洗。

查看數(shù)據(jù)三步走

  1. 數(shù)據(jù)大小 df.shape
  2. 字段類型及缺失值
  3. 數(shù)據(jù)頭尾行

使用df.shape查看數(shù)據(jù)大小,使用df.info()查看數(shù)據(jù)字段類型和缺失值情況。

  • 891行,12列,占據(jù)空間84kB
  • Age字段有20%的缺失,年齡是乘客的重要參數(shù),后續(xù)會補全
  • Cabin字段有70%的缺失,船艙號碼不是重要參數(shù),考慮暫不分析該字段

df.head(), df.tail()查看數(shù)據(jù)頭尾行情況

各字段解釋如下:

  • PassengerId: 乘客的id
  • Survival: 是否幸存 0 = No, 1 = Yes
  • Pclass: 艙位 class 1 = 1st, 2 = 2nd, 3 = 3rd
  • Name: 姓名
  • Sex: 性別
  • Age: 年齡
  • SibSp: 船上兄弟姐妹以及配偶的個數(shù)
  • Parch: 船上父母以及子女的個數(shù)
  • Ticket: 船票號碼
  • Fare: 票價
  • Cabin: 船艙號碼
  • Embarked: 登船碼頭 C = Cherbourg, Q = Queenstown, S = Southampton

補全缺失值

Age字段是乘客的重要參數(shù),需要補全。

可不能直接填充0,或者某個數(shù)去補全整個數(shù)據(jù)哦,這樣做很危險,數(shù)據(jù)源會失去客觀性!

那怎么辦呢?考慮到不同性別的年齡層不同,不同倉位(可以理解為社會等級)的年齡層也不同,我們可以這樣做:

以性別+倉位將數(shù)據(jù)分組,用每組的中位數(shù)去補全各組的空值

#讀取原始數(shù)據(jù)
titanic=pd.read_csv(r'D:\DataScience\python\python_course\titanic.csv',sep=';')

# 分組計算不同倉位、性別的年齡中位數(shù),得到一個Series數(shù)據(jù),索引為Pclass、Sex
age_median3=titanic.groupby(["Pclass","Sex"]).Age.median()
titanic.set_index(["Pclass","Sex"],inplace=True)

# 使用fillna補全空值,將根據(jù)索引進行補全
titanic.Age.fillna(age_median3,inplace=True)
titanic.reset_index(inplace=True)

titanic.Age.describe()

這樣一波操作之后,Age字段有891個非空值,已經(jīng)被補全。

03 數(shù)據(jù)挖掘

現(xiàn)在我們已經(jīng)得到一分干凈的數(shù)據(jù)集了,可以開動啦!

是什么因素影響了乘客的幸存率呢?

3.1 按性別、年齡段、倉位、登船碼頭4個維度分別觀察與幸存率的關系
  • 倉位-幸存率
# 數(shù)據(jù)透視表
titanic.pivot_table(values="Survived",index="Pclass",aggfunc="mean")

#可視化呈現(xiàn)
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字段是一個連續(xù)變量而不是分類變量,我們需要將Age字段離散化之后再進行分析。

# 連續(xù)變量離散化:將某個變量的所在區(qū)間分割為幾個小區(qū)間,落在同一個區(qū)間的觀測值用同一個符號表示
titanic["Ageband"]=pd.cut(titanic["Age"],5)

現(xiàn)在我們給titanic這個dataframe新增了一列“Ageband”,它代表Age字段所在的年齡段

# 可視化
sns.barplot(data=titanic,x="Ageband",y="Survived",ci=None)
plt.xticks(rotation=60)

低年齡段生存率最高,64歲以上老人生存率最低,青壯年次之,看來大家還是很有愛的——小朋友先救,青壯年讓位,老人可能體力不支或自動放棄。

  • 登船碼頭-幸存率
# 用groupby也可實現(xiàn)數(shù)據(jù)透視表
titanic[["Embarked","Survived"]].groupby("Embarked").mean()

sns.barplot(data=titanic,x="Embarked",y="Survived",ci=None)

C碼頭登船的幸存率最高,為什么呢?我們來看看各碼頭登船乘客的倉位情況

# 數(shù)據(jù)透視表
titanic.pivot_table(values="Name",index="Pclass",columns="Embarked",aggfunc="count")
  • S碼頭登船人數(shù)最多,大部分是3等倉位
  • Q碼頭登船的人90%以上是3等倉位
  • C碼頭登船的人半數(shù)是1等倉位,數(shù)據(jù)來看1等倉位的幸存率較高,因此C碼頭登船的人幸存率較高可解釋
  • 看來C碼頭主要是有錢人登船,S碼頭就主要是窮人了
3.2 按照倉位+性別、倉位+年齡段、年齡段+性別觀察與幸存率的關系
  • 倉位+性別-幸存率
# 數(shù)據(jù)透視表走起,以數(shù)字形式觀察結果
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等倉位生存率最低;

低年齡段的生存率逐次高于高年齡段;

在考慮各分組生存率的同時,要考慮各分組人數(shù),比如該分組并沒有人,那么生存率自然是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等倉位的幸存率。這張表各可能會讓你暈暈的,那么我們就可視化呈現(xiàn)吧。

"""各性別下,倉位+年齡段與幸存率關系"""

# 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等倉位女性比較慘一點。

  • 倉位+登船碼頭+性別
# 直接可視化呈現(xiàn)吧
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碼頭男乘客數(shù)量較少?

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的現(xiàn)象。

04 預告

本次針對泰坦尼克號乘客數(shù)據(jù),我們分析了幸存者的特征畫像:

女性,兒童,頭等艙,紳士風度

本次未對數(shù)據(jù)的直系、旁系親屬個數(shù)進行分析,下期考慮加入。

本次主要使用了數(shù)據(jù)透視表和seaborn包繪圖呈現(xiàn)結果,下期考慮加入特征工程對數(shù)據(jù)進一步分析。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容