30 марта

Распространение сферического коня в вакууме по территории РФ

Блог компании Open Data ScienceOpen sourcePythonData MiningЗдоровье гика


Привет от ODS. Мы откликнулись на идею tutu.ru поработать с их датасетом пассажиропотока РФ. И если в посте Milfgard огромная таблица выводов и научпоп, то мы хотим рассказать что под капотом.


Что, опять очередной пост про COVID-19? Да, но нет. Нам это было интересно именно с точки зрения математических методов и работы с интересным набором данных. Прежде, чем вы увидите под катом красивые картинки и графики, я обязан сказать несколько вещей:


  • любое моделирование — это очень сложный процесс, внутри которого невероятное количество ЕСЛИ и ПРЕДПОЛОЖИМ. Мы о них расскажем.
  • те, кто работал над этой статьей — не эпидемиологи или вирусологи. Мы просто группа любителей теории графов, практикующих методы моделирования сложных систем. Забавно, но именно в биоинформатике сейчас происходит наиболее существенный прогресс этой узкой области математики. Поэтому мы понимаем язык биологов, хоть и не умеем правильно обосновывать эпидемиологические модели и делать медицинские заключения.
  • наша симуляция всего лишь распространение сферического коня в вакууме по территории РФ. Не стоит относиться к этому серьезно, но стоит задуматься об общей картине. Она определенно интересная.
  • эта статья не существовала бы без датасета tutu.ru, за что им огромное спасибо.
  • мы хотим пригласить других заинтересованных исследователей в ODS.ai и под инициативой ML for Social Good (канал #ml4sg в ODS) вместе улучшать эту модель, чтобы получить опыт и возможность применять ее в будущем. Все интересные задачи, которые мы еще не решили, будут помечены в статье как TODO.

Под катом — результаты нашего марш-броска на датасет.


Датасет пассажиропотока


Так как рабочих рук у нас было не слишком много, мы старались разделить направления работы, покрывая как можно больше возможных задач.
Лучше всего иллюстрирует датасет визуализация Вадима Сафронова (safronov).


Самое интересное, что мы нашли:


  1. В России есть 5 городов, на которые приходится половина всех перелетов: Москва, Санкт-Петербург, Симферополь, Краснодар, Сочи.
  2. На 26 направлений из 9736 (это все виды транспорта) приходится 80% всего пассажиропотока, а всего в датасете — 951 город.

Вывод: у нас сильно централизованная транспортная система и пассажиропоток. Это позволяет болезни быстрее распространяться при условии инфицирования транспортных хабов с одной стороны, но с другой — позволяет быстро пресечь распространение болезни при условии перекрытия ключевых направлений.


TODO: вся работа шла с пассажиропотоком за один месяц, что не позволяет говорить о какой-либо сезонности, хотя она определенно должна присутствовать. Было бы здорово добавить примерные коэффициенты сезонности к данным, которые можно вытащить из статистики рынка путешествий.


Модель


Мы решили использовать практически самое простое семейство эпидемиологических моделей: SIR. Но их конечно сильно больше. С помощью таких моделей можно прогнозировать, сколько людей заразятся какой-то болезнью в закрытой популяции, сколько восстановятся после нее и как быстро.


Для удобства восприятия результатов мы ввели для симуляции два основных параметра (изменяя которые смотрели на результаты):


  • contact_rate можно рассматривать как скорость распространения болезни. Больше значение параметра -> быстрее распространяется болезнь.
  • recovery_rate — параметр, отвечающий за скорость выздоровления.

Для каждой пары "город отправления А" — "город прибытия Б" мы сделали следующий цикл:


  1. В день 0 у нас есть начальное число зараженных в А.
  2. Распространяем болезнь на 1 день в А (тут мы и используем SIR-модель).
  3. Считаем процент зараженных от численности населения А.
  4. Считаем число зараженных в пассажиропотоке из А в Б, просто используя процент заболевших из шага 2.
  5. В Б пересчитываем число инфицированных для запуска модели на следующий день. Кто-то приехал из А в Б зараженный, а значит и число зараженных для запуска модели внутри Б изменилось.

Так мы делаем на каждый день для каждого из 1000 городов нашего датасета. Повторяем в течении полугода.


Данные по начальному числу зараженных брали на 24 марта 2020ого года.


И вот настал тот самый момент, когда всплывают все ЕСЛИ, которые нам пришлось ввести.


  • Сравнивая модели, мы предполагали, что социальная изоляция уменьшает contact_rate, что кажется вполне логичным.
  • Мы НЕ пытались подогнать параметры модели под статистику реального распространения. Подобрали их лишь примерно, поэтому реальные числа можно воспринимать только для оценки порядка и динамики заболевания, а не как абсолютное значение.
  • Мы НЕ учитывали возрастное распределение в каждом регионе. Это тоже влияет на распространение вируса.
  • Мы НЕ учитывали вместимость больничных коек, смертность и другие вещи. Нам были интереснее маршруты распространения.

TODO: мы могли бы учитывать и передачу вируса внутри транспортного средства. Т.e. зная пассажиропоток из А в Б, мы можем посчитать, сколько требуется самолетов/поездов и для каждого транспортного средства произвести свой запуск модели внутри этого средства. Село 2 больных и 98 здоровых -> вышло 10 больных и 90 здоровых. Кроме того, задача оценки кросс-заражения между пассажирами идентична той, которую поручено исполнить операторами связи.


Результаты


Легенда:


  • Размер метки на карте показывает население этого города. Больше кружок — больше людей.
  • На карте не отображаются города, где нет ни одного заболевшего. Поэтому если город появился — значит там кто-то заболел.
  • Цветом обозначается число заболевших. От зеленого (мало заболевших) до красного (много заболевших).

Мы провели два основных кейса на полгода вперед.


TODO: было бы интересно сделать симуляцию с возможностью закрыть часть маршрутов в любое время.


Первый кейс: ничто не происходит, никто не реагирует.


Все полеты происходят как обычно, в жизни людей ничего не меняется.
contact_rate = 0.27
recovery_rate = 0.05



Вывод: огромное число заболевших, болезнь не удается изолировать, страдают даже отдаленные от центральной части РФ города. Наблюдается восстановление в небольших городах к концу симуляции.


Второй кейс: социальная изоляция и уменьшение перемещений.


Во втором кейсе мы ввели социальную изоляция (понизили contact_rate), весь пассажиропоток снизили до 10% от обычных значений.


contact_rate = 0.21
recovery_rate = 0.05



Вывод: социальная изоляция вместе с ограничением перемещений работает, как уже было сказано огромное число раз. Она позволяет снизить пик и растянуть заболевание на более длительный срок, тем самым не перегружая медицинскую систему. Видно, что удаленные от центральной части РФ регионы в этом случае страдают меньше. Также, учитывая высокую централизацию транспортных потоков, жители крупных городов несут бОльшую ответственность и подвергаются бОльшей опасности. Поэтому кажутся правильными совсем недавние меры, принятые в Москве.


Итоги


Пожалуйста, соблюдайте рекомендации ВОЗ, чаще мойте руки и следите за собой. Снизьте число социальных контактов и путешествий.


Также мы хотели бы обратиться к операторам связи и крупным компаниям на транспортном рынке с просьбой делиться анонимными открытыми данными. Часто это может привести к приятному сотрудничеству и интересным исследованиям.


Было сделано распределенной командой ODS из Берлина, Санкт-Петербурга, Лиссабона и Москвы в канале #ml4sg. Отдельное спасибо всем участникам проекта и всем заинтересовавшимся.


Все данные и код есть в репозитории.


Берегите себя. Ваше ODS.

Теги:datascienceвизуализацияods
Хабы: Блог компании Open Data Science Open source Python Data Mining Здоровье гика
+78
44,3k 55
Комментарии 36
Реклама
Похожие публикации
Лучшие публикации за сутки

Рекомендуем