第八課:案例分析 - 泰坦尼克數(shù)據(jù)
本節(jié)課將重點(diǎn)分析泰坦尼克號(hào)沉船事故,我們將探索是什么因素決定了最后是否生還。
我們將將前面課程所學(xué)過(guò)的知識(shí)點(diǎn)融會(huì)貫通,舉一反三
新增知識(shí)點(diǎn):
? ? ? ?缺失值處理:pandas中的fillna()方法
? ? ? ?數(shù)據(jù)透視表:pandas中的pivot_table函數(shù)
數(shù)據(jù)分析的流程
問(wèn)題:數(shù)據(jù)分析的核心是問(wèn)題,提出一個(gè)有價(jià)值的問(wèn)題就像瞄準(zhǔn)了正確的靶心,才能使后續(xù)的動(dòng)作變得有意義。
數(shù)據(jù)采集:有了問(wèn)題之后就要收集原始的數(shù)據(jù)。但是數(shù)據(jù)來(lái)源豐富多樣,格式不盡相同,所以需要進(jìn)行下一步——
數(shù)據(jù)清洗:清洗這些格式多樣的數(shù)據(jù),糾正其中可能的錯(cuò)誤。這個(gè)步驟比較繁雜,占整個(gè)過(guò)程的工作量比例較大,卻是整個(gè)分析流程必不可少的環(huán)節(jié)。
數(shù)據(jù)探索:這時(shí)候一般會(huì)用到統(tǒng)計(jì)和可視化的方法進(jìn)行分析,對(duì)數(shù)據(jù)有全面的認(rèn)識(shí),為后續(xù)的進(jìn)一步分析做鋪墊。
建模分析:這一步經(jīng)常用到機(jī)器學(xué)習(xí)/數(shù)據(jù)挖掘的算法(此課不做介紹)。
交流結(jié)果:通過(guò)報(bào)告或者可視化圖表的形式,展示結(jié)論,并與他人和交流。
決策:通過(guò)交流進(jìn)行決策。
整個(gè)數(shù)據(jù)分析的流程就是從問(wèn)題到?jīng)Q策的過(guò)程。但是真實(shí)的情況往往不會(huì)那么順利。比如在數(shù)據(jù)采集/清洗和探索的過(guò)程中,就會(huì)進(jìn)行來(lái)回倒騰。就像在探索的時(shí)候發(fā)現(xiàn)數(shù)據(jù)支撐不夠,要到前面一個(gè)步驟進(jìn)行更多的采集和清洗。又像有時(shí)候我們只有數(shù)據(jù)沒(méi)有具體的問(wèn)題,通過(guò)采集/清洗和探索這些步驟之后,對(duì)數(shù)據(jù)有了更深的認(rèn)識(shí),這時(shí)可以進(jìn)一步提出更有意義的問(wèn)題了。
我們第八課的課程里面,也會(huì)用這樣一個(gè)流程,對(duì)數(shù)據(jù)進(jìn)行處理。
我們今天的問(wèn)題是:哪些問(wèn)題會(huì)影響最后的生還概率。
泰坦尼克號(hào)背景介紹
泰坦尼克號(hào)是一艘?jiàn)W林匹克級(jí)郵輪,于1912年4月首航時(shí)撞上冰山后沉沒(méi)。泰坦尼克號(hào)由位于北愛(ài)爾蘭貝爾法斯特的哈蘭·沃爾夫船廠興建,是當(dāng)時(shí)最大的客運(yùn)輪船,由于其規(guī)模相當(dāng)一艘現(xiàn)代航空母艦,因而號(hào)稱“上帝也沉沒(méi)不了的巨型郵輪”。在泰坦尼克號(hào)的首航中,從英國(guó)南安普敦出發(fā),途經(jīng)法國(guó)瑟堡-奧克特維爾以及愛(ài)爾蘭昆士敦,計(jì)劃?rùn)M渡大西洋前往美國(guó)紐約市。但因?yàn)槿藶殄e(cuò)誤,于1912年4月14日船上時(shí)間夜里11點(diǎn)40分撞上冰山;2小時(shí)40分鐘后,即4月15日凌晨02點(diǎn)20分,船裂成兩半后沉入大西洋,死亡人數(shù)超越1500人,堪稱20世紀(jì)最大的海難事件,同時(shí)也是最廣為人知的海難之一。

