Nobel prize Data analysis

实验题目

  • Nobel prize Data analysis

实验内容

  • 我们都知道诺贝尔奖一般每年都会颁发给在全球做出突出贡献的科学家们,那么本次实验就来认真研究一下1901年至2020年间诺贝尔奖获得者的信息,选用数据集为有关诺贝尔奖获得者的个人信息,共14个特征,主要包括获奖者

    • 姓名
    • 出生地、死亡地国家代码
    • 性别
    • 获奖年份
    • 研究领域
    • 共享人数
    • 任职大学名称、城市、国家
    • 出生月份
    • 年龄
    • 获奖年龄

实验步骤

原始数据读取

  • 首先从官网下载数据集,数据集为csv文件格式,读取代码如下(数据集链接在文末)
# 导入相关库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
pd.options.mode.chained_assignment = None

nobel = pd.read_csv('nobel_final.csv')
  • 展示出效果如下,可以看到共有923位诺贝尔奖得主,数据集较为庞大
    在这里插入图片描述

数据分析

1.不同国家诺贝尔奖获得者人数

  • 首先看到数据我们肯定想了解这些年来哪些国家获得的诺贝尔奖比较多,于是对获奖总人数超过10的国家进行统计并可视化展示
nobel_bron_country = nobel['born_country_code'].value_counts().to_frame()
nobel_bron_country = nobel_bron_country[nobel_bron_country['born_country_code'] >= 10]
# 绘制
plt.figure(figsize=(15, 5))
sns.barplot(x = nobel_bron_country.index , y = 'born_country_code' ,data = nobel_bron_country)
plt.xlabel('Country Code')
plt.ylabel('Number of Nobel winner')
plt.title("Most Nobel Winner Countries")
plt.show()
  • 实现效果如下,可以看到美国、英国、德国在这些年中获奖人数最多,中国的我们要努力啊!
    在这里插入图片描述

2. 不同国家移民出去的获奖者人数

  • 同时我们观察发现有很多的获奖者其出生国籍和死亡国籍并不一样,说明他们是移民,那么到底有多少获奖者为移民呢?下面就让我们一起研究一下
imigrate_nobel_winner = nobel.loc[(nobel['born_country_code'] != nobel['died_country_code'])]
imigrate_nobel_winner.dropna(subset=['died_country_code'] , inplace=True)
print( str(len(imigrate_nobel_winner)) + ' Nobel winners that bron country and died country are diffrent')

190 Nobel winners that bron country and died country are diffrent

  • 可以看到共有190位获奖者为移民,那么这些获奖者到底是从哪些国家移民出去的呢?
imigrate_nobel_winner_born_country = imigrate_nobel_winner['born_country_code'].value_counts().to_frame()
imigrate_nobel_winner_born_country = imigrate_nobel_winner_born_country[imigrate_nobel_winner_born_country['born_country_code'] >= 5]

plt.figure(figsize=(15, 5))
sns.barplot(x = imigrate_nobel_winner_born_country.index , y = 'born_country_code' ,data = imigrate_nobel_winner_born_country)
plt.title("Most Immigrants Countries")
plt.xlabel('Country Code')
plt.ylabel('Number of Nobel winner')
plt.show()
  • 实现效果如下,可以看到从波兰、德国和英国移民出去的获奖者人数最多
    在这里插入图片描述

3.不同国家移民进来的获奖者人数

  • 那么你肯定会想问,这些科学家最终移民到哪个国家了呢?
imigrate_nobel_winner_died_country = imigrate_nobel_winner['died_country_code'].value_counts().to_frame()
imigrate_nobel_winner_died_country = imigrate_nobel_winner_died_country[imigrate_nobel_winner_died_country['died_country_code'] >= 5]

plt.figure(figsize=(15, 5))
sns.barplot(x = imigrate_nobel_winner_died_country.index , y = 'died_country_code' ,data = imigrate_nobel_winner_died_country)
plt.xlabel('Country Code')
plt.ylabel('Number of Nobel winner')
plt.title("Countries with the highest number of immigrant admissions")
plt.show()
  • 实现效果如下,可以看到去往美国,英国和德国的科学家人数最多
    在这里插入图片描述

