1. 程式人生 > 其它 >論文趨勢分析(python+excel+tableau)

論文趨勢分析(python+excel+tableau)

技術標籤:論文趨勢分析資料分析pythonexcel視覺化

本文github地址:連結
論文趨勢分析專欄:連結

論文趨勢分析(python+excel+tableau)

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt 
import json

from bs4 import
BeautifulSoup #用於爬取arxiv的資料 import re #用於正則表示式,匹配字串的模式 import requests #用於網路連線,傳送網路請求,使用域名獲取對應資訊

1資料讀取

1.1讀取原始資料

  • 資料集來源:資料集連結
  • 資料集的格式如下:
    • id:arXiv ID,可用於訪問論文;
    • submitter:論文提交者;
    • authors:論文作者;
    • title:論文標題;
    • comments:論文頁數和圖表等其他資訊;
    • journal-ref:論文發表的期刊的資訊;
    • doi:數字物件識別符號,https://www.doi.org
    • report-no:報告編號;
    • categories:論文在 arXiv 系統的所屬類別或標籤;
    • license:文章的許可證;
    • abstract:論文摘要;
    • versions:論文版本;
    • authors_parsed:作者的資訊。
# 讀取json資料
def readArxivFile(path, columns=['id', 'submitter', 'authors', 'title', 'comments', 'journal-ref', 'doi','report-no', 'categories', 'license', 'abstract', 'versions','update_date', 'authors_parsed'], count=None):
    data  = []
    with open(path, 'r') as f: 
        for idx, line in enumerate(f): 
            if idx == count:
                break
                
            d = json.loads(line)
            d = {col : d[col] for col in columns}
            data.append(d)

    data = pd.DataFrame(data)
    return data


data = readArxivFile('D:\code\Github\data\AcademicTrendsAnalysis/arxiv-metadata-oai-snapshot.json', ['id', 'submitter', 'authors', 'title', 'comments', 'journal-ref', 'categories', 'abstract', 'versions','update_date', 'authors_parsed'])

1.2抽取5%的資料作為樣本進行分析

  • 註釋掉此段程式碼,就可以對全部資料進行分析,限於本人的機子效能有限,所以只取5%的資料進行分析
