【全程记录】一次数据分析和可视化的大作业(python)

一、概述

本帖记录了一次从头到尾的作业过程(从导入数据集,经过数据处理与分析,到可视化数据,再到最终总结。包括遇到的问题与解决办法),其中运用到的知识来源于学校老师和bilibili教学视频,其中教学视频如下:

【【莫烦Python】Matplotlib Python 画图教程】

https://www.bilibili.com/video/BV1Jx411L7LU?vd_source=6cd5aa6c6bc6ca847fee566ff42f216a

【吹爆!终于有人把seaborn可视化讲得这么清晰了!2021最强的Python数据分析教程之seaborn精讲 简单明了 通俗易懂!】https://www.bilibili.com/video/BV1HF411B72n?vd_source=6cd5aa6c6bc6ca847fee566ff42f216a

【2023年度最佳python数据分析教程(numpy+matplotlib+pandas),整整200集,七周精通,拿走不谢】https://www.bilibili.com/video/BV1Jt4y1h7Vt?vd_source=6cd5aa6c6bc6ca847fee566ff42f216a

二、过程

1、数据准备(导入数据集)

我的数据集选择的是kaggle上的经典数据集——“Titanic”,其是一个常用的数据集,提供了关于泰坦尼克号乘客的各种信息,如姓名、年龄、性别、船票等级、生存情况等。

其中导入方式有两种,下面分别介绍:

① 代码下载实现

import opendatasets as od
import pandas as pd

# 下载Titanic数据集
dataset_url = 'https://www.kaggle.com/c/titanic/download/train.csv'
od.download(dataset_url, './data')

# 加载CSV数据集
dataset_path = './data/train.csv'
data = pd.read_csv(dataset_path)

# 打印数据集的前几行
print(data.head())

上述代码中,我们通过opendatasets库实现该数据集的下载,并且通过pandas库展示了数据集的前几行。

需要注意的是,如果出现了如下报错,可能是因为加速器或者VPN的使用,关闭VPN或者等待一会儿重新刷新即可。

② 直接在kaggle官网上下载数据集,然后上传至jupyter notebook

我在这里使用的是第二种方法,直接使用名称调用数据集即可

name = 'train.csv'
data = pd.read_csv(name)

2、数据准备与清洗

在一步中,我们将进行数据的准备与缺失值的补充

首先,我们先查看数据集的基本情况:

# 输出数据集的行数和列数
num_rows, num_cols = data.shape
print("数据集行数:", num_rows)
print("数据集列数:", num_cols)
# 输出数据集的基本信息
print("n数据集的基本信息:")
print(data.info())

然后,我们进行缺失值的处理:

处理过程分为两步:

第一步是输出缺失值的数量:

# 检查每列的缺失值数量
missing_values = data.isnull().sum()
print("n缺失值数量:")
print(missing_values)

第二步是填充缺失值(以‘age’列为例,以平均值填充):

data['Age'].fillna(data['Age'].mean(), inplace=True)

然后,我们进行异常数据的过滤(以‘Fare’列为例):

(我们在这里假设Fare大于99的就是异常值)

data = data[data['Fare'] <= 99]

然后,我们进行数据的拓展。

我在数据集中添加了一列“date”,其是泰坦尼克号的首航出发时间,并将它解析为了日期格式

data['date'] = 19120410
data['date'] = pd.to_datetime(data['date'])

至此,我们的数据预处理与清洗部分就结束了,下面我们查看处理后的数据集

print("处理后的数据集信息:")
print(data.info())

3、可视化

我是在jupyter notebook进行操作的,所以先准备代码的运行环境

import seaborn as sns
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline

sns.set_style('darkgrid')
matplotlib.rcParams['font.size'] = 14
matplotlib.rcParams['figure.figsize'] = (9, 5)
matplotlib.rcParams['figure.facecolor'] = '#00000000'

上述代码是在老师给定的模板上进行的修改

现在进行可视化部分:

① 不同性别的生存率(分组条形图)

# 统计不同性别的生存数量
gender_survived = data.groupby('Sex')['Survived'].value_counts().unstack()

# 绘制分组条形图
gender_survived.plot(kind='bar', stacked=True)
plt.xlabel('Sex')
plt.ylabel('Count')
plt.title('Survival Counts by Gender')
plt.legend(['Not Survived', 'Survived'])
plt.show()