4.获奖者男女比例

  • 我们还很关注的一个点就是这些获奖者中男女比例到底如何呢?
nobel_winner_gender = nobel['gender'].value_counts().to_frame()

plt.figure(figsize=(15, 5))
sns.barplot(x = nobel_winner_gender.index , y = 'gender' ,data = nobel_winner_gender)
plt.xlabel('Gender')
plt.ylabel('Number of Nobel winner')
plt.title("Gender ratio of winners")
plt.show()
  • 实现效果如下,可以看到超过850名男性获奖,不到100名女性获奖
    在这里插入图片描述

5.每年获奖人数

  • 我们知道诺贝尔奖不是每年都会颁发,那么我们好奇的一个点就是每年到底有多少获奖者,下面将获奖人数超过10的年份展示
nobel_winner_year = nobel['year'].value_counts(ascending = True).to_frame()
nobel_winner_year = nobel_winner_year[nobel_winner_year['year'] >= 10]

plt.figure(figsize=(20, 5))
sns.barplot(x = nobel_winner_year.index , y = 'year' ,data = nobel_winner_year)
plt.xlabel('Year')
plt.ylabel('Number of Prize')
plt.title("Number of winners per year")
plt.xticks(rotation = 90)
plt.show()
  • 实现效果如下,可以看到2001年和2019年的获奖人数是最多的
    在这里插入图片描述

6.不同领域每年获奖人数

  • 上面我们一直在研究获奖者的国家、性别以及年份信息,其实我们同样好奇的一个点就是到底在哪些领域获奖的人数较多呢?
winner_category = nobel['category'].value_counts().to_frame()

plt.figure(figsize=(20, 5))
sns.barplot(x = winner_category.index , y = 'category' ,data = winner_category)
plt.xlabel('Category')
plt.ylabel('Number of prize')
plt.title("Number of prize per category")
plt.show()
  • 实现效果如下,医学、物理和化学是获奖人数最多的领域
    在这里插入图片描述

7.获奖领域及性别统计

  • 现在我们来分析一下不同性别的科学家们在不同研究领域的人数情况
category_and_gender_winner = nobel.groupby('category')['gender'].value_counts().to_frame()
category_and_gender_winner.columns = ['number of winners']
category_and_gender_winner.reset_index(inplace=True)

plt.figure(figsize=(20, 5))
sns.barplot(x = 'category' , y = 'number of winners' , hue = 'gender' ,data = category_and_gender_winner)
plt.xlabel('Category')
plt.ylabel('Number of winners')
plt.title("Category By Gender")
plt.show()
  • 显示效果如下,女性在和平、文学和医学领域获得最多奖项,但物理、医学和化学领域是男性最受欢迎的领域
    在这里插入图片描述

8.获奖者就读大学统计

  • 接下来我们分析一下获奖者们大多来自哪些学校,并将前10的学校展示
nobel_university_winner = nobel['name_of_university'].value_counts().to_frame()
nobel_university_winner = nobel_university_winner[nobel_university_winner['name_of_university'] >= 10]

plt.figure(figsize=(10, 5))
sns.barplot(y = nobel_university_winner.index , x = 'name_of_university' ,data = nobel_university_winner ,palette = sns.color_palette('Set2'))
plt.xlabel('Number of Prize')
plt.ylabel('University')
plt.title("Top Universities that Nobel winners studied there")
plt.show()
  • 显示效果如下,加州大学、哈佛大学和麻省理工学院 (MIT) 是诺贝尔奖获得者就读的前 3 所大学

在这里插入图片描述

9.获奖者就读大学所在国家统计

  • 同样我们也很好奇这些获奖者们就读的学校在哪个国家?下面将拥有获奖者大学并且人数超过5的国家展示
