【计算机设计大赛近年获奖信息】数据分析及可视化

简介: 【计算机设计大赛近年获奖信息】数据分析及可视化

写在前面


本文通过最近三年 “中国大学生计算机设计大赛” 的获奖数据(2021结果尚未揭晓),分析挖掘一下该比赛深层的一些内容,主要有以下几点:

  • 各年各奖项的比例分布
  • 各年得奖最多的学校 Top10
  • 哪些学校多次进入得奖最多 Top10
  • 各学校三年中参赛次数统计
  • 各级别奖项中学校层次划分
  • 参赛人数与奖项之间的关系
  • 获奖作品名称热词

文中各部分中如果代码量较多的,为了阅读体验,就不进行展示,如需代码及相关文件可以私信我。


数据读取及描述


数据集是大赛官方提供的数据,2018、2019 年数据为.xlsx文件,2020 年数据为.pdf文件。先读取 2018 、2019 年数据,并观察一下数据集信息。


import pandas as pd
df_2018 = pd.read_excel('2018年决赛正式结果.xlsx', sheet_name='123等奖')
df_2019 = pd.read_excel('2019年大赛获奖作品名单公示20190907.xlsx')
复制代码


image.png

df_2019.info()
复制代码

image.png

通过上图中的信息可以看到,2018 年与 2019 年的数据集格式有挺大的差异,这些在之后合并时需要统一。


由于 2020 年的数据是 .pdf 文件,我们单独定义一个函数来读取。对于读取时的一些细节问题,都已在代码中以注释的形式标出。


import pdfplumber
def read_pdf_2020(read_path):
    pdf_2020 = pdfplumber.open(read_path)
    result_df = pd.DataFrame()
    for page in pdf_2020.pages:
        table = page.extract_table()
        df_detail = pd.DataFrame(table[1:], columns=table[0])
        # 合并每页的数据集
        result_df = pd.concat([df_detail, result_df], ignore_index=True)
    # 删除值全部是 NaN 的列
    result_df.dropna(axis=1, how='all', inplace=True)
    # 重置列名
    result_df.columns = ['奖项', '作品编号', '作品名称', '参赛学校', '作者', '指导老师']
    return result_df
df_2020 = read_pdf_2020('2020年中国大学生计算机设计大赛参赛作品获奖名单.pdf')
复制代码

image.png

观察 2020 年的数据,相比于前两年的数据,它的各列都没有缺失值,但2020年的获奖信息中并没有包含作品类别这一列,所以我们处理数据集时要将前两年的类别列进行删除。这样,我们可以按照 2020 数据集的格式作为模板,将前两年的数据集转换为相同的格式,再进行合并。


数据预处理


各年数据集格式化

按照 2020 年格式,将 2018 年与 2019 年数据集中部分列进行合并,并更换列名,删除多余的列。并添加 “年份” 这一列。

下面是处理后的 2018 年与 2019 年数据。

image.png

image.png

对于 2020 年数据集的处理要注意,数据读取时是基于每页数据来读取的,如果在一页的最后一行数据较多,需要换行的话,那么下一页首行数据就会缺失,如下所示。

image.png

这种情况就需要先筛选出这些作品编号为空的行,在将数据添加到上一行中。

# 2020年数据集处理
clean_df_2020 = df_2020.copy()
# 部分信息过长导致在分页处被分割,分别出现在两页上,下面将奖项为空的数据添加到上一条数据的信息中。
clean_df_2020.iloc[609]['参赛学校'] += '医大学'
clean_df_2020.iloc[1330]['作品名称'] += '丹霞'
clean_df_2020.iloc[2121]['作品名称'] += '现'
clean_df_2020.iloc[2997]['作品名称'] += '云平台'
del_index = clean_df_2020.loc[clean_df_2020['奖项'] == ''].index
clean_df_2020.drop(del_index, inplace=True)
clean_df_2020.reset_index(drop=True, inplace=True)
clean_df_2020['年份'] = [2020 for _ in range(len(clean_df_2020))]
复制代码


