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
🔴 Mapa de Calor
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.
🕒 Franja Horaria
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.
📈 Línea de Tiempo
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.
📍 Coordenadas
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:
📥 1. Descarga y unificación de archivos
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.
🏘️ 2. Normalización de nombres de barrios
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.
🕑 3. Formateo de la hora
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:
🌅 4. Clasificación por franjas horarias
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»
)
🧹 5. Filtrado de registros fuera de CABA
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»
)
📍 6. Corrección del formato de coordenadas
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.)
📊 7. Creación de medidas personalizadas
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»)
)
🎨 8. Visualizaciones y diseño
Finalmente, construí el dashboard y le di el diseño ayudandome de Canva.

