背景
背景:利用Python分析快手APP全国大学生用户数据,发现: 哪个学校的学生最喜欢使用快手APP Android、IOS、PC三大平台用户占比份额 全国哪些城市(学校所在地)的学生使用频次最高 全国哪些省份的生源最喜欢使用快手APP … 数据:快手APP大学生用户分析数据.csv 数据结构如下(字段名都为中文):
1、题目一
1、学校学生使用频次最多的前30所学校(5分)
提示:按照学校分组,对学生人数做累加求得每个学校学生使用的频次,最后对频次进行降序排名并将最终结果通过横向柱状图展示。
要求: 1)各学校使用频次(1分) 2)学校学生使用频次最多的前30所学校(1分)
2、题目二
2、使用频次前五学校学生中男女使用比例 (5分)
基于题目1中统计得到的各学校学生使用频次取出排名前5的学校,按照学校、性别分组,对学生人数进行sum累加求得各性别人数,将最终结果通过饼图展示(即展示前5所学校中每所学校男生女生的人数,需要在一张画布上展示5个图形,学校名作为每个图形的标题)。
要求: 1)取出学校学生使用频次排名前5的学校 (1分) 2)求得前5所学校中男生女生的使用频次(1分)
3、题目三
3、按省份统计使用快手APP数量 (5分)
按照学校省份进行分组,对学生人数进行累加求和得到每个省份的学生使用频次,最终将结果通过地图展示
要求: 1)各省份学生的使用频次(1分)
二、题解
1、题目一详解 —— 学校学生使用频次最多的前30所学校
① 相关知识点讲解
Ⅰ、Pyecharts Bar 相关使用
Pyecharts 画柱状图的方式非常简单,只需要导包并使用 Pyecharts 中 Bar()
类即可。其中 add_yaxis()
方法是必不可少的,通过该方法来导入数据并绘制柱状图;其次,通过 add_xaxis()
可以添加横坐标。
其次, reversal_axis()
可以用来将横纵坐标调换,从而达到绘制横向柱状图的目的。
set_global_opts()
可以对我们所绘制的柱状图的属性进行一些设置,像是柱状图的名称、标签、颜色等属性都可以在这里进行设置。
更多内容可以参考 【Pyecharts 柱状图的绘制】。
② 本题题解
首先导入我们所需要的包,pandas、pyecharts、matplotlib 等模块都需要导入。当然后面需要的时候再导入也是可以的啦!
# 导入所需模块
import pandas as pd
from pyecharts.charts import Bar
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
import matplotlib.pyplot as plt
from pyecharts.charts import Map
import os
使用 pandas 中的 read_csv()
函数读取我们的数据:
# 读取数据
data = pd.read_csv('某短视频APP大学生用户分析数据.csv')
接下来使用 pandas 相关的 groupby()
方法将数据分组,并使用 sort_values()
将数据按照学生使用频次将学校进行排列:
# 数据处理
freqByStuNum = data.groupby(by='学校')['学生人数'].sum().to_frame('学生使用频次').sort_values(['学生使用频次'],ascending=False).reset_index()
之后使用 pyecharts 中的 Bar 进行柱状图的绘画,画出的图像可能会显示不全,这里可以使用 InitOpts()
方法设置图像的大小,从而避免这一问题。
# pyecharts 画图
(
Bar(
# 调整图像
init_opts=opts.InitOpts(width="1700px",
height="750px",)
)
.add_xaxis(freqByStuNum['学校'].tolist()[0:30])
.add_yaxis('人数',freqByStuNum['学生使用频次'].tolist()[0:30],category_gap="100%",bar_min_width=20)
.set_series_opts(
label_opts=opts.LabelOpts(position="right",
),
)
.reversal_axis()
.set_global_opts(
title_opts=opts.TitleOpts(title="使用频次"),
xaxis_opts=opts.AxisOpts(
name='频次',
axislabel_opts={"rotate":45},
),
yaxis_opts=opts.AxisOpts(
axislabel_opts=opts.LabelOpts(font_size=12),
axistick_opts=opts.AxisTickOpts(is_show=False),
axisline_opts=opts.AxisLineOpts(is_show=False),
interval=100,
),
)
.render_notebook()
)
2、题目二详解 —— 使用频次前五学校学生中男女使用比例
① 相关知识点讲解
Ⅰ、matplotlib 相关使用
这里主要讲一下 matplotlib 画布的分割问题,以及饼图的绘制问题。
关于 matplotlib 画布的分割问题,可以使用 subplot()
函数将画布划分成若干个子画布,在子画布上画图,从而实现 “一画多图” 的效果。
这里使用 matplotlib 来饼图,是因为 matplotlib 绘制饼图更简单,在一个画布中绘制五个图形的方式更加方便。matplotlib 绘制饼图只需要传入我们的数据,matplotlib 就会自动计算比例并绘制图形大小,详情可以见下面的分析。
② 本题题解
使用 head()
方法取出快手app使用频次排名前五的学校,结果如下:
# 获取频次排名前五的学校
freqByStuNum_head5 = freqByStuNum.head(5)
freqByStuNum_head5['学校'].to_frame()
复制
out:
学校 | |
---|---|
0 | 香港中文大学 |
1 | 汉口学院 |
2 | 阜阳职业技术学院 |
3 | 福建医科大学 |
4 | 青岛职业技术学院 |
从这里便可以看出使用频率排名前五的学校,接着就可以使用 value_count()
对各所学校的男女人数进行统计:
# 处理频率前五所学校的性别
freqByStuNum_top1_Sex = data[data['学校'] ==('香港中文大学')]['性别'].value_counts()
freqByStuNum_top2_Sex = data[data['学校'] ==('汉口学院')]['性别'].value_counts()
freqByStuNum_top3_Sex = data[data['学校'] ==('阜阳职业技术学院')]['性别'].value_counts()
freqByStuNum_top4_Sex = data[data['学校'] ==('福建医科大学')]['性别'].value_counts()
freqByStuNum_top5_Sex = data[data['学校'] ==('青岛职业技术学院')]['性别'].value_counts()
# 输出一下
print(freqByStuNum_top1_Sex)
print(freqByStuNum_top2_Sex)
print(freqByStuNum_top3_Sex)
print(freqByStuNum_top4_Sex)
print(freqByStuNum_top5_Sex)
out:
男 18 女 11 Name: 性别, dtype: int64 男 17 女 15 Name: 性别, dtype: int64 男 14 女 10 Name: 性别, dtype: int64 男 21 女 12 Name: 性别, dtype: int64 女 11 男 9 Name: 性别, dtype: int64
得到男女人数之后,我们就可以开始做图了,这里我们使用 matplotlib 的 pie 来作饼图,并使用 subplot 函数讲我们的画布分成 5 份来分别做出 5 个饼图:
# 创建画布
plt.figure(figsize=(20, 8), dpi=1000)
# 香港中文大学
plt.subplot(1,5,1) # 画布第 1 块
plt.pie(freqByStuNum_top1_Sex,
labels=['男','女'],
autopct='%.2f%%')
plt.title("香港中文大学")
# 汉口学院
plt.subplot(1,5,2) # 画布第 2 块
plt.pie(freqByStuNum_top2_Sex,
labels=['男','女'],
autopct='%.2f%%')
plt.title("汉口学院")
# 阜阳职业技术学院
plt.subplot(1,5,3) # 画布第 3 块
plt.pie(freqByStuNum_top3_Sex,
labels=['男','女'],
autopct='%.2f%%')
plt.title("阜阳职业技术学院")
# 福建医科大学
plt.subplot(1,5,4) # 画布第 4 块
plt.pie(freqByStuNum_top4_Sex,
labels=['男','女'],
autopct='%.2f%%')
plt.title("福建医科大学")
# 青岛职业技术学院
plt.subplot(1,5,5) # 画布第 5 块
plt.pie(freqByStuNum_top5_Sex,
labels=['男','女'],
autopct='%.2f%%')
plt.title("青岛职业技术学院")
out:
注意,有些系统可能无法正常显示中文,需要在画图之前添加以下语句来设置 matplotlib 的字体从而保证饼图中汉字的正常显示:
## 部分设备安装 matplotlib 可能无法正常显示中文,需要添加以下两句
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
3、题目三详解 —— 按省份统计使用快手APP数量
① 相关知识点讲解
Ⅰ、Pyecharts Map 相关使用
想要画出好看的地图,Pyecharts 中的 Map 就尤为重要。通过 Map()
中的 add()
方法,可以将数据转换成热力分布地图。
set_global_opts()
可以用来设置热力图的数值范围,从而将地图中的颜色更加分明,更容易看出不同地区之间 app 使用频次的差异。
set_series_opts()
中可以使用 LabelOpts()
方法来设置地图中标签的格式,其中的 formatter
可以使用 JavaScript 来对我们的标签进行更复杂的渲染,从而美化我们的图像。
更多内容可以参考 【Pyecharts Map的绘制】。
② 本题题解
第三题我们主要使用 pyecharts 中的 map 来实现频次热力地图,由于 pyecharts 画地图时可能会因为网络问题而导致地图无法显示出来,于是我们就先下载 pyecharts 的地图数据包(当然网络好的可以不用下载)。
## 安装地图数据包
# pip install echarts-countries-pypkg
# pip install echarts-china-provinces-pypkg
# pip install echarts-china-cities-pypkg
# pip install echarts-china-counties-pypkg
# pip install echarts-china-misc-pypkg
# pip install echarts-united-kingdom-pypkg
# python os调用系统命令来实现地图数据包的安装
os.system("pip install echarts-countries-pypkg")
os.system("pip install echarts-china-provinces-pypkg")
os.system("pip install echarts-china-cities-pypkg")
os.system("pip install echarts-china-counties-pypkg")
os.system("pip install echarts-china-misc-pypkg")
os.system("pip install echarts-united-kingdom-pypkg")
因为画 map 图的时候需要省名与学生人数的列表数据,这里便把两者分离出来,并对省份名做相关处理。
# 数据处理
province_data = data.loc[:,['学生省份','学生人数']].groupby('学生省份').count().reset_index()
province_data = province_data.replace('省','',regex=True).replace('自治区','',regex=True).replace('特别行政区','',regex=True)\
.replace('壮族','',regex=True).replace('维吾尔','',regex=True).replace('回族','',regex=True).replace('市','',regex=True)
province_name = province_data['学生省份'].tolist()
province_num = province_data['学生人数'].tolist()
# 输出数据
print(province_name,'\n',province_num)
out:
[‘\N’, ‘上海’, ‘云南’, ‘内蒙古’, ‘北京’, ‘台湾’, ‘吉林’, ‘四川’, ‘天津’, ‘宁夏’, ‘安徽’, ‘山东’, ‘山西’, ‘广东’, ‘广西’, ‘新疆’, ‘江苏’, ‘江西’, ‘河北’, ‘河南’, ‘浙江’, ‘海南’, ‘湖北’, ‘湖南’, ‘澳门’, ‘甘肃’, ‘福建’, ‘西藏’, ‘贵州’, ‘辽宁’, ‘重庆’, ‘陕西’, ‘青海’, ‘香港’, ‘黑龙江’] [115, 731, 959, 705, 912, 3, 624, 1289, 585, 374, 1110, 1309, 917, 1433, 973, 620, 1388, 1034, 1231, 1403, 1196, 451, 1065, 1078, 31, 772, 920, 143, 1027, 883, 916, 923, 305, 36, 728]
使用 pyecharts map 图作频率热力地图,使用 add 方法使用我们的数据进行画图,并使用 JsCode 方法把地图中各个省份的标签变成 省份+数字
的形式,注意 VisualMapOpts()
中的 max 值不要设置太大,否则都会变成一个颜色。
(
Map()
.add("人数",
[list(z) for z in zip(province_name, province_num)],
maptype="china"
)
.set_series_opts(
label_opts=opts.LabelOpts(
is_show=True,
color='black',
position='bottom',
font_size=10,
formatter=JsCode(
'''function(params) {
if (isNaN(params.value)){
return params.name;
}else{return params.name+'\\n'+params.value;}
}'''
),
)
)
.set_global_opts(
title_opts=opts.TitleOpts(title="各省份使用人数"),
visualmap_opts=opts.VisualMapOpts(max_=1500),
)
.render_notebook()
)
out: