4768 字

1997-2020中国研究生数据分析

最近还在处理《现代科研指北》的书稿,可以确定的是正式出版应该不会用这个名字,新名字我还没想好。书里很多内容与当前在线版有不伤害本质的区别与删节,主要是为了照顾读者情绪与国内出版要求。目前可以认为在线版是开源项目而出版版是基于在线版的二次创作。书稿中原有一段是分析1997-2017年教育部研究生数据的,眼下要拖稿到2022年了,所以我把数据更新到了2020年(因为21年数据还没出),然后就发现很多结论已经验证了,很多新问题又出来了。因为书稿本身内容已经很多了,很多分析就放在这里,前一版我用的是Excel,这版我就全换成R了。

数据来源

原始数据是教育部放在自己网站上的,我这里只用了很小一部分。因为教育部按年发布,不同年代间报表有差异,很多统计方法也换掉了,这里我尽量洗了一下。有差异部分会在后面提及。

## 研究生数据
graduate <- read.csv('https://raw.githubusercontent.com/yufree/sciguide/master/data/graduate.csv', check.names = F)
## 教职数据
faculty <- read.csv('https://raw.githubusercontent.com/yufree/sciguide/master/data/faculty.csv', check.names = F)

研究生规模

研究生扩招是继高考扩招后另一个“知识改变命运”的国民级叙事,高考现在已经扩不动了,而且因为现在国家对中等职业教育有了硬性规定,适龄人口里大概一半人可能要读职业教育类学校,而剩下的一半多基本都被普通高中吸收了,高等教育入学率已经基本平稳,真考不上的那可能确实就是不适合读书了。然而,选拔性考试压力只会推迟而不会消失,在高考的选拔作用有限后,研究生入学考试就成了下一个战场。

首先,自然是讨论下研究生规模,这个群体一直是在增长的,而且最近几年增长的更快了。

graduate2 <- graduate[graduate$category == 'Total',]
# 人数
library(showtext)
## Loading required package: sysfonts
## Loading required package: showtextdb
showtext::showtext_auto()
par(mfrow=c(1,2))
plot(graduate2$year,graduate2$`Enrolment(Master)`,xlab = '年份',ylab = '人数',pch=19,col='black',ylim=c(min(graduate2$`Admitted(Master)`),max(graduate2$`Enrolment(Master)`)),main='硕士研究生')
points(graduate2$year,graduate2$`Graduates(Master)`,pch=19,col = 'red')
points(graduate2$year,graduate2$`Admitted(Master)`,pch=19,col='blue')
segments(graduate2$year[-c(22:24)],graduate2$`Admitted(Master)`[-c(22:24)],graduate2$year[-c(22:24)]+3,graduate2$`Graduates(Master)`[-c(1:3)])
legend('topleft',legend = c('在校生','录取人数','毕业人数'), col = c('black','blue','red'),pch=19)

plot(graduate2$year,graduate2$`Enrolment(Doctor)`,xlab = '年份',ylab = '人数',pch=19,col='black',ylim=c(min(graduate2$`Entrants(Doctor)`),max(graduate2$`Enrolment(Doctor)`)),main='博士研究生')
points(graduate2$year,graduate2$`Graduates(Doctor)`,pch=19,col = 'red')
points(graduate2$year,graduate2$`Entrants(Doctor)`,pch=19,col='blue')
segments(graduate2$year[-c(20:24)],graduate2$`Entrants(Doctor)`[-c(20:24)],graduate2$year[-c(20:24)]+5,graduate2$`Graduates(Doctor)`[-c(1:5)])
legend('topleft',legend = c('在校生','录取人数','毕业人数'), col = c('black','blue','red'),pch=19)

这里很多人会立即注意到2017年开始硕士研究生突然出现了扩张,这是个统计问题,教育部2017年换了统计方法,研究生招生、在校生指标内涵发生变化。招生包含全日制和非全日制研究生;在校生、授予学位数包含全日制、非全日制研究生和在职人员攻读硕士学位学生在校生的方法。

目前,我们已经有250万在校硕士生与接近50万的在校博士生,每年录取人数已经达到接近100万的硕士与10万的博士,硕博比基本稳定在10:1。然后我们看下延期现象,我把录取人数与硕士三年后毕业人数跟五年后博士人数做了连接,可以看出硕士毕业基本不怎么延期,但博士那边连线斜率最近几年都是负的,也就是说延期现象很普遍。

graduate3 <- graduate2[!is.na(graduate2$`Estimated Graduates for Next Year (master)`),]
par(mfrow=c(1,2))
plot(graduate3$year[-1],graduate3$`Estimated Graduates for Next Year (master)`[-5],xlab = '年份',ylab = '人数',pch=19,col='black',xlim = c(2017,2020), ylim=c(min(graduate3$`Graduates(Master)`),max(graduate3$`Estimated Graduates for Next Year (master)`)),main='硕士研究生')
points(graduate3$year[-1],graduate3$`Graduates(Master)`[-1],pch=19,col = 'red')
segments(graduate3$year[-1],graduate3$`Estimated Graduates for Next Year (master)`[-5],graduate3$year[-1],graduate3$`Graduates(Master)`[-1],pch=19)
plot(graduate3$year[-1],graduate3$`Estimated Graduates for Next Year (Doctor)`[-5],xlab = '年份',ylab = '人数',pch=19,col='black',xlim = c(2017,2020), ylim=c(min(graduate3$`Graduates(Doctor)`),max(graduate3$`Estimated Graduates for Next Year (Doctor)`)),main='博士研究生')
points(graduate3$year[-1],graduate3$`Graduates(Doctor)`[-1],pch=19,col = 'red')
segments(graduate3$year[-1],graduate3$`Estimated Graduates for Next Year (Doctor)`[-5],graduate3$year[-1],graduate3$`Graduates(Doctor)`[-1],pch=19)

# 平均延期概率
mean(graduate3$`Graduates(Master)`[-1]/graduate3$`Estimated Graduates for Next Year (master)`[-5])
## [1] 0.8885
mean(graduate3$`Graduates(Doctor)`[-1]/graduate3$`Estimated Graduates for Next Year (Doctor)`[-5])
## [1] 0.363

不过,很多学科硕士实际上是两年,而博士因为存在硕博连读很难直接说多少年毕业。然而,教育部最近五年也给出了下一年预计毕业人数,这样我们就可以直接对比毕业人数。上图可以看出最近四年的预计毕业人数与实际毕业人数状况,对于硕士而言11%学生不能按期毕业而博士则是64%,也就是说现在不论读硕士还是读博士都有超过1/10的概率无法按期毕业,每年延期毕业的硕士差不多等于当年读博士的人数,也算是一种讽刺。

分学科状况

下面我们看一下不同学科间的差异,这里可以明显看出,扩招在不同学科间是不一样的,硕士的扩招里专业学位、管理学、医学与工学学位的增长是很快的,但文科学位增长不大,军事学哲学甚至在下降,理学增长其实有限。然而,在博士的扩招趋势里,理学、工学与医学是最大的学科,增长也快,其余的学科在过去十年里没怎么扩招。

对比硕士博士学科差异,可以看出硕士里的管理学经济学硕士多但管理学经济学博士却不多,这说明这些学科硕士大概就挺容易就业的。硕士增长不多博士增长多,例如理学则属于基础学科,需要博士学位才能就业。但如果两者增长都很快,例如农学、艺术,可能是国家需求高,更可能是都不好找工作。另外,硕士专业学位的快速增长可以说明目前国家已经识别到硕士学位的应用方向需求,同时,专业博士学位也出现了,这说明应用方向对知识需求也越来越高。

graduate2 <- graduate[graduate$category != "Total"&graduate$category !="Of Which: Female",]
graduate2 <- graduate2[complete.cases(graduate2[,c(1:11)]),]
library(ggplot2)
ggplot(graduate2,aes(year,`Graduates(Master)`,color = category)) + 
        geom_point()+
        facet_wrap(facets = vars(category),scales = 'free')+
        ggtitle('硕士')

ggplot(graduate2,aes(year,`Graduates(Doctor)`,color = category)) + 
        geom_point()+
        facet_wrap(facets = vars(category),scales = 'free')+
        ggtitle('博士')

教职规模

看完了研究生状况,自然就该看下国内教职的状况,这里我主要用了教育部的研究生导师数据集。不过,当前国内教职没有博士学位已经基本不可能了,所以就不讨论硕士毕业后就业状况了,大概率是无法留在学术圈的。

