用python帶你一覽2021陜西全運(yùn)會(huì)數(shù)據(jù)
大家好,歡迎來(lái)到 Crossin的編程教室 !
第14屆全國(guó)運(yùn)動(dòng)會(huì)剛剛在陜西西安圓滿(mǎn)閉幕。1萬(wàn)多名來(lái)自全國(guó)各地的運(yùn)動(dòng)健兒在這里進(jìn)行了角逐。
今天讓我們利用Python來(lái)看看這次比賽的數(shù)據(jù)吧~
目錄:
1. 數(shù)據(jù)采集
1.1. 比賽大項(xiàng)數(shù)據(jù)
1.2. 比賽小項(xiàng)數(shù)據(jù)
1.3. 代表團(tuán)數(shù)據(jù)
1.4. 運(yùn)動(dòng)員數(shù)據(jù)
1.5. 決賽名次數(shù)據(jù)
2. 統(tǒng)計(jì)展示
2.1. 項(xiàng)目維度
2.2. 代表團(tuán)維度
2.3. 運(yùn)動(dòng)員維度

1. 數(shù)據(jù)采集
全運(yùn)會(huì)有個(gè)低調(diào)的官網(wǎng),里面有非常詳盡的數(shù)據(jù),我這邊用python直接從該網(wǎng)站采集了本屆的各類(lèi)數(shù)據(jù),采集過(guò)程不做詳細(xì)介紹了,大家看代碼即可。
第十四屆全運(yùn)會(huì)信息發(fā)布系統(tǒng):
https://info.2021shaanxi.com/

1.1. 比賽大項(xiàng)數(shù)據(jù)
比賽大項(xiàng)數(shù)據(jù)是指官網(wǎng)展示的一共49項(xiàng)大的比賽項(xiàng)目數(shù)據(jù),主要包含項(xiàng)目ID和項(xiàng)目名稱(chēng)。
import requests
import pandas as pd
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36",
}
# 大項(xiàng)
url = 'https://info.2021shaanxi.com/Data/commonCode/disciplineList.json'
r = requests.get(url, headers= headers)
data = r.json()
disciplineList = pd.DataFrame(data)
disciplineList.replace(r'-','',regex=True,inplace=True)
disciplineList.sample(5)

1.2. 比賽小項(xiàng)數(shù)據(jù)
比賽小項(xiàng)是指具體的比賽項(xiàng)目,比如大項(xiàng)射箭—男子—男子反曲弓個(gè)人項(xiàng)目,本次一共有427個(gè)小項(xiàng)。
# 小項(xiàng)
url = 'https://info.2021shaanxi.com/Data/commonCode/event.json'
r = requests.get(url, headers= headers,)
data = r.json()
items = []
for key in data.keys():
for key1 in data[key].keys():
item = data[key][key1][0]
items.append(item)
event = pd.DataFrame(items)
event.replace(r'-','',regex=True,inplace=True)
event.sample(5)

1.3. 代表團(tuán)數(shù)據(jù)
代表團(tuán)是指省、機(jī)構(gòu)組織或者個(gè)人,比如北京市、湖北省,北京體育大學(xué)組織或者個(gè)人(如游泳、山地車(chē)等就有以個(gè)人名義參加的運(yùn)動(dòng)員),一共58個(gè)代表團(tuán)組織。
# 代表團(tuán)
url = 'https://info.2021shaanxi.com/Data/commonCode/delegation.json'
r = requests.get(url, headers= headers, )
data = r.json()
items = []
for key in data.keys():
item = data[key][0]
items.append(item)
delegation = pd.DataFrame(items)
delegation.replace(r'-','',regex=True,inplace=True)
delegation.sample(5)

1.4. 運(yùn)動(dòng)員數(shù)據(jù)
運(yùn)動(dòng)員一共12434人,但實(shí)際有參與項(xiàng)目的12037人。
# 運(yùn)動(dòng)員
items = []
for Id in disciplineList['Id']:
url = f'https://info.2021shaanxi.com/api/participant/list?discipline={Id}'
r = requests.get(url, headers= headers)
data = r.json()
item = data['data']
items.extend(item)
AthleteList = pd.DataFrame(items)
AthleteList.replace(r'-','',regex=True,inplace=True)
AthleteList['event_count'] = AthleteList.EventEntry.apply(len)
# 匹配大項(xiàng)
AthleteList = AthleteList.merge(disciplineList[['Id', 'CHI_Description']],
right_on='Id', left_on='DisciplineCode', how='left')
# 匹配組織
AthleteList = AthleteList.merge(delegation[['Id', 'CHI_Description']],
left_on='OrganisationCode', right_on='Id', how='left')
AthleteList.sample(5)

