紛争のトレンドとパターンの探索:マニプールのACLEDデータ分析

Exploring Trends and Patterns in Conflicts ACLED Data Analysis in Manipur.

はじめに

データ分析と可視化は、複雑なデータセットを理解し、洞察を効果的に伝えるための強力なツールです。この現実世界の紛争データを深く掘り下げる没入型探索では、紛争の厳しい現実と複雑さに深く踏み込みます。焦点は、長期にわたる暴力と不安定状態によって悲惨な状況に陥ったインド北東部のマニプール州にあります。私たちは、武装紛争ロケーション&イベントデータプロジェクト(ACLED)データセット[1]を使用し、紛争の多面的な性質を明らかにするための詳細なデータ分析の旅に出ます。

学習目標

  • ACLEDデータセットのデータ分析技術に熟達する。
  • 効果的なデータ可視化のスキルを開発する。
  • 脆弱な人口に対する暴力の影響を理解する。
  • 紛争の時間的および空間的な側面に関する洞察を得る。
  • 人道的ニーズに対処するための根拠に基づくアプローチを支援する。

この記事は、データサイエンスブログマラソンの一環として公開されました。

利害の衝突

このブログで提示された分析と解釈に責任を持つ特定の組織や団体はありません。目的は、紛争分析におけるデータサイエンスの潜在力を紹介することです。さらに、これらの調査結果には個人的な利益や偏見が含まれておらず、紛争のダイナミクスを客観的に理解するアプローチが確保されています。データ駆動型の方法を促進し、紛争分析に関する広範な議論に情報を提供するために、積極的に利用することを推奨します。

実装

なぜACLEDデータセットを使用するのか?

ACLEDデータセットを活用することで、データサイエンス技術の力を活用することができます。これにより、マニプール州の状況を理解するだけでなく、暴力に関連する人道的側面にも光を当てることができます。ACLEDコードブックは、このデータセット[2]で使用されるコーディングスキームと変数に関する詳細な情報を提供する包括的な参考資料です。

ACLEDの重要性は、共感的なデータ分析にあります。これにより、マニプール州の暴力に関する理解が深まり、人道的ニーズが明らかにされ、暴力の解決と軽減に貢献します。これにより、影響を受けるコミュニティに平和で包摂的な未来が促進されます。

このデータ駆動型の分析により、貴重な洞察力を得るだけでなく、マニプール州の暴力の人的コストにも光が当てられます。ACLEDデータを精査することで、市民人口、強制的移動、必要なサービスへのアクセスなど、地域で直面する人道的現実の包括的な描写が可能になります。

紛争のイベント

まず、ACLEDデータセットを使用して、マニプール州の紛争のイベントを調査します。以下のコードスニペットは、インドのACLEDデータセットを読み込み、マニプール州のデータをフィルタリングして、形状が(行数、列数)のフィルタリングされたデータセットを生成します。フィルタリングされたデータの形状を出力します。

import pandas as pd 


# ACLEDデータをダウンロードして国別のcsvをインポートする

file_path = './acled_India.csv' 

all_data = pd.read_csv(file_path) 



# マニプール州のデータをフィルタリングする 

df_filtered = all_data.loc[all_data['admin1'] == "Manipur"] 

shape = df_filtered.shape 



print("フィルタリングされたデータの形状:", shape)

#出力:

#フィルタリングされたデータの形状: (4495, 31)

ACLEDデータの行数は、データセットに記録された個別のイベントまたは事件の数を表します。各行は通常、特定のイベント(紛争、抗議、暴力の発生など)に対応し、場所、日付、関与するアクターなどの情報を提供するさまざまな属性または列を含みます。

ACLEDデータの行数をカウントすることで、ACLEDが追跡したイベントまたは事件の総数を決定できます。マニプール州用にデータセットをフィルタリングすることで、2016年1月から2023年6月9日までに記録された個々のイベントまたは事件に関する情報を含むフィルタリングされたデータセットを取得しました。 ACLEDが追跡したイベントまたは事件の総数は4495行であり、ACLEDによって追跡された紛争またはイベントの範囲とスケールに関する洞察を提供しました。

次に、df_filtered DataFrameの各列(axis=0)のnull値を合計します。これにより、フィルタリングされたデータセットの各列に欠落値がいくつあるかがわかります。

df_filtered.isnull().sum(axis = 0) 