data = data.sample(frac =0.05,replace = False,random_state = 1 )
# 清理記憶體垃圾
import gc
gc.collect()
76
# 儲存轉換後的資料
data.to_csv('D:\code\Github\data\AcademicTrendsAnalysis\data.csv',index = False)
data.head(3)
idsubmitterauthorstitlecommentsjournal-refcategoriesabstractversionsupdate_dateauthors_parsed
01506.04017Serena NgJean-Jacques Forneron and Serena NgA Likelihood-Free Reverse Sampler of the Poste...NaNNaNstat.METhis paper considers properties of an optimi...[{'version': 'v1', 'created': 'Fri, 12 Jun 201...2015-12-02[['Forneron', 'Jean-Jacques', ''], ['Ng', 'Ser...
1gr-qc/9211024NaNR. Mansouri and M.Mohazzab (BROWN)Tunneling in Anisotropic Cosmological Models13 pages, phyzzxClass.Quant.Grav.10:1353-1359,1993gr-qcTunneling rate is investigated in homogenous...[{'version': 'v1', 'created': 'Thu, 19 Nov 199...2010-04-06[['Mansouri', 'R.', '', 'BROWN'], ['Mohazzab',...
22011.02152Rotem LissRotem Liss, Tal MorFrom Practice to Theory: The "Bright Illuminat...17 pagesNaNquant-ph cs.CRThe "Bright Illumination" attack [Lydersen e...[{'version': 'v1', 'created': 'Wed, 4 Nov 2020...2020-11-05[['Liss', 'Rotem', ''], ['Mor', 'Tal', '']]

1.3 爬取論文類別資訊

  • group_name 論文大類
  • archive_name 論文子類(除了物理學領域,其他種類都沒有子類)
  • archive_id 論文子類的縮寫
  • category_name 論文細類的名稱
  • categories 論文細類的縮寫
#爬取所有的類別
website_url = requests.get('https://arxiv.org/category_taxonomy').text #獲取網頁的文字資料
soup = BeautifulSoup(website_url,'lxml') #爬取資料,這裡使用lxml的解析器,加速
root = soup.find('div',{'id':'category_taxonomy_list'}) #找出 BeautifulSoup 對應的標籤入口
tags = root.find_all(["h2","h3","h4","p"], recursive=True) #讀取 tags

#初始化 str 和 list 變數
level_1_name = ""
level_2_name = ""
level_2_code = ""
level_1_names = []
level_2_codes = []
level_2_names = []
level_3_codes = []
level_3_names = []
level_3_notes = []

#進行
for t in tags:
    if t.name == "h2":
        level_1_name = t.text    
        level_2_code = t.text
        level_2_name = t.text
    elif t.name == "h3":
        raw = t.text
        level_2_code = re.sub(r"(.*)\((.*)\)",r"\2",raw) #正則表示式:模式字串:(.*)\((.*)\);被替換字串"\2";被處理字串:raw
        level_2_name = re.sub(r"(.*)\((.*)\)",r"\1",raw)
    elif t.name == "h4":
        raw = t.text
        level_3_code = re.sub(r"(.*) \((.*)\)",r"\1",raw)
        level_3_name = re.sub(r"(.*) \((.*)\)",r"\2",raw)
    elif t.name == "p":
        notes = t.text
        level_1_names.append(level_1_name)
        level_2_names.append(level_2_name)
        level_2_codes.append(level_2_code)
        level_3_names.append(level_3_name)
        level_3_codes.append(level_3_code)
        level_3_notes.append(notes)

#根據以上資訊生成dataframe格式的資料
df_taxonomy = pd.DataFrame({
    'group_name' : level_1_names,
    'archive_name' : level_2_names,
    'archive_id' : level_2_codes,
    'category_name' : level_3_names,
    'categories' : level_3_codes,
    'category_description': level_3_notes
    
})
df_taxonomy.head()
# 儲存論文類別資訊
df_taxonomy.to_csv('D:\code\Github\data\AcademicTrendsAnalysis\categories.csv',index = False)
data = pd.read_csv('D:\code\Github\data\AcademicTrendsAnalysis\data.csv')
df_taxonomy = pd.read_csv('D:\code\Github\data\AcademicTrendsAnalysis\categories.csv')
df_taxonomy.head(3)
group_namearchive_namearchive_idcategory_namecategoriescategory_description
0Computer ScienceComputer ScienceComputer ScienceArtificial Intelligencecs.AICovers all areas of AI except Vision, Robotics...
1Computer ScienceComputer ScienceComputer ScienceHardware Architecturecs.ARCovers systems organization and hardware archi...
2Computer ScienceComputer ScienceComputer ScienceComputational Complexitycs.CCCovers models of computation, complexity class...

1.4處理多種類論文

  • 有的論文同時屬於多個種類,在統計時,只按照其最重要的類別(第一個類別)
data.categories.iloc[:5]
0                            stat.ME
1                              gr-qc
2                     quant-ph cs.CR
3                  cond-mat.mtrl-sci
4    math.FA math.AP math.CA math.DG
Name: categories, dtype: object

看到類別資料以空格分割

data['category'] = data.categories.str.split(' ',expand=True)[0]
print(data['category'].nunique())
172

1.5表連線

data = data.merge(df_taxonomy,how='left',left_on='category',right_on='categories')
data.shape
(89846, 18)

1.6提取論文的發表年份和月份

data['month'] = pd.to_datetime(data.update_date).dt.month
data['year'] = pd.to_datetime(data.update_date).dt.year

1.7提取論文的頁數,圖數

# 將評論轉換成pd.string型別
data.comments = data.comments.astype('string')
pat = '(\d+) pages'
data['pages'] = data.comments.str.extract(pat=pat)

pat = '(\d+) figures'
data['figure'] = data.comments.str.extract(pat)
# 將文字轉換為數字
data.pages = data.pages.fillna('0').astype(int)
# 避免0值參與計算的影響,將0值轉換為空值,聚合計算時會自動忽略
data.loc[data.pages == 0] = np.nan

# 將文字轉換為數字
data.figure = data.figure.fillna('0').astype(int)
# 避免0值參與計算的影響,將0值轉換為空值,聚合計算時會自動忽略
data.figure.loc[data.figure == 0] = np.nan

1.8提取論文的作者數量

  • 將文字型的列表轉換為python列表
import ast 
data.authors_parsed =  data.authors_parsed.apply(ast.literal_eval)
  • 統計作者數量
data['author_num'] = data.authors_parsed.apply(len)

1.9刪除重複的論文

  • 一篇論文可能多次提交,因此有多個版本,只保留第一個版本
data = data.drop_duplicates(['id','category'],keep = 'first')
data.to_csv('D:\code\Github\data\AcademicTrendsAnalysis\data_processed.csv',index=False)

2論文趨勢分析-python

2.1論文大類總體分析

2.1.1各大類論文總數

  • 物理,數學,電腦科學是數量最多的三大門類
  • 統計學,計量生物學等門類的數量較少
group1 = data.groupby('group_name')['id'].agg('count').sort_values(ascending = False).to_frame()
group1 = group1.reset_index()
group1.columns = ['group_name','count']
sns.barplot(x = 'count',y = 'group_name',data = group1)
<matplotlib.axes._subplots.AxesSubplot at 0x1ca624ed730>
圖片名稱

2.1.2各類論文數量隨年份的變化

  • 可以看到電腦科學的論文數量隨著時間,增長越來越快,數學次之
  • 物理學領域的論文數量變化較大,但總體也呈現上升趨勢
  • 其他領域的論文數量則增幅很小
group2 = data.groupby(['group_name','year'])['id'].agg('count').to_frame()
group2 = group2.reset_index()
group2.columns = ['group_name','year','count']
sns.relplot(data=group2,x='year',y = 'count',hue='group_name',kind='line')
<seaborn.axisgrid.FacetGrid at 0x1ca63d96130>
圖片名稱
sns.catplot(data = group2,x = 'year',y ='count',col='group_name'
            ,col_wrap=2,height=6,aspect=1.2,kind='bar')
<seaborn.axisgrid.FacetGrid at 0x1ca62d0baf0>
圖片名稱

2.1.3論文總數量隨時間的變化

group3 = data.groupby('year')['id'].agg('count').sort_values(ascending = False).to_frame().reset_index()
group3.columns = ['year','count']
plt.figure(figsize = (10,8))
sns.barplot(data=group3,x='year',y='count')
<matplotlib.axes._subplots.AxesSubplot at 0x1ca65815940>
圖片名稱

2.1.4不同大類論文頁數的不同

  • 可以看到電腦科學的平均論文頁數並不算高
  • 經濟學,數學,統計學的論文頁數較多
group4 = data.groupby('group_name')['pages'].agg('mean').sort_values(ascending = False).to_frame().reset_index()
group4.columns = ['group_name','pages']
sns.barplot(data=group4,x='pages',y='group_name')
<matplotlib.axes._subplots.AxesSubplot at 0x1ca6c4183a0>
圖片名稱

2.1.5不同大類合作作者數量的不同

  • 物理學領域論文平均每篇的作者數量最多,為5人
  • 數學領域論文平均每篇的作者數量最少,只有不到2人
group4 = data.groupby('group_name')['author_num'].agg('mean').sort_values(ascending = False).to_frame().reset_index()
group4.columns = ['group_name','author_num']
sns.barplot(data=group4,x='author_num',y='group_name')
<matplotlib.axes._subplots.AxesSubplot at 0x1ca6ba9faf0>
圖片名稱

2.2計算機領域論文趨勢分析

2.2.1各領域論文的總數量

  • 計算機視覺,機器學習果然是電腦科學論文最多的領域
group5 = data.loc[data.group_name == 'Computer Science'].groupby('category_name')['id'].agg('count').sort_values(ascending = False).to_frame().reset_index()
group5.columns = ['category_name','count']
plt.figure(figsize=(12,10))
sns.barplot(data=group5,x='count',y='category_name')
<matplotlib.axes._subplots.AxesSubplot at 0x1ca7165a1f0>
圖片名稱

2.2.2各領域論文數量隨時間的變換

  • 可以看到除了機器學習,機器視覺,自然語言處理增長較快之外,其他領域的論文數量增長都比較慢
  • 資訊理論,密碼學與安全,機器人是除了ML,CV,NLP之外發表論文數量比較多的領域
  • ML和CV還是電腦科學領域最火的方向
group6 = data.loc[data.group_name == 'Computer Science'].groupby(['category_name','year'])['id'].agg('count').sort_values(ascending = False).to_frame().reset_index()
group6.columns = ['category_name','year','count']
sns.relplot(data=group6,x='year',y = 'count',hue='category_name',kind='line',height = 10,style = 'category_name',palette='husl')
<seaborn.axisgrid.FacetGrid at 0x1ca6c6c5070>
圖片名稱
  • Y軸相同刻度,檢視相對數量
sns.catplot(data = group6,x = 'year',y ='count',col='category_name'
            ,col_wrap=4,height=5,aspect=1.2,kind='bar')
<seaborn.axisgrid.FacetGrid at 0x1ca6c2eb7f0>
圖片名稱
  • Y軸不同刻度,檢視變化趨勢
sns.catplot(data = group6,x = 'year',y ='count',col='category_name'
            ,col_wrap=4,height=5,aspect=1.2,kind='bar',sharey=False)
<seaborn.axisgrid.FacetGrid at 0x1ca6c474130>
圖片名稱

2.2.3論文頁數

  • 人工智慧,程式語言,數值分析領域的論文頁數最長
  • CV和NLP的平均頁數未進入前20
group7 = data.loc[data.group_name == 'Computer Science'].groupby('category_name')['pages'].agg('mean').sort_values(ascending = False).to_frame().reset_index().head(20)
group7.columns = ['category_name','mean_pages']
plt.figure(figsize=(6,8))
sns.barplot(data=group7,x='mean_pages',y='category_name')
<matplotlib.axes._subplots.AxesSubplot at 0x1ca76e637f0>
圖片名稱

2.2.4計算機視覺領域的合作作者數量最多


group8 = data.loc[data.group_name == 'Computer Science'].groupby('category_name')['author_num'].agg('mean').sort_values(ascending = False).to_frame().reset_index().head(20)
group8.columns = ['category_name','mean_author_num']
plt.figure(figsize=(6,8))
sns.barplot(data=group8,x='mean_author_num',y='category_name')
<matplotlib.axes._subplots.AxesSubplot at 0x1ca772646d0>
圖片名稱

3使用Excel分析

3.1建立資料透視表

  1. 將儲存的csv檔案另存為excel檔案,並隨便建立開啟一個excel檔案
  2. 點選資料選項卡-獲取外部資料-現有連線 圖片名稱
  3. 點選瀏覽,選擇上面儲存的data_processed.xlsx檔案 圖片名稱
  4. 更改屬性,輸入sql語句:
	select * from [D:\code\Github\data\AcademicTrendsAnalysis\data_processed.xlsx].[data_processed$]A left join [D:\code\Github\data\AcademicTrendsAnalysis\categories.xlsx].[categories$]B on A.category = B.categories
圖片名稱 5. 點選確定,建立資料透視表

3.2不同大類的論文數量隨時間的變化趨勢

  1. 在資料透視表中選擇
圖片名稱 2. 插入切片器,和折線圖(前10) 計算機領域的論文變化趨勢 圖片名稱 更改切片器選擇,物理學領域的論文趨勢變化(前10) 圖片名稱 3. 更改透視表設計,可以實現python的全部分析結果 圖片名稱

4使用tableau進行分析

4.1計算機領域論文數量差異

圖片名稱

4.2計算機領域論文數量變化(top5)

圖片名稱

4.3計算機領域論文頁數差異

圖片名稱

總結

總的來說,python,excel,tableau都能完成上述分析視覺化任務,但是各有優缺點:

  • python:
    • 適合做不規則資料的處理
    • 適合進行各種演算法建模
    • 適合進行預測分析
  • excel:
    • 適合小量規則資料的分析與視覺化
    • 資料格式較為侷限,資料量不易過大
  • tableau
    • 適合大量資料的分析與視覺化
    • 操作簡單,比python敲程式碼作圖更快捷