泰坦尼克號的沉沒是歷史上最著名的沉船事件之一。 1912 年 4 月 15 日,鐵達尼號在與冰山相撞後沉沒。不幸的是,船上的每個人都沒有足夠的救生艇,導致 2224 名乘客和船員中有 1502 人死亡。
雖然生存中涉及到一些運氣因素,但似乎有些人比其他人更有可能生存。
使用機器學習創建一個模型,預測什麼樣的人更有可能在鐵達尼號沉船中生存下來。
gender_submission.csv :提交的結果文件示例
Index
Meaning
PassengerID
乘客編號
Survived
生存與否(1-生存,0-死亡)
Pclass
船艙等級(1/2/3等艙)
Name
乘客姓名
Sex
性別(male-男性;female-女性)
Age
年齡
Parch
父母/小孩人數
SibSp
兄弟姐妹/配偶人數
Ticket
船票編號
Fare
票價
Cabin
船艙號
Embarked
登船地(C = Cherbourg, Q = Queenstown, S = Southampton)
Index
Meaning
1
頭等
2
二等
3
三等
Index
Meaning
C
C=Cherbourg(法國 瑟堡市)
Q
Q=Queenstown(愛爾蘭 昆士敦)
S
S=Southampton(英國南安普頓)
贰、Exploratory Data Analysis (EDA) & Feature Engineering
利用.isnull().sum()查看缺失值,確認Survived有 418 個缺失值、Age有263個缺失值、Fare有1個缺失值、Cabin有1014 個缺失值、Embarked有2個缺失值。
二、Pclass(艙位)與Survived(生存率)的關係:
使用sns.barplot()繪製Pclass(艙位)與Survived(生存率)的關係,可以看出頭等艙的生存率最高,反映出身分地位越高,能享有的服務品質會更好,遇難時會有一定優勢。
繪製 Pclass(艙位)與Survived(生存率)的關係 - (圖2)
三、Sex(性別)與Survived(生存率)的關係:
使用sns.barplot()繪製Sex(性別)與Survived(生存率)的關係,可以看出女性的生存率明顯高於男性,說明歐洲的人們普遍秉持著女士優先的傳統。
繪製Sex(性別)與Survived(生存率)的關係 - (圖3)
四、SibSp(兄弟姐妹/配偶人數)與 Survived(生存率)的關係:
使用sns.barplot()繪製SibSp(兄弟姐妹/配偶人數)與Survived(生存率),可以看出人數少的生存率較高。
繪製SibSp(兄弟姐妹/配偶人數)與Survived(生存率)的關係 - (圖4)
五、Parch(父母/小孩人數)與Survived(生存率)的關係:
使用sns.barplot()繪製Parch(父母/小孩人數)與Survived(生存率),可以看出人數少的生存率較高。
繪製Parch(父母/小孩人數)與Survived(生存率)的關係 - (圖5)
使用.value.counts()計算Embarked(登船地)的’S’、’C’、’Q’資料數量,確認’S’最多,並將2個缺失值填入'S'。
Embarked(登船地)’S’、’C’、’Q’資料數量 - (圖6)
七、Embarked(登船地)與Survived(生存率)的關係:
使用sns.barplot()繪製Embarked(登船地)與Survived(生存率),可以看出Embarked(登船地)’C’的生存率最高。
繪製Embarked(登船地)與Survived(生存率)的關係 - (圖7)
使用sns.barplot()查看Pclass(船艙)和Embarked(登船地)與Fare(票價)的關係。
Pclass(船艙)的頭等艙與Fare(票價)最有關係 - (圖8)
Embarked(登船地)’S’與Fare(票價)最有關係 - (圖9)
將Pclass(船艙)為'1'且Embarked(登船地)為'S'的Fare(船票)的資料的平均值,填補到Fare(船票)的缺失值資料裡。
九、Fare(票價)與Survived(生存率)的關係:
使用sns.FacetGrid()繪製Fare(票價)與Survived(生存率)的關係。
繪製Fare(票價)與Survived(生存率)的關係 - (圖10)
使用.split()將名字分割為姓氏,新增 Title 欄位並使用.map()依照姓氏的相關意思進行分類,將相同姓氏做資料合併。
姓氏
意思
Mr.
Mister,先生
Miss
對未婚婦女用
Mlle
小姐
Master
傭人對未成年男少主人的稱呼
jonkheer
貴族
Mme
Madame的簡寫,夫人
Ms.或Mz
稱呼婚姻狀態不明的婦女
Mrs.
Mistress,太太/夫人
Don
先生(至於男士名字前的尊稱)
The Countless
女伯爵
Dona
西班牙語對女子的稱謂,相當於Lady
Lady
女士,指成年女子
Capt
Captain,隊長
Sir
閣下、爵士、先生
Col
Colonel,上校
Major
有少校人意思
Dr.
Doctor,醫生/博士
Rev.
Reverend,用於基督教的牧師
分類
姓氏
Mr
Mr
Miss
Mlle, Miss
Master
Master, Jonkheer
Mrs
Mme, Ms, Mrs
Royalty
Don, the Countess, Dona, Lady,Sir
Officer
Capt, Col, Major, Dr, Rev
十一、 Title欄位與Survived(生存率)的關係
使用sns.barplot繪製Title欄位的姓氏。
十二、Parch(父母/小孩人數)和SibSp(兄弟姐妹/配偶人數)資料處理
新增familyNum欄位,將Parch(父母/小孩人數)和SibSp(兄弟姐妹/配偶人數)做資料合併。
使用sns.barplot繪製familyNum與Survived(生存率)的關係,可以看出家族規模為2,3,4時,生存率是最高的。
繪製familyNum與Survived(生存率)的關係 - (圖14)
新增 familySize 欄位,將家族規模生存率接近的資料分類:
家族規模 1,7 生存率接近分為一類,以數字0表示;
家族規模 2,3,4 生存率接近分為一類,以數字1表示;
家族規模 5,6 生存率接近分為一類,以數字2表示。
使用sns.barplot繪製 familySize 與 Survived(生存率)的關係,可以看出家族規模為2,3,4時,生存率是最高的。
繪製 familySize 與 Survived(生存率)的關係 - (圖15)
宣告名為 TicketCountDict 的字典變數,將 Ticket(票號) 資料分類且計算數量,給值到 TicketCountDict 的字典變數裡,並查看 TicketCountDict 資料
繪製TicketCountDict 資料 – (圖16)
在 full 資料集新增欄位 TickCot,使用map()將 TicketCountDict轉換陣列內的元素,給值到新欄位 TickCot,並查看 TickCot 資料。
繪製 TickCot 與 Survived(生存率)的關係,可以看出存活率2,3,4的資料接近,1,5,8的資料接近,6,7,11的資料接近。
繪製TickCot 與 Survived(生存率)的關係 – (圖18)
定義 function 名稱為 TicketCountGroup,將存活率接近的 TickCot 資料做分類,且數值化表示。
新增 TicketGroup 欄位,使用map()將TickCot轉換陣列內的元素,給值到新欄位TicketGroup。
十四、TicketGroup欄位與Survived(生存率)的關係
使用sns.barplot繪製TicketGroup與Survived(生存率)的關係,可以看出分類'0'的生存率最高。
繪製TicketGroup與Survived(生存率)的關係 - (圖20)
可以看出0到10歲和15到40歲這兩個年齡層Survived(生存率)較大,遇難時優先保護小孩子是普遍的價值觀;一般出遊的人年紀落在15到40歲的人數會相對較多,所以Survived(生存率)有集中於15到40歲的趨勢。
繪製Age(年齡)與Survived(生存率)的關係 - (圖21)
將Age,Pclass,Title,TickCot,familyNum,Parch,SibSp 資料給值到變數 AgePre;使用get_dummies(),對變數AgePre進行類別變量轉換為標籤變量。
新增變數AgeCorrDf設為DataFrame的二維資料結構;使用corr()計算AgePre的相關係數求取並給值到變數AgeCorrDf,查看 Age欄位,可以看出Parch、SibSp、Pclass的相關係數較高(取值接近-1,表示反相關,類似反比例函數,取值接近1,表正相關
查看AgeCorrDf的 Age欄位 - (圖22)
分別對Parch、SibSp、Pclass進行get_dummies(),然後給值到變數ParAge、SibAge、PclAge;將資料AgePre、ParAge、SibAge、PclAge 作合併到AgePre。
拆分AgePre資料的Age欄位,分為Features和Label,Features將Age欄位刪除,Label只取Age欄位。
利用RF(RandomForestRegressor)建立模型,使用fit()進行資料預處理,使用score()進行評分;取出AgePre資料age為null的資料,使用drop()將age欄位刪除,製作生成Prediction使用的Features。
取出AgePre資料age為null的資料,使用drop()將age欄位刪除,製作生成Prediction使用的Feature,使用predict()預測Age,將預測 Age 填入到缺失值裡。
使用map()、lambda、split()、strip()對Name欄位的資料進行姓氏處理,新增Surname欄位,將處理好的資料給欄位Surname。
創建MaleDf變數,資料為家庭成員大於等於2且年齡大於12歲的男性。
創建FemChildDf變數,資料為家庭成員大於等於2而且為女性或年齡小於等於12歲的人。
使用groupby(),用MaleDf的Survived資料,對MaleDf的Surname資料進行分類並計算平均值,並存入MSurNamDf變數。
取出MSurNamDf生存率為1的姓氏,並存入MSurNamDict變數。
使用groupby(),用FemChildDf的Survived資料,對FemChildDf的Surname資料進行分類並計算平均值,並存入FCSurNamDf變數。
取出FCSurNamDf生存率為0的姓氏,並存入FCSurNamDict變數。
將資料集中Survived為空白值,且資料集中Surname為MSurNamDict,且性別為男性的進行填補和修正,性别改為女、Age改為5。
將資料集中Survived為空白值,且資料集中Surname為FCSurNamDict,且性別為女性及兒童的資料進行填補和修正,性别改為男、Age改為60。
新建變數fullSel,將full資料的Cabin,Name,Ticket,PassengerId,
Surname,SurnameNum欄位刪除,並將值給變數fullSel。
新建變數corrDf,進行fullSel的相關係數求取,並將值給變數corrDf。
查看Survived欄位的相關性,類似反比例函數,取值接近-1,表示反相關,取值接近1,表正相關。
使用HeatMap()繪製Survived與其他Feature間相關性大小。
可以看出SibSp,Parch,familyNum,TickCot欄位相關性太高,所以刪除,並免過度擬合。
繪製Survived與其他Feature間相關性大小 - (圖30)
使用one-hot Encoding,將類別變量轉換為標籤變量。
分別對fullSel、Pclass、TicketGroup、familySize進行get_dummies(),然後給值到變數fullSel、PclassDf、TickGroupDf、familySizeDf。
將資料fullSel、PclassDf、TickGroupDf、familySizeDf作合併到fullSel。
將fullSel的Survived為非空白值的資料取出,並給值到變數experData。
移除experData的Survived資料,當作訓練集的Features,並給值到變數experData_X。
使用experData的Survived資料,當作訓練集的Label,並給值到變數experData_y。
將fullSel的Survived是空白值的資料取出,並給值到變數perData。
移除preData的Survived資料,當作測試資料Features,並給值到變數perData_X。
匯入演算法 SVC()、DecisionTreeClassifier()、RandomForestClassifier()、ExtraTreesClassifier()、GradientBoostingClassifier()、KNeighborsClassifier()、LogisticRegression()、LinearDiscriminantAnalysis()為了進行演算法的效果選擇。
建立陣列classifiers,將所有演算法合併,進行每個演算法計算。
新增名稱為cvResDf的DataFrame,來紀錄和查看每個演算法的結果。
使用sns.barplot繪製各演算法的評分結果,可以看到GradientBoostingClassifier結果最好。
使用演算法 GradientBoostingClassifier正式進行訓練模型,使用fit()訓練資料experData_X,experData_y,創建變數GBCpreData_y,使用predict()預測資料preData_X,並將值給變數GBCpreData_y。
創建變數GBCpreData_y,使用predict()預測資料preData_X,並將值給變數GBCpreData_y,將變數GBCpreData_y資料類型轉換為 int 格式。
使用sklearn.metrics進行評分,讀取評估用資料。
使用confusion_matrix()計算混淆矩陣,使用accuracy_score()對分類的準確性評分,顯示主要分類指標的文本報告,可以看到各評分都有在85%以上。
通過對乘客生還率的分析,可以清楚地看到,女性的存活率明顯高於男性很多,說明在遇難時會以女士優先為主;其次,年幼的乘客生存率也明顯較高,說明人們會以女性和幼者為優先的保護對象;再者,從乘客等級來看,社會地位越高的人獲救率也更高,這也符合我們的日常認知。
本專題充分利用所學的Numpy、Pandas處理資料,Matplotlib、Seabron繪圖函數,Scikit-Learn建立模型,VSCode文本編輯,對數據進行了相應分析。
通過演練,熟悉了Python語言編程在實際數據分析中的運用,熟練掌握相關函數的使用以及數據可視化的基本能力,循環迭代以及運行速率的提升以及程式編輯能力是日後需要努力的方向。