{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Excess mortality in Russia during the covid19 pandemics\n", "## Analysis and figures for the Significance-2021 paper" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib notebook\n", "\n", "import numpy as np\n", "import pandas as pd\n", "import pylab as plt\n", "import seaborn as sns\n", "import matplotlib\n", "\n", "from matplotlib.patches import Polygon" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "months_eng = ['January', 'February', 'March', 'April', 'May', 'June',\n", " 'July', 'August', 'September', 'October', 'November', 'December']\n", "\n", "months_eng_short = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n", " 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n", "\n", "months_rus = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь',\n", " 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь']\n", "\n", "months_rus_short = ['янв', 'фев', 'мар', 'апр', 'май', 'июн',\n", " 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Names, locations, etc. of Russian regions" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def rename(regions):\n", " regions[regions=='Hижегородская область'] = 'Нижегородская область'\n", "\n", " # in EMISS files\n", " regions[regions=='Город Москва столица Российской Федерации город федерального значения'] = 'Москва'\n", " regions[regions=='Город Санкт-Петербург город федерального значения'] = 'Санкт-Петербург'\n", " regions[regions=='Город федерального значения Севастополь'] = 'Севастополь'\n", " regions[regions=='Ненецкий автономный округ (Архангельская область)'] = 'Ненецкий АО'\n", " regions[regions=='Архангельская область (кроме Ненецкого автономного округа)'] = 'Архангельская область без АО'\n", " regions[regions=='Ханты-Мансийский автономный округ - Югра (Тюменская область)'] = 'Ханты-Мансийский АО'\n", " regions[regions=='Ямало-Ненецкий автономный округ (Тюменская область)'] = 'Ямало-Hенецкий АО'\n", " regions[regions=='Тюменская область (кроме Ханты-Мансийского автономного округа-Югры и Ямало-Ненецкого автономного округа)'] = 'Тюменская область без АО'\n", " regions[regions=='Чукотский автономный округ'] = 'Чукотский АО'\n", " regions[regions=='Еврейская автономная область'] = 'Еврейская АО'\n", " regions[regions=='Республика Адыгея (Адыгея)'] = 'Республика Адыгея'\n", " regions[regions=='Республика Татарстан (Татарстан)'] = 'Республика Татарстан' \n", " regions[regions=='Чувашская Республика - Чувашия'] = 'Чувашская Республика'\n", " regions[regions=='Республика Северная Осетия-Алания'] = 'Северная Осетия'\n", " regions[regions=='Республика Саха (Якутия)'] = 'Якутия'\n", " regions[regions=='Кабардино-Балкарская Республика'] = 'Кабардино-Балкария'\n", " regions[regions=='Карачаево-Черкесская Республика'] = 'Карачаево-Черкесия'\n", " regions[regions=='Кемеровская область - Кузбасс'] = 'Кемеровская область'\n", " \n", " # in addition in Rosstat files\n", " regions[regions=='г.Москва'] = 'Москва'\n", " regions[regions=='г.Санкт-Петербург'] = 'Санкт-Петербург'\n", " regions[regions=='г.Севастополь'] = 'Севастополь'\n", " regions[regions=='Hенецкий авт.округ'] = 'Ненецкий АО'\n", " regions[regions=='Архангельская область без автономии'] = 'Архангельская область без АО'\n", " regions[regions=='Ханты-Мансийский авт.округ-Югра'] = 'Ханты-Мансийский АО'\n", " regions[regions=='Ямало-Hенецкий авт.округ'] = 'Ямало-Hенецкий АО'\n", " regions[regions=='Тюменская область без автономии'] = 'Тюменская область без АО'\n", " regions[regions=='Чукотский авт.округ'] = 'Чукотский АО'\n", " regions[regions=='Республика Татарстан(Татарстан)'] = 'Республика Татарстан'\n", " regions[regions=='Чувашская Республика(Чувашия)'] = 'Чувашская Республика'\n", " regions[regions=='Республика Северная Осетия- Алания'] = 'Северная Осетия'\n", " \n", " # in addition in Stopcoronavirus files\n", " regions[regions=='Ненецкий автономный округ'] = 'Ненецкий АО'\n", " regions[regions=='Республика Северная Осетия — Алания'] = 'Северная Осетия'\n", " regions[regions=='Республика Чувашия'] = 'Чувашская Республика'\n", " regions[regions=='Чукотский автономный округ'] = 'Чукотский АО'\n", " regions[regions=='Ямало-Ненецкий автономный округ'] = 'Ямало-Hенецкий АО'\n", " if 'Архангельская область без АО' not in regions:\n", " regions[regions=='Архангельская область'] = 'Архангельская область без АО'\n", " regions[regions=='Тюменская область'] = 'Тюменская область без АО'\n", " \n", " return regions" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "regions_table = {'Алтайский край':[3,12], 'Амурская область':[2,15],\n", " 'Архангельская область без АО':[1,8], 'Астраханская область':[7,7],\n", " 'Белгородская область':[6,4], 'Брянская область':[4,2], 'Владимирская область':[3,5],\n", " 'Волгоградская область':[6,6], 'Вологодская область':[1,5],\n", " 'Воронежская область':[6,5], 'Еврейская АО':[3,15], 'Забайкальский край':[1,15],\n", " 'Ивановская область':[2,5], 'Иркутская область':[1,14], 'Кабардино-Балкария':[9,4],\n", " 'Калининградская область':[1,0], 'Калужская область':[3,2], 'Камчатский край':[1,17],\n", " 'Карачаево-Черкесия':[8,4], 'Кемеровская область':[1,13], 'Кировская область':[2,8],\n", " 'Костромская область':[2,6], 'Краснодарский край':[7,4], 'Красноярский край':[0,13],\n", " 'Курганская область':[2,11], 'Курская область':[5,3], 'Ленинградская область':[1,3],\n", " 'Липецкая область':[5,4], 'Магаданская область':[1,16], 'Москва':[3,3],\n", " 'Московская область':[3,4], 'Мурманская область':[0,4], 'Ненецкий АО':[0,9],\n", " 'Нижегородская область':[3,6], 'Новгородская область':[1,4],\n", " 'Новосибирская область':[2,12], 'Омская область':[3,11], 'Оренбургская область':[5,8],\n", " 'Орловская область':[4,3], 'Пензенская область':[5,6], 'Пермский край':[2,9],\n", " 'Приморский край':[3,16], 'Псковская область':[2,2], 'Республика Адыгея':[8,3],\n", " 'Республика Алтай':[4,12], 'Республика Башкортостан':[4,9],\n", " 'Республика Бурятия':[2,14], 'Республика Дагестан':[8,7],\n", " 'Республика Ингушетия':[9,6], 'Республика Калмыкия':[7,6],\n", " 'Республика Карелия':[0,3], 'Республика Коми':[1,9], 'Республика Крым':[7,3],\n", " 'Республика Марий Эл':[2,7], 'Республика Мордовия':[4,6],\n", " 'Республика Татарстан':[3,8], 'Республика Тыва':[3,13], 'Республика Хакасия':[2,13],\n", " 'Ростовская область':[7,5], 'Рязанская область':[4,5], 'Самарская область':[4,8],\n", " 'Санкт-Петербург':[1,2], 'Саратовская область':[5,7], 'Сахалинская область':[3,17],\n", " 'Свердловская область':[2,10], 'Севастополь':[7,2], 'Северная Осетия':[9,5],\n", " 'Смоленская область':[3,1], 'Ставропольский край':[8,5], 'Тамбовская область':[5,5],\n", " 'Тверская область':[2,3], 'Томская область':[1,12], 'Тульская область':[4,4],\n", " 'Тюменская область без АО':[1,11], 'Удмуртская Республика':[3,9],\n", " 'Ульяновская область':[4,7], 'Хабаровский край':[2,16], 'Ханты-Мансийский АО':[1,10],\n", " 'Челябинская область':[3,10], 'Чеченская Республика':[8,6],\n", " 'Чувашская Республика':[3,7], 'Чукотский АО':[0,17], 'Якутия':[3,14],\n", " 'Ямало-Hенецкий АО':[0,10], 'Ярославская область':[2,4]}\n", "\n", "regions_short = ['Российская Федерация', 'Белгородская', 'Брянская',\n", " 'Владимирская', 'Воронежская',\n", " 'Ивановская', 'Калужская', 'Костромская',\n", " 'Курская', 'Липецкая', 'Московская',\n", " 'Орловская', 'Рязанская', 'Смоленская',\n", " 'Тамбовская', 'Тверская', 'Тульская',\n", " 'Ярославская', 'Москва', 'Карелия',\n", " 'Коми', 'Ненецкий АО', 'Архангельская',\n", " 'Вологодская', 'Калининградская',\n", " 'Ленинградская', 'Мурманская',\n", " 'Новгородская', 'Псковская', 'Петербург',\n", " 'Адыгея', 'Калмыкия', 'Крым',\n", " 'Краснодарский', 'Астраханская',\n", " 'Волгоградская', 'Ростовская', 'Севастополь',\n", " 'Дагестан', 'Ингушетия',\n", " 'Каб-Балкария', 'Кар-Черкесия', 'Сев Осетия',\n", " 'Чеченская', 'Ставропольский',\n", " 'Башкортостан', 'Марий Эл',\n", " 'Мордовия', 'Татарстан',\n", " 'Удмуртия', 'Чувашия', 'Пермский',\n", " 'Кировская', 'Нижегородская',\n", " 'Оренбургская', 'Пензенская', 'Самарская',\n", " 'Саратовская', 'Ульяновская', 'Курганская',\n", " 'Свердловская', 'Ханты-Манс АО', 'Ямало-Hен АО',\n", " 'Тюменская', 'Челябинская',\n", " 'Алтай', 'Тыва', 'Хакасия',\n", " 'Алтайский', 'Красноярский', 'Иркутская',\n", " 'Кемеровская', 'Новосибирская', 'Омская',\n", " 'Томская', 'Бурятия', 'Якутия',\n", " 'Забайкальский', 'Камчатский', 'Приморский',\n", " 'Хабаровский', 'Амурская', 'Магаданская',\n", " 'Сахалинская', 'Еврейская АО', 'Чукотский АО']" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "coordinates={}\n", "coordinates['Белгородская область' ] = [145,575]\n", "coordinates['Брянская область' ] = [140,510]\n", "coordinates['Владимирская область' ] = [245,530]\n", "coordinates['Воронежская область' ] = [170,590]\n", "coordinates['Ивановская область' ] = [265,515]\n", "coordinates['Калужская область' ] = [170,505]\n", "coordinates['Костромская область' ] = [300,500]\n", "coordinates['Курская область' ] = [140,545]\n", "coordinates['Липецкая область' ] = [180,560]\n", "coordinates['Московская область' ] = [214,500]\n", "coordinates['Орловская область' ] = [165,535]\n", "coordinates['Рязанская область' ] = [220,550]\n", "coordinates['Смоленская область' ] = [160,475]\n", "coordinates['Тамбовская область' ] = [210,580]\n", "coordinates['Тверская область' ] = [190,455]\n", "coordinates['Тульская область' ] = [185,530]\n", "coordinates['Ярославская область' ] = [260,480]\n", "coordinates['Москва' ] = [60, 460]\n", "coordinates['Республика Карелия' ] = [290,360]\n", "coordinates['Республика Коми' ] = [440,470]\n", "coordinates['Ненецкий АО' ] = [480,400]\n", "coordinates['Архангельская область без АО' ] = [340,420]\n", "coordinates['Вологодская область' ] = [290,460]\n", "coordinates['Калининградская область' ] = [80,380]\n", "coordinates['Ленинградская область' ] = [240,410]\n", "coordinates['Мурманская область' ] = [360,310]\n", "coordinates['Новгородская область' ] = [210,425]\n", "coordinates['Псковская область' ] = [170,410]\n", "coordinates['Санкт-Петербург' ] = [200,370]\n", "coordinates['Республика Адыгея' ] = [90,690]\n", "coordinates['Республика Калмыкия' ] = [170,705]\n", "coordinates['Краснодарский край' ] = [92,660]\n", "coordinates['Астраханская область' ] = [205,710]\n", "coordinates['Волгоградская область' ] = [195,645]\n", "coordinates['Ростовская область' ] = [140,650]\n", "coordinates['Республика Дагестан' ] = [146,792]\n", "coordinates['Республика Ингушетия' ] = [127,760]\n", "coordinates['Кабардино-Балкария' ] = [110,735]\n", "coordinates['Карачаево-Черкесия' ] = [95,720]\n", "coordinates['Северная Осетия' ] = [115,750]\n", "coordinates['Чеченская Республика' ] = [140,760]\n", "coordinates['Ставропольский край' ] = [125,710]\n", "coordinates['Республика Башкортостан' ] = [365,650]\n", "coordinates['Республика Марий Эл' ] = [320,560]\n", "coordinates['Республика Мордовия' ] = [250,570]\n", "coordinates['Республика Татарстан' ] = [320,600]\n", "coordinates['Удмуртская Республика' ] = [360,580]\n", "coordinates['Чувашская Республика' ] = [290,575]\n", "coordinates['Пермский край' ] = [410,560]\n", "coordinates['Кировская область' ] = [350,540]\n", "coordinates['Нижегородская область' ] = [270,550]\n", "coordinates['Оренбургская область' ] = [320,660]\n", "coordinates['Пензенская область' ] = [250,600]\n", "coordinates['Самарская область' ] = [300,630]\n", "coordinates['Саратовская область' ] = [250,640]\n", "coordinates['Ульяновская область' ] = [275,600]\n", "coordinates['Курганская область' ] = [460,660]\n", "coordinates['Свердловская область' ] = [460,600]\n", "coordinates['Ханты-Мансийский АО' ] = [550,550]\n", "coordinates['Ямало-Hенецкий АО' ] = [630,510]\n", "coordinates['Тюменская область без АО' ] = [510,640]\n", "coordinates['Челябинская область' ] = [420,660]\n", "coordinates['Республика Алтай' ] = [700,800]\n", "coordinates['Республика Бурятия' ] = [980,720]\n", "coordinates['Республика Тыва' ] = [810,790]\n", "coordinates['Республика Хакасия' ] = [750,755]\n", "coordinates['Алтайский край' ] = [650,770]\n", "coordinates['Забайкальский край' ] = [1060,710]\n", "coordinates['Красноярский край' ] = [790,520]\n", "coordinates['Иркутская область' ] = [900,670]\n", "coordinates['Кемеровская область' ] = [710,725]\n", "coordinates['Новосибирская область' ] = [620,710]\n", "coordinates['Омская область' ] = [560,680]\n", "coordinates['Томская область' ] = [660,650]\n", "coordinates['Якутия' ] = [1030,430]\n", "coordinates['Камчатский край' ] = [1390,360]\n", "coordinates['Приморский край' ] = [1340,730]\n", "coordinates['Хабаровский край' ] = [1200,510]\n", "coordinates['Амурская область' ] = [1160,630]\n", "coordinates['Магаданская область' ] = [1250,320]\n", "coordinates['Сахалинская область' ] = [1355,575]\n", "coordinates['Еврейская АО' ] = [1265,690]\n", "coordinates['Чукотский АО' ] = [1260,150]\n", "coordinates['Республика Крым' ] = [35,620]\n", "coordinates['Севастополь' ] = [20,625]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "regionsToEnglish = {'Москва':'Moscow', \n", " 'Московская область':'Moscow Oblast',\n", " 'Санкт-Петербург':'St. Petersburg', \n", " 'Республика Татарстан':'Tatarstan',\n", " 'Республика Башкортостан':'Bashkortostan',\n", " 'Краснодарский край':'Krasnodar Krai',\n", " 'Свердловская область':'Sverdlovsk Oblast',\n", " 'Самарская область':'Samara Oblast',\n", " 'Республика Дагестан':'Dagestan',\n", " 'Челябинская область':'Chelyabinsk Oblast',\n", " 'Нижегородская область':'Nizhny Novgorod Oblast',\n", " 'Ростовская область':'Rostov Oblast',\n", " 'Волгоградская область':'Volgograd Oblast',\n", " 'Ленинградская область':'Leningrad Oblast',\n", " 'Пензенская область':'Penza Oblast',\n", " 'Оренбургская область':'Orenburg Oblast',\n", " 'Новосибирская область':'Novosibirsk Oblast',\n", " 'Пермский край':'Perm Krai',\n", " }\n", "\n", "regionsToEnglishShort = {\n", " 'Москва':'Moscow', \n", " 'Московская область':'Moscow Oblast',\n", " 'Санкт-Петербург':'St. Petersburg', \n", " 'Республика Татарстан':'Tatarstan',\n", " 'Республика Башкортостан':'Bashkortostan',\n", " 'Краснодарский край':'Krasnodar Krai',\n", " 'Свердловская область':'Sverdlovsk O.',\n", " 'Самарская область':'Samara O.',\n", " 'Республика Дагестан':'Dagestan',\n", " 'Челябинская область':'Chelyabinsk O.',\n", " 'Нижегородская область':'N. Novgorod O.',\n", " 'Ростовская область':'Rostov O.',\n", " 'Волгоградская область':'Volgograd O.',\n", " 'Ленинградская область':'Leningrad O.',\n", " 'Пензенская область':'Penza O.',\n", " 'Оренбургская область':'Orenburg O.',\n", " 'Новосибирская область':'Novosibirsk O.',\n", " 'Пермский край':'Perm Krai',\n", " }" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Load data\n", "\n", "Data sources:\n", "\n", "* https://www.fedstat.ru/indicator/33556\n", "\n", "* https://www.fedstat.ru/indicator/31556\n", "\n", "* https://rosstat.gov.ru/storage/mediabank/ldMWepjj/edn11-2020.htm\n", "\n", "* https://docs.google.com/spreadsheets/d/1nCxvNcuZGNswsf97mliLikmUIsOrOGZtL-VI7xfN-Zw (scraped by Sergey Shpilkin)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "table = pd.read_excel('russian-data/data.xls')\n", "\n", "regions = table.values[3:,0]\n", "regions = np.array([r.strip(' *') for r in regions])\n", "\n", "deaths = table.values[3:,1:].astype(float)\n", "\n", "# fill in fields that are empty for some years for unclear reasons\n", "deaths[regions=='Архангельская область (кроме Ненецкого автономного округа)',:] = \\\n", " deaths[regions=='Архангельская область',:] - \\\n", " deaths[regions=='Ненецкий автономный округ (Архангельская область)',:]\n", "\n", "deaths[regions=='Тюменская область (кроме Ханты-Мансийского автономного округа-Югры и Ямало-Ненецкого автономного округа)',:] = \\\n", " deaths[regions=='Тюменская область',:] - \\\n", " deaths[regions=='Ханты-Мансийский автономный округ - Югра (Тюменская область)',:] - \\\n", " deaths[regions=='Ямало-Ненецкий автономный округ (Тюменская область)',:]\n", "\n", "kickout = np.isnan(deaths[:,-1])\n", "kickout |= np.array(['федеральный округ' in r for r in regions])\n", "kickout |= np.isin(regions, ['Архангельская область', 'Тюменская область'])\n", "\n", "regions = regions[~kickout]\n", "deaths = deaths[~kickout]\n", "\n", "regions = rename(regions)\n", "\n", "assert(all(deaths[0] == np.nansum(deaths[1:],axis=0)))" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "deaths_year = np.zeros((regions.size, 15, 12)) * np.nan\n", "for y in range(14):\n", " deaths_year[:,y,:] = deaths[:, y*12:(y+1)*12]\n", "deaths_year[:,14,:deaths.shape[1]-14*12] = deaths[:, 14*12:]\n", "\n", "deaths = deaths_year" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "# Append last months\n", "\n", "d = pd.read_excel('russian-data/edn10_2020.xlsx', sheet_name='t1_1')\n", "r = d.values[:,0][4:]\n", "d = d.values[:,5][4:]\n", "r = np.array([a.strip() for a in r])\n", "r = rename(r)\n", "\n", "for i,reg in enumerate(regions):\n", " deaths[i,-1,9] = d[r==reg][0]\n", " \n", "d = pd.read_excel('russian-data/edn11_2020.xlsx', sheet_name='t1_1')\n", "r = d.values[:,0][4:]\n", "d = d.values[:,5][4:]\n", "r = np.array([a.strip() for a in r])\n", "r = rename(r)\n", "\n", "for i,reg in enumerate(regions):\n", " deaths[i,-1,10] = d[r==reg][0]" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[164075. 143179. 152740. 150873. 172914. 162758. 181479. 157181. 170717.\n", " 205456. 219872. nan]\n" ] } ], "source": [ "print(deaths[0,-1])" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 0. 0. 0. 0.]\n", " [ 0. 0. 0. 0.]\n", " [ 0. 0. 0. 0.]\n", " [ 2700. 796. 870. 1284.]\n", " [11852. 3354. 3218. 6914.]\n", " [11650. 2984. 2968. 7068.]\n", " [10126. 2042. 2474. 6100.]\n", " [ 6872. 1164. 2368. 4942.]\n", " [ 9158. 1718. 2856. 6626.]\n", " [26154. 4052. 3588. 14872.]\n", " [39252. 7968. 4356. 19714.]\n", " [ 0. 0. 0. 0.]] \n", "\n", "[58882. 12039. 11349. 33760.] \n", "\n", "116030.0\n" ] } ], "source": [ "covid_deaths = np.zeros((regions.size, 12, 4))\n", "\n", "files = ['edn04_2020.xlsx', 'edn05_2020.xlsx', 'edn06_2020.xlsx',\n", " 'edn07_2020.xlsx', 'edn08_2020.xlsx', 'edn09_2020.xlsx',\n", " 'edn10_2020.xlsx', 'edn11_2020.xlsx']\n", "sheets = ['5.1', '5_1', '5_1', 't5_1', '5.1', '5.1', '5.1', 't5_1']\n", "fromrow = [6,5,6,6,6,6,5,5]\n", "\n", "for month, (file, sheet, row) in enumerate(zip(files, sheets, fromrow)):\n", " d = pd.read_excel('russian-data/'+file, sheet_name=sheet)\n", " r = d.values[:,0][row:-1]\n", " d = d.values[:,[2,3,5,6]][row:-1,:]\n", " r = np.array([a.strip() for a in r])\n", " r = rename(r)\n", " for i,reg in enumerate(regions):\n", " covid_deaths[i,3+month,:] = d[r==reg][0]\n", "\n", "covid_deaths[np.isnan(covid_deaths)] = 0\n", " \n", "assert(np.all(covid_deaths[0] == np.sum(covid_deaths[1:,:,:], axis=0)))\n", "\n", "print(np.sum(covid_deaths,axis=0), '\\n')\n", "print(np.sum(covid_deaths[0],axis=0), '\\n')\n", "print(np.sum(covid_deaths[0]))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "table = pd.read_excel('russian-data/data_population.xls')\n", "\n", "r = table.values[2:,0]\n", "r = np.array([a.strip(' *') for a in r])\n", "r = rename(r)\n", "pop = table.values[2:,2].astype(float)\n", "\n", "population = np.zeros(regions.size)\n", "for i,reg in enumerate(regions):\n", " population[i] = pop[r==reg][0]" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "40464.0\n", "[ nan nan nan 1145. 3686. 4681. 4522. 3241. 3592. 7344.\n", " 12229. 17091.]\n" ] } ], "source": [ "table = pd.read_csv('russian-data/StopCoronaRF - died.csv')\n", "off = table.values[:,table.columns=='01.12.2020'].flatten()\n", "r = table.values[:,0]\n", "r = rename(r)\n", "\n", "official_deaths = np.zeros(regions.size)\n", "official_deaths_monthly = np.zeros((regions.size, 12))\n", "for i,reg in enumerate(regions):\n", " if reg != 'Российская Федерация':\n", " official_deaths[i] = off[r==reg][0]\n", " for m in range(12):\n", " if m==11:\n", " nextm = 1\n", " nexty = 2021\n", " else:\n", " nextm = m+2\n", " nexty = 2020\n", " if f'01.{nextm:02d}.{nexty}' in table.columns and f'01.{m+1:02d}.2020' in table.columns:\n", " official_deaths_monthly[i,m] = \\\n", " table.values[:,table.columns==f'01.{nextm:02d}.{nexty}'].flatten()[r==reg][0] - \\\n", " table.values[:,table.columns==f'01.{m+1:02d}.2020'].flatten()[r==reg][0]\n", " else:\n", " official_deaths_monthly[i,m] = np.nan\n", "official_deaths[regions=='Российская Федерация'] = np.sum(official_deaths)\n", "official_deaths_monthly[regions=='Российская Федерация',:] = np.sum(official_deaths_monthly,axis=0)\n", "\n", "print(official_deaths[0])\n", "print(official_deaths_monthly[0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Compute excess deaths" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "242598.0\n", "230763.33333333334\n", "212433.4\n" ] } ], "source": [ "# Compared to 2019\n", "deaths_model = deaths[:,-2,:]\n", "excess = deaths[:,-1,:] - deaths_model\n", "total = np.nansum(excess[:,3:], axis=1)\n", "print(total[0])\n", "\n", "# Compared to the 2017-19 avearge\n", "deaths_model = np.mean(deaths[:,-4:-1,:], axis=1)\n", "excess = deaths[:,-1,:] - deaths_model\n", "total = np.nansum(excess[:,3:], axis=1)\n", "print(total[0])\n", "\n", "# Compared to the 2015-19 average\n", "deaths_model = np.mean(deaths[:,-6:-1,:], axis=1)\n", "excess = deaths[:,-1,:] - deaths_model\n", "total = np.nansum(excess[:,3:], axis=1)\n", "print(total[0])" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 511. 1536. -3902. 4771. 21070. 18950. 34728. 14410. 33590. 56120.\n", " 80461. nan]\n", "264100\n", "0% 1% -2% 3% 14% 13% 24% 10% 24% 38% 58% nan%\n", "0% 0% -0% 0% 1% 1% 2% 1% 2% 3% 5% nan%\n", "nan nan nan 4.2 5.7 4.0 7.7 4.4 9.4 7.6 6.6 nan\n", "266709\n", "1799\n", "22.8%\n", "15.0%\n", "262245\n" ] } ], "source": [ "from scipy import stats\n", "\n", "yearly = np.mean(deaths,axis=2)\n", "for r in range(yearly.shape[0]):\n", " b = stats.linregress(np.arange(2015, 2020), yearly[r,-6:-1])\n", " yearly[r,-1] = b.intercept + b.slope * 2020\n", " \n", "monthly = np.nanmedian(deaths[:,:-1,:] - yearly[:,:-1,np.newaxis], axis=1)\n", "\n", "deaths_model = monthly + yearly[:,-1][:,np.newaxis]\n", "\n", "excess = deaths[:,-1,:] - deaths_model\n", "total = np.nansum(excess[:,3:], axis=1)\n", "\n", "ratio = excess / deaths_model\n", "maxratio = np.nanmax(ratio,axis=1)\n", "fullratio = total / np.sum(deaths_model[:,~np.isnan(ratio[0])][:,3:], axis=1)\n", "yearratio = total / np.sum(deaths_model, axis=1)\n", "\n", "excess_permln = excess / population[:,np.newaxis] * 1e+6\n", "total_permln = total / population * 1e+6\n", "\n", "print(np.round(excess[0,:]))\n", "print(f'{total[0]:.0f}')\n", "print(' '.join([f'{r*100:.0f}%' for r in ratio[0]]))\n", "print(' '.join([f'{r*100:.0f}%' for r in excess[0]/np.sum(deaths_model[0])]))\n", "print(' '.join([f'{r:.1f}' for r in excess[0]/official_deaths_monthly[0]]))\n", "print(f'{np.sum(total[1:]):.0f}')\n", "print(f'{total_permln[0]:.0f}')\n", "print(f'{fullratio[0]*100:.1f}%')\n", "print(f'{yearratio[0]*100:.1f}%')\n", "\n", "print(f'{np.nansum(excess[0,:]):.0f}')" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "147164.28328810912\n", "2048.718950118371\n", "16389.75160094697\n", "[231975.77852881 296223.60480452]\n" ] } ], "source": [ "r=0\n", "\n", "X = np.concatenate((np.ones((5,1)), np.arange(2015,2020)[:,np.newaxis]), axis=1)\n", "y = yearly[r,-6:-1][:,np.newaxis]\n", "b = np.linalg.inv(X.T @ X) @ X.T @ y\n", "yhat = X @ b\n", "sigma2 = np.sum((y-yhat)**2) / (5-2)\n", "x = np.array([[1], [2020]])\n", "yhat = b.T @ x\n", "print(yhat[0][0])\n", "\n", "predictive_var = sigma2 * (1 + x.T @ np.linalg.inv(X.T @ X) @ x)\n", "predictive_std = np.sqrt(predictive_var)[0][0]\n", "\n", "print(predictive_std)\n", "\n", "a = 3\n", "b = np.where(np.isnan(deaths[r,-1,:]))[0][0]\n", "print(predictive_std*(b-a))\n", "print(predictive_std*(b-a)*np.array([-1.96,1.96]) + total[0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Comparison betwen countries\n", "\n", "https://www.nytimes.com/interactive/2020/04/21/world/coronavirus-missing-deaths.html \n", "https://www.economist.com/graphic-detail/2020/07/15/tracking-covid-19-excess-deaths-across-countries \n", "https://www.ft.com/content/a2901ce8-5eb7-4633-b89c-cbdf5b386938\n", "\n", "Iran: \n", "https://www.medrxiv.org/content/10.1101/2020.12.07.20245621v1.full\n", "\n", "Daily data: https://en.wikipedia.org/wiki/COVID-19_pandemic_by_country_and_territory#Total_cases_and_deaths \n", "Mortality rate: https://en.wikipedia.org/wiki/List_of_sovereign_states_and_dependent_territories_by_mortality_rate" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Country | Covid19 deaths, now | Source | Underreporting (excess deaths / covid19 deaths) | Estimated deaths | Estimated deaths per 100,000 | |
---|---|---|---|---|---|---|
1 | \n", "United States 🇺🇸 | \n", "349,397 | \n", "Ec | \n", "1.3 | \n", "451,000 | \n", "137 | \n", "
2 | \n", "Brazil 🇧🇷 | \n", "194,976 | \n", "Ec | \n", "1.1 | \n", "213,000 | \n", "101 | \n", "
3 | \n", "India 🇮🇳 | \n", "148,994 | \n", "\n", " | \n", " | \n", " | \n", " |
4 | \n", "Mexico 🇲🇽 | \n", "125,807 | \n", "Ec | \n", "2.5 | \n", "313,000 | \n", "248 | \n", "
5 | \n", "Italy 🇮🇹 | \n", "74,159 | \n", "Ec | \n", "1.7 | \n", "128,000 | \n", "211 | \n", "
6 | \n", "United Kingdom 🇬🇧 | \n", "74,125 | \n", "Ec | \n", "1.5 | \n", "114,000 | \n", "171 | \n", "
7 | \n", "France 🇫🇷 | \n", "64,632 | \n", "Ec | \n", "1.1 | \n", "68,000 | \n", "102 | \n", "
8 | \n", "Russia 🇷🇺 | \n", "57,555 | \n", "DK | \n", "6.5 | \n", "376,000 | \n", "256 | \n", "
9 | \n", "Iran 🇮🇷 | \n", "55,337 | \n", "Ghafari et al. | \n", "2.4 | \n", "134,000 | \n", "164 | \n", "
10 | \n", "Spain 🇪🇸 | \n", "50,837 | \n", "Ec | \n", "1.4 | \n", "71,000 | \n", "152 | \n", "
11 | \n", "Argentina 🇦🇷 | \n", "43,245 | \n", "\n", " | \n", " | \n", " | \n", " |
12 | \n", "Colombia 🇨🇴 | \n", "43,213 | \n", "NYT | \n", "0.9 | \n", "43,000 | \n", "87 | \n", "
13 | \n", "Peru 🇵🇪 | \n", "37,680 | \n", "Ec | \n", "2.3 | \n", "86,000 | \n", "269 | \n", "
14 | \n", "Germany 🇩🇪 | \n", "34,222 | \n", "Ec | \n", "1.2 | \n", "40,000 | \n", "48 | \n", "
15 | \n", "Poland 🇵🇱 | \n", "28,956 | \n", "FT | \n", "2.9 | \n", "83,000 | \n", "218 | \n", "
16 | \n", "South Africa 🇿🇦 | \n", "28,469 | \n", "Ec | \n", "2.1 | \n", "60,000 | \n", "104 | \n", "
17 | \n", "Indonesia 🇮🇩 | \n", "22,329 | \n", "\n", " | \n", " | \n", " | \n", " |
18 | \n", "Turkey 🇹🇷 | \n", "20,881 | \n", "\n", " | \n", " | \n", " | \n", " |
19 | \n", "Belgium 🇧🇪 | \n", "19,528 | \n", "Ec | \n", "1.1 | \n", "21,000 | \n", "184 | \n", "
20 | \n", "Ukraine 🇺🇦 | \n", "18,680 | \n", "DK | \n", "1.8 | \n", "33,000 | \n", "78 | \n", "
21 | \n", "Chile 🇨🇱 | \n", "16,608 | \n", "Ec | \n", "0.9 | \n", "17,000 | \n", "89 | \n", "
22 | \n", "Romania 🇷🇴 | \n", "15,841 | \n", "\n", " | \n", " | \n", " | \n", " |
23 | \n", "Canada 🇨🇦 | \n", "15,606 | \n", "\n", " | \n", " | \n", " | \n", " |
24 | \n", "Ecuador 🇪🇨 | \n", "14,032 | \n", "Ec | \n", "3.0 | \n", "42,000 | \n", "246 | \n", "
25 | \n", "Iraq 🇮🇶 | \n", "12,824 | \n", "\n", " | \n", " | \n", " | \n", " |
26 | \n", "Czech Republic 🇨🇿 | \n", "11,711 | \n", "\n", " | \n", " | \n", " | \n", " |
27 | \n", "Netherlands 🇳🇱 | \n", "11,432 | \n", "Ec | \n", "1.5 | \n", "17,000 | \n", "96 | \n", "
28 | \n", "Pakistan 🇵🇰 | \n", "10,176 | \n", "\n", " | \n", " | \n", " | \n", " |
29 | \n", "Hungary 🇭🇺 | \n", "9,667 | \n", "\n", " | \n", " | \n", " | \n", " |
30 | \n", "Philippines 🇵🇭 | \n", "9,248 | \n", "\n", " | \n", " | \n", " | \n", " |
31 | \n", "Bolivia 🇧🇴 | \n", "9,165 | \n", "NYT | \n", "3.2 | \n", "29,000 | \n", "258 | \n", "