数据合并

现在合并三年的数据。合并后数据集如下。

image.png


数据清洗

现在我们要对合并后的数据集进行一些处理,以便更好地分析及可视化。由于之后我们要用到全国高校的一些基本信息,如学校层次(985 211等),所以需要导入 college_info.csv ,该数据是博主在 6月15日 爬取的,部分高职高专可能并未收录,对于这部分高校就将对应标签赋值为 “暂无数据” 。清除参赛学校和作品名称中的换行符“\n”,之后添加 参赛人数列 来记录 各作品作者人数指导老师人数列 记录 该作品指导老师人数

college_info = pd.read_csv('college_info.csv')
college_name = college_info['学校名称'].values.tolist()
college_level = []
for college in all_df['参赛学校']:
    if college not in college_name:
        college_level.append('暂无数据')
    else:
        college_level.append(college_info['学校层次'][college_name.index(college)])
all_df['学校层次'] = college_level
all_df['参赛学校'] = all_df['参赛学校'].str.replace('\n|\r', '')
all_df['作品名称'] = all_df['作品名称'].str.replace('\n|\r', '')
# 删除作者为空的列
all_df.dropna(subset=['作者'], axis=0, inplace=True)
# 添加 参数人数 列来记录各作品作者人数
all_df['参赛人数'] = all_df['作者'].apply(lambda x: len(x.split('、')))
count_list = []
for index, row in all_df.iterrows():
    try:
        count_list.append(len(row['指导老师'].split('、')))
    except:
        count_list.append(0)
all_df['指导老师人数'] = count_list
all_df.to_csv('all_df.csv', index=False)
all_df
复制代码

处理后的数据集如下。

image.png


数据分析及可视化


各年奖项数量分布

统计三年中一等奖、二等奖、三等奖的占比,绘制层叠条形图。

'''
数据统计省略
'''
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType
c = Bar(init_opts=opts.InitOpts(theme=ThemeType.CHALK))
c.add_xaxis([2018, 2019, 2020])
c.add_yaxis("三等奖", list1, stack="stack1", category_gap="70%")
c.add_yaxis("二等奖", list2, stack="stack1", category_gap="70%")
c.add_yaxis("一等奖", list3, stack="stack1", category_gap="70%")
c.set_series_opts(label_opts=opts.LabelOpts(
                    position="right",
                    formatter=JsCode(
                        "function(x){return Number(x.data.percent * 100).toFixed() + '%';}"
                    ),
                )
            )
c.render("./images/各年奖项数量分布堆叠条形图.html")
c.render_notebook()
复制代码

image.png

从上图中观察发现,随着时间的推移,一等奖、二等奖的比例开始减少,三等奖比例增加,在 2020 年三等奖比例达到68%,不难看出赛方想要增加一等奖的含金量。


各年得奖最多的学校Top10

统计各年得奖最多的前 10 名学校的各项奖的数目,绘制图形。

image.png

从上图中大致可以看到很多大学不止一次出现在 Top10 当中,在这些学校中,一部分可能是因为学校比较重视该比赛。

下面使用韦恩图详细看一下,哪些学校多次进入得奖最多 Top10。

image.png

沈阳师范大学、沈阳工学院、辽宁工业大学在三年中都进入 Top10,还有一些其他两次进入 Top10 的学校, 其中东北部的大学明显较多。


各学校参加次数统计

现在统计各个学校的参赛次数,并计算各次数的学校数量。

from collections import Counter
all_school = []
for year in [2018, 2019, 2020]:
    school_set = set(all_df.loc[all_df['年份'] == year, '参赛学校'].values.tolist())
    all_school += list(school_set)
value_count = Counter(all_school)
count_list = ['参赛' + str(n) + '次' for n in value_count.values()]
counter = Counter(count_list)
from pyecharts.charts import Pie
c = Pie(init_opts=opts.InitOpts(theme=ThemeType.CHALK))
c.add("", [list(z) for z in zip(counter.keys(), counter.values())])
c.set_global_opts(title_opts=opts.TitleOpts(title="Pie-基本示例"))
c.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
c.render("./images/各学校参加次数统计饼图.html")
c.render_notebook()
复制代码

