第八課:案例分析 - 泰坦尼克數(shù)據(jù)
本節(jié)課將重點分析泰坦尼克號沉船事故,我們將探索是什么因素決定了最后是否生還蜕依。
我們將將前面課程所學過的知識點融會貫通,舉一反三
新增知識點:
? ? ? ?缺失值處理:pandas中的fillna()方法
? ? ? ?數(shù)據(jù)透視表:pandas中的pivot_table函數(shù)
我們上一篇文章用以前的知識將泰坦尼克案例的前面數(shù)據(jù)簡單操作了一番辩尊,剩下的內容會有新的知識點赎婚,不知道一篇文章裝不裝得下,來了熬料瘛紫谷!正文:
2、缺失值處理
真實數(shù)據(jù)往往某些變量會有缺失值捐寥。
首先笤昨,我們用 info( ) 語句操作,看到整份數(shù)據(jù)的大概情況:
從這份數(shù)據(jù)我們可以發(fā)現(xiàn)握恳,這里一共有 891 行數(shù)據(jù)瞒窒,所以在中間那一列數(shù)據(jù)中看到的不是 891 個數(shù)據(jù)的,都是有缺失值的乡洼。比如年齡Age這一列崇裁,有714個非空數(shù)值,就有 891-714=177 個缺失值束昵。又比如船艙號碼 cabin寇壳,缺失值就更多了。登船碼頭的缺失值比較少妻怎,后面可以不用處理壳炎。
這些缺失值是怎么處理的呢?一般是三種處理方法:不處理/丟棄/填充逼侦。
這里匿辩,cabin有超過70%以上的缺失值,我們可以考慮直接丟掉這個變量榛丢。 -- 刪除某一列數(shù)據(jù)
像Age這樣的重要變量铲球,有20%左右的缺失值,我們可以考慮用中位值來填補晰赞。-- 填補缺失值
我們一般不提倡去掉帶有缺失值的行稼病,因為其他非缺失的變量可能提供有用的信息。-- 刪除帶缺失值的行
刪除帶缺失值的行(一般不建議):df.dropna( )
刪除某一列:df.drop('column_name', axis=1, inplace=True)
填充缺失值:df.column_name.fillna( )
axis=1掖鱼,代表刪除的是一列的數(shù)據(jù)然走,也就是 column_name 這一列。inplace=True戏挡,表示在 df 這個原始數(shù)據(jù)上面進行修改芍瑞。
其實我們這節(jié)課重點的是最后一個:填充缺失值。fill 是填充褐墅,na 是缺失值的代稱拆檬。
我們在 info( ) 這個運行中可以看到 Age 的缺失值不少洪己,下面將使用中位數(shù)來填充 缺失值。
填補年齡數(shù)據(jù)中的缺失值
直接使用所有人年齡的中位數(shù)來填補
為了方便后面的比較竟贯,我們首先用 describe 統(tǒng)計數(shù)據(jù)答捕。
這份數(shù)據(jù)照樣是可以看到,非缺失值 count 是有 714屑那,平均值 mean 是 29.6歲噪珊,標準差 std 是 14.5,這時可以注意一下 50% ?那個數(shù)據(jù):28齐莲。
為了防止數(shù)據(jù)有改動,我們在開始之前需要重新載入數(shù)據(jù)磷箕。
正確的中位數(shù)可以使用 median 的方法獲取选酗,得到的數(shù)和上面的 50% 的數(shù)是一樣的。
把中位數(shù)賦值給 age_median1岳枷,這個操作體現(xiàn)在第二行代碼芒填。我的理解是,要是這里不重新賦值的話空繁,后面需要用到這個中位數(shù)的時候殿衰,就需要完整碼出 titanic_df.Age.median( ) 這一句,重新賦值就可以直接使用 age_median1 來代替稍微長一點的句子了盛泡。
titanic_df.Age.fillna(age_median1,inplace=True) 中闷祥,因為使用到Age這列數(shù)據(jù),然后用 fillna 來實現(xiàn)填充傲诵,所以語句用 titanic_df.Age.fillna( ) 來表達凯砍,括號里面需要填的參數(shù)就是需要填充的值,也就是里面的缺失值都是由剛剛賦值的 age_median1 來代替拴竹。逗號后面再加上inplace=True悟衩,表示在原來的 df 數(shù)據(jù)中進行修改了,如果不加上這個參數(shù)栓拜,就需要把填充后的值重新賦值給 Age 這一列座泳,所以 inplace 這個動作是為了簡單起見。
再來看我們得到的結果幕与,這個時候的非空缺失值已經變成了891挑势,平均值也從原本的29.7降到了29.4,因為我們剛剛填充的中位數(shù)是28啦鸣,比原來的平均值小薛耻,所以會有所新的平均值也會有所下降。
上面講的是所有人的年齡中位數(shù)赏陵,現(xiàn)在我們進一步來思考:性別因素饼齿,會怎么影響結果呢饲漾?
考慮性別因素,分別用男女乘客各自年齡的中位數(shù)來填補
由于上面的操作已經對原始數(shù)據(jù)進行修改了缕溉,所以要是我們需要重新分類考传,那就要重新載入原始數(shù)據(jù),不然后面的操作都會以上一步填充了所有年齡缺失值的基礎上操作的哦证鸥!這個虧我吃過僚楞。。枉层。
我們得到的女性中位數(shù)是 27泉褐,男性的是 29,還是有差距的吧鸟蜡!我們后面需要用到的是膜赃,用得出的中位數(shù)來填充男女的缺失值。
接下來的步驟揉忘,按照以前跳座,通常的思路是用布爾型索引取到女性中缺失值的數(shù)據(jù),然后用 27 重新賦值泣矛;同理可求男性的操作疲眷。
但是我們這節(jié)課學了fillna 這個新的方法啊您朽!
不過剛剛我們使用 fillna 的時候狂丝,填充的只是一個數(shù)值,這里不止一個數(shù)值哗总,就需要根據(jù)不同的情況來填充美侦。此時可以用到 Pandas 中里的一個小技巧,Pandas 的值在運算的過程中魂奥,會根據(jù)索引的值來進行自動的匹配菠剩。在這里我們可以看到這里的索引是 female 和 male 兩個值,如果原始數(shù)據(jù)也可以用性別來進行索引的話耻煤,就可以用 fillna 自動匹配相應的索引形式進行填充了具壮。
所以這里要對原來的數(shù)值重新設置索引,一開始是 0 1 2 這樣的數(shù)值哈蝇,現(xiàn)在要把它設置成性別這一列數(shù)據(jù)棺妓。用 set_index 語句,用 Sex 來進行索引炮赦,同時加入參數(shù) inplace=True怜跑,表示在原來的數(shù)據(jù)上進行修改。
inplace=True的含義應該講了第三遍了,其實我覺得要是不是很明白這個語句的用法時性芬,你可以先不加上這一句峡眶,跟著打代碼,然后到后面運行的哪一步你發(fā)現(xiàn)和老師的代碼不一樣的時候植锉,你就知道這個語句的重要性了辫樱。
我們可以看到這里的運行結果 列索引變成了 Sex,列首索引是 male 和 female 俊庇,在行首 Sex 已經不存在了狮暑。
我們將這里分類中位數(shù)賦值為 age_median2。填充的套路和上面也是一樣一樣的辉饱,根據(jù) Pandas 的自動匹配搬男,填充的時候會根據(jù)索引來匹配不同的值了。因為后續(xù)需要用到 Sex 這一列彭沼,所以這里也需要重置索引缔逛,將索引變成它的列。這里使用 reset_index溜腐。
非空值是 891 時就說明缺失值全部填充完畢了,這時候的均值是29.4瓜喇。
所以到這里挺益,我們把性別分類的缺失值也用各自的中位數(shù)填充完畢了。下一步要考慮的是乘寒,同時兩個因素的影響:
同時考慮性別和艙位因素
那我們首先來看一下望众,在不同年齡和不同艙位的中位數(shù),有什么變化呢伞辛?
groupby 分組的對象分別是 Pclass 艙位 和 Sex 性別烂翰,由于這里需要考量的有兩個因素:性別和艙位,所以這里需要使用到中括號蚤氏,后面加上用 Age.median 就可以得到分組的中位數(shù)了甘耿。
這里就有兩個索引,分別是艙位和性別竿滨,我們可以看到佳恬,隨著艙位的下降,它的年齡也是在下降的于游。用我們的話理解就是毁葱,年輕人普遍比年長的窮啊,年齡大一點的人積累的財富也多一點贰剥。
那接下來我們就用得出的中位數(shù)來各自重新賦值給艙位和性別倾剿。這時還是可以用 fillna 的,但是需要設置二重索引蚌成。
套路還是一樣的前痘,把這里得出的中位數(shù)賦值為 age_median3凛捏,然后對索引進行重新的賦值,同樣的际度,這里有兩個因素葵袭,也是使用中括號,用 set_index 的方法乖菱。
然后來看一下重置索引后的數(shù)據(jù)坡锡。看輸出我們是可以看到二重索引的窒所,第一列的組合內容一共有 3*2=6 種情況鹉勒。在列上面,已經沒有 Pclass 和 Sex 兩列數(shù)據(jù)了吵取,因為此刻它們已經在索引上了禽额。
現(xiàn)在按同樣的方法 fillna ,用索引值來匹配不同的中位數(shù)皮官。
額脯倒。。捺氢。這兩張看起來和上面的一毛一樣啊藻丢,是我哪里錯了嗎。摄乒。悠反。?
為了還原這樣的索引馍佑,這里用 reset來重置
這里的輸出可以看到非空數(shù)值已經是891了斋否,表示已經填滿缺失值了。平均值下降到了29.1歲拭荤,因為三等艙的人數(shù)比較多茵臭,而且年齡比較小,所以拉低了平均值舅世。
我們總結一下笼恰,這里使用的 fillna 的方法,可以對總體的中位數(shù)進行操作歇终,或者分類之后對中位數(shù)進行操作社证。分組之后由于有索引,所以同時也需要對原始數(shù)據(jù)進行索引评凝,對于相同索引值追葡,可以用匹配來進行填充。
在課堂答疑的時候,有同學問為什么要用中位數(shù)來填充缺失值呢宜肉?
老師回答其實也是可以用平均值來填充的匀钧,這里的中位數(shù)和平均值相差不大,極端值不明顯谬返。中位數(shù)在老師看來比較能夠表示人群的屬性之斯,老師舉了我國的人均收入這個例子,是用均值還是中位數(shù)比較好呢遣铝?要是用均值的話佑刷,大家都在拖后腿了。酿炸。瘫絮。
然后有同學問,設置索引有什么作用填硕?
老師回答:設置索引有匹配的作用麦萤,在剛剛男性和女性的分類中,就可以通過男性的屬性來匹配男性的中位數(shù)扁眯,女性的來匹配女性的中位數(shù)壮莹。通過第一個例子可以看到fillna 要是沒有索引的話,會給所有的數(shù)值都填充相同的一個值姻檀。
后面還有一大半內容命满。。施敢。老師說了這節(jié)課是一個加量的全家桶周荐,明天繼續(xù)更新后面的吧狭莱。僵娃。。