nobel_country_winner = nobel['country_of_university'].value_counts().to_frame()
nobel_country_winner = nobel_country_winner[nobel_country_winner['country_of_university'] >= 5]

plt.figure(figsize=(10, 5))
sns.barplot(y = nobel_country_winner.index , x = 'country_of_university' ,data = nobel_country_winner ,palette = sns.color_palette('Set2'))
plt.xlabel('Number of Prize')
plt.ylabel('Country of University')
plt.title("Top Country of universities that Nobel winners studied there")
plt.show()
  • 显示效果如下,美国 、英国和德国是拥有诺贝尔奖获得者在那里学习的大学最多的国家

在这里插入图片描述

10.获奖者大学获奖领域分布

下面我们研究一下这些顶尖大学中其获奖者主要在哪些领域获奖的人数比较多

fulprize_university = nobel[(nobel['name_of_university'] == 'University of California')
                          | (nobel['name_of_university'] == 'Harvard University')
                          | (nobel['name_of_university'] == 'Massachusetts Institute of Technology (MIT)')
                          | (nobel['name_of_university'] == 'Stanford University')
                          | (nobel['name_of_university'] == 'University of Chicago')
                          | (nobel['name_of_university'] == 'University of Cambridge')
                          | (nobel['name_of_university'] == 'California Institute of Technology (Caltech)')
                          | (nobel['name_of_university'] == 'Columbia University')
                          | (nobel['name_of_university'] == 'Princeton University')
                          | (nobel['name_of_university'] == 'Rockefeller University')
                          | (nobel['name_of_university'] == 'MRC Laboratory of Molecular Biology')]
university_and_category = fulprize_university.groupby('name_of_university')['category'].value_counts().to_frame()
university_and_category.columns = ['number of prize']
university_and_category.reset_index(inplace= True)

plt.figure(figsize=(10, 5))
sns.barplot(y = 'name_of_university' , x = 'number of prize' , hue = 'category' , dodge = False ,data = university_and_category ,palette = sns.color_palette('Set2'))
plt.xlabel('Number of Prize')
plt.ylabel('Country of University')
plt.title("Top Universities and distribution of category")
plt.show()
  • 显示效果如下,可以看到加州大学、斯坦福大学获奖领域比较多,而麻省理工学院 (MIT)和芝加哥大学在经济学领域是强势学科
    在这里插入图片描述

11.不同国家获奖领域分布

  • 看了顶尖大学获奖者的研究领域分布,同样我们也想了解不同国家到底在哪些领域获奖人数分布
nobel_country_winner_new = nobel_country_winner[nobel_country_winner['country_of_university'] >= 10]
fulprize_university_country = nobel[(nobel['country_of_university'] == 'USA')
                          | (nobel['country_of_university'] == 'United Kingdom')
                          | (nobel['country_of_university'] == 'Germany')
                          | (nobel['country_of_university'] == 'France') 
                          | (nobel['country_of_university'] == 'Switzerland')
                          | (nobel['country_of_university'] == 'Japan')
                          | (nobel['country_of_university'] == 'Sweden')
                          | (nobel['country_of_university'] == 'the Netherlands')]
country_university_and_category = fulprize_university_country.groupby('country_of_university')['category'].value_counts().to_frame()
country_university_and_category.columns = ['Number of Prize']
country_university_and_category.reset_index(inplace=True)

plt.figure(figsize=(10, 5))
sns.barplot(y = 'country_of_university' , x = 'Number of Prize' , hue = 'category' ,dodge = False ,data = country_university_and_category ,palette = sns.color_palette('Set2'))
plt.xlabel('Number of Prize')
plt.ylabel('Country of University')
plt.title("Top Counties and distribution of category")
plt.show()
  • 显示效果如下,美国获奖人数最多,获奖者们主要获奖领域为和平、经济以及医药学,英国获奖者们主要获奖领域为经济学和医药学,而德国获奖者们主要研究领域为经济学、化学和医药学

在这里插入图片描述

12.获奖者目前年龄分布

  • 接下来我们分析一下现在获奖者们的年龄分布,看看目前在世的获奖者们已经多少岁了?
