泰坦尼克 数据集_Python数据分析入门-泰坦尼克案例(一)

本文通过泰坦尼克数据集介绍Python数据分析的基本步骤,包括数据获取、初步分析和特征探索。发现年龄、性别、舱位和登船港口等因素影响幸存率,其中女性、18至40岁的乘客、头等舱和特定亲属数量的幸存率较高。
摘要由CSDN通过智能技术生成

本文以经典的泰坦尼克数据,熟悉掌握基本的Python数据分析,以及可视化步骤。

工具:jupyter notebook

所需模块:pandas,numpy,matplotlib,seaborn,sklearn

数据文件:链接:迅雷云盘 提取码:MOGD

导入库

# 数据分析
import pandas as pd
import numpy as np

# 绘图
import matplotlib.pyplot as plt
from matplotlib import style
import seaborn as sns

获取数据

# 导入数据
test_df = pd.read_csv("test.csv")
train_df = pd.read_csv("train.csv")

数据分析

# 查看训练集数据信息
train_df.info()

训练集数据结果:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   PassengerId  891 non-null    int64  
 1   Survived     891 non-null    int64  
 2   Pclass       891 non-null    int64  
 3   Name         891 non-null    object 
 4   Sex          891 non-null    object 
 5   Age          714 non-null    float64
 6   SibSp        891 non-null    int64  
 7   Parch        891 non-null    int64  
 8   Ticket       891 non-null    object 
 9   Fare         891 non-null    float64
 10  Cabin        204 non-null    object 
 11  Embarked     889 non-null    object 
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB

泰坦尼克训练集数据共计891条信息,包括:

  • survival: 是否存活
  • PassengerId: 乘客ID
  • pclass: 舱位,1为头等舱
  • sex: 性别
  • Age: 年龄
  • sibsp: 兄弟姐妹/配偶数量
  • parch: 父母/小孩数量
  • ticket: 船票号码
  • fare: 船票费用
  • cabin: 客舱号码
  • embarked: 登船港口
  • 部分数据存在缺失

查询数据集的前10行:

# 查看训练集数据
train_df.head(10)

56a92a5a81c3654b5f0565ecdecd7a65.png

获取描述统计信息:

# 查看描述统计
train_df.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

从数据集信息以及描述统计结果来看,泰坦尼克乘客幸存率为38.38%,年龄段从0.4至80岁,"Age", "Cabin","Embarked"字段存在缺失值,后面会对缺失值进行处理。

# 查看缺失值,降序排列
total = train_df.isnull().sum().sort_values(ascending = False) 
percent_1 = train_df.isnull().sum()/train_df.isnull().count()*100
percent_2 = (round(percent_1,1)).sort_values(ascending = False)
missing_data = pd.concat([total, percent_2],axis = 1, keys = ["total","%"])
# concat合并数据集
missing_data.head()

显示缺失值数量及占比:

         total	 %
Cabin	  687	77.1
Age	  177	19.9
Embarked  2	0.2
Fare	  0	0.0
Ticket	  0	0.0

进行数据分析要做一些预处理。首先,需要把多个特征转换成数字特征,这样机器学习算法才能处理它们。其次,这些特征处于不同的范围,需要转换成大致相同的范围内。最后需要处理包含缺失值(NaN =不是数字)的特征。

可以通过查看列名确定特征

# 查看列名
train_df.columns.values

主要特征包括:

array(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
       'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'], dtype=object)

其中包括11个特征,以及1个目标值('Survived')

那么,哪些特征可以导致高幸存率?

1. 年龄(Age)和性别(Sex)

# 创建1行2列,大小为10X4 的画布
fig, axes = plt.subplots(nrows =1 ,ncols = 2 ,figsize =(10,4))
#也可以fig, axes = plt.subplots(1,2 ,figsize =(10,4))

# 选取数据 
women = train_df[train_df["Sex"]=="female"]
men = train_df[train_df["Sex"]=="male"]

# 在画布第1列绘制男性幸存与否直方图
ax = sns.distplot(men[men["Survived"]==1].Age.dropna(), 
                  #color="g",#可以自定义颜色
                  bins=18, label = "Survived", ax = axes[0], kde =False)

ax = sns.distplot(men[men["Survived"]==0].Age.dropna(), 
                  bins=40, label = "Not_survived", ax = axes[0], kde =False)

# 添加图例和标题
ax.legend()
ax.set_title("Male")


