
Концепция
Для анализа я выбрала датасет о нападениях медведей на людей в Северной Америке с 1900 по 2018 год с ресурса www.kaggle.com. Я родилась и выросла в маленьком городе в Сибири, где мы часто слышали про прогулки медведей с медвежатами в близлежащих местностях, поэтому эта тема показалась мне интересной и важной.
На примере этих данных можно рассмотреть динамику и географию таких инцидентов, выявить сезонные, социальные и поведенческие особенности, которые могут быть полезны для профилактики и повышения осведомлённости людей о рисках в дикой природе.
Датасет содержит в себе информацию о 166 случаях нападений: о жертвах (имя, возраст, пол, количество), медведях, их видах, географии и сезонности происшествий.

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

Для анализа и визуализации данных я выбрала линейный график (динамика нападений медведей с течением времени), круговую диаграмму (распределение количества нападений медведей каждого вида), столбчатую диаграмму (количество жертв в каждой возрастной группе) и тепловую карту (распределение количества нападений по месяцам и числу жертв).
Обработка данных
Сначала я импортировала все необходимые мне библиотеки и распаковала свой csv-файл (библиотека pandas). Затем мне нужно было привести данные в порядок, удалить дубликаты и заменить пропущенные значения. Я столкнулась с проблемой, что столбцы не вызываются по названию. Тогда я очистила наименования, обратившись к колонкам, от лишних пробелов с помощью функции .str.strip ().
В работе я использовала не всю информацию из данных, поэтому заполнила пропуски только в возрасте (на медианные значения).
1. Линейный график
Для построения линейного графика мне нужно было привести столбец с годами к числовому формату (функция .to_numeric ()), а затем отфильтровать период с 1900 по 2018 год, чтобы избежать некорректных данных.
Далее я сгруппировала данные в переменную year_attack по годам, считала количество нападений для каждого и преобразовала результат в DataFrame с колонками 'Year' и 'Attacks'.
Чтобы настроить шрифты, цвета графика и необходимую мне толщину, я воспользовалась нейросетью Perplexity.ai. Как раз с помощью неё я узнала про библиотеку matplotlib, которая нужна, чтобы импортировать семейство шрифтов 'DejaVu Sans'. Также я узнала, как установить свой цвет на фон графика, поставить маркеры на линию, изменить цвет подписей. Всё это я использую в создании дальнейших визуализаций (конкретные фрагменты кода указаны жёлтым цветом на слайде). Нейросеть помогла мне настроить пределы осей (функция .xlim ()), чтобы график лучше считывался и не обрезался (plt.tight_layout ()).
Когда я попробовала построить график по параметрам выше, всё было хорошо, за исключением сетки на фоне, которая мешала восприятию. Тогда отключила её (plt.grid (False)).
Линейный график демонстрирует распределение нападений медведей на людей по годам. Мы видим, что линия с явными перепадами; трагических случаев, к сожалению, становится в среднем больше с течением времени (после 1980 года).
2. Круговая диаграмма
Чтобы посчитать количество нападений медведей определенного вида, достаточно было сгруппировать их в переменную bear_counts. С помощью Perplexity.ai я настроила цвета для сегментов и сделала список colors, к которому потом обращалась функция построения диаграммы.
Далее я по значениям bear_counts построила диаграмму, надписи на которой были в процентах, а остальная информация — в легенде. Возвращаемые значения функции matplotlib.pyplot.pie () (список сегментов диаграммы, список меток и легенду) мне подсказала нейросеть, чтобы упростить код.
Так, я убрала подписи с сегментов, настроила положение легенды и подписи, согласно индексам bear_counts.
Также, мне захотелось добавить контраста в график, поэтому я добавила расстояние между секторами: создала список explode, в котором указала расстояние сектора от центра 5%.
Эта диаграмма наглядно показывает, что полярные медведи нападают реже (6%), чем бурый и черный. Статистика по их нападениям примерно одинкова (48.2% и 45,8% соответственно).
3. Столбчатая диаграмма
С помощью столбчатой диаграммы я хотела показать распределение количества жертв нападений по возрастам. Однако, если бы я брала каждый возраст, то график получился бы очень сумбурным, поэтому я решила создать новый признак 'age_group'.
Я привела данные в числовой формат и написала функцию .grup (), которая обращается к каждой переменной из столбца 'age' и определяет, к какой возрастной группе она относится (всего возрастных групп 5).
После проделанных манипуляций, я сгруппировала 'age_group' в переменную grouped. По алгоритму из предыдущих визуализаций настроила шрифты и цвет фона, а затем выполнила построение диаграммы, где по оси X — 'age_group', а по оси Y — 'attack_count'.
Оформила заголовки и подписи, а затем подписи делений на осях (ax.tick_params ()).
По данным этого графика мы видим, что нападениям чаще всего подвержена возрастная группа 36-55 лет (более 50 случаев). Скорее всего это работа или увлечения, связанные с охотой, а также — туризм в диком природе. Молодёжь и пенсионеры более осторожны в этом плане, однако, всё равно количество их жертв находится в диапазоне от 30 до 40.
4. Тепловая карта
Тепловая карта показывает количество нападений по месяцам, что позволяет выявить закономерность поведения животных и людей. Диаграмма разделена на 2 части по исходу нападения: одна ли была жертва или несколько за раз (если жертв было несколько, они все занесены в датасет, поэтому это учтено и в предыдущих визуализациях).
Для построения тепловой карты я снова обратилась к нейросети, чтобы грамотно создать сводную таблицу heatmap_data, где строки — месяца, столбцы — исход нападения, значения — количество нападений. Мне нужно было проверить, есть ли в колонке с информацией про количество жертв за раз ('Only one killed') значение 0 (то есть False, а значит жертв несколько), поэтому в переменной col_labels я задала условие, по которому формировались подписи для карты.
Далее я настроила шрифты, цвет фона и градиент для карты: от красного к ярко-жёлтому. Эту функцию (mpl.colors.LinearSegmentedColormap ()) мне подсказала нейросеть. В переменной im построила тепловую карту (ax.imshow ()) по значениям heatmap_data с настроенными цветами. Настроила все подписи осей и заголовки, после чего добавила цветовую шкалу рядом с картой для удобства (fig.colorbar ()).
По данным тепловой карты мы видим, что чаще всего жертва одна во время нападения и наибольшее количество происшествий в феврале, в середине лета и в декабре. Это можно связать с уходом медведей в спячку, их временем бодрствования и со случаями, когда люди случайно будят животных в дикой природе.
Описание применения генеративной модели
В своей работе я использовала нейросеть Perplexity.ai. С помощью неё я импортировала библиотеку matplotlib, настроила шрифт, цвета диаграмм и кастомизировала фон графиков под собственный запрос. Также, я просила нейросеть проверять мой код, когда он выдавал ошибки, и исправлять его. Конструкции кода с более сложными функциями, но с меньшим количеством затраченного места — это фрагменты работы искусственного интеллекта. В процессе презентации я в конкретных местах указывала цель использования нейросети.
Ссылка на модель: https://www.perplexity.ai/
Список источников
Bear Attacks North America // Kaggle URL: https://www.kaggle.com/datasets/stealthtechnologies/bear-attacks-north-america/data (дата обращения: 06.06.2025).