image.png

在这三年的参赛学校中,三次参赛的占了一半左右,参赛一次和参赛两次的各占 25% 左右,这么说,参加比赛的学校还是愿意继续下一届继续去参加,说明该比赛是有吸引学校的地方。


各年参赛学校层次划分

统计各年参赛学校的层次,观察参加比赛学校的层次分布。

image.png

三年中,绝大多数的参赛者来自普通本科,其次为211,并且各层次的学校参赛人数在逐年上升。普通本科最为显著。可以看到,随着大赛的宣传和计算机的普及,越来越多的人关注计算机方面的比赛。(对于暂无数据的那一列部分原因是因为学校的信息没有收录,还有可能是参赛选手填写学校时出现失误造成)


参赛人数与奖项分布

根据作者和指导老师的人数进行组合,统计各奖项中出现的次数,绘制如下图形。

image.png

在各项奖项中,获奖比例最多的都是3名作者2名老师的阵容,其次就是3名作者1名老师。其余的阵容获奖人数就比较少了。看样子也不是人数越多获奖几率越大。


获奖作品名称热词

首先定义一个加载停用词的函数,用于加载本地停用词。

def load_stopwords(read_path):
    '''
    读取文件每行内容并保存到列表中
    :param read_path: 待读取文件的路径
    :return: 保存文件每行信息的列表
    '''
    result = []
    with open(read_path, "r", encoding='utf-8') as f:
        for line in f.readlines():
            line = line.strip('\n')  # 去掉列表中每一个元素的换行符
            result.append(line)
    return result
# 加载中文停用词
stopwords = load_stopwords('wordcloud_stopwords.txt')
复制代码


统计所有作品名称中去除停用词后的词汇,保存到列表中。

import jieba
# 添加自定义词典
jieba.load_userdict("自定义词典.txt")
token_list = []
# 对标题内容进行分词,并将分词结果保存在列表中
for name in all_df['作品名称']:
    tokens = jieba.lcut(name, cut_all=False)
    token_list += [token for token in tokens if token not in stopwords]
len(token_list)
复制代码


统计该列表中各词出现的频率,取前100作为热门词,绘制词云图。

from pyecharts.charts import WordCloud
from collections import Counter
token_count_list = Counter(token_list).most_common(100)
new_token_list = []
for token, count in token_count_list:
    new_token_list.append((token, str(count)))
c = WordCloud()   
c.add(series_name="热词", data_pair=new_token_list, word_size_range=[20, 200])
c.set_global_opts(
    title_opts=opts.TitleOpts(
        title="获奖作品热词", title_textstyle_opts=opts.TextStyleOpts(font_size=23)
    ),
    tooltip_opts=opts.TooltipOpts(is_show=True),
)
c.render("./images/获奖作品热词.html")
c.render_notebook()
复制代码

image.png

观察上图,能够十分清晰的了解目前计算机中热门的话题,如大数据、人工智能、算法、可视化、管理系统、机器人等,这些方向一直都是计算机行业的热门方向,也可以作为我们今后发展的一条道路。


总结


  • 近年来,计算机设计大赛一等奖、二等奖的比例减少,三等奖比例增加,这就增加了获得一、二等奖的难度含金量
  • 东北部的大学更加关注该赛事,无论从参赛人数还是获奖人数来看,其中沈阳师范大学、沈阳工学院、辽宁工业大学多次进入获奖最多 Top10。
  • 绝大多数的学校连续参加该比赛,在最近三年中,三次参赛的学校占了获奖总学校的一半左右。
  • 三年中,绝大多数的参赛者来自普通本科,其次为211,并且各层次的学校参赛人数在逐年上升。
  • 获奖的参赛选手中比例最多的是 3名作者2名老师 的阵容,其次就是 3名作者1名老师。(作者最多5人,指导老师2人 共7人)
  • 作品中的热门词大数据、人工智能、算法、可视化、管理系统、机器人等。



