Analysing Conflict before and after the fall of the Assad Regime#

data[(data['category'] == 'Regime Change')&(data['latitude']==35.5252)]['notes'].iloc[0]
"On 30 November 2024, Military Operations Command fighters attacked and destroyed a regime-affiliated convoy in Sahyan in rural Idleb as it attempted to withdraw, killing seventy-five regime members. The event was part of the Military Operations Command's Deterrence of Aggression operation. 75 fatalities."
conflict_daily[(conflict_daily['category'] == 'Regime Change')&(conflict_daily['latitude']==35.5252)]
event_date latitude longitude category nrFatalities nrEvents conflict_intensity_index_op1
13325 2024-11-30 35.5252 36.6626 Regime Change 75 1 8.717798
daily_mean[daily_mean['nrFatalities']==75]
category latitude longitude nrEvents nrFatalities
3396 Regime Change 35.5252 36.6626 1.0 75.0

No spatial aggregation#

Mean Conflict Events and Fatalities#

What are the average number of events per day occuring in Syria during the three time periods?

get_maps(daily_mean, 'Mean Fatalities and Events per Day')
../../_images/d98ad863a28e215063de6c4bfd55769173f58428bfcf12ffc7ac1b456bd98ce7.png

Median Conflict Events and Fatalities#

What is the most number of conflict events and fatalities that have occured in a given point in Syria?

get_maps(daily_median, 'Median Fatalities and Events per Day')
../../_images/a6292326413b70ede1f9b4ebe5c46f74ec2347cbad64cbc3c1a2c31232a7fe2d.png

Is there a difference between mean and median conflict events and conflict fatalities?

df = daily_median.merge(daily_mean, on = ['latitude', 'longitude', 'category'], suffixes=['_median', '_mean'])
df[df['nrFatalities_median'] - df['nrFatalities_mean']>0]
category latitude longitude nrEvents_median nrFatalities_median nrEvents_mean nrFatalities_mean
106 After Assad 32.9727 36.3354 1.0 1.0 1.000000 0.666667
128 After Assad 33.0569 36.0068 1.0 1.0 1.000000 0.666667
132 After Assad 33.0711 36.1833 1.0 1.0 1.095238 0.809524
201 After Assad 33.3341 36.1588 1.0 2.0 1.000000 1.666667
266 After Assad 33.6042 36.3118 1.0 1.5 1.125000 1.375000
... ... ... ... ... ... ... ...
2833 Before HTS 36.6405 37.8837 1.0 1.0 1.000000 0.857143
3123 Regime Change 33.0711 36.1833 1.0 6.0 1.333333 4.333333
3174 Regime Change 33.5706 36.4046 1.0 2.0 1.333333 1.666667
3274 Regime Change 35.1337 36.7613 1.0 5.0 1.600000 4.400000
3286 Regime Change 35.2020 36.7681 1.0 10.0 1.000000 6.666667

80 rows × 7 columns

pc = 100*80/daily_mean.shape[0]
print(f"Percentage of points where mean and median fatalities are different: {pc:.2f}%")
Percentage of points with more fatalities than events: 2.09%
df[df['nrEvents_median'] - df['nrEvents_mean']>0]
category latitude longitude nrEvents_median nrFatalities_median nrEvents_mean nrFatalities_mean
3645 Regime Change 36.206 37.1524 2.0 0.0 1.666667 6.5

Mean Conflict Index#

The conflict intensity index is calculated as the geometric mean of conflict events and fatalities, with an adjustment to handle zero values:

\[\text{Conflict Intensity Index} = \sqrt{(\text{nrEvents}) \times (\text{nrFatalities} + 1)}\]

Where:

  • \(\text{nrEvents}\) is the number of conflict events in a given period and location

  • \(\text{nrFatalities}\) is the number of fatalities from conflicts in the same period and location

  • The addition of 1 to each term ensures the index is defined even when either component is zero. This is arbitrary and is doen just to account for 0 values of fatalities and conflicts.

This index provides a balanced measure that accounts for both the frequency of conflicts and their severity. Compared to arithmetic means, the geometric mean reduces the influence of extreme values in either component (conflict events + fatalities). Areas with both high events and high fatalities will have higher index values than areas with many events but few fatalities or vice versa.

Conflict index is calculated at the location and then average is taken over time (across the three time periods). This is to preserve the integrity of the conflict index in that specific location.

daily_conflict_intensity_median = conflict_daily.groupby(['category','latitude','longitude'])[['nrEvents', 'nrFatalities', 'conflict_intensity_index_op1']].median().reset_index()
daily_conflict_intensity_median = analysis.convert_to_gdf(daily_conflict_intensity_median)
get_maps_conflict_index(daily_conflict_intensity, 'Mean Conflict Intensity', 'conflict_intensity_index_op1')
../../_images/c659014ce97ed434713c78873825061f3eba26abf13abceb0c760aa73036af3d.png

Hexagonal Aggregation#

Below are maps where the fatalities and conflict events are aggregated to hexagons of size 276 sq km each. This shows greater variance spatially.

Mean Conflict Index#

fig, ax = get_h3_maps(conflict_daily_h3_mean, 'Conflict Index of daily average conflict events and fatalities', measure='conflict_intensity_index_op1')
../../_images/e5ff55ef5f200a2f23928264d6430209bc62aa362a83c0d0a9755ad2eca2dded.png

The average conflict index measure shows the difference in the three periods very effectively compared to a showing mean conflict events and fatalities separately on the same map.

Mean Conflict Events#

fig, ax = get_h3_maps(conflict_daily_h3_mean, 'Daily average of conflict events', measure='nrEvents')
../../_images/abeaff6c087a46f08512bcb9b9b47e47d2d9a712a02b3cadaa097c29f5f99b76.png

Mean Fatalities#

fig, ax = get_h3_maps(conflict_daily_h3_mean, 'Daily average of conflict fatalities', measure='nrFatalities')
../../_images/89fb1ff79acc6e799aadbb5f467a3030f72fb6ab609711ad8baafde84d6e3e33.png

Median Conflict Events#

fig, ax = get_h3_maps(conflict_daily_h3_median, 'Daily median of conflict events', measure='nrEvents')
../../_images/8b320b6129adee122cee5b1418a73b3ed0e716874081d9301ea70e070a0685e9.png

Median Conflict Fatalities#

fig, ax = get_h3_maps(conflict_daily_h3_median, 'Daily median of conflict fatalities', measure='nrFatalities')
../../_images/a9072acbf09f9c91a4cd63f119274bff801ddfae720cdbc7e6d8f3bcee5ca030.png

Bivariate Conflict Map#

This last option does not use any formula on conflict events or fatalities, it simply uses one single color to show the combination of these two.

Conflict events and fatalities are divided into low-medium and high (equal quantiles of the data) and color is given accordingly.

Combination of mean conflict events and fatalities#

fig, ax = create_bivariate_conflict_map(conflict_daily_h3, "Conflict Patterns in Syria")
../../_images/105109297709855659bc6e9b9102cb3a12d67a3155cff2990d93b85d4888e942.png