# 出力: 各列のnull値のカウント
# event_id_cnty: 0 null values
# event_date: 0 null values
# year: 0 null values
# time_precision: 0 null values
# disorder_type: 0 null values
# event_type: 0 null values
# sub_event_type: 0 null values
# actor1: 0 null values
# assoc_actor_1: 1887 null values
# inter1: 0 null values
# actor2: 3342 null values
# assoc_actor_2: 4140 null values
# inter2: 0 null values
# interaction: 0 null values
# civilian_targeting: 4153 null values
# iso: 0 null values
# region: 0 null values
# country: 0 null values
# admin1: 0 null values
# admin2: 0 null values
# admin3: 0 null values
# location: 0 null values
# latitude: 0 null values
# longitude: 0 null values
# geo_precision: 0 null values
# source: 0 null values
# source_scale: 0 null values
# notes: 0 null values
# fatalities: 0 null values
# tags: 1699 null values
# timestamp: 0 null values

以下のコードスニペットは、各列のユニークな値の数を出力します。

n = df_filtered.nunique(axis=0) 

print("各列のユニークな値の数:\n", n)

# 出力:
# 各列のユニークな値の数:
# event_id_cnty: 4495
# event_date: 1695
# year: 8
# time_precision: 3
# disorder_type: 4
# event_type: 6
# sub_event_type: 17
# actor1: 66
# assoc_actor_1: 323
# inter1: 8
# actor2: 61
# assoc_actor_2: 122
# inter2: 9
# interaction: 28
# civilian_targeting: 1
# iso: 1
# region: 1
# country: 1
# admin1: 1
# admin2: 16
# admin3: 37
# location: 495
# latitude: 485
# longitude: 480
# geo_precision: 3
# source: 233
# source_scale: 12
# notes: 4462
# fatalities: 10
# tags: 97
# timestamp: 1070

Foliumライブラリを使用した対話型マップによるACLEDイベントの可視化

マニプールは地理的には、谷地と丘陵地帯の2つの異なる地域に分割されています。中央部に位置する谷地は比較的平坦で、周囲を丘陵が囲んでいます。この地域は州内で最も人口密度が高く、農業生産が盛んです。一方、丘陵地帯は周囲の丘陵と山々から成り、より険しい地形を提供しています。

以下のコードは、Foliumライブラリを使用して2022年から2023年にかけてマニプールで発生したACLEDイベントを可視化する対話型マップを作成します。各マーカーの色は対応する年を表し、イベントを円形マーカーとしてマップ上にプロットします。また、マニプールの境界を表示するGeoJSONレイヤーを追加し、マップタイトル、クレジット、そして年の色コードを示す凡例を含めます。これらの要素を持った最終マップが表示されます。

import folium 

# 2022年と2023年のデータをフィルタリングする 

df_filtered22_23 = df_filtered[(df_filtered['year'] == 2022) | (df_filtered['year'] == 2023)] 

# マップインスタンスを作成する 

map = folium.Map(location=[24.8170, 93.9368], zoom_start=8) 

# GeoJSONファイルからマニプールの境界を読み込む 

manipur_geojson = 'Manipur.geojson' 

# マニプールの境界のためのGeoJSONレイヤーを作成し、マップに追加する 

folium.GeoJson(manipur_geojson, 

               style_function=lambda feature: { 

                   'fillColor': 'white', 

                   'color': 'black', 

                   'weight': 2, 

                   'fillOpacity': 1 

               }).add_to(map) 


# 異なる年のためのカラーパレットを定義する 

color_palette = {2022: 'red', 2023: 'blue'} 

# 年に基づいて異なる色でイベントをマップ上にプロットする 

for index, row in df_filtered22_23.iterrows(): 

    folium.CircleMarker([row['latitude'], row['longitude']], 

                        radius=3, 

                        color=color_palette[row['year']], 

                        fill=True, 

                        fill_color=color_palette[row['year']], 

                        fill_opacity=0.5).add_to(map) 

# マップに機能を追加する 

folium.TileLayer('cartodbpositron').add_to(map) 

# マップの中心とズームレベルを設定する 

map.fit_bounds(map.get_bounds()) 

map.get_root().html.add_child(folium.Element(legend_html)) 

# マップを表示する 

map

出力:

中央の谷地域にイベントの集中が見られます。これは、人口密度、インフラ、アクセシビリティ、歴史的な社会政治的なダイナミクスなど、さまざまな要因によるものかもしれません。人口密度が高く経済的に発展している中央の谷地域は、丘陵地帯と比較して、より多くの事件やイベントが発生する可能性があります。

ACLED イベントタイプ

