写点什么

数据分析实际案例之:pandas 在泰坦尼特号乘客数据中的使用

作者:程序那些事
  • 2022 年 2 月 15 日
  • 本文字数:2473 字

    阅读完需:约 8 分钟

数据分析实际案例之:pandas在泰坦尼特号乘客数据中的使用

简介

1912 年 4 月 15 日,号称永不沉没的泰坦尼克号因为和冰山相撞沉没了。因为没有足够的救援设备,2224 个乘客中有 1502 个乘客不幸遇难。事故已经发生了,但是我们可以从泰坦尼克号中的历史数据中发现一些数据规律吗?今天本文将会带领大家灵活的使用 pandas 来进行数据分析。

泰坦尼特号乘客数据

我们从 kaggle 官网中下载了部分泰坦尼特号的乘客数据,主要包含下面几个字段:

下载下来的文件是一个 csv 文件。接下来我们来看一下怎么使用 pandas 来对其进行数据分析。

使用 pandas 对数据进行分析

引入依赖包

本文主要使用 pandas 和 matplotlib,所以需要首先进行下面的通用设置:

from numpy.random import randnimport numpy as npnp.random.seed(123)import osimport matplotlib.pyplot as pltimport pandas as pdplt.rc('figure', figsize=(10, 6))np.set_printoptions(precision=4)pd.options.display.max_rows = 20
复制代码

读取和分析数据

pandas 提供了一个 read_csv 方法可以很方便的读取一个 csv 数据,并将其转换为 DataFrame:

path = '../data/titanic.csv'df = pd.read_csv(path)df
复制代码

我们看下读入的数据:

418 rows × 11 columns

调用 df 的 describe 方法可以查看基本的统计信息:

如果要想查看乘客登录的港口,可以这样选择:

df['Embarked'][:10]
复制代码


0    Q1    S2    Q3    S4    S5    S6    Q7    S8    C9    SName: Embarked, dtype: object
复制代码

使用 value_counts 可以对其进行统计:

embark_counts=df['Embarked'].value_counts()embark_counts[:10]
复制代码


S    270C    102Q     46Name: Embarked, dtype: int64
复制代码

从结果可以看出,从 S 港口登录的乘客有 270 个,从 C 港口登录的乘客有 102 个,从 Q 港口登录的乘客有 46 个。

同样的,我们可以统计一下 age 信息:

age_counts=df['Age'].value_counts()age_counts.head(10)
复制代码

前 10 位的年龄如下:

24.0    1721.0    1722.0    1630.0    1518.0    1327.0    1226.0    1225.0    1123.0    1129.0    10Name: Age, dtype: int64
复制代码

计算一下年龄的平均数:

df['Age'].mean()
复制代码


30.272590361445783
复制代码

实际上有些数据是没有年龄的,我们可以使用平均数对其填充:

clean_age1 = df['Age'].fillna(df['Age'].mean())clean_age1.value_counts()
复制代码

可以看出平均数是 30.27,个数是 86。

30.27259    8624.00000    1721.00000    1722.00000    1630.00000    1518.00000    1326.00000    1227.00000    1225.00000    1123.00000    11            ..36.50000     140.50000     111.50000     134.00000     115.00000     17.00000      160.50000     126.50000     176.00000     134.50000     1Name: Age, Length: 80, dtype: int64
复制代码

使用平均数来作为年龄可能不是一个好主意,还有一种办法就是丢弃平均数:

clean_age2=df['Age'].dropna()clean_age2age_counts = clean_age2.value_counts()ageset=age_counts.head(10)ageset
复制代码


24.0    1721.0    1722.0    1630.0    1518.0    1327.0    1226.0    1225.0    1123.0    1129.0    10Name: Age, dtype: int64
复制代码

图形化表示和矩阵转换

图形化对于数据分析非常有帮助,我们对于上面得出的前 10 名的 age 使用柱状图来表示:

import seaborn as snssns.barplot(x=ageset.index, y=ageset.values)
复制代码



接下来我们来做一个复杂的矩阵变换,我们先来过滤掉 age 和 sex 都为空的数据:

cframe=df[df.Age.notnull() & df.Sex.notnull()]cframe
复制代码


332 rows × 11 columns

接下来使用 groupby 对 age 和 sex 进行分组:

by_sex_age = cframe.groupby(['Age', 'Sex'])by_sex_age.size()
复制代码


Age    Sex   0.17   female    10.33   male      10.75   male      10.83   male      10.92   female    11.00   female    32.00   female    1       male      13.00   female    15.00   male      1                ..60.00  female    360.50  male      161.00  male      262.00  male      163.00  female    1       male      164.00  female    2       male      167.00  male      176.00  female    1Length: 115, dtype: int64
复制代码

使用 unstack 将 Sex 的列数据变成行:

79 rows × 2 columns

我们把同样 age 的人数加起来,然后使用 argsort 进行排序,得到排序过后的 index:

indexer = agg_counts.sum(1).argsort()indexer.tail(10)
复制代码


Age58.0    3759.0    3160.0    2960.5    3261.0    3462.0    2263.0    3864.0    2767.0    2676.0    30dtype: int64
复制代码

从 agg_counts 中取出最后的 10 个,也就是最大的 10 个:

count_subset = agg_counts.take(indexer.tail(10))count_subset=count_subset.tail(10)count_subset
复制代码


上面的操作可以简化为下面的代码:

agg_counts.sum(1).nlargest(10)
复制代码


Age21.0    17.024.0    17.022.0    16.030.0    15.018.0    13.026.0    12.027.0    12.023.0    11.025.0    11.029.0    10.0dtype: float64
复制代码

将 count_subset 进行 stack 操作,方便后面的画图:

stack_subset = count_subset.stack()stack_subset
复制代码


Age   Sex   29.0  female     5.0      male       5.025.0  female     1.0      male      10.023.0  female     5.0      male       6.026.0  female     4.0      male       8.027.0  female     4.0      male       8.018.0  female     7.0      male       6.030.0  female     6.0      male       9.022.0  female    10.0      male       6.021.0  female     3.0      male      14.024.0  female     5.0      male      12.0dtype: float64
复制代码


stack_subset.name = 'total'stack_subset = stack_subset.reset_index()stack_subset
复制代码


作图如下:

sns.barplot(x='total', y='Age', hue='Sex',  data=stack_subset)
复制代码



本文例子可以参考: https://github.com/ddean2009/learn-ai/

本文已收录于 http://www.flydean.com/01-pandas-titanic/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

发布于: 2022 年 02 月 15 日阅读数: 28
用户头像

关注公众号:程序那些事,更多精彩等着你! 2020.06.07 加入

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧,尽在公众号:程序那些事!

评论

发布
暂无评论
数据分析实际案例之:pandas在泰坦尼特号乘客数据中的使用