Skip to the content.

Crime, Police, and the Megaoperação Contenção in Rio de Janeiro

1. Context

On October 28, 2025, approximately 2,500 officers from the Civil and Military Police of Rio de Janeiro entered the Complexo do Alemão and Complexo da Penha, a favela complex in the north zone of Rio de Janeiro, in what became known as the Megaoperação Contenção. The official objective was to contain the territorial expansion of Comando Vermelho (CV, one of the biggest criminal organizations in the country) and to execute some 100 arrest warrants and 180 search and seizure warrants. By the end of the operation, over 130 people had been killed and 100 arrests, as well as 118 weapons seized, making it the deadliest police operation in the history of the state of Rio de Janeiro.

After the operation, the debate regarding the efficacy of police force as a mean to fight organized crime and ensure public safety in contested zones gained a lot of the highlights. Some defend that the police is ineffective and the killings are a prove of the lack of preparadness from the police. Others state that this action will discourage individuals to join factions due to the risk it poses to their life. Other arguments are presented from both sides, heating the dabate. The problem with the discussion is that it is mostly based on the recall of case studies, narratives, sequence of "logical" connections and sometimes data that show or not correlations favoured to an argument. As I see it, this creates a fundamental problem of communication between both sides of the discussion, specially when the topic quickly becomes polarized and defending or critizing the operation becomes a signal to being a "leftist" or "rightist".

This post aims to a first attempt at studying the relationship between police enforcement and violent crime in this contested territory using longitudinal data and a simple dynamical systems model to lay down a formalization of some hypothesis raised by the arguments in the discussion. The goal is not to produce a definitive causal analysis (that would require a more careful identification strategy and a richer model) but to establish some basic empirical patterns and to test whether a few assumptions that supposedly dominate this relationship are enough to explain the observed data. This is exploratory and preliminary work; a more rigorous version of the analysis is under development.

Formal question at hand
Is enforcement of order via police actions an effective strategy in contested urban communities with settled organized criminal gangs? Do a dynamical relationship between crime, recruitment, police reprimand and police actions, manage to recreate the historical pattern of violent crimes and robery at the region of Complexo do Alemão and Complexo da Penha in Rio de Janeiro?

2. Data

Fogo Cruzado

The primary spatial data source is the Instituto Fogo Cruzado, which records georeferenced shooting incidents across the metropolitan region of Rio de Janeiro, derived from Disque Denúncia tip data. Each occurrence is classified as involving victims (dead or wounded) or not, with further breakdowns by civilian/police status, age category, and whether the incident took place during a police action. I use data covering 2022–2024 for the spatial analysis.

Python — loading the Fogo Cruzado data
year_start = 2022
year_final = 2024
n_years    = year_final - year_start + 1

for year in range(year_start, year_final + 1):
    df_v  = pd.read_csv(f'fc_api_occurrences_with_victims_{year}.csv')
    df_nv = pd.read_csv(f'fc_api_occurrences__{year}.csv')
    # concatenate with other-region files and accumulate

Victim counts aggregate civilians, police officers, children, teenagers, and the elderly across dead and wounded categories. All annual figures reported below are averages over the three-year period to smooth out year-specific variation.

ISP-RJ

For the time series analysis I use the monthly historical series from the Instituto de Segurança Pública do Rio de Janeiro (ISP-RJ), which reports crime statistics disaggregated by delegacia (CISP) and integrated security area (AISP) from January 2003 onward. The primary outcome variable is Crimes Violentos Letais Intencionais (CVLI), encompassing intentional homicide, robbery followed by death, and grievous bodily harm resulting in death. The enforcement intensity variable, which I call ações policiais (AMP), is the sum of monthly drug search-and-seizure warrants (cmp) and arrest warrant executions (cmba). This counts active enforcement events, not passive police presence.

Python — aggregating CVLI and police actions by zone
df_cisp = pd.read_csv('BaseDPEvolucaoMensalCisp.csv', sep=';', encoding='iso-8859-1')
north_zone_aisps = [17, 16, 6, 4, 3, 9, 41, 22]

for y in range(begin_year, end_year + 1):
    for aisp in north_zone_aisps:
        filtered = df_cisp.loc[(df_cisp['aisp'] == aisp) & (df_cisp['ano'] == y)]
        zones_cvlis[i, y - begin_year] += filtered['cvli'].sum()
        zones_amp[i, y - begin_year]   += filtered['cmp'].sum() + filtered['cmba'].sum()

Population estimates for each AISP are constructed from IBGE Census data (2000, 2010, 2022) with inter-censal values interpolated linearly. Per-capita rates are expressed per 100,000 inhabitants per year unless noted.

3. Spatial Analysis of Shooting Incidents

For each AISP in the metropolitan sample, I count the annual average number of victim-involving occurrences and total victims (dead plus wounded) over 2022–2024, then normalize by AISP population from the 2022 Census.

Map of victim rates across Rio de Janeiro's metropolitan region, 2022-2024 average
Figure 1. Annual average victim rate from shooting incidents per 100,000 inhabitants across Rio de Janeiro's metropolitan integrated security areas, 2022–2024. Victims include both civilians and police officers killed or wounded in shooting incidents recorded by Fogo Cruzado. The North Zone concentrations, including AISP 16 covering the Complexo do Alemão and Penha, stand out clearly. Source: Fogo Cruzado; IBGE Censo 2022.

Favelas vs. non-favelas within the same AISPs

I use the IBGE 2022 Census shapefile of Favelas e Comunidades Urbanas (FCU) to classify each Fogo Cruzado occurrence as falling inside or outside favela boundaries, with a small buffer (approximately 55 meters) around the FCU polygons to account for geolocation error.

Python — spatial join with favela polygons
favelas_rio = gpd.read_file('./Favelas_Comunidades_Urbanas_Censo2022/qg_2022_670_fcu_agregPolygon.shp')

for i in range(len(favelas_rio)):
    for j in range(len(df_v)):
        if favelas_rio.iloc[i].geometry.buffer(0.0005).contains(
            Point(df_v['longitude'][j], df_v['latitude'][j])
        ):
            victim_occurrences += 1
Comparison of victim rates inside and outside favelas
Figure 2. Distribution of annual victim rates from shooting incidents per 100,000 inhabitants, comparing favela territories (inside FCU) and non-favela areas (outside FCU) within the same AISPs. Thick bars show the interquartile range; thin bars the 2.5–97.5 percentile interval; dots show medians. The median rate inside favelas is roughly an order of magnitude higher than outside. Source: Fogo Cruzado; IBGE Censo 2022.
Interpretation note
Favela boundaries in the Census shapefile follow administrative demarcation, not the full extent of faction-controlled territory. Some incidents in peri-favela areas may be misclassified as outside-FCU. The buffer correction mitigates but does not eliminate this.

4. Time Series: CVLI and Police Actions in AISP 16

I now focus on AISP 16, which covers the Complexo do Alemão and Complexo da Penha. The time series covers January 2006 through December 2025. To reduce monthly noise, I fit a Generalized Additive Model (GAM) with a single spline term to each series.

Python — GAM smoothing
from pygam import LinearGAM, s

gam_cvli = LinearGAM(s(0)).fit(x_new, 1e5 * alemao_cvlis_percapita)
gam_amp  = LinearGAM(s(0)).fit(x_new, alemao_amp)
Time series of CVLI death rate and police actions in AISP 16, 2006-2025
Figure 3. GAM-smoothed monthly CVLI death rate per 100,000 inhabitants (left axis, blue) and monthly police action count (right axis, orange) in AISP 16, 2006–2025. Inset maps show the AISP location within Rio de Janeiro and the Complexo boundaries (gold). Source: ISP-RJ; IBGE Censo 2022.

The CVLI death rate fell sharply following the UPP occupation in 2010–2012 and remained low through roughly 2014–2015, then rose steadily as the UPP entered a period of fiscal constraint and operational contraction. Police action intensity does not track this pattern: it remains elevated throughout the post-pacification period without a corresponding reduction in CVLI. The Pearson correlation between the monthly smoothed series is not statistically significant ($r \approx 0.2$, $p > 0.05$). This absence of a simple negative correlation is the first empirical motivation for a mechanistic model.

5. A Simple Dynamical Model

Basic formulation

I start from a predator-prey-style system, which is commonly used to model relationships between police and criminals (see Sooknanan, J., Bhatt, B., & Comissiong, D. M. G. 2016), where $H(t)$ is the CVLI death rate and $P(t)$ is the police enforcement intensity:

$$\begin{align} \frac{dP}{dt} &= \alpha\, H(t - \tau) \\[6pt] \frac{dH}{dt} &= \gamma\, H(t) - \delta\, P(t)\, H(t) \end{align}$$

Here $\delta$ is police effectiveness, $\alpha$ is the sensitivity of deployment to rising crime, $\tau$ is the response delay, and $\gamma$ is the intrinsic crime growth rate in the absence of enforcement. Rather than solving the full coupled system, I use the observed (GAM-smoothed) police action series directly as the input $P(t)$ and integrate only the $H(t)$ equation forward.

Python — Euler integration with observed P(t)
P  = gam_amp.predict(x_new)
H  = np.zeros(len(x_new) + 1)
H[0] = gam_cvli.predict(x_new)[0]
dt = x_new[1] - x_new[0]
pars = {'gamma': 0.4, 'delta': 0.028, 'Hmax': 200, 'tau': 1}