整份數(shù)據(jù)分為數(shù)值變量和分類變量,這邊著重分一下,因?yàn)樗鼈冊(cè)诤竺娴氖褂靡彩遣灰粯拥?。因?yàn)槲覀兘裉彀咐黝}是 什么因素會(huì)影響生還,所以這份數(shù)據(jù)里面“survival” 這一列的數(shù)據(jù)是需要重點(diǎn)分析的,然后會(huì)對(duì)分類變量 “Pclass” 艙位和 “Sex” 性別,還有數(shù)值變量 “Age” 年齡,對(duì)生還情況的影響。
在里面可以看到很多NaN的顯示,表示此處是缺失值。第二部分我們將著重來(lái)看,怎么來(lái)處理這些缺失值。
1、數(shù)據(jù)導(dǎo)入和觀察

然后導(dǎo)入這次課程的數(shù)據(jù),csv格式的文件。用 Pandas 的 csv 的讀取方式來(lái)讀取,賦值于 titanic_df 這個(gè)數(shù)據(jù)數(shù)據(jù)變量中。我在前面的文章也不止講了3遍怎么導(dǎo)入數(shù)據(jù)了,討論區(qū)的答疑整理幾乎每一次都有人問(wèn)數(shù)據(jù)導(dǎo)入的問(wèn)題,所以到今天要是還不會(huì)導(dǎo)入數(shù)據(jù)的,可以翻我前面的文章。

數(shù)據(jù)字段說(shuō)明:
PassengerId: 乘客的id
Survival: 是否幸存 0 = No, 1 = Yes
Pclass: 艙位 class 1 = 1st, 2 = 2nd, 3 = 3rd
Name: 姓名
Sex: 性別
Age: 年齡
SibSp: 船上兄弟姐妹以及配偶的個(gè)數(shù)
Parch: 船上父母以及者子女的個(gè)數(shù)
Ticket: 船票號(hào)碼
Fare: 票價(jià)
Cabin: 船艙號(hào)碼
Embarked: 登船碼頭 C = Cherbourg, Q = Queenstown, S = Southampton
變量類型
數(shù)值變量:Age, SibSp, Parch, 和Fare。
分類變量:Pcalss, Sex, Cabin, 和Embarked。Survived是結(jié)果。
下面我們 describe 函數(shù)來(lái)觀察數(shù)值變量和分類變量。
數(shù)據(jù)的統(tǒng)計(jì)描述
數(shù)值變量

用方括號(hào)的形式,這四個(gè)參數(shù)重新組建一個(gè) DataFrame,用describe 進(jìn)行觀察。運(yùn)行得到四列數(shù)據(jù)的統(tǒng)計(jì)值。
count表示的是非空的數(shù)值個(gè)數(shù)。因?yàn)橐恍袛?shù)據(jù)統(tǒng)計(jì)出來(lái)的結(jié)果都是891,只有 Age 是714,所以我們從這份數(shù)據(jù)可以觀察到,Age這列數(shù)據(jù)是有缺失值的。下面的是一些統(tǒng)計(jì)量,mean 代表平均值,std 是標(biāo)準(zhǔn)差,也就是數(shù)據(jù)相對(duì)于均值的波動(dòng)情況。min 是最小值,max 是最大值,25%/50%/75% 分別是這份數(shù)據(jù)的四分位數(shù)。
通過(guò)這份 describe 函數(shù),我們可以對(duì)整份數(shù)據(jù)有大體的認(rèn)識(shí)。比如從年齡那一列看,平均年齡是29.6歲,標(biāo)準(zhǔn)差是14.5,最小的年齡是0.42,最大的80歲,年齡的中位數(shù)是28歲。因?yàn)?Survived 是0-1變量,所以均值就是幸存人數(shù)的百分比,這個(gè)用法非常有用,也就是 Survivied 這列數(shù)據(jù),由于生還與否是用 0 和 1 來(lái)進(jìn)行表達(dá),所以這里的0.38代表的是生還率。這個(gè)看起來(lái)很好用??!
同樣的,我們可以用describe來(lái)看分類變量的數(shù)據(jù)。但是要是直接使用,這里顯示的也只能是數(shù)據(jù),所以用到了 include=[ np.object ] 這個(gè)參數(shù),表示把數(shù)據(jù)里面不是數(shù)值的可以用字符串的形式表達(dá)出來(lái)。

