一、题目描述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: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女    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:
点赞 2
评论 0
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务