Pandas Groupby & Crosstab и Folium & Basemap

Глобальная база данных по терроризму (GTD) ведется Национальным консорциумом по изучению терроризма и реагированию на терроризм (START). Файл базы данных, используемый в этой записной книжке, можно скачать со страницы Kaggle (доступен в формате .csv). Он состоит из данных о террористических атаках во всем мире с 1970 по 2017, включая более 180 000 атак и 100 характеристик. GTD определяет терроризм как -

«Угроза или фактическое применение незаконной силы и насилия негосударственным субъектом для достижения политической, экономической, религиозной или социальной цели посредством страха, принуждения или запугивания».

В этом посте мы будем использовать данные (более 150 МБ) для изучения панд и различных картографических библиотек, таких как Folium и Basemap, и, в конечном итоге, сделать выводы о различных результатах.

Что вы можете узнать из этого поста -

  • Панды Groupby.
  • Панды Crosstab.
  • Панды Cut.
  • Панды сюжет.
  • Листовка-карта с использованием Folium.
  • Преобразуйте координаты (широту и долготу) для отображения проекций с помощью базовой карты.
  • И еще много важных понятий.

Все коды, использованные для этого поста, можно найти в моем GitHub. Ссылка дана в конце поста. Давайте начнем!

Начало работы с данными о терроризме:

terror_df = pd.read_csv(‘/path/terrorism.csv’, sep=’,’,  encoding=’ISO-8859–1')
print (‘dataframe shape :’, terror_df.shape)
>>> dataframe shape: (181691, 135)

Как и ожидалось, набор данных огромен - более 18000 строк и 130 столбцов. Здесь нам нужно решить, что мы хотим делать с набором данных? Я из Южной Азии, поэтому сосредоточился на этом регионе и в основном сосредоточился на визуализации тенденции террористических атак. Во-первых, я выбрал столбцы, относящиеся к моему анализу -

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

Как видите, среди выбранных функций есть несколько столбцов с нулевыми значениями, но мы можем начать наш анализ с функциями без нулевых значений. В полях Year, Country, Region, Success, AttackType, TargetType и WeaponType 0 нулевых значений. Во-первых, давайте визуализируем, как количество террористических атак менялось в разные годы.

Как видно из сюжета выше, в целом террористическая активность с годами возрастает. Но верно ли это для всего региона / страны? Мы ответим на этот вопрос в ближайшее время.

Какой регион подвергся наибольшему количеству атак? Мы можем построить аналогичный гистограмму, используя seaborn, но на этот раз мы используем регионы по оси Y, как показано ниже -

Как и следовало ожидать из часто получаемых новостей, Ближний Восток и Северная Африка и Южная Азия являются двумя ведущими регионами по количеству террористических атак. Мы также можем проверить, какой метод атаки чаще всего использовался террористами -

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

Получение большего от гистограмм:

Мы можем использовать фрейм данных value_counts, чтобы построить 15 стран, наиболее часто подвергавшихся нападениям террористов. Посмотрим -

fig= plt.figure(figsize=(13, 10))
sns.set(font_scale=0.9)
terror_country = sns.barplot(x=terror_df_selected['Country'].value_counts()[0:15].index, y=terror_df_selected['Country'].value_counts()[0:15], palette='RdYlGn')
terror_country.set_xticklabels(terror_country.get_xticklabels(), rotation=70)
terror_country.set_xlabel('Country', fontsize=12)
terror_country.set_ylabel('Counts', fontsize=12)
plt.title('Top 15 Countries: Most Attacks by Terrorist Groups', fontsize=12)

Как мы видим, Ирак является наиболее атакованной страной, и этот график также можно использовать вместе с рисунком 2, где мы показали, что Ближний Восток, Северная Африка и Азия входят в число наиболее атакованных регионов.

Есть способы передать больше информации с помощью гистограммы. Сколько раз использовалось оружие (количество) и частота использования могут быть нанесены на график с помощью гистограмм, как показано ниже -

Коды, использованные для построения графика выше, показаны ниже -

f = plt.figure(figsize=(15, 11))
sns.set(font_scale=0.8)
terror_df_selected[‘WeaponType’] = terror_df_selected[‘WeaponType’].replace([‘Vehicle (not to include vehicle-borne explosives, i.e., car or truck bombs)’], ‘Vehicle’)
ncount = len(terror_df_selected)
year_count = sns.countplot(x=’WeaponType’, data=terror_df_selected,)
year_count.set_xticklabels(year_count.get_xticklabels(), rotation=60)
plt.title(‘Types of weapon Used in Terrorist Attacks’, fontsize=12)
ax2=year_count.twinx()
ax2.yaxis.tick_left()
year_count.yaxis.tick_right()
# Switch the labels over
year_count.yaxis.set_label_position(‘right’)
ax2.yaxis.set_label_position(‘left’)
ax2.set_ylabel(‘Frequency [%]’, fontsize=11)
for p in year_count.patches:
  x=p.get_bbox().get_points()[:,0]
  y=p.get_bbox().get_points()[1,1]
  year_count.annotate(‘{:.1f}%’.format(100.*y/ncount), (x.mean(), y),ha=’center’, va=’bottom’) # set the alignment of the text
# LinearLocator Ticker for the correct number of ticks
year_count.yaxis.set_major_locator(ticker.LinearLocator(11))
# Fix the frequency range to 0–100
ax2.set_ylim(0,100)
year_count.set_ylabel(‘Count’, fontsize=11)
ax2.yaxis.set_major_locator(ticker.MultipleLocator(10))
ax2.grid(None)

Эффективное использование Pandas Crosstab:

Ранее на рисунке 1 мы видели тенденцию террористической деятельности в течение многих лет по всему миру. Но теперь мы делаем это для «регионов». Это 12 регионов, и анализ на основе регионов расскажет нам больше об экономике, росте, бедности и т. Д. В конкретном регионе.

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

Crosstab в основном вычисляет частотную таблицу переданных факторов. Мы будем использовать этот метод для создания таблицы (фрейма данных), где у нас будут годы в виде строк и количество атак в каждом году в другом регионе в виде столбца. После этого мы можем просто использовать график dataframe. Посмотрим ниже -

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

fig = plt.figure(figsize=(11, 10))
color_list_reg_yr = [‘palegreen’, ‘lime’, ‘green’, ‘Aqua’, ‘skyblue’, ‘darkred’, ‘darkgray’, ‘tan’, ‘orangered’, ‘plum’, ‘salmon’, ‘mistyrose’]
region_year.plot(figsize=(14, 10), fontsize=13, color=color_list_reg_yr)
plt.xlabel(‘Year’, fontsize=12)
plt.ylabel(‘Number of Attacks in a Year’, fontsize=12)
plt.legend(fontsize=12)

Обсуждения на основе рисунка 7:

Здесь мы видим, как со временем менялась террористическая деятельность в разных регионах.

  • Начиная с конца 90-х и начала 2000-х годов мы наблюдаем резкий рост террористической активности в регионе Ближнего Востока и Южной Азии.
  • В период с 1980 по 1990 год в Южной Америке велась активная террористическая деятельность.
  • Как сказано здесь, крупная террористическая деятельность в начале 90-х годов носила антиамериканский характер и вдохновлялась ролью США в войне в Персидском заливе.
  • Как отмечается в журнале Глобальная политика,

В период 1970–2918 годов террористические нападения значительно переместились из Латинской Америки и Карибского бассейна (LAC) и Европы и Центральной Азии (ЕЦА) на Ближний Восток и Северную Африку (MENA), Южную Азию (SAS) и южнее Сахары. Африка (SSA). В БВСА усиление демократии не было панацеей от терроризма, вопреки убеждениям Джорджа У. БВСА страдает от трех крупных гражданских войн и других мятежей, которые разжигают региональную нестабильность, поэтому необходимы международные миротворческие усилия для сдерживания этих конфликтов. Учитывая огромное значение количества гражданских конфликтов в порождении терроризма в регионе, такое миротворчество также служит контртеррористической мерой.

Pandas Cut: создание дискретных интервалов

На предыдущем графике мы видели количество атак в каждом регионе за несколько лет. Из обсуждения мы также узнали, что в период 1980–1990 годов в Южной Америке был высокий уровень террористической активности, но с 1990 года на Ближнем Востоке и в Южной Азии активизировалась террористическая деятельность. Чтобы более отчетливо увидеть эту тенденцию, воспользуемся методом вырезки панд. Вместо того, чтобы строить непрерывный график по годам, мы будем разбивать данные по десятилетиям. Например, 1970–1980, 1980–1990 и так далее… Это расскажет нам, как терроризм за десятилетия переместился с запада на восток.

terror_df_selected[‘Year10’] = pd.cut(terror_df_selected[‘Year’], bins=[1969, 1980, 1990, 2000, 2010, 2020], labels=[‘1970–1980’, ‘1980–1990’, ‘1990–2000’, ‘2000–2010’, ‘2010–2020’])

Как видно выше, мы сгруппировали данные, и теперь мы снова будем использовать кросс-таблицу pandas, чтобы создать компактную таблицу.

Используя график фрейма данных Pandas, как на рис. 7, мы можем снова построить тренд террористической активности в различных регионах, как показано ниже, но теперь мы сгруппировали данные по десятилетиям.

Теперь у нас есть более чистый график и его легче интерпретировать. Террористическая активность снизилась в Южной и Центральной Америке, а в Ближнем Востоке и Южной Азии резко выросла от От 80–90 до 90–2000 годов.

Используя объединенные данные и перекрестную таблицу, мы также можем увидеть тенденцию в использовании оружия террористами, как показано ниже:

Мы можем с уверенностью заключить, что взрывчатые вещества и огнестрельное оружие всегда были доминирующим оружием разрушения.

Террористическая деятельность в Южной Азии: Pandas Groupby

А теперь давайте подробнее остановимся на террористической деятельности в регионе Южной Азии. Мы будем использовать метод Pandas Groupby вместе с объектом get_group. В этой части важны смертельные исходы (убитые + раненые). Как мы видели ранее, в этих столбцах есть нулевые значения (Убить и Раненый). Сначала мы заменяем NaN нулями. Это очень грубый метод работы с нулевыми данными, но в демонстрационных целях оставим его.

terror_df_selected['Kill'] = terror_df_selected['Kill'].fillna(0).astype(int)
terror_df_selected['Wounded'] = terror_df_selected['Wounded'].fillna(0).astype(int)

Здесь мы используем «groupby» для группировки фрейма данных на основе «региона» и выбираем южноазиатскую группу с помощью get_group.

reg_groupby = terror_df_selected.groupby([‘Region’])
reg_groupby_SA_df = reg_groupby.get_group(‘South Asia’)

После этого новый фрейм данных выглядит, как показано ниже -

Давайте зафиксируем индексы строк, как показано ниже -

reg_groupby_SA_df.index = range(len(reg_groupby_SA_df.index))

Теперь мы можем использовать график подсчета Сиборна, чтобы увидеть террористическую деятельность только в странах Южной Азии.

Как показано на рис. 10, Пакистан - наиболее атакованная страна в Южной Азии. Не так уж и далеко отстают Индия и Афганистан. Используя value_counts, мы также можем построить 10 самых активных групп в Южной Азии. Судя по базе данных, большинство атак было совершено неизвестными группами, поэтому мы пренебрегаем этим, как показано ниже -

print ('There are {} unique number of terror groups in Souh East Asia'.format(len(reg_groupby_SA_df['TerroristGroup'].unique())) )
reg_groupby_SA_df_top10TerrorG = reg_groupby_SA_df[‘TerroristGroup’].value_counts([1:11].to_frame(name=‘Counts’)
reg_groupby_SA_df_top10TerrorG[‘Terror Group’] = reg_groupby_SA_df_top10TerrorG.index
reg_groupby_SA_df_top10TerrorG.reset_index(drop=True, inplace=True)
reg_groupby_SA_df_top10TerrorG.head(3)

Мы можем использовать гистограмму Seaborn, чтобы визуализировать эту информацию в виде аккуратного графика, как показано ниже -

Как видим, среди известных группировок «Талибан» осуществил максимальное количество атак. Эта группировка фактически находилась у власти в Афганистане с 1996–2001 гг. Группа, изначально состоявшая из студентов («Талибан» означает «студенты») превратилась в одну из самых терроризирующих организаций во всем мире.

Мы уже видели, что по количеству террористических атак Пакистан, Афганистан и Индия возглавляют список. Мы также можем построить график за 47 лет (1970–2017), среднее количество людей, которые были ранены + убиты в соответствующих странах в каждой атаке. Для этого сначала мы создаем новый столбец, добавляя количество убитых и раненых, как показано ниже -

reg_groupby_SA_df['Affected'] = reg_groupby_SA_df['Kill'] + reg_groupby_SA_df['Wounded']

Теперь мы создаем еще один объект groupby (под уже сгруппированным объектом с точки зрения «региона») теперь с точки зрения «страны» и вычисляем среднее количество пострадавших (убитых + раненых) людей, как показано ниже -

reg_groupby_SA_df_grp_country_affected = reg_groupby_SA_df.groupby(['Country'])['Affected'].mean()

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

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

Топ-5 атак (убитых + раненых) в Южной Азии: Мы также можем рассчитать самые смертоносные атаки в регионе Южной Азии с точки зрения количества раненых + убитых в каждой атаке.

reg_groupby_SA_df_most_affected10 = reg_groupby_SA_df.sort_values('Affected', ascending=False).head(5)
fig = plt.figure(figsize=(12, 8))
sns.set(font_scale=1.2)
topcountry_selectedfatal = sns.barplot(y=’Affected’, x=’Country’, data=reg_groupby_SA_df_most_affected10, hue=’Year’, )
topcountry_selectedfatal.set_xticklabels(topcountry_selectedfatal.get_xticklabels(), rotation=50, fontsize=9)
plt.title(‘Top 5: Fatalitites in a Single Attack (South Asia)’, fontsize=12)

Как мы видим здесь, единичное нападение в Коломбо на Шри-Ланке (1996 г.) привело к наибольшему количеству смертей в Южной Азии на сегодняшний день. Также в топ-5 терактов со смертельным исходом два из них были совершены в Афганистане.

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

Для геопространственных данных очень полезна библиотека Folium, которая может создавать интерактивную карту-листок с использованием координатных данных. В моем предыдущем посте по анализу данных Tokyo Neighborhoods я обсуждал Folium более подробно.

Чтобы создать визуализацию на основе местоположения, нам нужна информация о широте и долготе. Итак, сначала давайте отбросим в нашем фрейме данных записи, в которых широта или долгота равны NaN. Затем карта Folium используется для визуализации топ-100 атак с точки зрения смертности (убитые + раненые) в регионе Южной Азии. Посмотрим ниже -

Используя это, мы можем создать интерактивную карту, и снимок показан ниже -

Как мы видели ранее, 100 крупнейших атак в Южной Азии произошли в основном в Индии, Пакистане и Афганистане. Размер кружков представляет собой относительное количество убитых + раненых в каждой атаке.

Однако ущерб, нанесенный при каждой атаке, относительно меньше в Афганистане, и это может быть связано с низкой плотностью населения по сравнению с Индией и Шри-Ланкой.

Мы также можем визуализировать рост террористической активности после 2000-х годов с помощью базовой карты и анимации matplotlib.

Визуализация 2D-данных на картах с использованием базовой карты:

Для создания анимации количества атак в Южной Азии (за этот более чем 40-летний период) я использовал Базовую карту, ​​которая представляет собой библиотеку для нанесения двухмерных данных на карты. Помимо использования широты и долготы городов из фрейма данных, нам также необходимо предоставить координаты границы региона Южной Азии. Для этого использовалась информация, найденная здесь. Также нам необходимо использовать Animation api для визуализации изменения и сохранения его в виде файла GIF. Мы можем использовать базовую карту, как показано ниже -

Здесь мы можем увидеть, как увеличилась террористическая активность, особенно в Афганистане после 2000 года. Мы можем увидеть это, сравнив количество террористической деятельности с Пакистаном. Давайте посмотрим ниже, используя Pandas Dataframe isin -

country_selected = ['Pakistan', 'Afghanistan']

reg_groupby_SA_df_sel_country = reg_groupby_SA_df[reg_groupby_SA_df['Country'].isin(country_selected)]
print ('selected df shape:', reg_groupby_SA_df_sel_country.shape)
>>> new selected dataframe:  (26957, 16)

Мы снова используем график подсчета морских волн с «оттенком» в качестве аргумента и передаем список country_selected, как показано ниже:

f = plt.figure(figsize=(14, 7))

sns.set(font_scale=1.1)
year_count = sns.countplot(x='Year', data=reg_groupby_SA_df_sel_country, hue='Country', palette="Spectral")
year_count.set_xticklabels(year_count.get_xticklabels(), rotation=60)
plt.title('Number of Terrorist Attack Year by Year (Afg & Pak)', fontsize=12)

Как упоминается в этом документе Министерства иностранных дел (Япония), возможный рост терроризма в Афганистане мог быть вызван самими США -

После террористических атак 9 ноября 2001 г. администрация талибов в Афганистане, которая защищала «Аль-Каиду», рухнула в результате военных операций многонациональных сил под руководством США. «Аль-Каида» и лидеры «Талибана» бежали в приграничные районы и в Пакистан. В Афганистане операции по обеспечению безопасности ИСАФ, учрежденные резолюцией Совета Безопасности ООН, были в определенной степени успешными, и международное сообщество поддерживает государственное строительство. Однако дивиденды мира не достигли всех уголков страны, и некоторые люди поддерживают повстанцев по экономическим и другим причинам. С усилением силы талибов ситуация с безопасностью в последние годы ухудшилась без значительного улучшения уровня жизни людей.

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

Заключительное примечание:

До сих пор мы изучили довольно много полезных методов в Pandas, особенно для лучшего анализа данных и подготовки соответствующих графиков, которые могут передавать значимое сообщение. Начиная от графика фрейма данных до Groupby, Crosstab и некоторых библиотек визуализации глобальных карт, таких как Folium, Basemap и т. Д., Этот глобальный набор данных о терроризме открывает множество возможностей для поиска и анализа данных самостоятельно. Надеюсь, этот пост поможет вам хотя бы начать работу с Pandas, и затем вы сможете двигаться в нужном вам направлении.

Ваше здоровье! Оставайся сильным !!

Используемый здесь блокнот доступен в GitHub.