Проверьте, как ваша страна [или штат США] работает по сравнению с аналогами. И посмотрите, как работает кластерный анализ - с помощью проекции UMAP и HDBSCAN.

[Обновление 2020 г., 19 апреля: добавлен репозиторий GitHub, см. конец статьи]

Я часто задавался вопросом, как сравниваются разные страны в отношении статистики случаев коронавируса. Слишком часто учитывались только абсолютные числа. Как следствие, более мелкие страны (например, Швейцария, Бельгия) упускаются из виду. В этой истории я в основном анализирую случаи в зависимости от численности населения. Неопровержимые факты на сегодняшний день (16 апреля 2020 г., источник JHU):

Штат Нью-Йорк возглавляет этот печальный список, за ним следуют европейские страны - Испания, Бельгия и Италия. В списке 25 лучших провинций Китая всего одна провинция. Хубэй (позиция 23) имеет 56 смертей на миллион, что составляет примерно десятую часть числа Нью-Йорка.

Напоминаем, что разделение стран на более мелкие регионы всегда приводит к более экстремальным значениям. Для Италии это откроет Ломбардию с 1055 смертельными случаями на миллион…

А как насчет динамики? Одни страны отреагировали раньше, другие - позже? Есть какие-то закономерности? Можем ли мы учиться у других стран?

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

Эта история разделена на следующие четыре части:

  1. Источники данных
    Описание используемых источников данных.
  2. Развитие числа случаев после вспышки
    Известный сюжет - обновлено и в т.ч. Штаты США и провинции Китая.
  3. Разработка функций
    Подробная информация о функциях, которые будут использоваться в окончательном анализе.
  4. Кластерный анализ
    Сравнение стран с помощью обучения без учителя.

1. Источники данных

Статистика обращений

Как и многие другие (вкл. Я;)), для статистики обращений я опирался на данные репозитория GitHub Университета Джона Хопкинса. Они публикуют временной ряд, включающий подтвержденные случаи, выздоровление и смерти по странам и дням. Для некоторых стран, например США, Канада, Китай, Австралия, они даже пошли на один уровень глубже и добавили регион или даже муниципалитет.

В этом отчете мы использовали данные по странам. Только для США и Китая я также загрузил отдельные штаты и провинции.

численность населения

Размеры населения были взяты из трех разных источников. Цифры на уровне страны были взяты из API открытых данных Всемирного банка. Для этой работы также существует пакет Python.

Для провинций Китая удобного API не нашел. Поэтому я скопировал таблицу в Википедии в текстовый файл, разделенный табуляцией. Написанный на заказ скрипт импортера преобразовал этот беспорядок в красивый фрейм данных Pandas.

Размеры населения штатов США уже включены в файл временных рядов смертей США (time_series_covid19_deaths_US.csv). Этот файл является частью репозитория данных JHU.

После объединения всех этих наборов данных я получил фрейм данных Pandas, включающий все данные, которые мне нужны. Следующая команда извлекает случайную выборку за 11 апреля, исключая очень маленькие страны (‹1 миллион):

data[(data.date == '2020-04-11') & (data.Population >= 1000000)] \
    .sample(15)

2. Развитие числа случаев после вспышки

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

  • На оси абсцисс показано количество дней с момента эпидемии вируса. Однако вместо того, чтобы определять вспышку как день, когда число случаев превышает 100, мы определяем его как день, когда число случаев превышает 5 на миллион жителей. Статистика согласна с населением в 20 миллионов человек.
  • Ось Y показывает кумулятивное количество подтвержденных случаев по отношению к размеру популяции на оси журнала.

Из европейских стран лидирует Испания. Однако за последние несколько недель все эти страны замедлились. По этим цифрам США в целом сопоставимы с Европой.

Китай и Южная Корея сглаживали свою кривую 3–4 недели назад. В отличие от этих стран, в Японии наблюдается устойчивый, медленный рост числа заболевших.

Далее тот же график для штатов США. Я ограничил нижнюю границу оси x на 10, чтобы не загромождать верхний правый угол графика:

В то время как в некоторых штатах средний показатель по стране составляет 2000 случаев на миллион (например, Миннесота - 300), в Нью-Йорке и Нью-Джерси уже 8000–9000 случаев на миллион. Все кривые уменьшили свою скорость по оси бревна, но удвоение чисел на этом и без того высоком уровне отличается ...

