当前位置: 首页 > news >正文

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

大数据系列文章:👉 目录 👈

在这里插入图片描述

文章目录

    • 一、题目描述
      • 0、背景
      • 1、题目一
      • 2、题目二
      • 3、题目三
    • 二、题解
      • 1、题目一详解 —— 学校学生使用频次最多的前30所学校
        • ① 相关知识点讲解
          • Ⅰ、Pyecharts Bar 相关使用
        • ② 本题题解
      • 2、题目二详解 —— 使用频次前五学校学生中男女使用比例
        • ① 相关知识点讲解
          • Ⅰ、matplotlib 相关使用
        • ② 本题题解
      • 3、题目三详解 —— 按省份统计使用快手APP数量
        • ① 相关知识点讲解
          • Ⅰ、Pyecharts Map 相关使用
        • ② 本题题解
    • 三、资源

一、题目描述

0、背景

背景:利用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:

在这里插入图片描述

三、资源

  • 某短视频APP大学生用户分析数据.csv
  • Pyechart 官网
  • 和鲸社区 —— 某短视频APP大学生用户分析数据

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

相关文章:

  • 【转载】分布式训练和集合通信
  • 【K8S系列】Kubernetes的网络模型
  • CTFHub | 报错注入
  • Python-代码封装思想
  • 基于MATLAB的指纹识别算法仿真实现
  • Spring Boot中异步消息JMS的讲解与通信实例
  • JeecgBoot 3.4.3-GA 版本发布,开源免费的企业级低代码平台
  • 代码随想录38——动态规划:动态规划理论基础、509斐波那契数列、70爬楼梯、746使用最小花费爬楼梯
  • 基于大数据平台的毕业设计01:基于Docker的HDP集群搭建
  • YOLOv5剪枝 | 模型剪枝理论篇 | 1/2
  • 结构体、枚举类型和联合体
  • 【兄弟反目成仇系列】:我只是写了一个爆炸信息窗口脚本,好兄弟追了我几条街~
  • 参加微软学生开发者峰会,了解Azure和GitHub……
  • 【数据结构练习题——查找】
  • imx6ull-arm开发板和电脑网线直连通信
  • 深入了解以太坊
  • Angular 4.x 动态创建组件
  • Babel配置的不完全指南
  • CSS 专业技巧
  • Docker容器管理
  • JAVA_NIO系列——Channel和Buffer详解
  • java多线程
  • node-glob通配符
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • tweak 支持第三方库
  • underscore源码剖析之整体架构
  • Webpack 4 学习01(基础配置)
  • 创建一种深思熟虑的文化
  • 规范化安全开发 KOA 手脚架
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 使用parted解决大于2T的磁盘分区
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 译有关态射的一切
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 如何用纯 CSS 创作一个货车 loader
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #QT(串口助手-界面)
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (31)对象的克隆
  • (c语言)strcpy函数用法
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (Python第六天)文件处理
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (三)模仿学习-Action数据的模仿
  • (十六)一篇文章学会Java的常用API
  • (十一)c52学习之旅-动态数码管
  • (一)插入排序
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