天天看點

Kaggle 泰坦尼克号生存分析(資料概覽和缺失值處理部分)Kaggle 泰坦尼克号生存分析缺失值處理

Kaggle 泰坦尼克号生存分析

資料概覽

#導入pandas庫友善資料讀取和預處理,導入os庫友善修改工作路徑
import os
import pandas as pd
           
#讀取資料
os.chdir("F:/titianic_data")
train = pd.read_csv("raw/train.csv")
test = pd.read_csv("raw/test.csv")
           
train.shape
           
(891, 12)
           
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
1 3 Braund, Mr. Owen Harris male 22.0 1 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 STON/O2. 3101282 7.9250 NaN S
#檢視有無缺失值
train.isnull().sum()
           
PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age            177
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         2
dtype: int64
           
#檢視資料次元和類型
train.info()
           
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.6+ KB
           
#描述性統計分析
train.describe()
           
PassengerId Survived Pclass Age SibSp Parch Fare
count 891.000000 891.000000 891.000000 714.000000 891.000000 891.000000 891.000000
mean 446.000000 0.383838 2.308642 29.699118 0.523008 0.381594 32.204208
std 257.353842 0.486592 0.836071 14.526497 1.102743 0.806057 49.693429
min 1.000000 0.000000 1.000000 0.420000 0.000000 0.000000 0.000000
25% 223.500000 0.000000 2.000000 20.125000 0.000000 0.000000 7.910400
50% 446.000000 0.000000 3.000000 28.000000 0.000000 0.000000 14.454200
75% 668.500000 1.000000 3.000000 38.000000 1.000000 0.000000 31.000000
max 891.000000 1.000000 3.000000 80.000000 8.000000 6.000000 512.329200
#檢視字段的特征數量
train.nunique()
           
PassengerId    891
Survived         2
Pclass           3
Name           891
Sex              2
Age             88
SibSp            7
Parch            7
Ticket         681
Fare           248
Cabin          147
Embarked         3
dtype: int64
           

特征類型較少的,可視化分析

(1)定類資料:Embarked,Parch,Pclass,Sex,SibSp

(2)連續型資料:Age,Fare

特征類型較多的,後續處理再進行分析

(1)Name,Ticket,Cabin.

#合并train.csv以及test.csv進行下一步的資料缺失值處理
alldata = pd.concat([train,test],axis=0)
           

缺失值處理

缺失值的處理方式有多種:

1.用某些集中趨勢度量(均值、衆數)進行填充

2.用統計模型來預測缺失值,例如決策樹、随機森林RF、回歸模型

3.删除缺失值

4.保留缺失值

第一個字段:Embarked

#Embarked字段

#觀察資料的總體情況
print(train['Embarked'].value_counts())#訓練集

print(test['Embarked'].value_counts())#測試集
           
S    644
C    168
Q     77
Name: Embarked, dtype: int64
S    270
C    102
Q     46
Name: Embarked, dtype: int64
           

對于Embarked類别型的特征字段,采用頻率最高的特征值進行填充

# 忽略警告提示
import warnings
warnings.filterwarnings('ignore')
           
alldata.Embarked[alldata.Embarked.isnull()] = alldata.Embarked.dropna().mode().values
#還有三種表達方式
#alldata['Embarked'].fillna('S',inplace=True)
#alldata.loc[alldata.Embarked.isnull(),'Embarked']='S'
#alldata['Embarked'] = alldata['Embarked'].fillna(alldata['Embarked'].mode()[0])#通常預設使用第一個衆數值
           

第二個字段:Cabin

Cabin缺失比較嚴重,在train資料集中,891個觀測值有687條觀測值缺失,缺失比例達到 77%

處理這類資料方法之一是用一種特殊的字元來填充缺失值:把缺失值當成一類去對待,認為缺失本身是一種資訊,應該保持它的獨立性。

但這種方法比較适合類别變量,若要對連續變量使用該方法,需要首先對連續變量離散化,變成和類别變量一樣的形式。

客艙位缺失可能代表這些人沒有艙位,不妨使用’NO’來填充

alldata['Cabin'] = alldata['Cabin'].fillna('NO')
#其他表達方式
#alldata.loc[alldata.Cabin.isnull(),'Cabin'] = 'NO'
#alldata['Cabin'][alldata.Cabin.isnull()] = 'NO'
           

第三個字段:Age

Age這個變量看上去比較重要,下面介紹幾種填充方式

(1)采用與頭銜相對應的年齡中位數進行填補

