You Jump, I Jump? (上)

筆者最近脫離苦海,工作生活總算變得好平衡一點,於是無聊逛逛Kaggle.com,看看有什麼最新的數據分析的比賽進行中,我左看右看上看下看,每一個的比賽都不簡單(歌聲),直到我看到Titanic......



我就停下來,心裡在想當年鐡達尼也有數據嗎?Come On James,原來真的是有的,好吧,我投降了。再仔細看看,原來這個比賽的目的是想讓初學者學習和應用Machine Learning的技術,所以比賽的結束時間才會截至2020年,嚴格來說這算不上是比賽,不過也沒有所謂了,反正我是因為主題而衝著來的,相信大家都知道鐡達尼下沉的故事,由於那次的意外實在太震撼,後來也拍成一部電影,從來沒有看過的朋友不用擔心,谷阿莫會用5分鐘的時間,讓你清楚來龍去脈,科科。


Source: YouTube (主頻道【谷阿莫】)


首先我們有兩組數據(Data Source: https://www.kaggle.com/c/titanic / https://www.encyclopedia-titanica.org/),一組是已知生死的乘客的資料,主要用來訓練模型的數據,另外一組是生死未卜的乘客資料(不包括船員,船長),那現在要幹嗎了?沒錯,這次研究的目的有兩部分:(1) 用數據來描繪出當時的情況,(2)估計在這次事件中當時的乘客能否存活。為避免文章太冗長,現在這篇文章只包含上半部分的分析,下半部分則在另一篇文章繼續討論。

可能你沒有想過我們能透過電腦,便可以達到這個目的。站在Machine Learning的角度看,這是一個分類(Classification)的問題,從已知的數據學習,並對新的數據推算某乘客能夠存活(Survived)或者是不幸逝世(Not Survived)。我們先了解和分析一下當時的環境和存活的因素,好讓我們做一個更準的模型。




乘客們來自?
當時乘坐鐡達尼號的乘客有1309人,其25%是坐頭等艙,其餘21%和54%分別在二等和三等艙。 船上大部分也是男性(843人),而女性只有466人,年齡層的分佈(如下圖)大多是21-30的成年人,有20%的乘客年齡為不詳。

誰更喜歡和親人共享天倫之樂?
大多數人都是沒有親友或者伴侶陪同之下上船的,筆者好奇觀察一下他們的年齡,發現1個只有5歲大的小女孩沒有家人陪伴下上船,真是人細鬼大啊!正當我以為的小屁孩有我們這一代那麼開放早熟嗎,沒有父母陪伴的小孩居然能獨自去偷歡,才發現原來保姆是不算是父母,看來這是一場美麗的誤會。

發現女性更傾向和親友和家人在船上共享天倫之樂,而男性卻偏向獨自一人或友伴登船的。我亦透過T-test (significant level = 0.01) 去證實這個觀點,女乘客會相比起男的有更多的家人陪同。
登船的地點跟艙位等級有關係?
登船的位置有3個埠,分別為C, Q, S,七成的人是由S點上船,而C點的乘客雖然相對地少,但他們所買的船票價錢平均是昂貴一點,因為頭等的船票售價當然比較貴,而超過一半的頭等客都會在C埠。另外,幾乎全部二等艙的乘客都來自Q埠,三等的來自S埠。

誰能生存到最後?
由於我們沒法單憑存活人數來判斷男性或是女性的生存機會高一點,因為男女人數本來就不相等,沒法做出對等的比較。因此,筆者會使用存活率(%),$p_{survival}$來作為表示某一團人的存活機會。

$$p_{survival} = \frac{n_{survival}}{n_{total}}$$


頭等艙較易生存?
很明顯的,頭等生存機會比起其餘兩等來得高,看來真是一分錢一分貨這句話是真的,這是一個頗有趣的發現,至於是甚麼原因令大部分頭等艙的遇難者都能逃過鬼門關,筆者也感到十分的好奇,或許真是錢作怪,也可能頭等艙的位置比較有利生存,始終二等和三等艙人員都被困在船底,當時鐵達尼更斷開兩節,後半部分先沉,從數據來看除了女性,大部的男性也逃不掉了這次災難。下圖為船身構造,頭等(紅)二等(綠)三等艙(藍)的位置作為參考。




Source: South China Morning Post


至於倖存的女性和小孩亦比男性成人來得多,這並不意外,因為當時的救生艇是有限的
這些有限的位置都留給小朋友和女性,他們因而避過一劫,至於未能上救生艇的受難者,需要在極低温的海水裡掙扎求存,生物學上,女性皮下脂相對豐富,在這個極端環境相對容易適應並活下來。所以無奈地只有19%男性倖免,某程度上他們的犧牲救了較弱少的人,無論如何都是遺憾和值得後人們尊敬。


Survival Rate against demographic data


Data Transformation
先了解一下數據中的Attribute以及其型態,Survived這個attribute的值雖然是1,0,但並不代表它是Numeric Type,因為它的數值大小不能反應程度,Survived是不會出現0.5,就算那人受傷半死均為存活,Survived值依舊是1。在Programming上,它可被為boolean (只有true & false),而在建立模型時,它其實是屬於Nominal Variable,即是Class Variables的其中一種型式。由於Carbin這個變數實在太多缺失值,所以可以放棄和忽略這個沒有太多資訊的變數。



PassengerId
Pclass
Name
Sex
Age
SibSp
Parch
Ticket
Fare
Cabin
Embarked
Survived
Unique Key
Class
Text
Class
Numeric
Numeric
Numeric
Class
Numeric
Class
Class
Class


從上表我們可見有一些Attribute是屬於Class Variables,例如性別,乘客座位的等級或是登船的碼頭.因為它們並不是數字,我們沒法直接把它們放進Model裡面,要先把這些Variables轉換成數個Dummy Variables,其數值只有1或0 (True/False),用登船的埠作為例子,先設3個Dummy Variables為"C埠上船","Q埠上船"和"S埠上船",如果某一位乘客由C埠上船,即是他/她絕不會在Q埠或S埠上船,換句話說"C埠上船"的數值應是1 (True),而"Q埠上船"和"S埠上船"則是0 (False),把這個方法應用在全部乘客中,3個新的Columns從而誔生出來。由此,所有的Class Variables都會被轉化為Dummy Variables:


Pclass
class_1
class_2
class_3









Sex
male
female











Ticket
A_ticket
C_ticket
CA_ticket
FC_ticket
numeric_ticket
Others_ticket
PC_ticket
PP_ticket
SC_ticket
SO_ticket
SOTON_ticket
STON_ticket
W_ticket
Embarked
Embarked_C
Embarked_Q
Embarked_S












Correlation
為了更了解每個變數之間的關係,有沒有正比或者反比的關係,每一對的Correlation Coefficient會放在一個Table裡面(如下圖),唯有把一些有顯住的正比或反比關係的變數列出來。由於乘客的名字和票號沒有特別的意思,所以不把其放在考慮為因素。

由於AGE(年齡)有263個缺失值,直接把整條記緑刪去,即是刪走四分之一的數據,這個做法後果是失去很多資訊,為了同時保留這些資訊,我們把已知AGE取一個平均值填補這些空格,使我們能快速且有效地計算與其他因素的Correlation,當然這個估算的方法假設了這些缺失值的平均值和已知值的為相同。

由於只有training data才有Survival這個變數,我先用891個數據來計算Correlation Coefficient,並把結果放在上表,藍色代表有明顯的正比關係,而紅色則有反比的,愈深色意味著效果愈明顯。而下表,如果相關係數在T-test中檢定為顯著地有正反比的關係(99% significant level)。


Correlation Coefficient of Training Data


先前我把每個Class Variable都分成Dummy Variables,而這些變數之間的Correlation Coefficient可以不用理會,它們一定呈現反比的關係,對於一位乘客而言,它們的值不可能同時等於1,當其中一個Dummy Variable等於1的時侯 (e.g. male),除非你是人妖,偽娘,另外的Variable (e.g. female)便會等於0。至於年齡這個變數跟頭等艙和船票費用有著較強的正比關係;跟親友的數量成反比,這可解釋為年紀愈大的乘客都偏向較願意花錢享受更佳的服務和較少的親友陪同. 至於兄弟姐妹/伴侶的數目和父母/子女的數目以及女性有一個正比關係,這個結果跟先前的推論是一致的。而費用則是和女性,親友數目和頭等艙成正比,看來女乘客對服務質素比價錢更加重要。最後,C,Q和S埠分別和頭等,三等,二等艙的乘客成正比,和之前的觀察結果也是一致的。


正因為不知道Testing Data會否跟Training Data有很大的偏差,把所有1309個數據重新計算一次(看下圖),Testing Data沒有Survival的變數,所以不會把它包括在內,結果是沒有太大的變化,照這樣看,Training Data和Testing Data並太大的Sequential dependency出現。


Correlation Coefficient of Training & Testing Data (Ignore variable: Survival)


如果讀者們對Predictive Model有感興趣的話,那麽敬請等待下一篇的文章吧!沒有的話也非常感謝你的時間!

======================================== 前部分已完 ========================================

P.S. 由於數據來源來自Kaggle,未能驗證數據的真確和全面性,是否合乎當時實際的環境,因此在這個研究裡假設得來的數據是真確無誤和沒有缺失的。


Comments

Popular posts from this blog

Boosting vs Bagging? 別再胡亂用了!

機器學習之陷阱 - Imbalance Class Classification

Excel VBA - 自動生成分析報告