② 不同舱位等级的乘客年龄分布(箱线图)

# 使用箱线图比较不同舱位等级的乘客年龄分布
plt.boxplot([data[data['Pclass'] == 1]['Age'].dropna(),
             data[data['Pclass'] == 2]['Age'].dropna(),
             data[data['Pclass'] == 3]['Age'].dropna()])
plt.xlabel('Pclass')
plt.ylabel('Age')
plt.title('Age Distribution by Passenger Class')
plt.xticks([1, 2, 3], ['1st Class', '2nd Class', '3rd Class'])
plt.show()

③ 乘客的登船港口分布(饼图)

# 统计乘客的登船港口分布
embarked_count = data['Embarked'].value_counts()

# 绘制饼图
plt.pie(embarked_count, labels=embarked_count.index)
plt.title('Distribution of Passengers by Embarked')
plt.show()

④ 比较不同年龄段乘客的生存情况(条形图)

age_groups = pd.cut(data['Age'], bins=[0, 12, 18, 30, 50, 80])
survival_by_age = data.groupby(age_groups)['Survived'].mean().reset_index()
sns.barplot(x='Age', y='Survived', data=survival_by_age)
plt.xlabel('Age Group')
plt.ylabel('Survival Rate')
plt.title('Survival Rate by Age Group')
plt.show()

⑤ 探索票价的分布(混合图)

sns.histplot(data['Fare'], kde=True)
plt.xlabel('Fare')
plt.ylabel('Count')
plt.title('Distribution of Fare')
plt.show()

⑥ 乘客的舱位等级和生存率的关系(条形图)

# 统计不同舱位等级的乘客生存率
pclass_survived = data.groupby('Pclass')['Survived'].mean()

# 绘制条形图
plt.bar(pclass_survived.index, pclass_survived)
plt.xlabel('Pclass')
plt.ylabel('Survival Rate')
plt.title('Survival Rate by Passenger Class')
plt.xticks([1, 2, 3], ['1st Class', '2nd Class', '3rd Class'])
plt.show()

4、问答

在这一部分中,我将提出一些问题,并且使用数据分析与可视化知识进行回答

问题以及解答方式:

① 不同舱位等级的乘客数量是多少?

(本题使用条形图回答)

pclass_count = data['Pclass'].value_counts()
plt.figure(figsize=(8, 6))
sns.countplot(x='Pclass', data=data)
plt.title("不同舱位等级的乘客数量")
plt.show()

需要注意的是,上述代码可能会报错:

 参考相关资料可知,出现这种问题可能是因为Matplotlib无法正确渲染字符,下面给出三种解决方法:

  方法一:安装中文字体库

 输入以下代码下载中文字体库:


!apt-get -qq -y install fonts-wqy-zenhei 

然后在绘图前运行如下代码,选择可以运行的字体

plt.rcParams['font.family'] = 'WenQuanYi Zen Hei'  # 设置字体为文泉驿正黑字体

 方法二:重新设置默认字体

运行以下代码:

matplotlib.rcParams['font.family'] = 'sans-serif'
matplotlib.rcParams['font.sans-serif'] = ['Arial']

通过这个方法,我们将默认字体重新设置为无衬线字体`Arial`,解决了这个问题。

 方法三:删除中文字符

这是最简单粗暴的一种方法,因为我是全英授课,作业也要求为英文完成,所以就采取了这个方法

所以我改进后的代码为:

pclass_count = data['Pclass'].value_counts()
plt.figure(figsize=(8, 6))
sns.countplot(x='Pclass', data=data)
plt.title("Distribution of different passenger class classes")
plt.show()

② 不同年龄段的乘客存活率如何?

(本题使用柱状图回答)

# 根据年龄分组,并计算存活率
age_groups = pd.cut(data['Age'], bins=[0, 18, 30, 50, 100], labels=['0-18', '19-30', '31-50', '51+'])
survival_rate_by_age = data.groupby(age_groups)['Survived'].mean()

# 绘制条形图显示不同年龄段的存活率
plt.bar(survival_rate_by_age.index, survival_rate_by_age)
plt.xlabel('Age Group')
plt.ylabel('Survival Rate')
plt.title('Survival Rate by Age Group')
plt.show()

③ 存活的乘客中,男性和女性的平均年龄是否有差异?