for idx, t in enumerate(x_new):
    Hd   = H[idx - pars['tau']] if idx >= pars['tau'] else 0
    dHdt = pars['gamma'] * H[idx] * (1 - H[idx] / pars['Hmax']) \
           - pars['delta'] * P[idx] * H[idx]
    H[idx + 1] = H[idx] + dHdt * dt

Time-varying parameters

The empirical series shows a structural shift around 2012–2014 that a constant-coefficient model cannot reproduce. Two mechanisms can account for this: an increase in the intrinsic crime growth rate $\gamma$ as criminal organizations adapted to UPP presence, and a decline in police effectiveness $\delta$ as institutional legitimacy eroded. I model both as sigmoidal transitions centred at $t_c \approx 2012$:

$$\begin{align} \gamma(t) &= \frac{\gamma_+}{1 + e^{-b_1(t - t_c)}} + \gamma_0 \\[6pt] \delta(t) &= \frac{\delta_0 - \delta_-}{1 + e^{b_2(t - t_c)}} + \delta_- \end{align}$$
Connection to institutional theory
The time-variation in $\delta(t)$ formalizes Evans' (1995) argument that enforcement effectiveness depends on the state's social embeddedness in the community. As legitimacy erodes, the same enforcement intensity produces progressively less crime reduction.

Three scenarios

Scenario$\gamma$$\delta$Description
1constantconstantBaseline homogeneous model
2$\gamma(t)$constantAdaptive criminal growth only
3$\gamma(t)$$\delta(t)$Adaptive growth + declining effectiveness
Model results for three scenarios against observed CVLI series in AISP 16
Figure 4. Simulated CVLI death rate per 100,000 inhabitants under three model scenarios (colored lines) against the GAM-smoothed observed trend (dashed black) for AISP 16, 2006–2025. Scenario 1 fails to capture the post-2012 resurgence. Scenario 3, with time-varying $\gamma$ and $\delta$, produces the closest match. Source: ISP-RJ; author's calculations.

Only once we allow for a structural decline in enforcement effectiveness — a declining $\delta(t)$ — does the model begin to approximate the observed trajectory. Formal calibration via nonlinear least squares and sensitivity analysis remain to be done.

6. Discussion

Several patterns emerge consistently across the spatial, time-series, and modeling components of the analysis.

Shooting violence in Rio de Janeiro is highly concentrated in favela territory. The median annual victim rate per 100,000 inhabitants inside favelas is roughly an order of magnitude higher than in non-favela areas within the same AISPs, across the full distribution of communities.

The relationship between police enforcement intensity and lethal crime in AISP 16 is not well described by simple deterrence logic. The sharp CVLI reduction following the 2010–2012 occupation was not maintained despite continued enforcement activity in subsequent years, consistent with the findings of Bellégo and Drouard (2024) at the UPP programme level.

The dynamical model provides a candidate mechanism. If police effectiveness $\delta$ declines over time as institutional legitimacy erodes, then constant or increasing enforcement intensity will produce rising crime outcomes after a threshold. The October 2025 Megaoperação Contenção fits naturally into this framework: by the time of the operation, the institutional legitimacy of the state in the Complexo do Alemão/Penha had been depleted by years of abusive enforcement and the effective collapse of the UPP community policing model. A massive enforcement operation in a low-legitimacy environment should produce a large transient spike in police-involved incidents without generating sustained reductions in community violence — because the mechanism through which enforcement reduces crime (community cooperation, information sharing, and the social embedding of formal authority) is absent. The Fogo Cruzado data in the months following the operation are consistent with this prediction.

The next steps are to extend the model to include a third state variable for institutional legitimacy, implement formal nonlinear least squares calibration, incorporate Disque Denúncia data as a reporting-correction mechanism and legitimacy proxy, and extend the comparative analysis to Rocinha to exploit the cross-territory variation that motivates the comparative case design.

Data sources

SourceDataAccess
Instituto Fogo CruzadoGeoreferenced shooting incidents with victim counts, 2022–2024api.fogocruzado.org.br
ISP-RJMonthly CVLI, robbery, and police action statistics by CISP/AISP, 2003–2025ispdados.rj.gov.br
IBGE Censo Demográfico 2022Population by neighborhood; FCU shapefilecenso2022.ibge.gov.br
SISPOL/PMERJAISP and CISP boundary shapefiles (July 2024)Via ISP-RJ
geobrRio de Janeiro municipality and state geometriesgithub.com/ipeaGIT/geobr
All code and processed data for this post are available at [repository link]. Figures were generated in Python using geopandas, matplotlib, seaborn, and pygam. The ODE integration uses a simple forward Euler scheme; model results should be treated as qualitative illustrations pending formal calibration.