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

Я выбрала открытый датасет 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)
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»
Визуализация данных
Линейный график: динамика заболеваемости в Германии
Линейный график наглядно иллюстрирует волновую природу пандемии: несколько отчётливых пиков соответствуют основным волнам заболеваемости, наиболее выраженным в конце 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 ()
Площадная диаграмма: вакцинация в Германии
График показывает быстрый рост доли населения, получившего хотя бы одну дозу вакцины в первой половине 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 ()
Гистограмма: распределение смертности (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 ()
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/