ACLEDのevent_typeは、ACLEDデータセットに記録されたさまざまな種類のイベントを分類するものです。これらのイベントタイプは、紛争、暴力、抗議など、様々な活動や事件に関連するものです。ACLEDデータセットの一部のイベントタイプには、市民に対する暴力、爆発/遠隔地による暴力、抗議、暴動などがあります。これらのイベントタイプは、ACLEDデータベースに記録された紛争および関連する事件の性質と動向についての洞察を提供します。

以下のコードは、年ごとにグループ化されたManipu、India内のイベントタイプを視覚化する棒グラフを生成します。

import pandas as pd 

import matplotlib.pyplot as plt 

df_filteredevent = df_filtered.copy() 

df_filteredevent['event_date'] = pd.to_datetime(df_filteredevent['event_date']) 

# Group the data by year 

df_cross_event = df_filteredevent.groupby(df_filteredevent['event_date'].dt.year)
['event_type'].value_counts().unstack() 

# Define the color palette 

color_palette = ['#FF5C5C', '#FFC94C', '#FF9633', '#8E8EE1', '#72C472', '#0818A8'] 

# Plot the bar chart 

fig, ax = plt.subplots(figsize=(10, 6)) 

df_cross_event.plot.bar(ax=ax, color=color_palette) 

# Set the x-axis tick labels to display only the year 

ax.set_xticklabels(df_cross_event.index, rotation=0) 

# Set the legend 

ax.legend(title='Event Types', bbox_to_anchor=(1, 1.02), loc='upper left') 

# Set the axis labels and title 

ax.set_xlabel('Year') 

ax.set_ylabel('Event Count') 

ax.set_title('Manipur, India: ACLED Event Types by Year')  

# Adjust the padding and layout 

plt.tight_layout(rect=[0, 0, 0.95, 1])   

# Display the plot 

plt.show()

出力:

ACLED Event Types by Year

特に、棒グラフによるイベントタイプの視覚化は、「Protests」カテゴリーの支配を強調し、他のイベントタイプを正確に比較することが難しくなる可能性があります。 「Protests」カテゴリを除外または分離することにより、視覚化を調整し、残りのイベントタイプをより明確に比較できるようにしました。

以下のコードスニペットは、データから「Protests」イベントタイプをフィルタリングします。次に、残りのイベントを年ごとにグループ化し、棒グラフで視覚化します。支配的な「Protests」カテゴリを除外した結果の視覚化は、年ごとのイベントタイプをより明確に示しています。

import pandas as pd 

import matplotlib.pyplot as plt 


df_filteredevent = df_filtered.copy() 

df_filteredevent['event_date'] = pd.to_datetime(df_filteredevent['event_date']) 


# Filter out the "Protests" event type 

df_filteredevent = df_filteredevent[df_filteredevent['event_type'] != 'Protests'] 


# Group the data by year 

df_cross_event = df_filteredevent.groupby(df_filteredevent['event_date'].dt.year)
['event_type'].value_counts().unstack() 


# Define the color palette 

color_palette = ['#FF5C5C', '#FFC94C', '#FF9633', '#8E8EE1', '#72C472', '#0818A8'] 


# Plot the bar chart 

fig, ax = plt.subplots(figsize=(10, 6)) 

df_cross_event.plot.bar(ax=ax, color=color_palette) 


# Set the x-axis tick labels to display only the year 

ax.set_xticklabels(df_cross_event.index, rotation=0) 


# Set the legend 

ax.legend(title='Event Types', bbox_to_anchor=(1, 1.02), loc='upper left') 


# Set the axis labels and title 

ax.set_xlabel('Year') 

ax.set_ylabel('Event Count') 

ax.set_title('Manipur, India: ACLED Event Types (excluding Protests) by Year') 


# Adjust the padding and layout 

plt.tight_layout(rect=[0, 0, 0.95, 1]) 


# Display the plot 

plt.show()

出力:

ACLED EventTypes excluding Protests by Year

イベントダイナミクスの可視化:イベントタイプと頻度のマッピング

イベントタイプと頻度に基づいてマーカーのサイズと色が異なるマップ上でイベントをプロットするために、インタラクティブマップを使用します。これにより、異なるイベントの空間分布と強度を表現し、パターン、ホットスポット、トレンドを素早く特定できます。このアプローチにより、イベントの地理的ダイナミクスが向上し、データに基づく意思決定が容易になり、特定されたパターンと頻度に応じた効果的なリソース配分とターゲット型介入が可能となります。

イベントは、イベントタイプと頻度に基づいて色とサイズが異なる円形マーカーとしてマップ上にプロットされます。

