Как учёные перемещаются по миру
Недавно в журнале Science была статья «Огромный архив резюме раскрыл самых путешествующих учёных» («Vast set of public CVs reveals the world«s most migratory scientists») — где на основе публичных данных из системы orcid была продемонстрирована статистика переезда учёных из страны в страну. Все данные использованные для статьи тоже были выложены в октрытый доступ, и я решил посмотреть куда-же разьезжаются учёные из России в общем, ну и из родного Физтеха в частности.
Введение
Система orcid (Open Researcher and Contributor ID) это НКО отвечающая за добровольно-принудительная систему для помощи идентификации авторов научных публикаций, созданная в 2012 году. Идея состоит в том, что учёные участвующие в публикации научных статей могут самостоятельно создать учётную запись, которая будет их уникальным образом идентифицировать и позволит правильно идентифицировать людей при расчёте разных метрик (например индекс Хирша).
Что интересно, все исходные данные открыты, orcid выложил в свободный доступ полных архив всех резюме доступных для публичного доступа в формате json. Причём со всей историей изменений. Т.е например условный Иван Иваныч Иванов указал в системе что окончил MIT в 2000 г, потом был аспирантом в Стенфорде, а потом поставил место работы Московский Шинолитейный Университет, то система в принципе это всё скушает и запомнит. Т.е в принципе никто не мешает на данный момент создавать фейковые учётные записи, но многие научные журналы уже начали требовать ORCID для публикации статей, так что есть предположение что большинство учётных записей в системе создано с благими намерениями.
На момент публикации статьи в Science, в открытой базе orcid была информация о резюме примерно 3х миллионов учёных по всему миру. Авторы статьи в Science пишут что разные страны представлены более полно (если сравнивать со статистикой Unesco о количестве учёных) и есть заметный уклон в сторону учёных недавно окончивших аспирантуру.
Несмотря на всё вышеперечисленное, это самая полная публично-доступная база данных об учёных и их перемещения. В оригинальной статье авторы просто разбили весь мир на 8 областей (ЕС за исключением Великобротании, Великобритания, Штаты, Азия, Америка за исключением США, Австралия и Океания, Европа за исключением ЕС и Африка) и подсчитали статистику о том, сколько учёных сменили место жительства после окончания аспирантуры и куда они потом направились.Можно посмотреть где теперь живут учёные окончившие российские вузы, в том числе. Но, поскольку все исходные данные есть в публичном доступе, желающие могут самостоятельно удовлетворить своё любопытство, что я и сделал.
Импортируем данные
Я решил импортировать базу данных после первичной обработки из json в .csv в SQLite для простоты написания запросов: загрузил файл ORCID_migrations_2016_12_16.csv (1988114 записей, 224 мб):
CREATE TABLE migration(dummy,orcid_id,country,organization_name,Ringgold_id,start_year,end_year,affiliation_type,affiliation_role,is_phd);
.import ORCID_migrations_2016_12_16.csv migration
В этой таблице каждая строка соответствует одному месту работы или учёбы человека ешё я сделал отдельную таблицу всех индивидумов с информацией о том в какой стране и в каком году они учились последний раз, и ещё одну с информацией где они теперь находятся:
create table person_last_education(orcid_id,country,graduated,is_phd);
insert into person_last_education(orcid_id,country,graduated,is_phd) select p.orcid_id, m.country, m.end_year, m.is_phd from person as p, migration as m
where
m.orcid_id=p.orcid_id and
m.affiliation_type='EDUCATION' ;
create table person_last_location(orcid_id,country);
# selecting orcid
insert into person_last_location(orcid_id,country)
select p.orcid_id,
(select m.country from migration as m where m.orcid_id=p.orcid_id order by end_year desc limit 1)
from person as p;
Получилось, что в базе есть данные о 1096745 выпускниках по всему миру, из них 321083 получила PhD.
Обрабатываем данные
Считаем статистику по десяти самым представленным странам и рисуем диаграмму с помощь ggplot.
library(DBI)
migration <- dbConnect(RSQLite::SQLite(), "orcid_2016.sqlite3")
by_country<-dbGetQuery(migration, 'select country,count(*) from person_last_education group by 1 order by 2 desc limit 10')
ggplot(by_country,aes(x=country,y=`count(*)`))+geom_col()
by_country_phd<-dbGetQuery(migration, 'select country,count(*) from person_last_education where is_phd=1 group by 1 order by 2 desc limit 10')
ggplot(by_country_phd,aes(x=country,y=`count(*)`))+geom_col()
Сюрприз, Россия на 10 м месте в мире по количеству зарегистрировавшихся выпускников, правда в 10ку выпускников с PhD не попала.
Теперь смотрим, где-же теперь обитают русские учёные, и для наглядности покажем их на карте мира, отнормировав на общее количество выпускников. Для более удобной демонстрации воспользуемся plotly, это пакет облегчающий создание интерактивных графиков, локально или со своим сервером его можно использовать бесплатно, но он так-же предоставляет службу для хостинга, небольшое количества графиков можно выложить бесплатно.
Как сделать
create table person_last_location(orcid_id,country);
# selecting orcid
insert into person_last_location(orcid_id,country)
select p.orcid_id,
(select m.country from migration as m where m.orcid_id=p.orcid_id order by end_year desc limit 1)
from person as p;
destination_by_country<-dbGetQuery(migration, "select l.country as destination, count(*) as count from person_last_education as o left join person_last_location as l on l.orcid_id=o.orcid_id where o.country='RU' and o.is_phd=1 group by 1")
total_from_ru <- destination_by_country %>% summarize(n=sum(count))
fraction_remained <- destination_by_country %>%
filter(destination=='RU') %>% mutate(frac=100*count/total_from_ru$n)
destination_by_country_n <- destination_by_country %>% filter(destination!='RU') %>%
mutate(frac=100*count/total_from_ru$n)
p <- plot_geo(destination_by_country_n) %>%
add_trace(
z = ~frac, color = ~frac, colorscale = 'Bluered',
text = ~COUNTRY, locations = ~destination3c, marker = list(line = list(color = toRGB("grey"), width = 0.5))
) %>%
colorbar(title = 'Отбыло', ticksuffix = '%') %>%
layout(
title = paste('PhD по странам убытия, осталось ',fraction_remained$frac,'%'),
geo = list(
showframe = FALSE,
showcoastlines = FALSE,
projection = list(type = 'Mercator')
)
)
api_create(p, filename = "phds_from_russia")
Интерактивный график на plotly
Аналогично можно посмотреть откуда в Россию приезжают учёные.
Интерактивный график на plotly
Налицо некоторый дисбаланс, из получивших степень кандидата (PhD) в России осталось 83%, но из всех российских учёных — 95% получило степень в России. Т.е уехало больше чем приехало. Посмотрим, а как с этим балансом обстоят дела во всём мире?
left_country<-dbGetQuery(migration, "select o.country as country,count(distinct o.orcid_id) as departed from person_last_education as o left join person_last_location as l on l.orcid_id=o.orcid_id where o.country!=l.country and o.is_phd=1 group by 1")
arrived_to_country<-dbGetQuery(migration, "select l.country as country, count(distinct l.orcid_id) as arrived from person_last_education as o left join person_last_location as l on l.orcid_id=o.orcid_id where o.country!=l.country and o.is_phd=1 group by 1")
by_country<-dbGetQuery(migration, 'select l.country as country, count(distinct l.orcid_id) as total from person_last_education as o left join person_last_location as l on l.orcid_id=o.orcid_id where o.is_phd=1 group by 1')
balance_by_country <- by_country %>%
left_join(left_country,by='country') %>%
left_join(arrived_to_country,by='country') %>%
mutate(arrived=ifelse(is.na(arrived),0,arrived),departed=ifelse(is.na(departed),0,departed)) %>%
mutate(balance=round(100*(arrived-departed)/total,2)) %>%
filter(total>10) %>%
mutate(country3c=to_iso3c(country),country.ru=decode_ru(country))
p <- plot_geo(balance_by_country) %>%
add_trace(
z = ~balance, color = ~balance, colorscale = 'Bluered',
text = ~country.ru, locations = ~country3c, marker = list(line = list(color = toRGB("grey"), width = 0.5))
) %>%
colorbar(title = 'Баланс', ticksuffix = '%',limits=c(-100,100)) %>%
layout(
title = 'PhD (приехало-уехало)/осталось',
geo = list(
showframe = FALSE,
showcoastlines = TRUE,
projection = list(type = 'Mercator')
)
)
api_create(p, filename = "phds_balance")
Я решил показывать только страны где суммарное количество людей с PhD больше 10, скорее всего там просто люди недостаточно активно пользуются системой ORCID.
Интерактивный график на plotly
Похоже что во многих развитых странах, особенно в Европейских народ оканчивает аспирантуру и уезжает работать куда-нибудь в неочень развитое мест, наверное там конкуренция с местными выпускниками не такая сильная и проще получить позицию в Университете.
Куда уехали физтехи?
С выпускниками физтеха пришлось немного повозится, потому что название родного вуза все указывают немного по-разному, пришлось в ручную поискать в базе всё что похоже на МФТИ и сделать табликчку соответвия. И вот что получилось:
Интерактивный график на plotly
Похоже, большинство физтехов шифруются (как и я) и не выкладывают в orcid своё резюме. Будем ждать…
Отмазка
Все статистика построена на основе данные которые люди внесли в базу данных ORCID и сделали доступной для публичного доступа. Поэтому бессмысленно говорить что-то типа «а, это всё фигня — я лично знаю физтеха живущего в Мексике или Бразилии», наверное он просто не сделал публичное резюме на orcid.
Все скрипты разещены на github смотрите https://github.com/vfonov/sci_migration/blob/master/stats_db.R