count?表示非空數(shù)值的個(gè)數(shù)。unique?表示非重復(fù)數(shù)的個(gè)數(shù),比如 name在這里的非重復(fù)數(shù)是891,那么和上面的非空數(shù)值對(duì)比,就知道是沒(méi)有重名的人在里面。top?表示最高頻的一個(gè)詞,在性別 sex 中表示的是男性比女性多。freq 代表的是上面面最高頻的數(shù)量,這里告訴我們男性出現(xiàn)次數(shù)最多,有577次。所以我們?cè)谶@個(gè)表格可以看到,添加了 include=[ np.object ] 這個(gè)參數(shù)之后,用 describe 函數(shù)不僅能表示數(shù)值類的函數(shù),也能表達(dá)字符類的函數(shù)。
不同艙位的分布情況是怎樣的呢?
我們通過(guò)這個(gè)例子來(lái)復(fù)習(xí) value_counts 和 group_by

取到艙位這一批數(shù)據(jù),然后用到 value_counts( ),因?yàn)樗J(rèn)是從小到大排列的,所以可以看到三等艙的人最多。
為了求到相應(yīng)的占比,我們可以除以相應(yīng)的總量,用 len( )函數(shù),然后可以看到三等艙的人數(shù)占了55%。

這是用 value_counts 使用的第一種方法,下面還有另一種方法:group_by。

將數(shù)據(jù)按艙位來(lái)分組,分組之后在計(jì)算每一組數(shù)據(jù)的大小。這里用列名 Pclass,代表此處是用艙名來(lái)分類的,然后使用聚合函數(shù)agg,用的是 size ,是用來(lái)計(jì)算分組之后的數(shù)據(jù)大小的。同樣我們可以得到每一個(gè)艙位的人數(shù)。
同樣需要得到相應(yīng)的占比,也是除以 len( tatanic_df )

要是想要讓數(shù)據(jù)從大到小進(jìn)行排序,我們用的是 sort_values 這個(gè)方法進(jìn)行操作:

注意哦,這里是先把前面的內(nèi)容用圓括號(hào)擴(kuò)起來(lái),代表這里的優(yōu)先級(jí)更高,然后再使用 sort_values。后面需要設(shè)置參數(shù) =False,因?yàn)榇颂幨悄J(rèn)從小到大排列的。
所以這兩種方法使用下來(lái),能看出方法1是簡(jiǎn)單一點(diǎn)的,有默認(rèn)排序功能,方法2還需要語(yǔ)句來(lái)設(shè)定。啊,我這種懶人!
作業(yè)8-1:
查看Embarked(登船碼頭)人數(shù)分布的百分比
第八課的這篇文章我碼到現(xiàn)在,都是在用以前的知識(shí)點(diǎn)來(lái)進(jìn)行操作的。下一篇文章將會(huì)有新的知識(shí)點(diǎn) “ 缺失值處理:pandas中的fillna()方法 ” 和 “ 數(shù)據(jù)透視表:pandas中的pivot_table函數(shù) ”
老師在GitHub 預(yù)告的,我這兩天繼續(xù)更新!!