相关文章
|
1月前
|
数据采集 数据可视化 数据挖掘
基于Python的数据分析与可视化实战
本文将引导读者通过Python进行数据分析和可视化,从基础的数据操作到高级的数据可视化技巧。我们将使用Pandas库处理数据,并利用Matplotlib和Seaborn库创建直观的图表。文章不仅提供代码示例,还将解释每个步骤的重要性和目的,帮助读者理解背后的逻辑。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供有价值的见解和技能。
100 0
|
9天前
|
数据采集 数据可视化 数据挖掘
使用Python进行数据分析和可视化
【10月更文挑战第33天】本文将介绍如何使用Python编程语言进行数据分析和可视化。我们将从数据清洗开始,然后进行数据探索性分析,最后使用matplotlib和seaborn库进行数据可视化。通过阅读本文,你将学会如何运用Python进行数据处理和可视化展示。
|
30天前
|
数据采集 数据可视化 数据挖掘
使用Python进行数据处理与可视化——以气温数据分析为例
【10月更文挑战第12天】使用Python进行数据处理与可视化——以气温数据分析为例
183 0
|
1月前
|
数据采集 数据可视化 数据挖掘
Python 数据分析实战:使用 Pandas 进行数据清洗与可视化
【10月更文挑战第3天】Python 数据分析实战:使用 Pandas 进行数据清洗与可视化
85 0
|
1月前
|
机器学习/深度学习 数据采集 数据可视化
如何理解数据分析及数据的预处理,分析建模,可视化
如何理解数据分析及数据的预处理,分析建模,可视化
49 0
|
2月前
|
机器学习/深度学习 存储 数据可视化
数据分析和可视化
数据分析和可视化
|
2月前
|
数据采集 传感器 数据可视化
利用Python进行数据分析与可视化
【9月更文挑战第11天】在数字化时代,数据已成为企业决策和科学研究的关键。本文将引导读者了解如何使用Python这一强大的工具进行数据分析和可视化,帮助初学者理解数据处理的流程,并掌握基本的可视化技术。通过实际案例,我们将展示如何从原始数据中提取信息,进行清洗、处理,最终以图形方式展现结果,使复杂的数据变得直观易懂。
|
3月前
|
数据可视化 数据挖掘 Python
"揭秘Visium HD黑科技:空间数据分析大揭秘,可视化与整合的艺术之旅!"
【8月更文挑战第20天】近年来,空间转录组技术,特别是Visium HD技术,因其高分辨率与高通量特性,在单细胞生物学领域受到广泛关注。本文通过Python演示了Visium HD数据的全流程分析:从数据准备(读取表达矩阵和空间坐标)、空间数据分析(计算基因表达统计量)、数据可视化(绘制基因表达热图和空间点分布图),到多样本数据整合,为读者提供了实用的分析指南,助力深入探索空间转录组学的奥秘。
81 4
|
3月前
|
SQL 数据可视化 数据挖掘
SQL 在数据分析中简直太牛啦!从数据提取到可视化,带你领略强大数据库语言的神奇魅力!
【8月更文挑战第31天】在数据驱动时代,SQL(Structured Query Language)作为强大的数据库查询语言,在数据分析中扮演着关键角色。它不仅能够高效准确地提取所需数据,还能通过丰富的函数和操作符对数据进行清洗与转换,确保其适用于进一步分析。借助 SQL 的聚合、分组及排序功能,用户可以从多角度深入分析数据,为企业决策提供有力支持。尽管 SQL 本身不支持数据可视化,但其查询结果可轻松导出至 Excel、Python、R 等工具中进行可视化处理,帮助用户更直观地理解数据。掌握 SQL 可显著提升数据分析效率,助力挖掘数据价值。
68 0
|
3月前
|
数据可视化 前端开发 JavaScript
Echarts+JS实现数据分析可视化大屏!!附源码!!
Echarts+JS实现数据分析可视化大屏!!附源码!!