Original size 1140x1600

Тенденции распространения COVID-19

PROTECT STATUS: not protected
The project is taking part in the competition

Концепция

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

big
Original size 735x160

Я выбрала открытый датасет COVID-19 от Our World in Data, который содержит ежедневные данные по заболеваемости, смертности, вакцинации и социально-экономическим показателям по странам и регионам мира. Данные были получены из официального каталога Our World in Data в формате CSV, что удобно для анализа в Pandas и обеспечивает прозрачность источников и регулярное обновление информации.

Для визуализации я использовала несколько типов графиков. Линейный график — чтобы показать динамику показателей во времени и выявить волны заболеваемости. Площадная диаграмма — для наглядного сравнения уровней вакцинации. Гистограмма и boxplot — для анализа распределений и сравнения регионов.

Обработка данных

import pandas as pd import numpy as np import matplotlib.pyplot as plt

pd.set_option («display.max_columns», 200)

Для начала я импортировала нужные библиотеки: pandas, numpy и matplotlib.pyplot. Далее я использовала открытый датасет Our World in Data. Данные регулярно обновляются и содержат информацию по странам и регионам мира.

df = pd.read_csv (URL) df[«date»] = pd.to_datetime (df[«date»], errors="coerce»)

Сохраняем датасет локально

df.to_csv («owid_covid_compact.csv», index=False)

df.head ()

Методы и общий стиль

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

*описательная статистика

*анализ пропусков

print («Размер датасета:», df.shape) print («Диапазон дат:», df[«date»].min ().date (), «—», df[«date»].max ().date ()) print («Количество стран и регионов:», df[«location»].nunique ())

(df.isna ().mean () * 100).sort_values (ascending=False).head (15)

Далее установила единый стиль визуализации

import matplotlib.pyplot as plt

plt.rcParams.update ({ Фон «figure.facecolor»: «white», «axes.facecolor»: «white»,

 Основные цвета (голубой \+ тёмно-синий)
«axes.edgecolor»: «#E3EDF7»,
«axes.labelcolor»: «#1F4E79»,
«xtick.color»: «#1F4E79»,
«ytick.color»: «#1F4E79»,
«text.color»: «#1F4E79»,

 Сетка
«axes.grid»: True,
«grid.color»: «#E6F0FA»,
«grid.linewidth»: 1,
«grid.alpha»: 0.8,

 Шрифты
«font.family»: «sans-serif»,
«font.sans-serif»: [«Inter», «Segoe UI», «Arial»],
«axes.titleweight»: «semibold»,
«axes.titlesize»: 16,
«axes.labelsize»: 12,
«axes.spines.top»: False,
«axes.spines.right»: False,
«axes.spines.left»: False,
«axes.spines.bottom»: False,

# Размер по умолчанию
«figure.figsize»: (10, 5.5),

})

Палитра для ручного использования в графиках BLUE = «#5DA9E9» LIGHT_BLUE = «#CFE7FB» DARK_BLUE = «#1F4E79»

Визуализация данных

Original size 989x540

Линейный график: динамика заболеваемости в Германии

Линейный график наглядно иллюстрирует волновую природу пандемии: несколько отчётливых пиков соответствуют основным волнам заболеваемости, наиболее выраженным в конце 2021 — начале 2022 года. Использование 7-дневного сглаживания позволяет убрать недельные колебания и лучше увидеть общую динамику распространения инфекции.

de = df[df[«country»] == «Germany»].sort_values («date»)

col = «new_cases_smoothed_per_million» data = de[[«date», col]].dropna ()

fig, ax = plt.subplots () ax.plot (data[«date»], data[col]) ax.set_title («Германия — новые случаи COVID‑19 (7‑дневное сглаживание)») ax.set_xlabel («Дата») ax.set_ylabel («Случаев на 1 млн человек»)

plt.tight_layout () plt.show ()

Original size 990x540

Площадная диаграмма: вакцинация в Германии

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

cols = [«date», «people_vaccinated_per_hundred», «people_fully_vaccinated_per_hundred»] vac = de[cols].dropna ()

fig, ax = plt.subplots () ax.fill_between (vac[«date»], vac[«people_vaccinated_per_hundred»], alpha=0.3, label="Хотя бы одна доза») ax.fill_between (vac[«date»], vac[«people_fully_vaccinated_per_hundred»], alpha=0.3, label="Полностью вакцинированы»)

ax.set_title («Германия — охват вакцинацией») ax.set_xlabel («Дата») ax.set_ylabel («Человек на 100») ax.legend ()

plt.tight_layout () plt.show ()

Original size 989x540

Гистограмма: распределение смертности (2021 год)

Гистограмма демонстрирует асимметричное распределение с «тяжёлым правым хвостом»: в большинстве наблюдений смертность на 1 млн человек была низкой, однако в отдельные периоды и регионы фиксировались резкие всплески. Это указывает на неравномерное влияние пандемии и подчёркивает, что средние значения могут скрывать экстремальные, но важные события.

df_2021 = df[df[«date»].dt.year == 2021] x = df_2021[«new_deaths_smoothed_per_million»].dropna ()

fig, ax = plt.subplots () ax.hist (x, bins=60) ax.set_title («Распределение смертей от COVID‑19 в 2021 году») ax.set_xlabel («Смертей на 1 млн человек (7‑дневное сглаживание)») ax.set_ylabel («Количество наблюдений»)

plt.tight_layout () plt.show ()

Original size 989x540

Boxplot: сравнение континентов

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

continents = [«Africa», «Asia», «Europe», «North America», «South America», «Oceania»] subset = df[df[«continent»].isin (continents)]

col = «new_cases_smoothed_per_million» data = [subset[subset[«continent»] == c][col].dropna () for c in continents]

fig, ax = plt.subplots () ax.boxplot (data, labels=continents, showfliers=False) ax.set_title («Сравнение континентов по уровню заболеваемости COVID‑19») ax.set_ylabel («Случаев на 1 млн человек»)

plt.xticks (rotation=25) plt.tight_layout () plt.show ()

Использованные источники и нейросети

В ходе работы над проектом я использовала ChatGPT-4 в качестве вспомогательного инструмента — для уточнения отдельных аспектов анализа данных, проверки кода и помощи в формулировке описаний визуализаций

Просмотр промтов и запросов: https://disk.yandex.ru/i/ITwooTVI25l7uA

Ссылка на модель: https://openai.com/index/gpt-4/