import folium 

import json 


# 2023年のデータのみをフィルタリングする 

df_filtered23 = df_filtered[df_filtered['year'] == 2023] 


# 各ロケーションのイベント数を計算する 

event_counts = df_filtered23.groupby(['latitude', 'longitude']).size().
reset_index(name='count') 


# マップインスタンスを作成する 

map = folium.Map(location=[24.8170, 93.9368], zoom_start=8) 


# GeoJSONファイルからマニプールの境界をロードする 

with open('Manipur.geojson') as f: 

    manipur_geojson = json.load(f) 


# マニプールの境界のためのGeoJSONレイヤーを作成し、マップに追加する 

folium.GeoJson(manipur_geojson, 

               style_function=lambda feature: { 

                   'fillColor': 'white', 

                   'color': 'black', 

                   'weight': 2, 

                   'fillOpacity': 1 

               }).add_to(map) 


# ACLEDテーマ別カテゴリにインスパイアされたカスタムカラーパレットを定義する 

event_type_palette = { 

    'Violence against civilians': '#FF5C5C',       # 暗いオレンジ 

    'Explosions/Remote violence': '#FFC94C',       # 明るい黄色 

    'Strategic developments': '#FF9633',            # 明るいオレンジ 

    'Battles': '#8E8EE1',                           # 紫 

    'Protests': '#72C472',                          # 緑 

    'Riots': '#0818A8'                              # 青鋼色 

} 

# イベントタイプと頻度に基づいてマーカーのサイズと色が異なるイベントをマップ上にプロットする 

for index, row in event_counts.iterrows(): 

    location = (row['latitude'], row['longitude']) 

    count = row['count'] 


    # 現在の場所のイベントタイプを取得する 

    event_type = df_filtered23[(df_filtered23['latitude'] == row['latitude']) & 

                             (df_filtered23['longitude'] == row['longitude'])]
                             ['event_type'].values[0] 


    folium.CircleMarker( 

        location=location, 

        radius=2 + count * 0.1, 

        color=event_type_palette[event_type], 

        fill=True, 

        fill_color=event_type_palette[event_type], 

        fill_opacity=0.7 

    ).add_to(map) 


# 2023年のための凡例を追加する 

legend_html = """ 

<div style="position: fixed; bottom: 50px; right: 50px; z-index: 1000; font-size: 14px; 

             background-color: rgba(255, 255, 255, 0.8); padding: 10px; border-radius: 
             5px;"> 

    <p><strong>凡例</strong></p> 

    <p><span style="color: #FF5C5C;">暴力行為</span></p> 

    <p><span style="color: #FFC94C;">爆発/遠隔攻撃</span></p> 

    <p><span style="color: #FF9633;">戦略的展開</span></p> 

    <p><span style="color: #8E8EE1;">戦闘</span></p> 

    <p><span style="color: #72C472;">抗議</span></p> 

    <p><span style="color: #0818A8;">暴動</span></p> 

</div> 

""" 

map.get_root().html.add_child(folium.Element(legend_html)) 



# マップを表示する 

map 

出力:

紛争の主要行為者

このステップでは、マニプールの紛争や事件に関与する異なる実体またはグループについての洞察を得ます。 ACLEDデータセットでは、「actor1」は記録されたイベントに関与する主要な行為者を指します。特定の紛争や事件を開始または参加する主要な実体またはグループを表します。「actor1」列には、政府、反乱軍、民族武装勢力、または紛争や事件に関与する他の実体のような、主要な行為者のアイデンティティに関する情報が提供されます。 「actor1」列の各一意の値は、記録されたイベントに関与する異なる行為者またはグループを表します。

次に、以下のコードスニペットを使用して「actor1」の値のカウントを可視化しました。

このコードは、 ‘actor1’列の値のカウントに基づいてDataFrameをフィルタリングし、カウントが5以上のもののみを選択します。その後、結果のデータを可視化します。

import matplotlib.pyplot as plt 


# Filter the DataFrame based on value counts >= 5 

filtered_df = df_filtered[(df_filtered['year'] != 2023)]['actor1'].
value_counts().loc[lambda x: x >= 5] 


# Create a figure and axes for the horizontal bar chart 

fig, ax = plt.subplots(figsize=(8, 6)) 


# Define the color palette 

color_palette = ['#FF5C5C', '#FFC94C', '#FF9633', '#8E8EE1', '#72C472', '#0818A8'] 


# Plot the horizontal bar chart 

filtered_df.plot.barh(ax=ax, color=color_palette) 


# Add labels and title 

ax.set_xlabel('Count') 

ax.set_ylabel('Actor1') 

ax.set_title('Value Counts of Actor1 (>= 5) (January 2016 to 9th December 2022)', 
pad=55) 


# Set the data availability information 

data_info = "Accessed on June 17, 2023" 


# Add credits and data availability information 

plt.text(0.5, 1.1, "Data accessed from:", ha='center', transform=ax.transAxes, 
fontsize=10) 

plt.text(0.5, 1.05, "Armed Conflict Location & Event Data Project (ACLED); 
www.acleddata.com", 

         ha='center', transform=ax.transAxes, fontsize=10) 

plt.text(0.5, 1.0, data_info, ha='center', transform=ax.transAxes, fontsize=10) 


# Display the count next to each bar 

for i, v in enumerate(filtered_df.values): 

    ax.text(v + 3, i, str(v), color='black') 

# Display the plots 

plt.tight_layout() 

plt.show() 

出力:

Value Counts of Actor1

このチャートは、2016年1月から2022年12月9日までのデータを表しています。また、「5以上のカウント」という条件は、出現頻度が5回以上のアクターのみが分析およびチャートに表示されることを意味します。

以下のコードスニペットに示すように、2022年と2023年のカテゴリ数を比較するために以下の可視化を使用しました。

import matplotlib.pyplot as plt 

import numpy as np 

# Filter the DataFrame for the year 2022 

filtered_df_2022 = df_filtered[df_filtered['year'] == 2022]['actor1'].
value_counts().loc[lambda x: x >= 10] 


# Filter the DataFrame for the year 2023 

filtered_df_2023 = df_filtered[df_filtered['year'] == 2023]['actor1'].
value_counts().loc[lambda x: x >= 10] 


# Get the unique categories that appear more than 10 in either DataFrame 

categories = set(filtered_df_2022.index).union(set(filtered_df_2023.index)) 


# Create a dictionary to store the category counts 

category_counts = {'2022': [], '2023': []} 

# Iterate over the categories 

for category in categories: 

    # Add the count for 2022 if available, otherwise add 0 

    category_counts['2022'].append(filtered_df_2022.get(category, 0)) 

    # Add the count for 2023 if available, otherwise add 0 

    category_counts['2023'].append(filtered_df_2023.get(category, 0)) 


# Exclude categories with count 0 

non_zero_categories = [category for category, count_2022, count_2023 in zip
(categories, category_counts['2022'], category_counts['2023']) if count_2022 > 
0 or count_2023 > 0] 


# Create a figure and axes for the bar chart 

fig, ax = plt.subplots(figsize=(10, 6)) 


# Set the x-axis positions 

x = np.arange(len(non_zero_categories)) 


# Set the width of the bars 

width = 0.35 

# Plot the bar chart for 2022 

bars_2022 = ax.bar(x - width/2, category_counts['2022'], width, color=color_palette[0],
 label='2022') 

# Plot the bar chart for 2023 

bars_2023 = ax.bar(x + width/2, category_counts['2023'], width, color=color_palette[1],
 label='2023') 


# Set the x-axis tick labels and rotate them for better visibility 

ax.set_xticks(x) 

ax.set_xticklabels(non_zero_categories, rotation=90) 


# Set the y-axis label 

ax.set_ylabel('Count') 


# Set the title and legend 

ax.set_title('Comparison of Actor1 Categories (>= 10) - 2022 vs 2023') 

ax.legend() 


# Add count values above each bar 

for rect in bars_2022 + bars_2023: 

    height = rect.get_height() 

    ax.annotate(f'{height}', xy=(rect.get_x() + rect.get_width() / 2, height), 

                xytext=(0, 3), textcoords="offset points", ha='center', va='bottom') 


# Adjust the spacing between lines 

plt.subplots_adjust(top=0.9) 


# Display the plot 

plt.show()

出力:

Manipuriの2022年のACLEDデータと2023年6月9日までのデータの比較は、以下のコードスニペットを使用して取得できます。

import matplotlib.pyplot as plt 

import numpy as np 


# 2022年のデータフレームをフィルタリングする 

filtered_df_2022 = df_filtered[df_filtered['year'] == 2022]['actor1'].
value_counts().loc[lambda x: x >= 10] 


# 2023年のデータフレームをフィルタリングする 

filtered_df_2023 = df_filtered[df_filtered['year'] == 2023]['actor1'].
value_counts().loc[lambda x: x >= 10] 