3. Разработка функций

Применение методов машинного обучения к набору данных COVID-19 непросто, учитывая ограниченный объем и неоднородность данных:

  • Во-первых, каждая страна собирает данные по-разному. Существуют разные определения случаев заболевания, задержки в сборе данных, в некоторых странах проводятся дополнительные проверки и т. Д. Кроме того, причина смерти не всегда одинакова.
  • Во-вторых, на земном шаре всего около 200 стран. Кроме того, для применения подхода, основанного на данных, страны, у которых нет подтвержденных случаев или мало подтвержденных случаев, не добавляют ценности этому анализу.

В общей сложности у нас есть около 60 стран с данными за более чем 3 недели с момента вспышки. Поэтому вместо полностью автоматизированного подхода мне пришлось вложить больше энергии в создание полезных функций вручную. Позвольте мне сначала объяснить два термина, а затем сами особенности:

Определения

  • Вспышка:
    Как указано выше, я определяю вспышку как день, когда число случаев заболевания превышает 5 на миллион жителей.
  • Пик:
    Пик определяется как день, когда сглаженное среднее за последние 7 дней имеет максимальное значение. Подробнее о сглаживании позже.

Функции

Для следующего кластерного анализа я рассчитываю и использую следующие функции:

  1. Ранняя смертность:
    число смертей за неделю через 14 дней после вспышки, разделенное на
    количество подтвержденных случаев за неделю до вспышки.
  2. Дней до 10x:
    Количество дней, которое требуется от вспышки до умножения подтвержденных случаев на 10. Фактически это временной интервал от 5 до 50 на миллион.
  3. Пиковая смертность:
    количество смертей в пиковую неделю, разделенное на количество подтвержденных случаев за 14 дней до этого.
  4. Раннее ускорение:
    Если deltaW0W1 процентное увеличение Подтвержденных случаев с недели, когда началась вспышка, до недели после, и deltaW1W2 процентное увеличение с 1-й по 2-ю неделю после вспышки, то ускорение составит:
    earlyAccel = deltaW1W2 / deltaW0W1.
  5. Текущее ускорение:
    Похоже. Если deltaWt-2Wt - процентное увеличение Подтвержденных обращений с позапрошлой до текущей недели, а deltaWt-4Wt-2 - процентное увеличение с 4-й на 2-ю неделю. перед током, то ускорение будет:
    currentAccel = deltaWt-2Wt / deltaWt-4Wt-2.

Определения ускорений могут показаться сложными, но на самом деле это просто изменение скорости. Если мы видим увеличение числа обращений на 20%, а затем на 10%, то ускорение составит 1,10 / 1,20 = 0,92. Таким образом, значение меньше 1.0 подходит.

Почему я использовал среднее геометрическое для сглаживания недель

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

[25, 50, 100, 200, 400]

приводит к среднему арифметическому, равному 155. Среднее геометрическое, напротив, равно 100. Это именно то, что мы хотим. Вот фрагменты кода для расчета:

def geometric_mean(values):
    return np.exp(np.mean(np.log(values)))
def geometric_simple_moving_average(df, len=7):
    return df.apply(np.log).rolling(len).mean().apply(np.exp)

4. Кластерный анализ

Методы

Я выбрал проекцию UMAP с HDBSCAN для кластерного анализа по нескольким причинам. Во-первых, данные не являются симметричными, поэтому линейные методы, основанные на симметричных расстояниях, скорее всего потерпят неудачу.

С точки зрения нелинейного кластерного анализа в настоящее время t-SNE является довольно распространенным явлением. Однако t-SNE сохраняет только локальную структуру, а не глобальную. Для UMAP, напротив, также имеют значение глобальные расстояния. Это делает визуализацию более ценной для интерпретации.

И последнее, но не менее важное: я хотел исполнить что-то новое. Ни старых k-средних, ни стандартной иерархии и т. Д. :)

UMAP не создает кластеры напрямую. Это нелинейная проекция в новое пространство. В этой новой проекции HDBSCAN можно использовать для извлечения кластеров.

Подробности и код Python по кластерному анализу с использованием UMAP и HDBSCAN можно найти на странице UMAP-learn. Я рассчитал два разных прогноза. Один для визуализации (embedding_for_plot), а другой (embedding_for_hdbscan) в качестве препроцессора для кластеризации HDBSCAN:

import umap.umap_ as umap   # !pip install 'umap-learn==0.3.10'
import hdbscan
embedding_for_plot = umap.UMAP(random_state=random_state) \
    .fit_transform(features)
embedding_for_hdbscan = umap.UMAP( \
    random_state=random_state, min_dist=0.0, n_neighbors=10) \
    .fit_transform(features)
cluster = hdbscan.HDBSCAN(min_samples=2, min_cluster_size=5) \
    .fit_predict(embedding_for_hdbscan)

Почему 2 анализа?

Я выполнил два разных анализа. Первый кластерный анализ включает только три функции и отлично работает для стран, у которых есть данные только через 2,5 недели после вспышки.

Во втором анализе также используются характеристики пика кривой. Для стран, в которых число ежедневных случаев продолжает расти, пик сдвинется. Значит, изменятся и результаты.

1. Сходство вспышек и кластерный анализ

Для этого первого анализа я использовал следующие три функции:

  • Дней до 10X
  • Ранняя смертность
  • EarlyAccel

Алгоритм разделил набор данных на четыре разных кластера одинакового размера. Используя вложения UMAP, данные можно легко визуализировать по двум осям:

Помните, что для этой кластеризации используются данные только за 2–3 недели после вспышки. Что примечательно, Испания здесь не попадает в оранжевый кластер, куда входят Италия, Бельгия, Нью-Йорк, Германия, Канада и т. Д.

Чтобы копнуть глубже, я создал Скрипичные сюжеты (похожие на коробчатые сюжеты). И красный, и оранжевый кластеры имеют высокий уровень ранней смертности. Однако после вспышки красный кластер разрастается в 10 раз быстрее (маленький DaysTo10X).

2. Общее сходство и кластерный анализ

В этот второй анализ я включил еще две функции, а именно:

  • Пиковая смертность
  • CurrentAccel

Теперь HDBSCAN идентифицировал 5 кластеров:

Из этих кластеров особняком стоит синий. Странам «голубого класса» потребовалось больше времени, чтобы добиться 10-кратного увеличения числа случаев после вспышки, но сейчас у них наблюдается довольно высокий рост числа подтвержденных случаев (см. «CurrentAccel»).

Не торопитесь, определите свою страну и сделайте свою интерпретацию. Кластерный анализ - это всегда поиск новых отношений и идей.

Большинство методов также имеют случайные компоненты. Это означает, что если мы запустим тот же анализ с другим случайным начальным числом, результаты могут выглядеть немного иначе. Обычно не много, но бывает, что вместо пяти мы выделяем четыре или шесть кластеров.

Примечание о прогнозировании и прогнозировании

Эта история напрямую не о предсказаниях и сценариях будущего. Однако определение похожих стран или штатов, а также их групп может помочь в применении контролируемого обучения.

Если мы знаем, что Нью-Йорк и Нью-Джерси работают так же, как Италия и Испания, но они отстают на 2 недели, мы можем использовать новейшую историю европейских стран, чтобы предсказать будущее этих штатов США.

Самые последние данные в европейских странах используются как «ярлыки» с точки зрения терминологии машинного обучения.

Репозиторий

Весь код этой истории можно найти на GitHub, см .:



Последние мысли

Помимо определения некоторых хорошо известных кластеров, я также смог найти некоторые новые, неожиданные отношения. Кроме того, особенно визуализация кластерных распределений с помощью графиков скрипки очень помогла получить больше информации из извлеченных кластеров.

Наконец, я всегда рекомендовал бы принимать решения в отношении коронавируса на основе средних [геометрических] средних значений за неделю, а не на ежедневной статистике случаев. Это устраняет эффект выходных и делает каждый анализ и интерпретацию более стабильными.

Если вам понравилась эта история, вам также может понравиться одна из этих двух средних историй, которые я опубликовал на сайте Towards Data Science. Речь идет о COVID-19, Analytics и разработке веб-приложений на основе данных:





Примечание редакции: Towards Data Science - это издание Medium, в основном основанное на изучении науки о данных и машинного обучения. Мы не являемся специалистами в области здравоохранения или эпидемиологами, и мнения, изложенные в этой статье, не следует интерпретировать как профессиональные советы. Чтобы узнать больше о пандемии коронавируса, нажмите здесь.