在以下的任务中,请将每一个任务标题作为markdown标题内容写进jupyter中,标题下方写解题代码。
首先我们先导入两个常用的数据分析和可视化库。
import pandas as pd
:这行代码导入了pandas库,并将其简称为pd。pandas是一个强大的数据处理库,提供了DataFrame等数据结构以及丰富的数据处理、清洗、分析等功能。
import matplotlib.pyplot as plt
:这行代码导入了matplotlib库中的pyplot模块,并将其简称为plt。matplotlib是一个用于绘制图形的库,而pyplot是其子模块,提供了类似于MATLAB的绘图API,可以方便地创建各种图形。
注:以下任务点的数据均来自航空公司数据
任务点1:根据“航空公司数据.xlsx”完成下述图形的绘制,要求每个图形都有标题和坐标轴名称:绘制各省份用户人数柱形图(前30名)
根据任务点1,我们需要先导入航空公司数据表。代码如图:
导入完航空公司数据表后,开始绘图,代码如下:
这段代码的主要功能是生成一个柱状图,展示了各省份用户人数的分布情况。
首先,它从名为df1
的数据框中获取了'工作地所在省份'这一列,并使用value_counts()
函数统计了每个省份的用户数量,然后取前30个结果存储在top30
变量中。
接下来,设置了图形中的字体为'SimHei',这是为了确保中文能正确显示。
然后,创建了一个柱形图,x轴为省份(即top30
的索引),y轴为用户数量(即top30
的值)。每个柱子的宽度设置为0.7。
设置图表的标题为'各省份用户人数柱形图(前30名)',x轴标签为'省份',y轴标签为'用户人数'。
将x轴的标签旋转90度,以便更好地显示。
最后,对于每一个省份和其对应的用户数量,都在柱状图上方添加了一个文本标签,显示具体的用户数量。这个标签的位置是在对应省份的柱子上方100个单位的位置,水平居中对齐。
最后,使用plt.show()
显示这个图形。
结果如图:
任务点2:画用户“平均折扣系数”和“飞行里程数”数据的散点图
如任务一所示,第一步依旧是先自定义一个名字并导入列表:
随后开始根据任务点二画散点图,代码如图所示:
1、plt.scatter()
函数用于绘制散点图,其中df2['平均折扣系数']
表示x轴的数据,df2['飞行里程数']
表示y轴的数据。
2、s=1
表示散点的大小为1。
3、c='r'
表示散点的颜色为红色
4、marker='+'
表示散点的形状为加号
5、plt.xlim(0,20)
和plt.ylim(0,300000)
分别设置x轴和y轴的范围
6、plt.xlabel('平均折扣系数',loc='right')
设置x轴的标签为“平均折扣系数”,并将标签位置设置为右侧
7、plt.ylabel('飞行里程数',loc='top')
设置y轴的标签为“飞行里程数”,并将标签位置设置为顶部。
8、最后plt.show()
显示绘制的散点图。
结果如图所示:
任务点3:统计每年入会会员人数,并画折线图。
步骤:
(1)查看入会时间是否是字符串序列,是则转换为时间对象序列
(2)提取入会时间的年数据作为新的列,保存到表格中
(3)分组聚合求各组人数
(4)plot画折线图
第一步,导入相关数据,如图所示:
随后开始根据任务点三的四个步骤编写代码并绘图,代码如图所示:
代码解释:
1、df3['入会时间'] = pd.to_datetime(df3['入会时间'])
:将'入会时间'列转换为datetime类型。
2、df3['入会年份'] = df3['入会时间'].dt.year
:提取出'入会时间'列中的年份,并存储在新的'入会年份'列中。
3、years = df3.groupby('入会年份').size()
:按照'入会年份'进行分组,并计算每个分组的大小(即每年入会的会员人数)。
4、plt.plot(years.index,years.values)
:绘制折线图,横坐标为年份,纵坐标为会员人数。
5、years.plot(kind = 'line',marker='o')
:使用pandas的plot方法绘制折线图,设置线条样式为实线,标记点样式为圆圈
6、plt.title('每年入会会员人数折线图')
:设置图表标题为“每年入会会员人数折线图”
7、for x0,y0 in zip(years.index,years.values): plt.text(x0,y0+20,f'{y0}',ha='center')
:在每个数据点上方20个单位的位置添加文本标签,显示该年份的会员人数。
8、plt.xlabel('年份')
:设置x轴标签为“年份”。
9、plt.ylabel('会员人数')
:设置y轴标签为“会员人数”。
10、plt.show()
:显示绘制的折线图。
结果如图显示:
任务点4:假设“飞龄”为用户的入会时间距离今天的年数(不满1年的时间舍去),试对“飞龄”数据分组(组距为3),并统计各组人数,画各组人数占比的饼图。(提示:使用序列的agg方法和时间类型对象)
步骤:
(1)查看入会时间是否是字符串序列,是则转换为时间对象序列
(2)创建一个表示今天的时间对象
(3)入会时间序列-今天的时间,计算时间差序列
(4)取时间差对象序列的年份数据作为新的列
(5)保存新的列(飞龄)到表格中
(6)将飞龄数据做一个数据分箱
(6)基于分箱结果做分组聚合求各组人数
(7)画饼图
第一步,导入相关数据,如图所示:
随后开始根据任务点四的七个步骤编写代码并绘图,代码如图所示:
关于以上代码的解释:
1、df4['入会时间'] = pd.to_datetime(df4['入会时间'])
:将数据框df4中的'入会时间'列转换为日期时间格式。
2、df4['飞龄'] = (pd.Timestamp.today().year - df4['入会时间'].dt.year)
:计算每个用户的飞龄,即当前年份减去入会时间年份。
3、bins = [9, 12, 15, 18]
:定义一个列表,表示飞龄分组的边界值。
4、df4['飞龄分组'] = pd.cut(df4['飞龄'], bins=bins)
:根据给定的bins对飞龄进行分组,将分组结果存储在新的'飞龄分组'列中。
5、group = df4['飞龄分组'].value_counts()
:统计每个飞龄分组的用户数量。
6、plt.pie(group, labels=group.index,autopct='%1.1f%%')
:使用matplotlib库绘制饼图,展示不同飞龄分组的用户数量占比。
7、plt.title('用户飞龄分布饼图')
:设置饼图的标题为'用户飞龄分布饼图'
8、plt.show()
:显示绘制的饼图。
结果如图所示:
任务点5:同时绘制“飞行次数”数据分布的直方图和箱线图,在画布中上下分布。
第一步,导入相关数据,如图所示:
随后开始根据任务点五的步骤编写代码并绘图,代码如图所示:
关于以上代码的解释:
1、plt.figure(figsize=(12,10))
:创建一个大小为12x10的画布。
2、plt.subplot(2,1,1)
:在画布上创建一个2行1列的子图,当前子图为第1个。
3、plt.hist(...)
:绘制直方图,横坐标为飞行次数,纵坐标为人数。直方图的分组区间为[df5['飞行次数'].min(), df5['飞行次数'].max()),步长为5。
4、plt.title('用户飞行次数直方图')
:设置直方图的标题为“用户飞行次数直方图”。
5、plt.xlabel('飞行次数')
:设置横坐标的标签为“飞行次数”。
6、plt.ylabel('人数')
:设置纵坐标的标签为“人数”。
7、plt.subplot(2,1,2)
:在画布上创建一个2行1列的子图,当前子图为第2个。
8、plt.boxplot(...)
:绘制箱形图,横坐标为飞行次数,纵坐标为人数。箱形图的标签为“飞行次数”。
9、plt.title('用户飞行次数箱形图')
:设置箱形图的标题为“用户飞行次数箱形图”。
10、plt.show()
:显示绘制的图形。
结果如图所示,就能得到两个图片:
除了以上这几种绘图方法,还有一种能够画出多种图像的方法。如图所示:
到此,所有任务均已完成