數據分析——計算機設計大賽近年獲獎信息


數據分析——計算機設計大賽近年獲獎信息

 

寫在前面

本文通過最近三年 “中國大學生計算機設計大賽” 的獲獎數據,分析挖掘一下該比賽深層的一些內容,主要有以下幾點:

  • 各年各獎項的比例分布

  • 各年得獎最多的學校 Top10

  • 哪些學校多次進入得獎最多 Top10

  • 各學校三年中參賽次數統計

  • 各級別獎項中學校層次划分

  • 參賽人數與獎項之間的關系

  • 獲獎作品名稱熱詞

文中各部分中如果代碼量較多的,就不進行展示,代碼已上傳 github ,如果需要可以在文末鏈接中進入。

 

1. 數據讀取及描述

數據集是大賽官方數據,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')

 

在這里插入圖片描述 C:\Users\pc\AppData\Roaming\Typora\typora-user-images\image-20210618155634363.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')

 

在這里插入圖片描述

觀察 2020 年的數據,相比於前兩年的數據,它的各列都沒有缺失值,但2020年的獲獎信息中並沒有包含作品類別這一列,所以我們處理數據集時要將前兩年的類別列進行刪除。這樣,我們可以按照 2020 數據集的格式作為模板,將前兩年的數據集轉換為相同的格式,再進行合並。

 

2. 數據預處理

2.1 各年數據集格式化

按照 2020 年格式,將 2018 年與 2019 年數據集中部分列進行合並,並更換列名,刪除多余的列。並添加 “年份” 這一列。

下面是處理后的 2018 年與 2019 年數據。

在這里插入圖片描述 在這里插入圖片描述

對於 2020 年數據集的處理要注意,數據讀取時是基於每頁數據來讀取的,如果在一頁的最后一行數據較多需要換行的話,那么下一頁首行數據就會確實,如下所示。

在這里插入圖片描述

對於這種情況就需要先篩選出這些作品編號為空的行,在將數據添加到上一行中。

# 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))]

 

 

2.1 數據合並

現在合並三年的數據。合並后數據集如下。

在這里插入圖片描述

2.3 數據清洗

現在我們要對合並后的數據集進行一些處理,以便更好地分析及可視化。由於之后我們要用到全國高校的一些基本信息,如學校層次(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

 

處理后的數據集如下。

在這里插入圖片描述

 

3.數據分析及可視化

3.1 各年獎項數量分布

統計三年中一等獎二等獎三等獎的占比,繪制層疊條形圖。

'''
數據統計省略
'''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()

 

在這里插入圖片描述

從上圖中觀察發現,隨着時間的推移,一等獎、二等獎的比例開始減少,三等獎比例增加,在 2020 年以達到68%。

 

3.2 各年得獎最多的學校Top10

統計各年得獎最多的前 10 名學校的各項獎的數目,繪制如下圖形。

在這里插入圖片描述

從上圖中大致可以看到很多大學不止一次出現在 Top10 當中,在這些學校中,一部分可能是因為學校比較重視該比賽。

下面使用韋恩圖詳細看一下,哪些學校多次進入得獎最多 Top10。

在這里插入圖片描述

沈陽師范大學、沈陽工學院、遼寧工業大學在三年中都進入 Top10,還有一些其他兩次進入 Top10 的學校, 其中東北部的大學明顯較多。

 

3.3 各學校參加次數統計

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()

 

在這里插入圖片描述

在這三年的參賽學校中,三次參賽的占了一半左右,參賽一次和參賽兩次的各占25%左右,這么說,參加比賽的學校還是願意繼續下一屆繼續去參加,說明該比賽是有吸引學校的地方。

 

3.5 各年參賽學校層次划分

統計各年參賽學校的層次,觀察參加比賽學校的層次分布。

在這里插入圖片描述

三年中,絕大多數的參賽者來自普通本科,其次為211,並且各層次的學校參賽人數在逐年上升。普通本科那一行最為顯著。可以看到,隨着大賽的宣傳和計算機的普及,越來越多的人關注計算機方面的比賽。(對於暫無數據的那一列部分原因是因為學校的信息沒有收錄,還有可能是參賽選手填寫學校時出現失誤造成)

 

3.6 參賽人數與獎項分布

根據作者和指導老師的人數進行組合,統計各獎項中出現的次數,繪制如下圖形。

在這里插入圖片描述

可以看到在各項獎項中,比例最多的都是3名作者2名老師的陣容,其次就是3名作者1名老師。其余的陣容獲獎人數就比較少了。看樣子也不是人數越多獲獎幾率越大。

 

3.7 獲獎作品名稱熱詞

首先定義一個加載停用詞的函數,用於加載本地停用詞。

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()

 

在這里插入圖片描述

觀察上圖,能夠十分清晰的了解目前計算機中熱門的話題,如大數據、人工智能、算法、可視化、管理系統、機器人等,這些方向一直都是計算機行業的熱門方向,也可以作為我們今后發展的一條道路。

 

4. 總結

  • 近年來,計算機設計大賽一等獎、二等獎的比例開始減少,三等獎比例增加,這就增加了獲得一、二等獎的難度。

  • 東北部的大學更加關注該賽事,無論從參賽人數還是獲獎人數來看,其中沈陽師范大學沈陽工學院遼寧工業大學多次進入獲獎最多 Top10。

  • 絕大多數的學校連續參加該比賽,在最近三年中,三次參賽的學校占了獲獎總學校的一半左右。

  • 三年中,絕大多數的參賽者來自普通本科,其次為211,並且各層次的學校參賽人數在逐年上升。

  • 獲獎的參賽選手中比例最多的是 3名作者2名老師 的陣容,其次就是 3名作者1名老師。(作者最多5人,指導老師2人共7人)

  • 作品中的熱門詞大數據人工智能算法可視化管理系統機器人等。


代碼地址:https://github.com/python-dy/CompetitionDataAnalysis

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM