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')

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')

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:
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')

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')

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')

Mean Fatalities#
fig, ax = get_h3_maps(conflict_daily_h3_mean, 'Daily average of conflict fatalities', measure='nrFatalities')

Median Conflict Events#
fig, ax = get_h3_maps(conflict_daily_h3_median, 'Daily median of conflict events', measure='nrEvents')

Median Conflict Fatalities#
fig, ax = get_h3_maps(conflict_daily_h3_median, 'Daily median of conflict fatalities', measure='nrFatalities')

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")
