#冲刺创作新星# 利用Python分析快手APP全国大学生用户数据 原创 精华

忆往事_随风
发布于 2022-10-29 09:08
浏览
2收藏

Table of Contents

一、题目描述

0、背景

背景:利用Python分析快手APP全国大学生用户数据,发现:
哪个学校的学生最喜欢使用快手APP
Android、IOS、PC三大平台用户占比份额
全国哪些城市(学校所在地)的学生使用频次最高
全国哪些省份的生源最喜欢使用快手APP

数据:快手APP大学生用户分析数据.csv
数据结构如下(字段名都为中文):

#冲刺创作新星# 利用Python分析快手APP全国大学生用户数据 -鸿蒙开发者社区

1、题目一

1、学校学生使用频次最多的前30所学校(5分)

提示:按照学校分组,对学生人数做累加求得每个学校学生使用的频次,最后对频次进行降序排名并将最终结果通过横向柱状图展示。

要求:
1)各学校使用频次(1分)
2)学校学生使用频次最多的前30所学校(1分)

#冲刺创作新星# 利用Python分析快手APP全国大学生用户数据 -鸿蒙开发者社区

2、题目二

2、使用频次前五学校学生中男女使用比例 (5分)

基于题目1中统计得到的各学校学生使用频次取出排名前5的学校,按照学校、性别分组,对学生人数进行sum累加求得各性别人数,将最终结果通过饼图展示(即展示前5所学校中每所学校男生女生的人数,需要在一张画布上展示5个图形,学校名作为每个图形的标题)。

要求:
1)取出学校学生使用频次排名前5的学校 (1分)
2)求得前5所学校中男生女生的使用频次(1分)

#冲刺创作新星# 利用Python分析快手APP全国大学生用户数据 -鸿蒙开发者社区

3、题目三

3、按省份统计使用快手APP数量 (5分)

按照学校省份进行分组,对学生人数进行累加求和得到每个省份的学生使用频次,最终将结果通过地图展示

要求:
1)各省份学生的使用频次(1分)

#冲刺创作新星# 利用Python分析快手APP全国大学生用户数据 -鸿蒙开发者社区

二、题解

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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

使用 pandas 中的 read_csv() 函数读取我们的数据:

# 读取数据
data = pd.read_csv('某短视频APP大学生用户分析数据.csv')  
  • 1.
  • 2.

接下来使用 pandas 相关的 groupby() 方法将数据分组,并使用 sort_values() 将数据按照学生使用频次将学校进行排列:

# 数据处理
freqByStuNum = data.groupby(by='学校')['学生人数'].sum().to_frame('学生使用频次').sort_values(['学生使用频次'],ascending=False).reset_index()
  • 1.
  • 2.

之后使用 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()
)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.

2、题目二详解 —— 使用频次前五学校学生中男女使用比例

① 相关知识点讲解

Ⅰ、matplotlib 相关使用

这里主要讲一下 matplotlib 画布的分割问题,以及饼图的绘制问题。

关于 matplotlib 画布的分割问题,可以使用 subplot() 函数将画布划分成若干个子画布,在子画布上画图,从而实现 “一画多图” 的效果。

这里使用 matplotlib 来饼图,是因为 matplotlib 绘制饼图更简单,在一个画布中绘制五个图形的方式更加方便。matplotlib 绘制饼图只需要传入我们的数据,matplotlib 就会自动计算比例并绘制图形大小,详情可以见下面的分析。

② 本题题解

使用 head() 方法取出快手app使用频次排名前五的学校,结果如下:

# 获取频次排名前五的学校
freqByStuNum_head5 = freqByStuNum.head(5)
freqByStuNum_head5['学校'].to_frame()
  • 1.
  • 2.
  • 3.

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)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

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("青岛职业技术学院")
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.

out:

#冲刺创作新星# 利用Python分析快手APP全国大学生用户数据 -鸿蒙开发者社区

注意,有些系统可能无法正常显示中文,需要在画图之前添加以下语句来设置 matplotlib 的字体从而保证饼图中汉字的正常显示:

## 部分设备安装 matplotlib 可能无法正常显示中文,需要添加以下两句
plt.rcParams['font.sans-serif'] = ['SimHei'] 
plt.rcParams['axes.unicode_minus'] = False  
  • 1.
  • 2.
  • 3.

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")
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

因为画 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)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

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()
)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.

out:

#冲刺创作新星# 利用Python分析快手APP全国大学生用户数据 -鸿蒙开发者社区

三、资源

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

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
某短视频APP大学生用户分析数据.zip 393.11K 33次下载
本科赛题4 - 第四部分:可视化.docx 48.16K 26次下载
已于2022-10-30 08:34:14修改
4
收藏 2
回复
举报
4
1
2
1条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

看到附件怎么还有作业

回复
2022-10-31 17:06:00


回复
    相关推荐
    这个用户很懒,还没有个人简介
    觉得TA不错?点个关注精彩不错过
    帖子
    视频
    声望
    粉丝
    社区精华内容