(本题使用柱状图回答)

# 计算存活的男性和女性的平均年龄
average_age_survived = data.groupby('Sex')['Age'].mean()

# 绘制柱状图显示存活的男性和女性的平均年龄
plt.bar(average_age_survived.index, average_age_survived,color = 'green')
plt.xlabel('Sex')
plt.ylabel('Average Age')
plt.title('Average Age of Survived Passengers by Sex')
plt.show()

④ 不同船舱等级(Pclass)的男性和女性乘客数量分别是多少?

(本题使用堆叠条形图回答)

# 统计不同船舱等级下男性和女性乘客数量
gender_counts_by_pclass = data.groupby(['Pclass', 'Sex']).size().unstack()

# 绘制堆叠条形图显示不同船舱等级下男性和女性乘客数量
gender_counts_by_pclass.plot(kind='bar', stacked=True)
plt.xlabel('Pclass')
plt.ylabel('Count')
plt.title('Passenger Count by Pclass and Sex')
plt.show()

⑤不同家庭规模(Family Size)的乘客数量分布如何?

(本题使用条形图回答)

# 计算家庭规模
data['FamilySize'] = data['SibSp'] + data['Parch'] + 1

# 统计不同家庭规模的乘客数量
passenger_count_by_family_size = data['FamilySize'].value_counts()

# 绘制条形图显示不同家庭规模的乘客数量分布
passenger_count_by_family_size.plot(kind='bar')
plt.xlabel('Family Size')
plt.ylabel('Count')
plt.title('Passenger Count by Family Size')
plt.show()

⑥ 不同年龄段的乘客存活率是否与船舱等级(Pclass)有关?

(本题使用热力图作答)

# 计算不同年龄段和船舱等级组合下的乘客存活率
survival_rate_by_age_group_pclass = data.groupby(['Age', 'Pclass'])['Survived'].mean().unstack()

# 绘制热力图显示乘客存活率与年龄段、船舱等级之间的关联
sns.heatmap(survival_rate_by_age_group_pclass, annot=True, cmap='coolwarm')
plt.xlabel('Pclass')
plt.ylabel('Age Group')
plt.title('Survival Rate by Age Group and Pclass')
plt.show()

⑦不同家庭规模(Family Size)的乘客存活率是否与船舱等级(Pclass)有关?

(本题使用热力图作答)

# 计算不同家庭规模和船舱等级组合下的乘客存活率
survival_rate_by_family_size_pclass = data.groupby(['FamilySize', 'Pclass'])['Survived'].mean().unstack()

# 绘制热力图显示乘客存活率与家庭规模、船舱等级之间的关联
sns.heatmap(survival_rate_by_family_size_pclass, annot=True, cmap='coolwarm')
plt.xlabel('Pclass')
plt.ylabel('Family Size')
plt.title('Survival Rate by Family Size and Pclass')
plt.show()

5、总结

在各个部分中,我将总结归纳从数据集中可视化得出的推论,然后回答我提出的问题。

① 可视化总结

1、女性的生存率远高于男性。

2、一般来说,舱位等级越高,乘客年龄越高。

3、绝大多数乘客都是在表示为“s”的港口登船的。

4、总体来说,0-12岁的儿童生存率高于其他年龄组,18-30岁的青壮年生存率偏低。

5、票价主要集中在“10”左右,有极少数高价票。

6、高等级客舱的生存率显著高于低等级客舱,其中最大差距一倍有余。

② 回答问题

1、三等舱的人数最多,在490人左右;一等二等舱各在190人左右。

2、0-12岁的儿童生存率高于其他年龄组,18-30岁的青壮年生存率偏低。

3、存活的男女年龄有所差异,但是差别不大,总体都在28岁上下。

4、读图可知,一等二等舱的人数几乎相同(男性各190人左右,女性50人左右);三等舱男性490人左右,女性150人左右。

5、绝大多数乘客都是独自一人登船的,也有小部分2人或3人登船的,超过四人登船的数量极少。

6、总体来讲,年龄越小,舱位等级越高,生存概率越大。

7、舱位等级越高,生存概率越大,但是未发现生存率与家庭数量有明显关联。

三、结束

学生党,第一次写博客,有不正确的地方欢迎批评指正。

也感谢老师和各路大神提供的帮助。

创作不易,转载请注明出处(顿首)

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>