plt.figure(figsize=(15, 5))
sns.distplot(nobel['age'])
plt.xlabel('Age')
plt.title('Age get prize distribution')
plt.title("Distribution of Age Winners")
plt.show()
  • 显示效果如下,可以看到目前大多数获奖者的年龄分布为80岁左右,最年轻的已经40多岁,而年长的已经超过百岁

在这里插入图片描述

13.获奖时年龄分布

  • 然后我们分析一下获奖者获奖时的年龄,看看大家到底是在哪个年龄段获得诺贝奖的呢?
plt.figure(figsize=(15, 5))
sns.distplot(nobel['age_get_prize'])
plt.xlabel('Age get prize')
plt.title('Age get prize distribution')
plt.show()
  • 显示效果如下,可以看到最年轻的获奖者为20多岁,最大的为九十多岁,而大多数还是在60岁左右
    在这里插入图片描述

13.得奖者目前年龄分布 VS 得奖时年龄分布

  • 接下来我们对比一下获奖者现在的年龄和其获奖时的年龄分布
plt.figure(figsize=(15, 5))
plot = sns.jointplot(x='age', y='age_get_prize' , kind='hex' ,data=nobel)
plot.set_axis_labels('x', 'y', fontsize=12)
plot.ax_joint.set_xlabel('Age')
plot.ax_joint.set_ylabel('Age of winner when get prize')
plt.title("Distribution of Age Winners VS Age of winners when get prize")
plt.tight_layout()
  • 显示效果如下,从图可以看到目前大多数获奖者都处于年长的状态

在这里插入图片描述

14.按性别划分的平均年龄

  • 同时我们也观察一下目前不同性别获奖者们的年龄分布情况
plt.figure(figsize=(15, 5))
sns.boxplot(x='gender', y='age', data=nobel)
plt.ylabel('Age')
plt.xlabel('Gender')
plt.title('Age average seprated by gender')
plt.show()
  • 实现效果如下,男性的平均年龄约为 81 岁,女性的平均年龄约为 73

在这里插入图片描述

15.不同领域获奖时的年龄分布

  • 然后我们分析一下不同性别、不同研究领域的科学家获得诺贝尔奖是的年龄分布
plt.figure(figsize=(15, 5))
sns.swarmplot(x='gender', y='age_get_prize',hue = 'category', dodge=True , data=nobel)
plt.ylabel('Age when get prize')
plt.xlabel('Gender')
plt.title('Every winner age seperated by gender and prize category')
plt.show()
  • 实现效果如下,可以看到男性和女性科学家获奖时的年龄大都在60岁左右,男性科学家在物理学领域可以较早获得诺贝尔奖,而女性科学奖在和平领域获得诺贝尔奖较早
    在这里插入图片描述

16.不同领域获奖年龄的核密度估计

  • 接下来我们分析一下不同研究领域年龄的核密度估计
plt.figure(figsize=(15, 6))
sns.kdeplot(nobel.age[nobel.category == 'chemistry'], label='chemistry', shade=True)
sns.kdeplot(nobel.age[nobel.category == 'economics'], label='economics', shade=True)
sns.kdeplot(nobel.age[nobel.category == 'peace'], label='peace', shade=True)
sns.kdeplot(nobel.age[nobel.category == 'literature'], label='literature', shade=True)
sns.kdeplot(nobel.age[nobel.category == 'physics'], label='physics', shade=True)
sns.kdeplot(nobel.age[nobel.category == 'medicine'], label='medicine', shade=True)
sns.kdeplot(nobel.age[nobel.category == 'chemistry'], label='chemistry', shade=True)
plt.xlabel('Age')
plt.title('Age distribution on category of winners')
  • 实现效果如下,可以看到要想获奖,大家还是得努力学习,多等几年哈!

在这里插入图片描述

17.多次获奖者和其性别统计

  • 通过数据观察我们发现有一些大佬拿奖咳不止一次,那么他们到期是谁呢?
who_won_more_than_one = nobel[nobel.duplicated(subset=['firstname','surname'], keep= False)]\
[["firstname","surname","year", "age_get_prize", "gender","born_country_code", "died_country_code"]].reset_index()
who_won_more_than_one["difference_between_two_prize"] = who_won_more_than_one.groupby("surname")["year"].diff().abs()
who_won_more_than_one.bfill()
  • 实现效果如下,可以看到Marie、John、Linus和Frederick这四位科学家总共拿了两次诺贝尔奖

在这里插入图片描述

  • 加下来观察一下他们两次获奖之间的时间差是多少
plt.figure(figsize = (16, 7))
sns.barplot(x= "firstname", y= "difference_between_two_prize", hue= "gender",
            dodge=False, data= who_won_more_than_one, palette="Set1")
plt.xlabel("firstname")
plt.ylabel("Years Betwen two Prizes")
plt.title("Time difference between two awards")
plt.show()
  • 显示效果如下,可以看到两次获奖的时间差最短也要为7年,不得不说还是很厉害啊!

在这里插入图片描述

实验分析

  • 这次实验总体上来说难度较大,首先是数据集的选择,这花费了我挺长的时间。选择好数据集后就开始准备可视化数据集,一方面要学习不同的函数实现不同的绘制功能,同时还要构造数据,让其可视化出来的效果有意义,助于分析,总之,收获还是很大。

附录

数据集下载链接如下:https://github.com/NuanBaobao/Data-Visualization/blob/main/Exp7/noble.zip

参考资源:
https://www.cnblogs.com/cgmcoding/p/13356745.html
https://www.cnblogs.com/cgmcoding/p/13384442.html
https://cloud.tencent.com/developer/article/1517200
https://zhuanlan.zhihu.com/p/347067055

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
收集了2004年(第一届)至今中(全)国研究生数学建模竞赛获奖数据,并基于R语言,进行了数据处理和可视化的工作。 这项工作最初的起因是,作者和队友在2015、2016、2017年参赛并获奖后,好奇一共有多少人连续获奖以及他们来自于哪个省份和学校。于是2017年底,我开始收集数据、敲代码。由于当时正值毕业,也面临着从matlab转出选语言的问题,认准R语言的我便开始使用R来写这部分代码,因此当时那一版惨不忍睹。2018年9月15日,台风山竹正面袭击广州深圳,被迫呆在家里的我,发现正好是当年落户杯开赛的日子,于是我决定把这个代码重写了一遍,并发布到github上。2020开年的新冠肺炎疫情期间,没法去办公室的我,看了Hadley 大神的Advanced R一书,并整合自己2019年所学,开始重新审视自己的编程水平,于是决定再一次修改这个代码,并且决定,以后每年都要来修改一次,以见证每年收获和进步。 关于项目的几个说明: 中国研究生数学建模竞赛(原名全国研究生数学建模竞赛),官网网址(新),官方网址(旧),2004年开办,每年9月开赛、11月~12月会公布当年获奖结果,旧网址曾经有历年数据,不过目前404了; 官方公布的获奖名单,包含一等奖、二等奖、三等奖以及成功参与(参赛、参加)奖,但是基本上参赛、提交并未被认定为作弊就能拿到成功参与奖,所以这里将获奖名单视为参赛名单,其中的一二三等奖视为获奖; 部分年份获奖名单中无题型信息,则视其题型全部为N; 对于个人“连续获奖”这个概念,每个版本可能有不同算法,但基本原则是: 鉴于信息有限,只考虑同名、同学校在连续年份的获奖情况为“连续获奖”,即忽略“山大张三在2005年获奖后转学到中大并于2006年获奖” 鉴于信息有限,不区分同名不同人、但同校名的获奖情况,即将“山大张三于2005年获奖然后另一个也叫张三的山大学生于2006年获奖”,视为连续2次获奖 如果张三于2005年获奖,并于2007、2008年获奖,则将其视为两次连续获奖,第一次为1连,第二次为2连
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泷叶er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值