# 在画布第2列绘制女性幸存与否直方图
_ax = sns.distplot(women[women["Survived"]==1].Age.dropna(), 
                  #color="g",
                  bins=18, label = "Survived", ax = axes[1], kde =False)

_ax = sns.distplot(women[women["Survived"]==0].Age.dropna(), 
                  bins=40, label = "Not_survived", ax = axes[1], kde =False)
# 添加图例和标题
_ax.legend()
_ax.set_title("Female")

# 保存图片
#fig.savefig("./picture/age_and_sex.png",dpi = 120)

结果展示:

c4e4ff908039966b6acd6a65525fe874.png

女性的幸存率明显高于男性。对男性而言,18至30岁有较高的幸存率,而女性在14至40岁有较高的幸存率。5至18岁的男性存活率明显低于同年龄段的女性,另外无论男女,婴儿的幸存率都很高。

2. 登船港口(Embarked),舱位(Pclass)与性别(Sex)

# facetgrid  对数据集根据col,row 实例化facegrid类,生成对象
FacetGrid = sns.FacetGrid(train_df, col="Embarked", 
                          # row = "Embarked"则图片纵向排列,
                          height=4.5, #高度
                          aspect=1.2  #长宽比 
                         )

FacetGrid.map(sns.pointplot, "Pclass", "Survived", "Sex", 
              palette=None,  #调色板
              order=None, 
              hue_order=None 
               )
# 添加图例
FacetGrid.add_legend()

结果展示:

5d8f2b33c03f9adecdf8947f63423360.png

不同登船港口,乘客幸存率不同,且与性别有明显的关系。其中,S港和Q港的女性幸存率高与男性,C港口正相反;同时也可以看出,舱位(Pclas)也与幸存率相关。

3. 舱位(Pclass)

# 绘制各仓位的幸存率
fig,axes = plt.subplots(1,2,figsize =(10,4))  
sns.barplot(x = "Pclass", y = "Survived", data = train_df, ax=axes[0],
            palette="Set2",#调色板
            capsize=0.05,  #横线宽度
            errwidth= 1.2, #误差线宽度
            errcolor="0.1",#误差线颜色透明度,1为白色
            #alpha = 0.8   #透明度
           )
sns.barplot(x = "Pclass", y = "Survived", hue = "Sex", data = train_df, ax=axes[1],
            capsize=0.05,  #横线宽度
            errwidth= 1.2, #误差线宽度
            errcolor="0.1",#误差线颜色透明度,1为白色
            alpha = 0.6    #透明度
           )

结果展示:

b416eb6df1f60f528a4878ee4bf07561.png

明显可以看出,舱位等级越高,乘客幸存率也越高,头等舱的幸存率是三等舱的两倍还要多。(金钱可以提高生存率 #狗头 )并且舱位间的性别幸存差异也非常明显。

# 不同舱位下,各年龄的幸存与否人数
grid = sns.FacetGrid(train_df, row = "Survived", col = "Pclass",
                    height = 3 ,aspect = 1.2)
grid.map(plt.hist, "Age", bins = 20, alpha = 0.6)
grid.add_legend()

结果展示:

540064c28f20406fed43d5405608e0e7.png

可以看个各舱位幸存的人数,头等舱幸存人数最多,而三等舱的遇难人数最多。

4. 亲属(SibSp,Parch)

将SibSp-兄弟姐妹、配偶和 Parch-父母、小孩 合并成一个因素--亲属

# 将SibSp-兄弟姐妹、配偶和 Parch-父母、小孩 合并成一个因素, 亲属
data = [train_df, test_df]
# 添加relatives列
for dataset in data:
    dataset["relatives"] = dataset["SibSp"] + dataset["Parch"]
    dataset.loc[dataset["relatives"] > 0, "not_alone"] = 0
    dataset.loc[dataset["relatives"] == 0, "not_alone"] = 1
    dataset["not_alone"] = dataset["not_alone"].astype(int)

train_df["not_alone"].value_counts()

有无亲属:

1    537
0    354
Name: not_alone, dtype: int64
axes = sns.factorplot("relatives","Survived", 
                      data=train_df, aspect = 2.5, )

结果展示:

e17c5f2108886ba870e75b98b6658104.png
axes = sns.catplot("relatives", "Survived", data = train_df, aspect = 2)

1da0b997a7fdfd32fb711d9bce1dd6e3.png

亲属的数量为1-3个时,有较高的幸存率,低于1个或者高于3个幸存率下降,亲属数量为6个时除外。

本篇结束,下篇将展示特征进行数值化处理的过程与结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值