# 10以上のユニークなカテゴリを取得する 

categories = set(filtered_df_2022.index).union(set(filtered_df_2023.index)) 


# カテゴリカウントを格納する辞書を作成する 

category_counts = {'2022': [], '2023': []} 


# カテゴリごとに繰り返す 

for category in categories: 

    # 利用可能な場合は2022年のカウントを追加し、そうでない場合は0を追加する 

    category_counts['2022'].append(filtered_df_2022.get(category, 0)) 


    # 利用可能な場合は2023年のカウントを追加し、そうでない場合は0を追加する 

    category_counts['2023'].append(filtered_df_2023.get(category, 0)) 


# カウント0のカテゴリを除外する 

non_zero_categories = [category for category, count_2022, count_2023 in 
zip(categories, category_counts['2022'], category_counts['2023']) 
if count_2022 > 0 or count_2023 > 0] 


# 棒グラフのための図と軸を作成する 

fig, ax = plt.subplots(figsize=(10, 6)) 


# x軸の位置を設定する 

x = np.arange(len(non_zero_categories)) 


# 棒の幅を設定する 

width = 0.35 


# 2022年の棒グラフをプロットする 

bars_2022 = ax.bar(x - width/2, category_counts['2022'], width, 
color=color_palette[0], label='2022') 


# 2023年の棒グラフをプロットする 

bars_2023 = ax.bar(x + width/2, category_counts['2023'], width, 
color=color_palette[1], label='2023') 


# x軸の目盛りラベルを設定し、可読性を高めるために回転させる 

ax.set_xticks(x) 

ax.set_xticklabels(non_zero_categories, rotation=90) 


# y軸ラベルを設定する 

ax.set_ylabel('カウント') 


# タイトルと凡例を設定する 

ax.set_title('Actor1カテゴリの比較(≧10) - 2022 vs 2023') 

ax.legend() 


# 各バーの上にカウント値を追加する 

for rect in bars_2022 + bars_2023: 

    height = rect.get_height() 

    ax.annotate(f'{height}', xy=(rect.get_x() + rect.get_width() / 2, height), 

                xytext=(0, 3), textcoords="offset points", ha='center', va='bottom') 


# プロットを表示する 

plt.show() 

出力:

紛争強度分析

次のコードスニペットでは、’event_date’列をdatetimeに変換してさらなる分析や可視化のためにデータを準備します。pd.crosstab()関数を使用して、’df_filtered’の’event_date’(dt.to_period(‘m’)を使用して月次期間に変換)と’inter1’列の間にクロスタブ(度数分布表)を作成します。次に、’event_date’でフィルタリングしたDataFrameをグループ化し、各日付の’fatalities’の合計を計算します。月ごとの死亡者数を既存のクロスタブ化されたDataFrameに追加して、’df_conflicts’を作成します。これは、さらなる分析のための分類されたイベントデータとそれに対応する死亡者情報を含みます。

コードの実装

import pandas as pd 

# 'event_date'列をdatetimeデータ型に変換する 

df_filtered['event_date'] = pd.to_datetime(df_filtered['event_date']) 



# クロスタブ操作を実行する 

df_cross = pd.crosstab(df_filtered['event_date'].dt.to_period('m'), 
df_filtered['inter1']) 



# 列名を変更する 

df_cross.columns = ['州軍', '反乱軍', '政治的民兵', 
'アイデンティティ民兵', '暴徒', '抗議者', '市民', '外部/その他の勢力'] 



# 期間インデックスを日付に変換する 

df_cross['event_date'] = df_cross.index.to_timestamp() 



# インデックスをリセットする 

df_cross.reset_index(drop=True, inplace=True) 

df2 = df_filtered.copy() 

df2['event_date'] = pd.to_datetime(df2['event_date']) 



fatality_filtered = (df2 

.filter(['event_date','fatalities']) 

.groupby(['event_date']) 

.fatalities 

.sum() 

) 

df_fatality_filtered = fatality_filtered.to_frame().reset_index() 

df_fatality_month= df_fatality_filtered.resample('M', on="event_date").sum() 

df_fatality_month = df_fatality_month.reset_index() 

df_fatalities = df_fatality_month.drop(columns=['event_date']) 

df_concat = pd.concat([df_cross, df_fatalities], axis=1) 

df_conflicts = df_concat.copy() 

出力:

このコードは、マニプルの月次イベントによるアクタータイプ別の紛争強度分析を可視化し、報告された死亡数に基づいて重み付けされています。ラインの幅は、各アクタータイプの死亡数に基づいています。このような分析により、パターンや紛争に関与する異なるアクタータイプの相対的な影響を特定し、紛争研究におけるさらなる分析や意思決定のための貴重な洞察を提供することができます。

import plotly.graph_objects as go 

fig = go.Figure() 

fig.add_trace(go.Scatter( 

    name='州軍', 

    x=df_conflicts['event_date'].dt.strftime('%Y-%m'), 

    y=df_conflicts['州軍'], 

    mode='markers+lines', 

    marker=dict(color='darkviolet', size=4), 

    showlegend=True 

)) 



fig.add_trace(go.Scatter( 

    name='死亡数の重み', 

    x=df_conflicts['event_date'], 

    y=df_conflicts['州軍']+df_conflicts['fatalities']/5, 

    mode='lines', 

    marker=dict(color="#444"), 

    line=dict(width=1), 

    hoverinfo='skip', 

    showlegend=False 

)) 



fig.add_trace(go.Scatter( 

    name='死亡数の重み', 

    x=df_conflicts['event_date'], 

    y=df_conflicts['州軍']-df_conflicts['fatalities']/5, 

    marker=dict(color="#444"), 

    line=dict(width=1), 

    mode='lines', 

    fillcolor='rgba(68, 68, 68, 0.3)', 

    fill='tonexty', 

    hoverinfo='text', 

    hovertemplate='<br>%{x|%b\n%Y}<br><i>死亡数: %{text}</i>', 

    text=['{}'.format(i) for i in df_conflicts['fatalities']], 

    showlegend=False 

)) 



#similiray insert add_trace for other event types too here...



fig.update_xaxes( 

    dtick="M3",  # チックの頻度を3ヶ月(四半期)に設定

    tickformat="%b\n%Y" 

) 



fig.update_layout( 

    yaxis_title='イベント数', 

    title={ 

        'text': '紛争強度分析:アクタータイプ別のマニプルのイベント、報告された死亡数による重み付け', 

        'y': 0.95, 

        'x': 0.5, 

        'xanchor': 'center', 

        'yanchor': 'top', 

        'font': {'size': 20} 

    }, 

    annotations=[ 

        dict( 

            text="2016年1月から2023年6月9日|データアクセス元:武装紛争ロケーション&イベントデータプロジェクト(ACLED)、www.acleddata.com", 

            xref="paper", 

            yref="paper", 

            x=0.5, 

            y=1.06, 

            showarrow=False, 

            font={'size': 12} 

        ) 

    ], 

    hovermode="x", 

    xaxis=dict( 

        showgrid=False 

    ), 

    yaxis=dict( 

        showgrid=False 

    ) 

) 


fig.data[0].marker.size = 4 

fig.data[3].marker.size = 4 

fig.data[6].marker.size = 4 

fig.data[9].marker.size = 4 

fig.data[12].marker.size = 4 

fig.data[15].marker.size = 4 

fig.data[18].marker.size = 4 

fig.data[21].marker.size = 4 



fig.show()

出力:

マルチライングラフで他の変数よりも高い値(この場合は「抗議者」)があると、異なる変数の傾向を正確に比較し、解釈することが困難になります。1つの変数の支配力が低下すると、他の変数間の相対的な変化や関係を評価することが難しくなります。可視化は、圧縮されたまたは混雑した視覚効果、低価値変数の詳細の損失、バイアスのある解釈につながる不均衡な強調を伴うことがあります。

これらの欠点を緩和し、最近の紛争の激しさを明確に可視化するために、2023年と2022年の紛争イベントのデータをフィルタリングし、以下が出力結果です:

日次データを使用して紛争の傾向分析に日付をインデックスとして設定し、以下のデータフレームを取得してさらに分析します。

移動平均と紛争の傾向分析

紛争の傾向分析では、30日間と7日間の移動窓口が一般的です。これらは、特定の時間期間内の紛争関連データの移動平均または平均を計算するために使用されます。

移動窓口は、タイムラインに沿って移動する固定サイズの時間間隔を指します。その間隔内の指定されたデータポイント数を含みます。たとえば、30日間の移動窓口では、現在の日に加えて前の29日が含まれます。7日間の移動窓口では、現在の日に加えて前の6日が含まれ、1週間分のデータを表します。

移動平均は、窓口内のデータポイントの平均を取ることによって計算されます。これにより、データのスムーズ化された表現が提供され、短期的な変動が減少し、長期的な傾向が強調されます。

