Análisis de Delitos en CABA

Este proyecto en Power BI ofrece una visualización interactiva y dinámica de los delitos ocurridos en la Ciudad Autónoma de Buenos Aires (CABA), con el objetivo de facilitar el análisis territorial, temporal y tipológico de los hechos delictivos registrados. La herramienta está organizada en cuatro solapas principales, cada una enfocada en un aspecto específico de la problemática.

Explicación de las Solapas

Presenta una vista geográfica con un mapa de calor que muestra la concentración de delitos por barrio. Se puede filtrar por año para observar la evolución a lo largo del tiempo. Incluye también:

  • Gráficos de delitos por tipo.

  • Dos gráficos tipo dona que destacan los delitos cometidos con armas y en moto.

  • Una tabla con los subtipos de delitos, brindando mayor nivel de detalle.

Visualiza la distribución de los delitos según la hora del día y el día de la semana, permitiendo detectar patrones temporales y posibles franjas críticas de inseguridad.

Muestra una evolución temporal de los delitos mediante una línea de tiempo agrupada por mes y año. Esta sección permite detectar tendencias generales y picos de actividad delictiva a lo largo de los períodos analizados.

Incluye un mapa con la geolocalización exacta de cada delito. Además, integra un reloj animado que permite reproducir la actividad delictiva hora por hora, brindando una visualización dinámica y precisa de cómo se distribuyen los hechos delictivos en el espacio-tiempo.

Preparación de la Base de Datos - Paso a Paso

Para construir este tablero interactivo en Power BI, lo primero que hice fue preparar y transformar la base de datos original para asegurar su consistencia, limpieza y utilidad analítica. A continuación detallo el proceso:

  • Descargué los datasets de delitos de https://data.buenosaires.gob.ar/dataset/delitos

  • Los archivos estaban divididos por año, así que los puse todos juntos en una carpeta local.

  • En Power BI utilicé la opción de importar varios archivos desde una carpeta, lo que me permitió unificarlos automáticamente, ya que todos compartían la misma estructura de columnas.

  • Los nombres de barrios venían con errores, variaciones y formatos inconsistentes.

  • Realicé una limpieza y normalización de esos valores para que coincidieran con los 48 barrios oficiales de CABA.

  • La columna de hora venía en formato numérico (por ejemplo: 14, 13, etc.).

  • Para convertirla en un formato de hora legible, creé una columna calculada en DAX:

Hora = TIME('Delitos'[franja], 0, 0)

A partir de la columna de hora, definí franjas simplificadas para agrupar los delitos en turnos del día:

Franja Simplificada =
SWITCH(TRUE(),
‘Delitos'[franja] >= 0 && ‘Delitos'[franja] < 6, «Madrugada»,
‘Delitos'[franja] >= 6 && ‘Delitos'[franja] < 12, «Mañana»,
‘Delitos'[franja] >= 12 && ‘Delitos'[franja] < 18, «Tarde»,
‘Delitos'[franja] >= 18 && ‘Delitos'[franja] < 24, «Noche»,
«Sin Datos»
)

  • Algunos registros venían con barrios que no pertenecen a la Ciudad de Buenos Aires.

  • Para filtrar correctamente, creé esta comprobación con los 48 barrios oficiales

EsCABA =
IF (
CONTAINSROW (
{
«AGRONOMIA», «ALMAGRO», «BALVANERA», «BARRACAS», «BELGRANO»,
«BOEDO», «CABALLITO», «CHACARITA», «COGHLAN», «COLEGIALES»,
«CONSTITUCION», «FLORES», «FLORESTA», «LA BOCA», «LA PATERNAL»,
«LINIERS», «MATADEROS», «MONTE CASTRO», «MONSERRAT», «NUEVA POMPEYA»,
«NUÑEZ», «PALERMO», «PARQUE AVELLANEDA», «PARQUE CHACABUCO»,
«PARQUE CHAS», «PARQUE PATRICIOS», «PUERTO MADERO», «RECOLETA»,
«RETIRO», «SAAVEDRA», «SAN CRISTOBAL», «SAN NICOLAS», «SAN TELMO»,
«VELEZ SARSFIELD», «VERSALLES», «VILLA CRESPO», «VILLA DEL PARQUE»,
«VILLA DEVOTO», «VILLA GRAL. MITRE», «VILLA LUGANO», «VILLA LURO»,
«VILLA ORTUZAR», «VILLA PUEYRREDON», «VILLA REAL», «VILLA RIACHUELO»,
«VILLA SANTA RITA», «VILLA SOLDATI», «VILLA URQUIZA»
},
UPPER([BARRIO])
),
«ES CABA»,
«NO ES CABA»
)

  • La latitud y longitud venían en un formato que no era compatible con el visual del mapa.

  • Las transformé para que tengan punto decimal, usando esta fórmula en DAX:

Lat =
VAR LatText = [Latitud]
VAR LenLat = LEN(LatText)
VAR PrimerosTres = IF(LenLat >= 3, LEFT(LatText, 3), LatText)
VAR Resto = IF(LenLat > 3, MID(LatText, 4, LenLat – 3), «»)
RETURN
PrimerosTres & IF(LenLat > 3, «.», «») & Resto

(Lo mismo apliqué para la longitud.)

  • La tabla ya venía bastante limpia, por lo que no requería demasiadas transformaciones adicionales. Me enfoqué en crear visualizaciones.

  • Solo armé algunas medidas DAX para enriquecer los análisis, como por ejemplo:

Promedio de delitos por día:

Promedio Delitos por Día =
DIVIDE(
SUM(‘Delitos'[cantidad]),
DISTINCTCOUNT(‘Delitos'[fecha])
)

Etiqueta dinámica para el año filtrado:

Año Filtrado =
VAR Anos = VALUES(Delitos[anio])
VAR Cant = COUNTROWS(Anos)
VAR MinAno = MIN(Delitos[anio])
VAR MaxAno = MAX(Delitos[anio])
RETURN
SWITCH(
TRUE(),
Cant = 0, «Todos»,
Cant = 1, FORMAT(MAXX(Anos, Delitos[anio]), «0»),
Cant > 1, «Desde » & FORMAT(MinAno, «0») & » hasta » & FORMAT(MaxAno, «0»)
)

  • Finalmente, construí el dashboard y le di el diseño ayudandome de Canva.

Scroll al inicio