1.5. 決賽名次數(shù)據(jù)
決賽名次其實(shí)就是每個(gè)項(xiàng)目比賽結(jié)果數(shù)據(jù),金銀銅牌獲得者的信息,后續(xù)我們可以根據(jù)這份數(shù)據(jù)來(lái)看看體育強(qiáng)省在哪里!
# 決賽數(shù)據(jù)
dataList = []
# 決賽日期(數(shù)據(jù)是9-25號(hào)采集的,所以截止選的9-24日)
dateList = pd.date_range('2021-07-12','2021-09-24').strftime('%Y%m%d')
for date in dateList:
url = f'https://info.2021shaanxi.com/Data/Medal/Daily/{date}/data.json'
r = requests.get(url, headers= headers)
try:
data = r.json()
data = pd.DataFrame(data)
data.replace(r'-','',regex=True,inplace=True)
def get_BirthDate(x):
if len(x)==1:
return x[0]['BirthDate']
def get_AthleteCode(x):
if len(x)==1:
return x[0]['AthleteCode']
data['BirthDate'] = data['Members'].apply(get_BirthDate)
data['AthleteCode'] = data['Members'].apply(get_AthleteCode)
dataList.append(data)
except :
continue
data = pd.concat(dataList)
df = data[['Date', 'EventCode', 'MedalRank', 'OrganisationCode', 'Gender',
'Name', 'BirthDate', 'AthleteCode']]
# 匹配組織
df = df.merge(delegation[['Id', 'CHI_Description']],
left_on='OrganisationCode', right_on='Id', how='left')
# 匹配小項(xiàng)
df = df.merge(event[['CHI_Description','Code', 'Discipline', 'Team_Event']],
right_on='Code', left_on='EventCode', how='left')
# 匹配大項(xiàng)
df = df.merge(disciplineList[['Id', 'CHI_Description']],
right_on='Id', left_on='Discipline', how='left')
# 字段篩選
df = df[['Date', 'CHI_Description', 'CHI_Description_y', 'Gender', 'MedalRank',
'Name', 'CHI_Description_x','BirthDate', 'AthleteCode', 'Team_Event']]
df.sample(5)


2. 統(tǒng)計(jì)展示
本部分我們將進(jìn)行項(xiàng)目統(tǒng)計(jì)、代表團(tuán)(尤其是省級(jí)行政區(qū)代表團(tuán))統(tǒng)計(jì)以及運(yùn)動(dòng)員統(tǒng)計(jì)三部分展開(kāi)。
2.1. 項(xiàng)目維度
本屆全運(yùn)會(huì)大項(xiàng)目一共49個(gè),小項(xiàng)目一共427個(gè),具體分布如下:
大項(xiàng)-小項(xiàng)分布
田徑、游泳是擁有小項(xiàng)最多的,其中田徑的小項(xiàng)高達(dá)52種、游泳的小項(xiàng)也有高達(dá)37種。熱度較高的跳水小項(xiàng)也很多有17種,乒乓球則有7種小項(xiàng)。

# 篩選全小項(xiàng)
event = event[(event['Event'].str.len()>0)&(event['Gender'].str.len()>0)]
# 匹配大項(xiàng)名稱(chēng)
Discipline_event_Num = event.merge(disciplineList, left_on='Discipline', right_on='Id').groupby('CHI_Description_y')['Code'].nunique().to_frame('小項(xiàng)數(shù)')
Discipline_event_Num.sort_values(by='小項(xiàng)數(shù)', ascending=False).reset_index()

各大項(xiàng)參與人數(shù)
田徑和足球是參與人數(shù)最多的項(xiàng)目,都多達(dá)1000人以上。不過(guò),大多數(shù)的團(tuán)體項(xiàng)目參與人數(shù)都是較多的無(wú)疑了。
# 各項(xiàng)目運(yùn)動(dòng)員數(shù)
Discipline_Num = AthleteList.groupby('CHI_Description_x')['AthleteCode'].nunique().to_frame('人數(shù)')
Discipline_Num.sort_values(by='人數(shù)', ascending=False).reset_index()

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 設(shè)置柱狀圖顏色
colors = ['turquoise', 'coral']
labels = Discipline_Num.index
y = Discipline_Num['人數(shù)']
x = np.arange(len(labels))
width = 0.35
fig, ax = plt.subplots(figsize=(8,16))
rects1 = ax.barh(x + width/2, y, color=colors[1], edgecolor='grey')
ax.set_title('各項(xiàng)目參賽人數(shù)', fontsize=16)
y_pos = np.arange(len(labels))
ax.set_yticks(y_pos)
ax.set_yticklabels(labels, fontsize=12)
# 顯示數(shù)據(jù)標(biāo)簽
ax.bar_label(rects1, padding=3)
fig.tight_layout()
# 邊框隱藏
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
# ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)
plt.show()
fig.savefig('各項(xiàng)目參賽人數(shù).png')
個(gè)人團(tuán)體分布
在全部小項(xiàng)目中有139項(xiàng)約占32.6%的項(xiàng)目是團(tuán)體類(lèi)的(比如足球、乒乓球混雙等),另外288項(xiàng)占比67.54的項(xiàng)目是個(gè)人賽。

# 個(gè)人團(tuán)體分布 (Discipline)
Team_Event_Num = event.groupby('Team_Event')['Code'].nunique().to_frame('小項(xiàng)數(shù)')
labels = Team_Event_Num.index
sizes = Team_Event_Num['小項(xiàng)數(shù)']
explode = (0, 0.1,)
fig1, ax1 = plt.subplots(figsize=(6,5))
patches, texts, autotexts = ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
shadow=True, startangle=90)
ax1.axis('equal')
ax1.set_title('各比賽小項(xiàng)個(gè)人團(tuán)體分布', fontsize=16)
# 重新設(shè)置字體大小
proptease = fm.FontProperties()
proptease.set_size('large')
plt.setp(autotexts, fontproperties=proptease)
plt.setp(texts, fontproperties=proptease)
plt.show()
性別分布
有207個(gè)項(xiàng)目是男性項(xiàng)目,193個(gè)項(xiàng)目是女性項(xiàng)目,混合類(lèi)的有21種,而不分男女共6種(馬術(shù)比賽)

# 性別分布
Gender_Event_Num = event.groupby('Gender')['Code'].nunique().to_frame('小項(xiàng)數(shù)')
labels = Gender_Event_Num.index
sizes = Gender_Event_Num['小項(xiàng)數(shù)']
explode = (0, 0., 0, 0, )
fig1, ax1 = plt.subplots(figsize=(8,7))
patches, texts, autotexts = ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
shadow=True, startangle=90)
ax1.axis('equal')
ax1.set_title('各比賽小項(xiàng)性別分布', fontsize=16)
# 重新設(shè)置字體大小
proptease = fm.FontProperties()
proptease.set_size('large')
plt.setp(autotexts, fontproperties=proptease)
plt.setp(texts, fontproperties=proptease)
plt.show()
2.2. 代表團(tuán)維度
一共58個(gè)代表團(tuán),其中34個(gè)省級(jí)行政區(qū)+4個(gè)協(xié)會(huì)、13個(gè)俱樂(lè)部、2個(gè)學(xué)校等,其中OO是聯(lián)合隊(duì)(奧運(yùn)會(huì)聯(lián)合隊(duì))
各類(lèi)代表團(tuán)分布
| Type | 數(shù)量 | |
|---|---|---|
| 0 | D | 38 |
| 1 | CLUB | 13 |
| 2 | RO | 3 |
| 3 | SCHOOL | 2 |
| 4 | GR | 1 |
| 5 | OO | 1 |
# 代表團(tuán)類(lèi)型
Type_delegation_Num = delegation.groupby('Type')['Id'].nunique().to_frame('數(shù)量')
Type_delegation_Num.sort_values(by='數(shù)量', ascending=False).reset_index()

代表團(tuán)人數(shù)對(duì)比
雖然說(shuō)有58個(gè)代表團(tuán),實(shí)際參賽的代表團(tuán)53個(gè),比如我們的臺(tái)灣省并沒(méi)有參與,希望他們能早日參與進(jìn)來(lái)。在這53個(gè)代表團(tuán)中,我們按照省級(jí)行政區(qū)和其他分類(lèi)對(duì)比看看。
省級(jí)行政區(qū)
山東、廣東、江蘇、上海和陜西是本次參數(shù)選手最多的省份

其他
天津體育學(xué)院作為高校,有24名參數(shù)選手,北京體育大學(xué)則有2名。

代表團(tuán)參與大項(xiàng)數(shù)
作為東道主的陜西,本屆全運(yùn)會(huì)參與了高達(dá)47/49個(gè)大類(lèi),此外參賽人數(shù)較多的江蘇、廣東和上海均參加了44個(gè)大類(lèi)。
Organisation_Discipline_Num = AthleteList.groupby('CHI_Description_y')['CHI_Description_x'].nunique().to_frame('大項(xiàng)數(shù)')
Organisation_Discipline_Num.sort_values(by='大項(xiàng)數(shù)', ascending=False).reset_index()

代表團(tuán)獎(jiǎng)牌數(shù)
注:后續(xù)章節(jié)數(shù)據(jù)截止時(shí)間為9月24日24點(diǎn)。。
在總獎(jiǎng)牌數(shù)排名中,山東、廣東、江蘇、浙江和上海高居前列(這聯(lián)合隊(duì)未進(jìn)行細(xì)分到省份哈)
Organisation_Medal_Num = df.pivot_table(values='Name',margins=True,index='CHI_Description_x',columns='MedalRank',aggfunc='count').fillna(0)
Organisation_Medal_Num = Organisation_Medal_Num.sort_values(by='All', ascending=False).reset_index()
Organisation_Medal_Num.columns = ['代表團(tuán)','金牌','銀牌','銅牌','總獎(jiǎng)牌']
Organisation_Medal_Num.convert_dtypes()
| 代表團(tuán) | 金牌 | 銀牌 | 銅牌 | 總獎(jiǎng)牌 |
|---|---|---|---|---|
| All | 331 | 331 | 391 | 1053 |
| 山東 | 35 | 38 | 35 | 108 |
| 廣東 | 30 | 26 | 48 | 104 |
| 江蘇 | 27 | 27 | 31 | 85 |
| 浙江 | 25 | 25 | 28 | 78 |
| 上海 | 16 | 19 | 23 | 58 |
| 四川 | 14 | 17 | 20 | 51 |
| 陜西 | 16 | 13 | 20 | 49 |
| 福建 | 18 | 15 | 16 | 49 |
| 湖北 | 12 | 16 | 15 | 43 |
| 聯(lián)合隊(duì) | 35 | 4 | 1 | 40 |
| 遼寧 | 7 | 13 | 17 | 37 |
| 北京 | 10 | 12 | 12 | 34 |
| 天津 | 8 | 8 | 16 | 32 |
| 河北 | 8 | 10 | 13 | 31 |
| 河南 | 10 | 8 | 13 | 31 |
| 湖南 | 13 | 11 | 7 | 31 |
| 安徽 | 6 | 9 | 9 | 24 |
| 山西 | 4 | 7 | 10 | 21 |
| 內(nèi)蒙古 | 7 | 4 | 7 | 18 |
| 云南 | 5 | 7 | 5 | 17 |
| 江西 | 2 | 6 | 5 | 13 |
| 廣西 | 2 | 6 | 4 | 12 |
| 吉林 | 2 | 3 | 7 | 12 |
| 新疆 | 2 | 5 | 3 | 10 |
| 甘肅 | 2 | 4 | 3 | 9 |
| 貴州 | 2 | 2 | 5 | 9 |
| 重慶 | 1 | 6 | 2 | 9 |
| 黑龍江 | 1 | 4 | 4 | 9 |
| 香港 | 1 | 0 | 5 | 6 |
| 前衛(wèi)體協(xié) | 2 | 2 | 1 | 5 |
| 海南 | 4 | 1 | 0 | 5 |
| 西藏 | 3 | 0 | 2 | 5 |
| 青海 | 0 | 3 | 1 | 4 |
| 貴州輪跡自行車(chē)運(yùn)動(dòng)俱樂(lè)部 | 1 | 0 | 1 | 2 |
| 火車(chē)頭體協(xié) | 0 | 0 | 1 | 1 |
| 澳門(mén) | 0 | 0 | 1 | 1 |
代表團(tuán)奪金數(shù)(金牌榜)
金牌榜中,山東最強(qiáng),其次是聯(lián)合隊(duì),接著依次是廣東、江蘇、浙江和福建。
我們發(fā)現(xiàn)聯(lián)合隊(duì)基本都是金牌,這也是為什么本屆的奧運(yùn)聯(lián)合隊(duì)會(huì)機(jī)制會(huì)被網(wǎng)友吐槽的原因!
| 排名 | 代表團(tuán) | 金牌 | 銀牌 | 銅牌 | 總獎(jiǎng)牌 |
|---|---|---|---|---|---|
| 1 | 山東 | 35 | 38 | 35 | 108 |
| 2 | 聯(lián)合隊(duì) | 35 | 4 | 1 | 40 |
| 3 | 廣東 | 30 | 26 | 48 | 104 |
| 4 | 江蘇 | 27 | 27 | 31 | 85 |
| 5 | 浙江 | 25 | 25 | 28 | 78 |
| 6 | 福建 | 18 | 15 | 16 | 49 |
| 7 | 上海 | 16 | 19 | 23 | 58 |
| 8 | 陜西 | 16 | 13 | 20 | 49 |
| 9 | 四川 | 14 | 17 | 20 | 51 |
2.3. 運(yùn)動(dòng)員維度
這部分我們主要看看運(yùn)動(dòng)員年齡分布,感受一下咱們新生代力量。
我們一共有668名運(yùn)動(dòng)員獲得了獎(jiǎng)牌,其中金牌獲得者208人,銀牌獲得者215人,銅牌獲得者270人。
(注意:本部分不考慮團(tuán)體賽)
參數(shù)運(yùn)動(dòng)員性別分布
全部參賽選手中,男性占比52.2%,女性占比47.8%,總的來(lái)說(shuō)是非常平衡的了。

# 參賽選手性別分布
Gender_Num = AthleteList.groupby('GenderCode')['AthleteCode'].nunique().to_frame('人數(shù)')
獎(jiǎng)牌最多的運(yùn)動(dòng)員
個(gè)人單項(xiàng)賽事獎(jiǎng)牌最多的有5個(gè)人,均為3塊獎(jiǎng)牌
| 運(yùn)動(dòng)員 | 性別 | 金牌 | 銀牌 | 銅牌 | 總獎(jiǎng)牌 | |
|---|---|---|---|---|---|---|
| 1 | 汪順 | M | 3 | 0 | 0 | 3 |
| 2 | 張子揚(yáng) | M | 2 | 1 | 0 | 3 |
| 3 | 王春雨 | W | 2 | 1 | 0 | 3 |
| 4 | 季新杰 | M | 1 | 2 | 0 | 3 |
| 5 | 覃海洋 | M | 1 | 1 | 1 | 3 |
Athlete_Medal_Num = df[df['Team_Event']=='N'].pivot_table(values='CHI_Description',margins=True,index=['Name','Gender'],columns='MedalRank',aggfunc='count').fillna(0)
Athlete_Medal_Num = Athlete_Medal_Num.sort_values(by=['All',1,2,3], ascending=[False,False,False,False]).reset_index()
Athlete_Medal_Num.columns = ['運(yùn)動(dòng)員','性別','金牌','銀牌','銅牌','總獎(jiǎng)牌']
Athlete_Medal_Num.convert_dtypes().head()
那都是通過(guò)什么項(xiàng)目獲得的呢?
來(lái)自田徑和游泳

nameList = Athlete_Medal_Num[Athlete_Medal_Num['總獎(jiǎng)牌']>=3]['運(yùn)動(dòng)員']
df[df['Name'].str.contains('|'.join(nameList))].sort_values(by = 'Name')
事實(shí)上,來(lái)自浙江的1994年的汪順已經(jīng)收獲了含團(tuán)體賽在內(nèi)的6枚金牌!

金牌最多的運(yùn)動(dòng)員
金牌數(shù)最多的就是汪順了
獲得金牌最多的女子運(yùn)動(dòng)員則是田徑選手王春雨,來(lái)自安徽的1995年跑步健將!

獲獎(jiǎng)運(yùn)動(dòng)員年齡分布
本屆全運(yùn)會(huì),大部分的獲獎(jiǎng)運(yùn)動(dòng)員出生年份集中在1994年-2000年。
我們發(fā)現(xiàn)居然還有1971年的51歲選手??!,最小的則是2008年的13歲朋友??!相差接近4倍~

時(shí)隔12年 “七戰(zhàn)”1971年的老將劉英姿再奪全運(yùn)會(huì)飛碟多向金牌

2008年出生的小獎(jiǎng),有三個(gè)是青年組的選手。

金牌運(yùn)動(dòng)員年齡分布
1996年和2000年出生的金牌運(yùn)動(dòng)員最多,居然剛好差了4年(一屆周期)

以上就是本次全運(yùn)會(huì)數(shù)據(jù)分析的全部?jī)?nèi)容。數(shù)據(jù)分析可以有很多維度和展現(xiàn)方式,本文僅僅是選取了其中的一部分,你也可以嘗試更多角度的分析。
獲取文中相關(guān)數(shù)據(jù)和代碼文件,可點(diǎn)擊下方公眾號(hào)名片,回復(fù)關(guān)鍵字 全運(yùn)會(huì)
作者:道才
_往期文章推薦_
