01.Kaggle之泰坦尼克号幸存预测——数据分析

本文源自DataWhale在Github分享的教程,感谢大佬们的无私奉献。附上此项目主页。
GitHub-DataWhale

1 读取数据

1.1 导入库

import numpy as np
import pandas as pd

1.2读取数据

数据下载地址
(百度网盘:提取码:1234)

1.2.1读取train.csv并将列索引改为中文

data = pd.read_csv('data/train.csv')
data.columns = (['乘客ID',
                 '是否幸存',
                 '乘客等级',
                 '乘客姓名',
                 '性别',
                 '年龄',
                 '兄妹个数',
                 '父母小孩个数',
                 '船票信息',
                 '票价',
                 '客舱',
                 '登船港口'])
data.head()
乘客ID是否幸存乘客等级乘客姓名性别年龄兄妹个数父母小孩个数船票信息票价客舱登船港口
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS

1.2.2 查看列索引信息

data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   乘客ID    891 non-null    int64  
 1   是否幸存    891 non-null    int64  
 2   乘客等级    891 non-null    int64  
 3   乘客姓名    891 non-null    object 
 4   性别      891 non-null    object 
 5   年龄      714 non-null    float64
 6   兄妹个数    891 non-null    int64  
 7   父母小孩个数  891 non-null    int64  
 8   船票信息    891 non-null    object 
 9   票价      891 non-null    float64
 10  客舱      204 non-null    object 
 11  登船港口    889 non-null    object 
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB

1.2.3 读取test.csv

test_1 = pd.read_csv('data/test.csv')
test_1.head()
PassengerIdPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
08923Kelly, Mr. Jamesmale34.5003309117.8292NaNQ
18933Wilkes, Mrs. James (Ellen Needs)female47.0103632727.0000NaNS
28942Myles, Mr. Thomas Francismale62.0002402769.6875NaNQ
38953Wirz, Mr. Albertmale27.0003151548.6625NaNS
48963Hirvonen, Mrs. Alexander (Helga E Lindqvist)female22.011310129812.2875NaNS
test_1.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 418 entries, 0 to 417
Data columns (total 11 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   PassengerId  418 non-null    int64  
 1   Pclass       418 non-null    int64  
 2   Name         418 non-null    object 
 3   Sex          418 non-null    object 
 4   Age          332 non-null    float64
 5   SibSp        418 non-null    int64  
 6   Parch        418 non-null    int64  
 7   Ticket       418 non-null    object 
 8   Fare         417 non-null    float64
 9   Cabin        91 non-null     object 
 10  Embarked     418 non-null    object 
dtypes: float64(2), int64(4), object(5)
memory usage: 36.0+ KB

2 数据分析/处理

2.1 对船票和年龄降序排列

data = data.sort_values(by=['票价','年龄'], ascending=False)
data.head(5)
乘客ID是否幸存乘客等级乘客姓名性别年龄兄妹个数父母小孩个数船票信息票价客舱登船港口
67968011Cardeza, Mr. Thomas Drake Martinezmale36.001PC 17755512.3292B51 B53 B55C
25825911Ward, Miss. Annafemale35.000PC 17755512.3292NaNC
73773811Lesurer, Mr. Gustave Jmale35.000PC 17755512.3292B101C
43843901Fortune, Mr. Markmale64.01419950263.0000C23 C25 C27S
34134211Fortune, Miss. Alice Elizabethfemale24.03219950263.0000C23 C25 C27S
data.tail(5)
乘客ID是否幸存乘客等级乘客姓名性别年龄兄妹个数父母小孩个数船票信息票价客舱登船港口
48148202Frost, Mr. Anthony Wood "Archie"maleNaN002398540.0NaNS
63363401Parr, Mr. William Henry MarshmaleNaN001120520.0NaNS
67467502Watson, Mr. Ennis HastingsmaleNaN002398560.0NaNS
73273302Knight, Mr. Robert JmaleNaN002398550.0NaNS
81581601Fry, Mr. RichardmaleNaN001120580.0B102S

1 发现票价越高,幸存的人数越多,前20人中,70%的人幸存;后20人中仅有一人幸存;

2 概率可能会较其他参数同水平的人更低。

2.2 观察船票/性别/年龄

①票价

data['票价'].describe()
count    891.000000
mean      32.204208
std       49.693429
min        0.000000
25%        7.910400
50%       14.454200
75%       31.000000
max      512.329200
Name: 票价, dtype: float64

②性别

data['性别'].describe()
count      891
unique       2
top       male
freq       577
Name: 性别, dtype: object

③年龄

data['年龄'].describe()
count    714.000000
mean      29.699118
std       14.526497
min        0.420000
25%       20.125000
50%       28.000000
75%       38.000000
max       80.000000
Name: 年龄, dtype: float64

总结

1.票价整体很低,仅有少数高价票

2.男性较女性更多,占64%

3.乘客年龄不高,28岁以下占50%,38岁以下占75%,有少数高龄乘客

3 数据清洗及特征处理

数据清洗简述

我们拿到的数据通常是不干净的,所谓的不干净,就是数据中有缺失值,有一些异常点等,需要经过一定的处理才能继续做后面的分析或建模,所以拿到数据的第一步是进行数据清洗,本章我们将学习缺失值、重复值、字符串和数据转换等操作,将数据清洗成可以分析或建模的样子。

3.1 缺失值的观察与处理

3.1.1 缺失值观察

data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 891 entries, 679 to 815
Data columns (total 12 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   乘客ID    891 non-null    int64  
 1   是否幸存    891 non-null    int64  
 2   乘客等级    891 non-null    int64  
 3   乘客姓名    891 non-null    object 
 4   性别      891 non-null    object 
 5   年龄      714 non-null    float64
 6   兄妹个数    891 non-null    int64  
 7   父母小孩个数  891 non-null    int64  
 8   船票信息    891 non-null    object 
 9   票价      891 non-null    float64
 10  客舱      204 non-null    object 
 11  登船港口    889 non-null    object 
dtypes: float64(2), int64(5), object(5)
memory usage: 90.5+ KB
或者使用df.isnull().sum()
data.isnull().sum()
乘客ID        0
是否幸存        0
乘客等级        0
乘客姓名        0
性别          0
年龄        177
兄妹个数        0
父母小孩个数      0
船票信息        0
票价          0
客舱        687
登船港口        2
dtype: int64

3.1.2 缺失值的处理

过滤缺失值

①df.isnull 加 布尔索引,手动过滤缺失值

#  方法一
# data[data['年龄'].isnull()] = 0

②df.dropna方法

DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

# 方法二
# data.dropna()

补全缺失值

df.fillna() 方法

DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)

# data[data['年龄']].fillna()

3.2 重复值的观察与处理

3.2.1 观察重复值

data[data.duplicated()]
乘客ID是否幸存乘客等级乘客姓名性别年龄兄妹个数父母小孩个数船票信息票价客舱登船港口
data.duplicated().sum()
0

3.2.2 删除重复值

data.drop_duplicates()
乘客ID是否幸存乘客等级乘客姓名性别年龄兄妹个数父母小孩个数船票信息票价客舱登船港口
67968011Cardeza, Mr. Thomas Drake Martinezmale36.001PC 17755512.3292B51 B53 B55C
25825911Ward, Miss. Annafemale35.000PC 17755512.3292NaNC
73773811Lesurer, Mr. Gustave Jmale35.000PC 17755512.3292B101C
43843901Fortune, Mr. Markmale64.01419950263.0000C23 C25 C27S
34134211Fortune, Miss. Alice Elizabethfemale24.03219950263.0000C23 C25 C27S
.......................................
48148202Frost, Mr. Anthony Wood "Archie"maleNaN002398540.0000NaNS
63363401Parr, Mr. William Henry MarshmaleNaN001120520.0000NaNS
67467502Watson, Mr. Ennis HastingsmaleNaN002398560.0000NaNS
73273302Knight, Mr. Robert JmaleNaN002398550.0000NaNS
81581601Fry, Mr. RichardmaleNaN001120580.0000B102S

891 rows × 12 columns

3.3 特征观察与处理

数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare,其中Survived, Pclass为离散型数值特征,Age,SibSp, Parch, Fare为连续型数值特征

文本型特征:Name, Sex, Cabin,Embarked, Ticket,其中Sex, Cabin, Embarked, Ticket为类别型文本特征。

文本型特征往往需要转换成数值型特征才能用于建模分析。

3.3.1 对年龄进行分箱(离散化)处理

什么是分箱?

即连续值的离散化,把一组数据切分为若干“箱子”。

pd.cut方法详解

①将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示

bins = 5 #bins为分组方法,可以为int、标量序列
data['年龄(离散化)'] = pd.cut(data['年龄'], bins, labels=['1','2','3','4','5'])
data.head(5)
乘客ID是否幸存乘客等级乘客姓名性别年龄兄妹个数父母小孩个数船票信息票价客舱登船港口年龄(离散化)
67968011Cardeza, Mr. Thomas Drake Martinezmale36.001PC 17755512.3292B51 B53 B55C3
25825911Ward, Miss. Annafemale35.000PC 17755512.3292NaNC3
73773811Lesurer, Mr. Gustave Jmale35.000PC 17755512.3292B101C3
43843901Fortune, Mr. Markmale64.01419950263.0000C23 C25 C27S4
34134211Fortune, Miss. Alice Elizabethfemale24.03219950263.0000C23 C25 C27S2

②将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示

bins = [0,5,15,30,50,80]
data['年龄(离散化)'] = pd.cut(data['年龄'], bins, labels=['1','2','3','4','5'])
data.head()
乘客ID是否幸存乘客等级乘客姓名性别年龄兄妹个数父母小孩个数船票信息票价客舱登船港口年龄(离散化)
67968011Cardeza, Mr. Thomas Drake Martinezmale36.001PC 17755512.3292B51 B53 B55C4
25825911Ward, Miss. Annafemale35.000PC 17755512.3292NaNC4
73773811Lesurer, Mr. Gustave Jmale35.000PC 17755512.3292B101C4
43843901Fortune, Mr. Markmale64.01419950263.0000C23 C25 C27S5
34134211Fortune, Miss. Alice Elizabethfemale24.03219950263.0000C23 C25 C27S3

③将连续变量Age按10% 30% 50 70% 90%五个年龄段,并用分类变量12345表示

pd.qcut()方法详解

q = [0,0.1,0.3,0.5,0.7,0.9]
data['年龄(离散化)'] = pd.qcut(data['年龄'], q, labels=['1','2','3','4','5'])
data.head()
乘客ID是否幸存乘客等级乘客姓名性别年龄兄妹个数父母小孩个数船票信息票价客舱登船港口年龄(离散化)
67968011Cardeza, Mr. Thomas Drake Martinezmale36.001PC 17755512.3292B51 B53 B55C4
25825911Ward, Miss. Annafemale35.000PC 17755512.3292NaNC4
73773811Lesurer, Mr. Gustave Jmale35.000PC 17755512.3292B101C4
43843901Fortune, Mr. Markmale64.01419950263.0000C23 C25 C27SNaN
34134211Fortune, Miss. Alice Elizabethfemale24.03219950263.0000C23 C25 C27S3

3.3.2 对文本变量进行转换

①查看文本变量名及种类(性别/客舱/登船港口)
方法一:value_counts
data['性别'].value_counts()
male      577
female    314
Name: 性别, dtype: int64
data['登船港口'].value_counts()
S    644
C    168
Q     77
Name: 登船港口, dtype: int64
方法二:unique()
data['客舱'].unique()
array(['B51 B53 B55', nan, 'B101', 'C23 C25 C27', 'B57 B59 B63 B66',
       'B58 B60', 'C45', 'C62 C64', 'C95', 'C82', 'B3', 'B5', 'C7',
       'C125', 'C91', 'C22 C26', 'B80', 'B78', 'C32', 'C99', 'E40', 'E34',
       'B96 B98', 'D48', 'D36', 'C68', 'C70', 'C65', 'C86', 'B69', 'B73',
       'B49', 'C78', 'C93', 'C92', 'B77', 'B79', 'C83', 'C50', 'E49',
       'C54', 'A34', 'B28', 'E67', 'E68', 'B41', 'B82 B84', 'B86', 'C46',
       'D20', 'D7', 'D11', 'D9', 'D26', 'D33', 'D49', 'D15', 'D37', 'C85',
       'B22', 'B35', 'C2', 'D10 D12', 'B30', 'E31', 'B18', 'B20', 'A20',
       'E36', 'E44', 'E50', 'E33', 'C123', 'E8', 'D30', 'D35', 'D19',
       'C126', 'C110', 'B71', 'A14', 'E46', 'D21', 'C101', 'A24', 'A32',
       'C90', 'B39', 'A10', 'A16', 'D28', 'F4', 'E63', 'A26', 'T', 'A6',
       'C52', 'C128', 'A5', 'D46', 'B19', 'D50', 'A31', 'A7', 'C30',
       'C104', 'B50', 'C106', 'A23', 'D6', 'C148', 'B42', 'D45', 'B37',
       'C118', 'C47', 'C49', 'C124', 'C111', 'B4', 'E38', 'C87', 'C103',
       'E17', 'E12', 'B38', 'E25', 'E24', 'D47', 'F2', 'A19', 'D17',
       'E58', 'F E69', 'G6', 'D', 'D56', 'E101', 'F33', 'E121', 'E77',
       'E10', 'F38', 'F G63', 'F G73', 'B94', 'A36', 'B102'], dtype=object)
data['客舱'].nunique() # 不同种类数据的个数
147
② 将文本变量用数值变量12345表示
方法一:replace

replace官方文档

data['性别(数值)'] = data['性别'].replace(['female','male'], [0, 1])
data.head()
乘客ID是否幸存乘客等级乘客姓名性别年龄兄妹个数父母小孩个数船票信息票价客舱登船港口年龄(离散化)性别(数值)
67968011Cardeza, Mr. Thomas Drake Martinezmale36.001PC 17755512.3292B51 B53 B55C41
25825911Ward, Miss. Annafemale35.000PC 17755512.3292NaNC40
73773811Lesurer, Mr. Gustave Jmale35.000PC 17755512.3292B101C41
43843901Fortune, Mr. Markmale64.01419950263.0000C23 C25 C27SNaN1
34134211Fortune, Miss. Alice Elizabethfemale24.03219950263.0000C23 C25 C27S30
方法二:Series.map()

map官方文档

data['性别(数值)'] = data['性别'].map({'male':1, 'female':0})

当文本类型的种类较少时,可以采用以上两种方法,如性别,但如 客舱这种复杂信息,这两种方法就难以应对。

方法三:使用sklearn.preprocessing的LabelEncoder

LabelEncoder方法

methoddescribetion
fit(y)Fit label encoder
fit_transform(y)Fit label encoder and return encoded labels
get_params([deep])Get parameters for this estimator.
inverse_transform(y)Transform labels back to original encoding.
set_params(**params)Set the parameters of this estimator.
transform(y)Transform labels to normalized encoding.
from sklearn.preprocessing import LabelEncoder

for feat in ['船票信息', '客舱']: #对 船票信息,客舱 两列文本信息分别进行数值化处理
    encoder = LabelEncoder()
    data[feat + '(数值化)'] = encoder.fit_transform(data[feat].astype(str))
    #astype()函数可用于转化dateframe某一列的数据类型,不使用astype会报错
data.sort_values(by='乘客ID').head()
乘客ID是否幸存乘客等级乘客姓名性别年龄兄妹个数父母小孩个数船票信息票价客舱登船港口年龄(离散化)性别(数值)船票信息(数值化)客舱(数值化)
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS21523147
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C5059681
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS30669147
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S404955
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS41472147
③将文本变量用one-hot编码表示

将已经离散化、数值化的列删除

data_encoded = data.drop(['性别', '年龄', '客舱', '船票信息'], axis = 'columns')
data_encoded.head()
乘客ID是否幸存乘客等级乘客姓名兄妹个数父母小孩个数票价登船港口年龄(离散化)性别(数值)船票信息(数值化)客舱(数值化)
67968011Cardeza, Mr. Thomas Drake Martinez01512.3292C4160834
25825911Ward, Miss. Anna00512.3292C40608147
73773811Lesurer, Mr. Gustave J00512.3292C4160815
43843901Fortune, Mr. Mark14263.0000SNaN19563
34134211Fortune, Miss. Alice Elizabeth32263.0000S309563
登船港口_1hot = pd.get_dummies(data['登船港口'], prefix='登船港口')
登船港口_1hot
登船港口_C登船港口_Q登船港口_S
679100
258100
737100
438001
341001
............
481001
633001
674001
732001
815001

891 rows × 3 columns

data_encoded = pd.concat([data_encoded,登船港口_1hot], axis=1)
data_encoded.head()
乘客ID是否幸存乘客等级乘客姓名兄妹个数父母小孩个数票价登船港口年龄(离散化)性别(数值)船票信息(数值化)客舱(数值化)登船港口_C登船港口_Q登船港口_S
67968011Cardeza, Mr. Thomas Drake Martinez01512.3292C4160834100
25825911Ward, Miss. Anna00512.3292C40608147100
73773811Lesurer, Mr. Gustave J00512.3292C4160815100
43843901Fortune, Mr. Mark14263.0000SNaN19563001
34134211Fortune, Miss. Alice Elizabeth32263.0000S309563001

3.3.3 从纯文本提取特征

# 跳过:正则表达式

3.3.4 数据保存

data_encoded.to_csv('train_fin.csv')
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值