紛争分析で30日間と7日間の移動平均を計算することにより、分析者は時間の経過に伴う紛争イベントの全体的なパターンと傾向に関する洞察を得ることができます。これらの移動平均は、データの短期的な変動を捉えながら、長期的な傾向を特定するのに役立ちます。これらの移動平均は、潜在的なパターンを明らかにし、紛争の進化のより明確な画像を提供するのに役立ちます。

コードスニペット

以下のコードスニペットは、各紛争シナリオのプロットを作成します。

import matplotlib.pyplot as plt 

import pandas as pd 



# Variables to calculate rolling means for 

variables = ['State Forces', 'Rebel Groups', 'Political Militias', 
'Identity Militias', 'Rioters', 'Protesters', 
'Civilians', 'External/Other Forces'] 



# Calculate rolling means for each variable 

data_7d_rol = {} 

data_30d_rol = {} 

for variable in variables: 

    data_7d_rol[variable] = data_ts[variable].rolling(window=7, min_periods=1).mean() 

    data_30d_rol[variable] = data_ts[variable].rolling(window=30, min_periods=1).mean() 




# Plotting separate graphs for each variable 

for variable in variables: 

    fig, ax = plt.subplots(figsize=(11, 4)) 



    # Plotting 7-day rolling mean 

    ax.plot(data_ts.index, data_7d_rol[variable], linewidth=2, label='7-d Rolling Mean') 



    # Plotting 30-day rolling mean 

    ax.plot(data_ts.index, data_30d_rol[variable], color='0.2', linewidth=3, 
    label='30-d Rolling Mean') 



    # Beautification of plot 

    ax.legend() 

    ax.set_xlabel('Year') 

    ax.set_ylabel('Events accounted by ' + variable) 

    ax.set_title('Trends in ' + variable + ' Conflicts') 



    # Add main heading and subheading 

    fig.suptitle(main_title, fontsize=14, fontweight='bold', y=1.05) 

    #ax.text(0.5, -0.25, sub_title, transform=ax.transAxes, fontsize=10, color='red', ha='center') 

    ax.text(0.5, 0.95, sub_title, transform=ax.transAxes, fontsize=10, color='red', ha='center') 



    plt.tight_layout() 

    plt.show() 

出力:

State Forces
Rebel Groups
Political Militias
Identity Militias
Rioters
Protesters
Civilians
External/Other Forces

注意:このブログで生成されたプロットとデータ分析は、データサイエンス技術の応用を示すためだけに行われたものです。これらの分析は、紛争の複雑なダイナミクスに関する決定的な結論や解釈を描くものではありません。この分析の範囲を超えた包括的かつ文脈に応じた理解が必要であることを認識して、紛争分析にアプローチしてください。

結論

このブログは、ACLEDデータ分析を使用して、インドのマニプル州での紛争の事件とパターンを探索しています。ACLEDのイベントをマニプルで視覚化するには、インタラクティブなマップやその他の視覚化を使用してください。マニプルのイベントタイプを分析することで、紛争、暴力、抗議などの様々な活動や事件が明らかになりました。紛争イベントのトレンドを理解するために、30日間および7日間の移動平均を計算しました。これらの移動平均は、データの平滑化表現を提供し、短期的な変動を減らし、長期的なトレンドを強調します。全体として、これらの調査結果は、地域の紛争ダイナミクスのより良い理解に貢献し、さらなる研究や意思決定プロセスを支援できる可能性があります。

重要なポイント

  1. インタラクティブなACLEDデータ分析:現実の紛争データにダイブし、洞察を得る。
  2. インタラクティブなマップは、紛争の空間的および時間的ダイナミクスを視覚化します。
  3. 効果的な理解のためにデータを視覚化および分析することの重要性を強調します。
  4. 主要なアクターを識別することにより、紛争の景観を形成する主要なエンティティが明らかになります。
  5. 移動平均の計算により、紛争の短期的な変動と長期的なトレンドが明らかになります。

この記事が有益であることを願っています。LinkedInで私に連絡して、データを活用してポジティブな変化をもたらすために協力しましょう。

よくある質問

参考文献

1. Raleigh, Clionadh, Andrew Linke, Håvard Hegre and Joakim Karlsen. (2010). “IntroducingACLED-Armed Conflict Location and Event Data.” Journal of Peace Research 47(5) 651-660.

2. ACLED. (2023). “Armed Conflict Location & Event Data Project (ACLED)Codebook, 2023.

この記事に掲載されているメディアはAnalytics Vidhyaの所有物ではありません。著者の裁量により使用されています。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more