Original size 1024x1365

! Осторожно! Анализ нападений медведей на людей

PROTECT STATUS: not protected
8

Концепция

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

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

Датасет содержит в себе информацию о 166 случаях нападений: о жертвах (имя, возраст, пол, количество), медведях, их видах, географии и сезонности происшествий.

big
Original size 690x468

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

big
Original size 2010x710

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

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

Сначала я импортировала все необходимые мне библиотеки и распаковала свой csv-файл (библиотека pandas). Затем мне нужно было привести данные в порядок, удалить дубликаты и заменить пропущенные значения. Я столкнулась с проблемой, что столбцы не вызываются по названию. Тогда я очистила наименования, обратившись к колонкам, от лишних пробелов с помощью функции .str.strip ().

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

Original size 1229x691

1. Линейный график

Для построения линейного графика мне нужно было привести столбец с годами к числовому формату (функция .to_numeric ()), а затем отфильтровать период с 1900 по 2018 год, чтобы избежать некорректных данных.

Далее я сгруппировала данные в переменную year_attack по годам, считала количество нападений для каждого и преобразовала результат в DataFrame с колонками 'Year' и 'Attacks'.

Чтобы настроить шрифты, цвета графика и необходимую мне толщину, я воспользовалась нейросетью Perplexity.ai. Как раз с помощью неё я узнала про библиотеку matplotlib, которая нужна, чтобы импортировать семейство шрифтов 'DejaVu Sans'. Также я узнала, как установить свой цвет на фон графика, поставить маркеры на линию, изменить цвет подписей. Всё это я использую в создании дальнейших визуализаций (конкретные фрагменты кода указаны жёлтым цветом на слайде). Нейросеть помогла мне настроить пределы осей (функция .xlim ()), чтобы график лучше считывался и не обрезался (plt.tight_layout ()).

Когда я попробовала построить график по параметрам выше, всё было хорошо, за исключением сетки на фоне, которая мешала восприятию. Тогда отключила её (plt.grid (False)).

0

Линейный график демонстрирует распределение нападений медведей на людей по годам. Мы видим, что линия с явными перепадами; трагических случаев, к сожалению, становится в среднем больше с течением времени (после 1980 года).

2. Круговая диаграмма

0

Чтобы посчитать количество нападений медведей определенного вида, достаточно было сгруппировать их в переменную 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).

Original size 1229x691
0

После проделанных манипуляций, я сгруппировала '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 ()).

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

0

Описание применения генеративной модели

В своей работе я использовала нейросеть 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).

! Осторожно! Анализ нападений медведей на людей
8