赞
踩
本帖记录了一次从头到尾的作业过程(从导入数据集,经过数据处理与分析,到可视化数据,再到最终总结。包括遇到的问题与解决办法),其中运用到的知识来源于学校老师和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
我的数据集选择的是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)
在一步中,我们将进行数据的准备与缺失值的补充
首先,我们先查看数据集的基本情况:
- # 输出数据集的行数和列数
- 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())
我是在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()
在这一部分中,我将提出一些问题,并且使用数据分析与可视化知识进行回答
问题以及解答方式:
① 不同舱位等级的乘客数量是多少?
(本题使用条形图回答)
- 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()
在各个部分中,我将总结归纳从数据集中可视化得出的推论,然后回答我提出的问题。
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、舱位等级越高,生存概率越大,但是未发现生存率与家庭数量有明显关联。
学生党,第一次写博客,有不正确的地方欢迎批评指正。
也感谢老师和各路大神提供的帮助。
创作不易,转载请注明出处(顿首)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。