par(mfrow=c(1,2))
plot(faculty$year[faculty$category == 'Total'],faculty$total[faculty$category == 'Total'],pch=19, main='教职数',ylim=c(0,max(faculty$total)),xlab = '年份', ylab = '人数', type = 'o')
points(faculty$year[faculty$category == 'Professors'], faculty$total[faculty$category == 'Professors'],pch=19,col='blue', type = 'o')
points(faculty$year[faculty$category == 'Asso. Professors'],faculty$total[faculty$category == 'Asso. Professors'],pch=19,col='red', type = 'o')
points(faculty$year[faculty$category == 'middle'],faculty$total[faculty$category == 'middle'],pch=19,col='orange', type = 'o')
legend('topleft',legend = c('总数','教授','副教授','中级职称'), col = c('black','blue','red','orange'),pch=19)
plot(faculty$year[faculty$category == "Supervisors of master's degree prog."],faculty$total[faculty$category == "Supervisors of master's degree prog."],pch=19, main='教职数',ylim=c(0,400000),xlab = '年份', ylab = '人数', type = 'o')
points(faculty$year[faculty$category == 'Supervisors of doctoral programmes'], faculty$total[faculty$category == 'Supervisors of doctoral programmes'],pch=19,col='blue', type = 'o')
points(faculty$year[faculty$category == 'Supervisors of doc. & mas. Degree programmes'],faculty$total[faculty$category == 'Supervisors of doc. & mas. Degree programmes'],pch=19,col='red', type = 'o')
legend('topleft',legend = c('硕士导师','博士导师','硕士博士导师'), col = c('black','blue','red'),pch=19)

由于本科生从1999年开始扩招,教职数也一直增加。不过,高级职称的增加速度明显低于教职总数的增加速度而中级职称教职在快速增加。教授与副教授都在增长,甚至教授人数比副教授还要多。如果我们看下导师资格,会发现硕士导师增长飞快而博士导师数目基本是不变的,大概在2万左右。需要注意的是最近国内教职正在改革,改为预聘长聘的方法,所以以后硕士博士导师可能区别不大了。

faculty2 <- faculty[faculty$category == 'Total', ]
par(mfrow=c(1,1))
col = RColorBrewer::brewer.pal(8,'Set2')
plot(faculty2$year,faculty2$`30 Years & Under`,pch=19, main='教职数',ylim=c(0,110000),xlab = '年份', ylab = '人数',col=col[1], type = 'o')
points(faculty2$year,faculty2$`31-35years`,pch=19,col=col[2], type = 'o')
points(faculty2$year,faculty2$`36-40years`,pch=19,col=col[3], type = 'o')
points(faculty2$year,faculty2$`41-45years`,pch=19,col=col[4], type = 'o')
points(faculty2$year,faculty2$`46-50years`,pch=19,col=col[5], type = 'o')
points(faculty2$year,faculty2$`51-55years`,pch=19,col=col[6], type = 'o')
points(faculty2$year,faculty2$`56-60years`,pch=19,col=col[7], type = 'o')
points(faculty2$year,faculty2$`61 Years & Over`,pch=19,col=col[8], type = 'o')
legend('topleft',legend = c('30岁以下','30-34','35-39','40-44','45-49','50-54','55-59','60岁以上'), col = col,pch=19)

下面就是教职年龄分布图了,这里需要注意,1997-2013年的教职年龄分布数据分段为30岁(含)以下,31-35,36-40,41-45,46-50,51-55,56-60,60岁以上。

这里我们可以看到1999年大学扩招后35-39岁段出了个教职高峰,也就是那个年代基本博士毕业就能拿到教职,后面每隔五年我们会看到这个教职高峰的平移,现在已经移到55-59岁了。如果退休年龄不延长的话,大概未来五到十年我们会看到一个退休导致的教职空窗期,现在一年高级教职大概会有两三万,遇到这个高峰会翻倍。不过大概率退休年龄会延长,所以真正能遇到这个空窗期的人大概现在还在读中学或者说现在就要至少是个中级职称去排队。再晚上几年,中国教职就会一个萝卜一个坑了。

