写点什么

利用 Python 分析快手 APP 全国大学生用户数据(2022 年初赛第四题 )

作者:繁依Fanyi
  • 2023-05-04
    安徽
  • 本文字数:4894 字

    阅读完需:约 16 分钟

利用Python分析快手APP全国大学生用户数据(2022 年初赛第四题 )

一、题目描述

0、背景

背景:利用 Python 分析快手 APP 全国大学生用户数据,发现:哪个学校的学生最喜欢使用快手 APPAndroid、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 pdfrom pyecharts.charts import Barfrom pyecharts import options as optsfrom pyecharts.commons.utils import JsCodeimport matplotlib.pyplot as pltfrom pyecharts.charts import Mapimport 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:



从这里便可以看出使用频率排名前五的学校,接着就可以使用 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 女 11Name: 性别, dtype: int64 男 17 女 15Name: 性别, dtype: int64 男 14 女 10Name: 性别, dtype: int64 男 21 女 12Name: 性别, dtype: int64 女 11 男 9Name: 性别, 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:


三、资源


文中代码在和鲸社区中也有发布,大家可以可以 fork 并运行来进行学习哦!

发布于: 刚刚阅读数: 5
用户头像

繁依Fanyi

关注

还未添加个人签名 2023-02-18 加入

还未添加个人简介

评论

发布
暂无评论
利用Python分析快手APP全国大学生用户数据(2022 年初赛第四题 )_大数据_繁依Fanyi_InfoQ写作社区