第八課:案例分析 - 泰坦尼克數據
本節課將重點分析泰坦尼克號沉船事故,我們將探索是什么因素決定了最后是否生還。
我們將前面課程所學過的知識點融會貫通,舉一反三。
新增知識點:
? ?
? 缺失值處理:pandas中的fillna()方法? ? ?數據透視表:pandas中的pivot_table函數
上篇文章的作業疑惑,其實用下圖是可以簡潔說明的,此圖截屏于 新生大學-解密大數據《Python編程&數據科學入門》線上課程(說明來處,應該沒侵權啊。。)。
對啦,我上的就是這個課,有讀者問到這課程講得那么詳細是什么課,這個介紹一下,就是 新生大學-解密大數據《Python編程&數據科學入門》,感興趣的讀者可以去了解一下。
為什么前面聽了那么久,我都不知道index是行索引,columns是列索引呢??!
好吧,接下來是正文內容:
3-4 年齡與生還情況
與上面的艙位、性別這些分類變量不同,年齡是一個連續的變量。
生還組和罹難組的年齡分布直方圖
分類變量可以繪制條形圖,連續變量可以繪制直方圖。將泰坦尼克號的數據映射到 hist 函數中,來繪制 Age 這一列的直方圖,并且把區間設成 20,輸出得到年齡分布的直方圖。
這張圖并沒能明顯顯示 FacetGrid 圖表的優勢,由于我們需要的是罹難和生還兩個組的年齡分布,所以這時候可以加一個語句:
這個 col='Survived' 充滿了魔力?。。?!一變二!這里就能顯示生還組(Survived=1)和罹難組( Survived=0 )兩個圖表中年齡的分布了。col代表的是列的屬性,這時把0和1分布在兩個圖表中,為了一致起見,把兩個圖表歸一化,使用normed=True 這個參數,我們能夠看到縱坐標的值改變了,并不是頻數等統計,歸一化的意思就是下面陰影區域的面積為1。
在這個圖可以看到,相對來說,生還組中兒童占比比較大。
結論:兒童有更高的生還可能。
作業 8-3:
考慮艙位因素后,繪制生還組和罹難組的年齡分布直方圖提示:FacetGrid參數中同時設置col和row
年齡是一個連續的值,要是用直方圖來觀察,不是太方便。這里就需要將連續性的變量離散化了:
連續型變量離散化是建模中一種常用的方法
離散化指的是將某個變量的所在區間分割為幾個小區間,落在同一個區間的觀測值用同一個符號表示
以年齡為例,最小值是0.42(嬰兒),最大值是80,如果我們想產生一個五個級(levels),我們可使用cut或者qcut函數
cut函數將年齡的區間均勻分割為5分,而qcut則選取區間以至于每個區間里的觀察值個數都是一樣的(五等分), 這里演示中使用cut函數。
我們上面的圖中可以看到年齡是0-80歲,我們可以嘗試將它劃分為五等分,等于就是把一個連續的值變成離散的值了,將數值變量變成一個分類變量。
此處離散化的方法是使用 pandas 里面的 cut 函數,首先傳遞給這個函數將要離散化的數據:年齡,后面的5,表示將數據分割成五等分。這里將原本數據的每一行對應到一個區間數據。
然后把這個輸出添加到原來的數據中,通過添加一個新的列,賦值給 AgeBand,代表了年齡區間。
查看落在不同年齡區間里的人數
sort=False 表示不需要將結果排序,上圖是沒有加上這句話的輸出,可以看到區間是按照區間數量的多少進行從大到小的排序的,要是想要把區間捋一捋,將區間從小到大無縫連接地排序,就可以加上 sort=False 這個語句了,下圖是輸出效果:
這里的結果輸出可以看到年齡最小的區間人數有100人,按年齡區間分布最多的是16-32歲之間,老年人最少。
同樣的,得出這樣結果的方法不止一個,我們用 pivot_table 方法進行操作:
因為這里統計的是頻數,values 對應的是非空數值就可以了。這里的主語是年齡區間,所以索引引導的是 AgeBand。也因為這里統計的是頻數,所以聚合函數 aggfunc 的值是 count。
方法一和方法二不同的是,方法一是Series格式,方法二是DataFrame格式。
查看各個年齡區間的生還率
上面表格可以看到不同年齡區間的生還率,年齡最小區間的生還率是最高的,有55.5%,中堅力量三個區間的生還率不相上下,老年人最低,只有9%,從上面看到老年人只有11人,應該就是只有個別老人成功逃離了。。。
按照套路,我們下面到了繪制圖表的時間啦!
這個圖標的橫坐標每個數據有點長,相互打架了。所以我們進行設置:
plt.xticks 這個函數我們之前提到過的,一般是用來調整坐標軸,可以通過旋轉角度,對圖表進行調整。這里 rotation=60,表示旋轉的度數為 60 度,然后可以看到輸出。
結論:兒童的生還率更高。
以上是單獨看年齡/性別/艙位和生還率的關系,下面我們綜合不止一個因素來看生還率。
3-5 年齡、性別 與生還概率
這里設置行索引 index 是年齡區間 AgeBand ,列索引 columns 是性別 Sex,聚合函數 aggfunc 是 numpy 的平均值。
第八課講到挺多這樣結構的案例的,前面我搞得挺迷糊,昨天在地鐵上忍不住打開電腦敲代碼的時候,真的發現這東西因為太簡潔了,所以邏輯性特別強。比如這里需要看年齡和性別兩個因素同時與生還概率的關系,所以是用了二重索引來作為分支,數字是生還率,所以 values 是等于生還率的,我的理解就是主語是這些數字,主要就是為了展示主語。然后有分支分類的從句,對句子進行補充,行索引 是年齡區間,列索引 是性別,我的理解就是 行索引 和 列索引 的關系是并列的,然后同時從屬于主句,為生還率這個主語服務。得出來的輸出就是 在某年齡區間,男性的生還率和女性的生還率分別是多少。這段話是文科生說給文科生聽的??
接下來是繪制圖表:
這里會自動幫你把Y軸 survived 這個數據求平均。不過這張圖只有一條折線,因為這里還沒有進行按性別來分組。折線圖的分組句型記得啊!是hue!加上要修改距離打架的X軸,下面兩處改動:
這張折線圖可以看到,綠色代表的女性生還率無論在哪個年齡區間都是大于男性的,而且女性的生還率隨年齡的增加也在遞增。對于男性來說,也就是藍色那條線的代表值,幼者生還率最大,年長的生還率都低于20%。老師說,從這幅圖可以看出營救的策略應該是兒童優先,然后女性優先。
3-6 年齡、艙位、性別 與生還概率
我覺得要是前面說給文科生的那段話理解清楚,或者知道那段話代表的內容能理解清楚,這里加多一個因素的時候,不會那么慌。這里加了一個艙位的分支。看到最后一行輸出,老年組女性的值是NaN,這一區間,無人生還。
看數據會有點懵,接下來繪制折線圖,直觀點吧!
上圖并沒有年齡區間的劃分,這個函數不合適有三重索引地表達吧。所以下面要引進另一個函數,正確表達年齡,艙位,性別和生還概率的關系。
把年齡區間放在row上,按照年齡區間來分圖,老師說到第二句代碼map的時候,說把sns.pointplot,也就是上面運行的結果,映射到新賦值的函數中,我就想,反正都把結果弄上去了,為什么后面還要加上橫縱坐標以及分類的參數呢,所以就試了一下不放其他參數的結果:
結果就是,五個空圖,有年齡區間,有頻數,就是沒有參數的內容。不能偷懶啊不能偷懶~~????
因為上面正確輸出的圖不是太完美,所以要進行調整:
aspect是長寬比等于1.5倍,還是胖一點好看??????
palette是調色板,用內置的色板進行調整,然后那條幾乎隱形的白線終于顯示出來了,變成綠色了。綠色代表女性數據,藍色代表男性數據。
然而。。。這還沒完,看上面五張圖,幾乎都是綠色在上面,也就是女性生還率高于男性,但是在第三個圖,也就是年齡區間在32到48歲之間的綠色線是在藍色線下面的?。。〔豢赡馨?,翻看前面的數據表格,也是女性生還率高啊!然后老師說,這里藍色和綠色代表的數值調換了,也就是這張圖中的藍色代表女性,綠色代表男性。為什么呢?老師沒說??
這里的設置是加一句 hue_order=[ 'male' , 'female' ] ,此處用的是列表形式擴住參數。然后就正常了:
老師說,對上圖的色板配色感興趣的,可以去這個鏈接:palette 配色參考?https://seaborn.pydata.org/tutorial/color_palettes.html?highlight=palette
哈我就沒多大要求了,默認隱藏的夠用就行,你們拿去收藏吧!??
作業8-4:
綜合考慮性別,艙位和登船碼頭三個因素,計算其生還概率,并在一副圖中探索它們和生還概率的關系。
來來來總結一下第八課的內容,我們一開篇就提出一個問題:生還率和什么因素有關,然后拿到了原始數據,數據通過清洗填充了缺失值,然后看單個因素和生還率的關系,再看多個因素和生還率的關系,進行可視化圖表的繪制更容易得出結論,看下圖(我又侵權了嗎。。。??外框綠色蝴蝶是新生大學Logo,內框那只老虎是解密大數據團隊Logo)
第八課終于結束了,老淚縱橫。。。寫不完的第八課??????今晚上第九課啦?。?!預習資料還沒看??抓緊時間