par(mfrow=c(1,3))
faculty2 <- faculty[faculty$category == 'Professors', ]
plot(faculty2$year,faculty2$`30 Years & Under`,pch=19, main='教授',ylim=c(0,80000),xlab = '年份', ylab = '人数',col=col[1], type = 'o')
points(faculty2$year,faculty2$`31-35years`,pch=19,col=col[2], type = 'o')
points(faculty2$year,faculty2$`36-40years`,pch=19,col=col[3], type = 'o')
points(faculty2$year,faculty2$`41-45years`,pch=19,col=col[4], type = 'o')
points(faculty2$year,faculty2$`46-50years`,pch=19,col=col[5], type = 'o')
points(faculty2$year,faculty2$`51-55years`,pch=19,col=col[6], type = 'o')
points(faculty2$year,faculty2$`56-60years`,pch=19,col=col[7], type = 'o')
points(faculty2$year,faculty2$`61 Years & Over`,pch=19,col=col[8], type = 'o')
legend('topleft',legend = c('30岁以下','30-34','35-39','40-44','45-49','50-54','55-59','60岁以上'), col = col,pch=19)

faculty2 <- faculty[faculty$category == 'Asso. Professors', ]
plot(faculty2$year,faculty2$`30 Years & Under`,pch=19, main='副教授',ylim=c(0,80000),xlab = '年份', ylab = '人数',col=col[1], type = 'o')
points(faculty2$year,faculty2$`31-35years`,pch=19,col=col[2], type = 'o')
points(faculty2$year,faculty2$`36-40years`,pch=19,col=col[3], type = 'o')
points(faculty2$year,faculty2$`41-45years`,pch=19,col=col[4], type = 'o')
points(faculty2$year,faculty2$`46-50years`,pch=19,col=col[5], type = 'o')
points(faculty2$year,faculty2$`51-55years`,pch=19,col=col[6], type = 'o')
points(faculty2$year,faculty2$`56-60years`,pch=19,col=col[7], type = 'o')
points(faculty2$year,faculty2$`61 Years & Over`,pch=19,col=col[8], type = 'o')
legend('topleft',legend = c('30岁以下','30-34','35-39','40-44','45-49','50-54','55-59','60岁以上'), col = col,pch=19)

faculty2 <- faculty[faculty$category == 'middle', ]
plot(faculty2$year,faculty2$`30 Years & Under`,pch=19, main='中级职称',ylim=c(0,30000),xlab = '年份', ylab = '人数',col=col[1], type = 'o')
points(faculty2$year,faculty2$`31-35years`,pch=19,col=col[2], type = 'o')
points(faculty2$year,faculty2$`36-40years`,pch=19,col=col[3], type = 'o')
points(faculty2$year,faculty2$`41-45years`,pch=19,col=col[4], type = 'o')
points(faculty2$year,faculty2$`46-50years`,pch=19,col=col[5], type = 'o')
points(faculty2$year,faculty2$`51-55years`,pch=19,col=col[6], type = 'o')
points(faculty2$year,faculty2$`56-60years`,pch=19,col=col[7], type = 'o')
points(faculty2$year,faculty2$`61 Years & Over`,pch=19,col=col[8], type = 'o')
legend('topleft',legend = c('30岁以下','30-34','35-39','40-44','45-49','50-54','55-59','60岁以上'), col = col,pch=19)

如果我们仔细分析这个1999年扩招造成的特殊年龄分布,会发现处于这个年龄段的基本都是教授,也就是20年前还是可以熬年限的。但现在显然都堵在副教授上了,副教授教授里的年轻人这些年都在增加,而中级职称的人还在快速增长。数据上看40-44岁如果不能上教授或副教授,后面基本也上不去了,目前国家的人才项目基本也是卡在40或45左右的。

从就业上看,每年博士毕业生10万,但中级职称每年增加两万左右,高级职称刚毕业(包含博士后)现在也有可能拿到,大概每年也是两三万的量级。也就是说,目前教职市场最多可以吸收一半的博士毕业生。因为大学不扩招了,所以教职市场很难出现大扩充,又因为博士还在扩招,往后应该会看到更多的博士毕业生直接输送到社会。

小结

  • 扩招依然进行中,研究生群体在300万左右,每年还要增加百万量级
  • 硕士会有十分之一延期,博士则超过六成,读博要做好年龄规划
  • 不同学科间硕士博士扩招情况不同,硕士偏重职业化与应用,博士扩招侧重理工科
  • 教职方面存在1999年大学扩招后出现的一个人口红利,未来会有个每年四五万的教职空窗期
  • 目前教职扩充吸收的主要是中级职称,大概吸收当年五分之一的博士毕业生
  • 40-44岁拿到的职称基本就是退休职称了
  • 现在会有一半博士不做教职,未来会有更多,早做职业化打算