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')
幸存機會大對應的頭銜:
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。