數據分析——計算機設計大賽近年獲獎信息
寫在前面
本文通過最近三年 “中國大學生計算機設計大賽” 的獲獎數據,分析挖掘一下該比賽深層的一些內容,主要有以下幾點:
-
各年各獎項的比例分布
-
各年得獎最多的學校 Top10
-
哪些學校多次進入得獎最多 Top10
-
各學校三年中參賽次數統計
-
各級別獎項中學校層次划分
-
參賽人數與獎項之間的關系
-
獲獎作品名稱熱詞
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')
通過上圖中的信息可以看到,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人)
-
作品中的熱門詞大數據、人工智能、算法、可視化、管理系統、機器人等。
代碼地址: