当前位置:   article > 正文

【全程记录】一次数据分析和可视化的大作业(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”,其是一个常用的数据集,提供了关于泰坦尼克号乘客的各种信息,如姓名、年龄、性别、船票等级、生存情况等。

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

① 代码下载实现

  1. import opendatasets as od
  2. import pandas as pd
  3. # 下载Titanic数据集
  4. dataset_url = 'https://www.kaggle.com/c/titanic/download/train.csv'
  5. od.download(dataset_url, './data')
  6. # 加载CSV数据集
  7. dataset_path = './data/train.csv'
  8. data = pd.read_csv(dataset_path)
  9. # 打印数据集的前几行
  10. print(data.head())

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

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

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

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

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

2、数据准备与清洗

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

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

  1. # 输出数据集的行数和列数
  2. num_rows, num_cols = data.shape
  3. print("数据集行数:", num_rows)
  4. print("数据集列数:", num_cols)
  5. # 输出数据集的基本信息
  6. print("\n数据集的基本信息:")
  7. print(data.info())

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

处理过程分为两步:

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

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

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

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

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

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

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

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

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

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

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

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

3、可视化

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

  1. import seaborn as sns
  2. import matplotlib
  3. import matplotlib.pyplot as plt
  4. %matplotlib inline
  5. sns.set_style('darkgrid')
  6. matplotlib.rcParams['font.size'] = 14
  7. matplotlib.rcParams['figure.figsize'] = (9, 5)
  8. matplotlib.rcParams['figure.facecolor'] = '#00000000'

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

现在进行可视化部分:

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

  1. # 统计不同性别的生存数量
  2. gender_survived = data.groupby('Sex')['Survived'].value_counts().unstack()
  3. # 绘制分组条形图
  4. gender_survived.plot(kind='bar', stacked=True)
  5. plt.xlabel('Sex')
  6. plt.ylabel('Count')
  7. plt.title('Survival Counts by Gender')
  8. plt.legend(['Not Survived', 'Survived'])
  9. plt.show()

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

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

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

  1. # 统计乘客的登船港口分布
  2. embarked_count = data['Embarked'].value_counts()
  3. # 绘制饼图
  4. plt.pie(embarked_count, labels=embarked_count.index)
  5. plt.title('Distribution of Passengers by Embarked')
  6. plt.show()

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

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

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

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

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

  1. # 统计不同舱位等级的乘客生存率
  2. pclass_survived = data.groupby('Pclass')['Survived'].mean()
  3. # 绘制条形图
  4. plt.bar(pclass_survived.index, pclass_survived)
  5. plt.xlabel('Pclass')
  6. plt.ylabel('Survival Rate')
  7. plt.title('Survival Rate by Passenger Class')
  8. plt.xticks([1, 2, 3], ['1st Class', '2nd Class', '3rd Class'])
  9. plt.show()

4、问答

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

问题以及解答方式:

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

(本题使用条形图回答)

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

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

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

  方法一:安装中文字体库

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

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

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

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

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

运行以下代码:

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

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

 方法三:删除中文字符

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

所以我改进后的代码为:

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

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

(本题使用柱状图回答)

  1. # 根据年龄分组,并计算存活率
  2. age_groups = pd.cut(data['Age'], bins=[0, 18, 30, 50, 100], labels=['0-18', '19-30', '31-50', '51+'])
  3. survival_rate_by_age = data.groupby(age_groups)['Survived'].mean()
  4. # 绘制条形图显示不同年龄段的存活率
  5. plt.bar(survival_rate_by_age.index, survival_rate_by_age)
  6. plt.xlabel('Age Group')
  7. plt.ylabel('Survival Rate')
  8. plt.title('Survival Rate by Age Group')
  9. plt.show()

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

(本题使用柱状图回答)

  1. # 计算存活的男性和女性的平均年龄
  2. average_age_survived = data.groupby('Sex')['Age'].mean()
  3. # 绘制柱状图显示存活的男性和女性的平均年龄
  4. plt.bar(average_age_survived.index, average_age_survived,color = 'green')
  5. plt.xlabel('Sex')
  6. plt.ylabel('Average Age')
  7. plt.title('Average Age of Survived Passengers by Sex')
  8. plt.show()

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

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

  1. # 统计不同船舱等级下男性和女性乘客数量
  2. gender_counts_by_pclass = data.groupby(['Pclass', 'Sex']).size().unstack()
  3. # 绘制堆叠条形图显示不同船舱等级下男性和女性乘客数量
  4. gender_counts_by_pclass.plot(kind='bar', stacked=True)
  5. plt.xlabel('Pclass')
  6. plt.ylabel('Count')
  7. plt.title('Passenger Count by Pclass and Sex')
  8. plt.show()

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

(本题使用条形图回答)

  1. # 计算家庭规模
  2. data['FamilySize'] = data['SibSp'] + data['Parch'] + 1
  3. # 统计不同家庭规模的乘客数量
  4. passenger_count_by_family_size = data['FamilySize'].value_counts()
  5. # 绘制条形图显示不同家庭规模的乘客数量分布
  6. passenger_count_by_family_size.plot(kind='bar')
  7. plt.xlabel('Family Size')
  8. plt.ylabel('Count')
  9. plt.title('Passenger Count by Family Size')
  10. plt.show()

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

(本题使用热力图作答)

  1. # 计算不同年龄段和船舱等级组合下的乘客存活率
  2. survival_rate_by_age_group_pclass = data.groupby(['Age', 'Pclass'])['Survived'].mean().unstack()
  3. # 绘制热力图显示乘客存活率与年龄段、船舱等级之间的关联
  4. sns.heatmap(survival_rate_by_age_group_pclass, annot=True, cmap='coolwarm')
  5. plt.xlabel('Pclass')
  6. plt.ylabel('Age Group')
  7. plt.title('Survival Rate by Age Group and Pclass')
  8. plt.show()

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

(本题使用热力图作答)

  1. # 计算不同家庭规模和船舱等级组合下的乘客存活率
  2. survival_rate_by_family_size_pclass = data.groupby(['FamilySize', 'Pclass'])['Survived'].mean().unstack()
  3. # 绘制热力图显示乘客存活率与家庭规模、船舱等级之间的关联
  4. sns.heatmap(survival_rate_by_family_size_pclass, annot=True, cmap='coolwarm')
  5. plt.xlabel('Pclass')
  6. plt.ylabel('Family Size')
  7. plt.title('Survival Rate by Family Size and Pclass')
  8. 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、舱位等级越高,生存概率越大,但是未发现生存率与家庭数量有明显关联。

三、结束

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/690558
推荐阅读
相关标签
  

闽ICP备14008679号