#不同方法得到結果有所不同,将資料拷貝一份,以防混淆不同方式得到的結果
title_alldata = alldata.copy()
           

train資料集中,891個觀測值,姓名字段有891個不同的結果,直接拿來使用,沒太大意義,但是值得注意的是姓名中有頭銜存在,頭銜又是身份地位的象征

有可能身份地位越高,越容易存活

import re
           
#提取頭銜
title_alldata['title'] = title_alldata.Name.apply(lambda x:re.search('\w+\.',x).group()).str.replace('.','')
#檢視一共有多少種不同的結果
title_alldata.title.unique()
           
array(['Mr', 'Mrs', 'Miss', 'Master', 'Don', 'Rev', 'Dr', 'Mme', 'Ms',
       'Major', 'Lady', 'Sir', 'Mlle', 'Col', 'Capt', 'Countess',
       'Jonkheer', 'Dona'], dtype=object)
           

頭銜的解讀:

Mr:既可以用于已婚男性,也可以用于未婚男性

Mrs:已婚女士

Miss:稱呼未婚女士,有時也用于自己不了解的年齡較大的婦女

Master:男童或男嬰

Don:大學老師

Rev:牧師

Dr:醫生或者博士

Mme:女士

Ms:既可以用于已婚女士也可以用于未婚女士

Major:陸軍少校

Lady:公侯伯爵的女兒

Sir:上級長官

Mile:小姐

Col:上校(常用于陸空軍)

Capt:船長

Countess:伯爵夫人

Jonkheer:鄉紳

頭銜太多,最終決定再次分類,檢視每個頭銜與性别對應的人數

title_sex = pd.crosstab(title_alldata.title,title_alldata.Sex)
title_sex.T
           
title Capt Col Countess Don Dona Dr Jonkheer Lady Major Master Miss Mlle Mme Mr Mrs Ms Rev Sir
Sex
female 1 1 1 1 260 2 1 197 2
male 1 4 1 7 1 2 61 757 8 1

決定将少數部分歸為’Rare’(中文翻譯:稀少的)

‘Mlle’、'Ms’用’Miss’代替

将’Mme’用’Mrs’代替

title_alldata['title'] = title_alldata['title'].replace(['Capt','Col','Countess','Don','Dr','Jonkheer','Lady','Major','Rev','Sir'],'Rare')
title_alldata['title'] = title_alldata['title'].replace(['Mlle','Ms'],'Miss')
title_alldata['title'] = title_alldata['title'].replace('Mme','Mrs')
#檢視再次分類後,還有多少種不同的結果
title_alldata.title.unique()
           
array(['Mr', 'Mrs', 'Miss', 'Master', 'Rare', 'Dona'], dtype=object)
           

檢視頭銜與幸存的結果

import matplotlib.pyplot as plt
           
#繪制柱狀圖
title_survived = pd.crosstab(title_alldata['title'],title_alldata['Survived'])
title_survived.plot(kind='bar')
plt.xticks(np.arange(len(title_survived.index)),title_alldata.index,rotation = 360)
plt.title('Survived Status By Title')
           
Text(0.5,1,'Survived Status By Title')
           
Kaggle 泰坦尼克号生存分析(資料概覽和缺失值處理部分)Kaggle 泰坦尼克号生存分析缺失值處理

幸存機會大對應的頭銜:

Master,Miss,Mrs

幸存機會小對應的頭銜:

Mr,Rare

train資料集中Age缺失值有177個,缺失比例約為20%,缺失資料也不少,而且Age在本次分析中比較重要(副船長當時堅持“小孩和女士先走”),是以缺失值不能删除也不能保留缺失值

方式之一:采用與頭銜相對應的年齡中位數進行填補

#求出每個頭銜對應的年齡中位數
age_title_median = title_alldata.groupby('title')['Age'].median()
#在目前表設定title為索引
title_alldata.set_index('title',inplace=True)
#在目前表填充缺失值
title_alldata.Age.fillna(age_title_median,inplace=True)
#重置索引
title_alldata.reset_index(inplace=True)
           

(2)采用均值進行填補

263
           

參考資料

http://url.cn/52f3eDc

http://www.cnblogs.com/star-zhao/p/9801196.html

https://mp.weixin.qq.com/s/lKEma5gAYvNw4lvEMu621g

https://www.kaggle.com/c/titanic/data

《Python機器學習及實戰_從零開始通往KAGGLE之路》

如有違反或冒犯,請聯系作者删除,QQ:2168849535。