Analisis Geografico de Crimenes en Chicago
Introducción
Con el propósito de aplicar los conocimientos adquiridos durante el curso de Inteligencia de Negocios, se plantea llevar a cabo un análisis geográfico de los crímenes en Chicago, Estados Unidos. El conjunto de datos utilizado se obtendrá del repositorio de Kaggle, específicamente del siguiente enlace: https://www.kaggle.com/datasets/currie32/crimes-in-chicago. Para este análisis, se selecciono los registros del año 2014.
El objetivo principal de este análisis es comprender la variación estacional mensual de los crímenes en Chicago. Además, se pretende identificar los delitos más recurrentes en distintas localidades de la ciudad.
Este enfoque permitirá obtener insights valiosos sobre la distribución geográfica de los crímenes a lo largo de un año, así como destacar patrones estacionales que podrían ser de interés para la toma de decisiones en el ámbito de la seguridad pública.
Preguntas de Investigación:
Con el objetivo de abordar el análisis geográfico de los crímenes en Chicago, se formularán dos preguntas investigativas. Estas serán respondidas mediante el empleo de estadísticas descriptivas y análisis detallado:
Se explorarán tendencias, patrones estacionales y posibles factores influyentes que hayan impactado la frecuencia de crímenes en la ciudad a lo largo de los meses en el año 2014.
Se analizarán las estadísticas por área geográfica para identificar patrones específicos y entender la distribución de tipos de crímenes en la ciudad, proporcionando así información valiosa para la formulación de estrategias de seguridad localizadas.
Estadisticas descriptivas
Dataset <- read.csv("C:/Users/yquitian/OneDrive - CasaLuker S.A/Escritorio/Maestria/Chicago_Crimes_2012_to_2017_.csv", sep=";")
# Imprimir las primeras filas del dataset para verificar
head(Dataset)
## ID Case.Number Date Block
## 1 10512552 HZ253503 11/1/14 9:00 AM 004XX E ERIE ST
## 2 10517063 HZ259229 12/10/14 12:00 PM 063XX S KOMENSKY AVE
## 3 10517120 HZ259337 1/1/14 9:00 AM 035XX W LE MOYNE ST
## 4 10518590 HZ259878 2/26/14 10:15 AM 0000X E 9TH ST
## 5 10518648 HZ260491 7/1/14 8:00 AM 092XX S MANISTEE AVE
## 6 10466568 HZ205549 1/1/14 12:00 PM 105XX S WABASH AVE
## Primary.Type Description
## 1 DECEPTIVE PRACTICE ILLEGAL USE CASH CARD
## 2 DECEPTIVE PRACTICE FINANCIAL IDENTITY THEFT OVER $ 300
## 3 DECEPTIVE PRACTICE FINANCIAL IDENTITY THEFT OVER $ 300
## 4 DECEPTIVE PRACTICE FINANCIAL IDENTITY THEFT OVER $ 300
## 5 DECEPTIVE PRACTICE FINANCIAL IDENTITY THEFT OVER $ 300
## 6 CRIM SEXUAL ASSAULT PREDATORY
## Location.Description Arrest Domestic Beat District Ward
## 1 ATM (AUTOMATIC TELLER MACHINE) FALSE FALSE 1834 18 42
## 2 RESIDENCE FALSE FALSE 813 8 13
## 3 RESIDENCE FALSE FALSE 1422 14 26
## 4 FALSE FALSE 123 1 2
## 5 RESIDENCE FALSE FALSE 423 4 7
## 6 RESIDENCE FALSE FALSE 512 5 9
## Community.Area X.Coordinate Y.Coordinate Year Latitude Longitude Location
## 1 8 NA NA 2014
## 2 65 NA NA 2014
## 3 23 NA NA 2014
## 4 32 NA NA 2014
## 5 48 NA NA 2014
## 6 49 NA NA 2014
#Contar valores nulos por columna
nulos_por_columna <- colSums(is.na(Dataset))
print(nulos_por_columna)
## ID Case.Number Date
## 0 0 0
## Block Primary.Type Description
## 0 0 0
## Location.Description Arrest Domestic
## 0 0 0
## Beat District Ward
## 0 0 2
## Community.Area X.Coordinate Y.Coordinate
## 1 4323 4323
## Year Latitude Longitude
## 0 0 0
## Location
## 0
datos_sin_nulos <- na.omit(Dataset)
#Mostrar las primeras filas del nuevo conjunto de datos
head(datos_sin_nulos)
## ID Case.Number Date Block
## 7 9792948 HX441974 9/24/14 7:42 AM 114XX S STEWART AVE
## 11 9746045 HX395851 8/20/14 7:59 AM 046XX S KEDZIE AVE
## 12 9898680 HX548935 12/20/14 3:05 AM 069XX N SHERIDAN RD
## 32 9905633 HX556167 12/27/14 2:21 AM 008XX N WALLER AVE
## 35 10521555 HZ263643 3/28/14 12:00 PM 048XX N LONG AVE
## 46 9514244 HX169413 3/2/14 1:21 AM 023XX E 67TH ST
## Primary.Type Description Location.Description Arrest
## 7 CRIMINAL TRESPASS TO RESIDENCE RESIDENCE PORCH/HALLWAY FALSE
## 11 ROBBERY ARMED: HANDGUN SMALL RETAIL STORE TRUE
## 12 CRIM SEXUAL ASSAULT NON-AGGRAVATED APARTMENT TRUE
## 32 BURGLARY ATTEMPT FORCIBLE ENTRY APARTMENT TRUE
## 35 SEX OFFENSE CRIMINAL SEXUAL ABUSE PARK PROPERTY FALSE
## 46 PUBLIC PEACE VIOLATION FALSE POLICE REPORT CTA BUS STOP TRUE
## Domestic Beat District Ward Community.Area X.Coordinate Y.Coordinate Year
## 7 FALSE 522 5 34 49 1175674 1829041 2014
## 11 FALSE 821 8 14 58 1155814 1873754 2014
## 12 FALSE 2431 24 49 1 1166730 1946444 2014
## 32 FALSE 1511 15 29 25 1138206 1905064 2014
## 35 FALSE 1623 16 45 11 1139465 1931490 2014
## 46 FALSE 331 3 5 42 1193024 1860999 2014
## Latitude Longitude Location
## 7 41,68625271 -87,63251787 (41.686252712, -87.632517867)
## 11 41,80937285 -87,70402497 (41.809372853, -87.704024967)
## 12 42,00861253 -87,66189989 (42.008612529, -87.661899888)
## 32 41,8956277 -87,76785283 (41.895627701, -87.767852831)
## 35 41,96812055 -87,76258263 (41.968120549, -87.762582634)
## 46 41,77354357 -87,56796336 (41.773543569, -87.567963357)
nulos_por_columna2 <- colSums(is.na(datos_sin_nulos))
print(nulos_por_columna2)
## ID Case.Number Date
## 0 0 0
## Block Primary.Type Description
## 0 0 0
## Location.Description Arrest Domestic
## 0 0 0
## Beat District Ward
## 0 0 0
## Community.Area X.Coordinate Y.Coordinate
## 0 0 0
## Year Latitude Longitude
## 0 0 0
## Location
## 0
Dataset <-datos_sin_nulos
Dataset$Date <- as.POSIXct(Dataset$Date, format = "%m/%d/%y %I:%M %p")
summary(Dataset)
## ID Case.Number Date
## Min. : 9446748 Length:268897 Min. :2014-01-01 01:00:00.00
## 1st Qu.: 9572934 Class :character 1st Qu.:2014-04-11 03:45:00.00
## Median : 9686304 Mode :character Median :2014-07-04 10:20:00.00
## Mean : 9685239 Mean :2014-07-03 17:07:14.47
## 3rd Qu.: 9799306 3rd Qu.:2014-09-26 01:50:00.00
## Max. :10521555 Max. :2014-12-31 12:59:00.00
## Block Primary.Type Description Location.Description
## Length:268897 Length:268897 Length:268897 Length:268897
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## Arrest Domestic Beat District Ward
## Mode :logical Mode :logical Min. : 111 Min. : 1.00 Min. : 1.00
## FALSE:191148 FALSE:229239 1st Qu.: 612 1st Qu.: 6.00 1st Qu.:10.00
## TRUE :77749 TRUE :39658 Median :1023 Median :10.00 Median :23.00
## Mean :1142 Mean :11.19 Mean :22.76
## 3rd Qu.:1651 3rd Qu.:16.00 3rd Qu.:34.00
## Max. :2535 Max. :31.00 Max. :50.00
## Community.Area X.Coordinate Y.Coordinate Year
## Min. : 1.00 Min. : 0 Min. : 0 Min. :2014
## 1st Qu.:23.00 1st Qu.:1152334 1st Qu.:1858541 1st Qu.:2014
## Median :32.00 Median :1165890 Median :1891055 Median :2014
## Mean :37.59 Mean :1164191 Mean :1885099 Mean :2014
## 3rd Qu.:56.00 3rd Qu.:1176364 3rd Qu.:1908303 3rd Qu.:2014
## Max. :77.00 Max. :1205119 Max. :1951499 Max. :2014
## Latitude Longitude Location
## Length:268897 Length:268897 Length:268897
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
str(Dataset)
## 'data.frame': 268897 obs. of 19 variables:
## $ ID : int 9792948 9746045 9898680 9905633 10521555 9514244 9712460 9814194 9856640 9723683 ...
## $ Case.Number : chr "HX441974" "HX395851" "HX548935" "HX556167" ...
## $ Date : POSIXct, format: "2014-09-24 07:42:00" "2014-08-20 07:59:00" ...
## $ Block : chr "114XX S STEWART AVE" "046XX S KEDZIE AVE" "069XX N SHERIDAN RD" "008XX N WALLER AVE" ...
## $ Primary.Type : chr "CRIMINAL TRESPASS" "ROBBERY" "CRIM SEXUAL ASSAULT" "BURGLARY" ...
## $ Description : chr "TO RESIDENCE" "ARMED: HANDGUN" "NON-AGGRAVATED" "ATTEMPT FORCIBLE ENTRY" ...
## $ Location.Description: chr "RESIDENCE PORCH/HALLWAY" "SMALL RETAIL STORE" "APARTMENT" "APARTMENT" ...
## $ Arrest : logi FALSE TRUE TRUE TRUE FALSE TRUE ...
## $ Domestic : logi FALSE FALSE FALSE FALSE FALSE FALSE ...
## $ Beat : int 522 821 2431 1511 1623 331 331 1021 922 623 ...
## $ District : int 5 8 24 15 16 3 3 10 9 6 ...
## $ Ward : int 34 14 49 29 45 5 5 24 12 6 ...
## $ Community.Area : int 49 58 1 25 11 42 43 29 58 69 ...
## $ X.Coordinate : int 1175674 1155814 1166730 1138206 1139465 1193024 1193387 1153710 1160166 1177141 ...
## $ Y.Coordinate : int 1829041 1873754 1946444 1905064 1931490 1860999 1860848 1893244 1873163 1852951 ...
## $ Year : int 2014 2014 2014 2014 2014 2014 2014 2014 2014 2014 ...
## $ Latitude : chr "41,68625271" "41,80937285" "42,00861253" "41,8956277" ...
## $ Longitude : chr "-87,63251787" "-87,70402497" "-87,66189989" "-87,76785283" ...
## $ Location : chr "(41.686252712, -87.632517867)" "(41.809372853, -87.704024967)" "(42.008612529, -87.661899888)" "(41.895627701, -87.767852831)" ...
## - attr(*, "na.action")= 'omit' Named int [1:4325] 1 2 3 4 5 6 8 9 10 13 ...
## ..- attr(*, "names")= chr [1:4325] "1" "2" "3" "4" ...
View(Dataset)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
# Calcular la frecuencia de Primary Type y organizar por frecuencia ascendente
freq_table <- Dataset %>%
count(`Primary.Type`, sort = TRUE) %>%
rename(`Primary.Type` = `Primary.Type`, Frequency = n)
# Crear el gráfico de barras de menor a mayor
ggplot(freq_table, aes(x = reorder(Primary.Type, Frequency), y = Frequency)) +
geom_bar(stat = "identity", fill = "skyblue") +
coord_flip() +
labs(title = "Gráfico I.Cantidad de Crímenes en Chicago (Año: 2014)", x = "Tipo de Crimen", y = "Cantidad")
De acuerdo con los datos suministrados para el año 2014 el total de crimenes cometidos en Chicago fue de 268.897, ademas en el grafico I, se puede evidenciar que en el año 2014 el crimen mas cometido en Chicago es Theft que en español se refiere al robo el cual es el acto de tomar ilegalmente la propiedad de otra persona, ademas crimenes como BATTERY (Agresión Fisica), Criminal Damage (Daño Criminal), Narcotics (Narcotics) y OTHER OFFENSE (Otro delitos) son los crimenes con mayor frecuencia en Chicago.
library(dplyr)
library(ggplot2)
# Suponiendo que tienes una columna "Arrest" en tu conjunto de datos Dataset
# Calcular la frecuencia de arrestos y no arrestos
arrest_freq <- Dataset %>%
count(Arrest)
# Calcular los porcentajes
arrest_freq <- arrest_freq %>%
mutate(Percentage = n / sum(n) * 100)
# Crear el gráfico de torta con porcentajes
ggplot(arrest_freq, aes(x = "", y = Percentage, fill = factor(Arrest))) +
geom_bar(stat = "identity", width = 1, color = "white") +
coord_polar("y") +
labs(title = "Grafico II. Proporción de Arrestos en Chicago",
fill = "Arresto",
x = NULL,
y = NULL) +
theme_minimal() +
scale_fill_manual(values = c("#1f78b4", "#33a02c")) + # Colores para TRUE y FALSE +
geom_text(aes(label = sprintf("%.1f%%", Percentage)), position = position_stack(vjust = 0.5)) # Añadir etiquetas de porcentaje
Ahora bien que tan efectiva es la fuerza policial en Chicago, pues segun el grafico II, de los 268.897 casos reportados solo el 28.9% de los casos tuvieron un arresto y el 71.1% no tuvo como resultado un arresto.
Ahora bien cuales son esos crimenes que son mas faciles de arrestar para la policia y cuales no? Para resolver esta pregunta se presentan los siguientes graficos de barras.
library(dplyr)
library(ggplot2)
# Suponiendo que tienes una columna "Primary.Type" y "Arrest" en tu conjunto de datos Dataset
# Filtrar los datos donde Arrest es TRUE
arrested_crimes <- Dataset %>%
filter(Arrest == TRUE)
# Calcular la frecuencia de cada tipo de crimen con arresto
arrested_crimes_freq <- arrested_crimes %>%
count(Primary.Type) %>%
arrange(desc(n))
# Seleccionar los N tipos de crimen con más arrestos
top_n_crimes <- arrested_crimes_freq %>%
top_n(10, wt = n) # Cambia 10 por el número deseado de tipos de crimen a mostrar
# Crear el gráfico de barras con orden de derecha a izquierda
ggplot(top_n_crimes, aes(x = reorder(Primary.Type, -n), y = n)) +
geom_bar(stat = "identity", fill = "#1f78b4") +
labs(title = "Grafico III. Tipos de crímenes con más arrestos en Chicago",
x = "Tipo de Crimen",
y = "Cantidad de Arrestos") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))
Pues bien, de acuerdo al gráfico III, observamos que los crímenes con mayor cantidad de arrestos son NARCÓTICOS (NARCOTICS), AGRESIÓN (BATTERY) y ROBO (THEFT). Por otro lado, los demás tipos de crímenes presentan una tasa de arrestos más baja. Este fenómeno puede asociarse al hecho de que la fuerza policial en Chicago está altamente capacitada para detectar y abordar este tipo de crímenes.
La prioridad de aplicación de la ley en Estados Unidos juega un papel crucial en esta dinámica. Las agencias policiales suelen dar alta prioridad a la lucha contra el tráfico y la distribución de drogas ilegales, dado su impacto significativo en la salud pública y la seguridad. Este enfoque priorizado puede traducirse en una mayor efectividad en la identificación y detención de aquellos involucrados en actividades relacionadas con narcóticos.
Adicionalmente, las actividades vinculadas a los narcóticos pueden ser más visibles o más fáciles de detectar para las fuerzas del orden en comparación con otros tipos de delitos. Esta mayor visibilidad, junto con la capacitación especializada de la policía en este ámbito, podría explicar la diferencia en las tasas de arresto observadas en el análisis del gráfico III.
library(dplyr)
library(ggplot2)
# Suponiendo que tienes una columna "Primary.Type" y "Arrest" en tu conjunto de datos Dataset
# Filtrar los datos donde Arrest es FALSE
non_arrested_crimes <- Dataset %>%
filter(Arrest == FALSE)
# Calcular la frecuencia de cada tipo de crimen sin arresto
non_arrested_crimes_freq <- non_arrested_crimes %>%
count(Primary.Type) %>%
arrange(desc(n))
# Seleccionar los N tipos de crimen con más casos sin arresto
top_n_non_arrested_crimes <- non_arrested_crimes_freq %>%
top_n(10, wt = n) # Cambia 10 por el número deseado de tipos de crimen a mostrar
# Crear el gráfico de barras con orden de derecha a izquierda
ggplot(top_n_non_arrested_crimes, aes(x = reorder(Primary.Type, -n), y = n)) +
geom_bar(stat = "identity", fill = "#33a02c") +
labs(title = "Grafico IV. Tipos de crímenes con más casos sin arresto en Chicago",
x = "Tipo de Crimen",
y = "Cantidad de Casos sin Arresto") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))
En el análisis del gráfico IV, se observa que los crímenes menos propensos a resultar en arrestos por parte de la policía son los robos convencionales, tales como robo (THEFT), agresión (BATTERY) y daño criminal (CRIMINAL DAMAGE). Esta tendencia podría vincularse con diversos factores, entre ellos, la dificultad para identificar a los delincuentes, las prioridades policiales y la propia naturaleza de estos delitos.
En casos de robo, por ejemplo, la rapidez con la que puede ocurrir el acto delictivo y la falta de testigos presenciales pueden dificultar la intervención policial inmediata. Asimismo, en situaciones de agresión y daño criminal, donde la identificación del perpetrador puede ser más compleja y las prioridades policiales podrían centrarse en crímenes más graves, la probabilidad de arresto disminuye.
Este análisis subraya la importancia de considerar no solo la incidencia delictiva, sino también los desafíos inherentes a la aplicación de la ley, proporcionando una perspectiva más completa de los patrones de crímenes y sus implicaciones en la seguridad pública.
library(dplyr)
library(ggplot2)
# Suponiendo que tienes una columna "Location.Description" en tu conjunto de datos Dataset
# Calcular la frecuencia de crímenes por ubicación
location_freq <- Dataset %>%
count(Location.Description) %>%
arrange(desc(n)) # Ordenar de mayor a menor frecuencia
# Seleccionar las N ubicaciones con más crímenes para mostrar en el heatmap
top_n_locations <- location_freq %>%
top_n(10, wt = n) # Cambia 10 por el número deseado de ubicaciones a mostrar
# Crear el heatmap
ggplot(top_n_locations, aes(x = reorder(Location.Description, -n), y = 1, fill = n)) +
geom_tile() +
labs(title = "Grafico V. Distribución de crímenes por ubicación en Chicago",
x = "Ubicación",
y = NULL, # Eliminar etiqueta del eje y
fill = "Cantidad de Crímenes") +
scale_fill_gradient(low = "lightblue", high = "darkblue") + # Colores del heatmap
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))
El análisis del heatmap anterior revela que la mayor concentración de crímenes se registra en ubicaciones como calles, residencias, apartamentos y aceras. Este patrón sugiere una asociación con los crímenes comunes que ocurren en entornos urbanos y puede atribuirse a diversos factores, entre ellos la densidad poblacional en estas áreas.
Es relevante destacar que la presencia de crímenes en calles y aceras podría relacionarse con la actividad social y la interacción entre individuos en espacios públicos. Por otro lado, la alta incidencia en residencias y apartamentos podría estar influenciada por factores como condiciones de iluminación, diseño urbano y características propias de estos entornos.
Este análisis resalta la complejidad de los determinantes que contribuyen a la distribución geográfica de los crímenes y destaca la importancia de considerar no solo factores socioeconómicos, sino también elementos urbanos y de diseño en la comprensión de los patrones delictivos en la ciudad.
Análisis
Ahora bien resulta intersante conocer la incidencia de crímenes en Chicago a lo largo del tiempo, para esto se propone el siguiente grafico.
library(dplyr)
library(ggplot2)
library(lubridate)
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
# Suponiendo que tienes una columna "Date" en tu conjunto de datos Dataset
# Convertir la columna Date a formato de fecha
Dataset$Date <- as.Date(Dataset$Date, format = "%m/%d/%Y")
# Extraer el mes y el año de la columna Date
Dataset$Month <- month(Dataset$Date, label = TRUE)
Dataset$Year <- year(Dataset$Date)
# Calcular la frecuencia de cada mes por año
freq_table <- Dataset %>%
count(Year, Month)
# Crear el gráfico de líneas conectadas (connected scatter plot)
ggplot(freq_table, aes(x = Month, y = n, group = Year, color = as.factor(Year))) +
geom_line(aes(group = Year)) +
geom_point() +
labs(title = "Grafico VI. Frecuencia de crímenes por mes en Chicago Año:2014",
x = "Mes",
y = "Frecuencia",
color = "Año") +
scale_x_discrete(labels = month.abb) +
theme_minimal()
De acuerdo con el análisis del Gráfico VI, que examina la cantidad de crímenes a lo largo de un año fiscal en Chicago, se destaca que el mes con la mayor incidencia de crímenes reportados es julio. Esta tendencia podría vincularse con las condiciones climáticas favorables durante el verano, propiciando una mayor actividad social y tiempo al aire libre. Resulta relevante señalar que los meses más críticos abarcan el período de mayo a agosto, sugiriendo una estacionalidad marcada en la actividad delictiva.
Por otro lado, se observa que los meses con la menor cantidad de crímenes se encuentran al inicio y al final del año, específicamente en enero, noviembre y diciembre. Esta reducción podría asociarse a factores climáticos, ya que en enero, Chicago experimenta inviernos fríos con temperaturas bajas. Las condiciones adversas pueden disminuir la actividad al aire libre y la interacción entre personas, influyendo en las tasas de ciertos tipos de crímenes.
En el caso de noviembre y diciembre, el descenso en las tasas de crimen podría relacionarse con un aumento en la presencia policial y la conciencia pública sobre la seguridad durante las festividades. Además, las personas tienden a pasar más tiempo en casa o con sus familias durante estas fechas, lo que podría contribuir a la disminución de algunos tipos de crímenes. Este análisis subraya la complejidad de los factores que influyen en los patrones de criminalidad y destaca la importancia de considerar múltiples variables para una comprensión más completa.
# Suponiendo que tienes una columna "Date" en tu conjunto de datos Dataset
# Convertir la columna Date a formato de fecha
Dataset$Date <- as.Date(Dataset$Date, format = "%m/%d/%Y")
# Extraer el mes y el año de la columna Date
Dataset$Month <- month(Dataset$Date, label = TRUE)
Dataset$Year <- year(Dataset$Date)
# Filtrar los datos para los tipos de crimen deseados
selected_crimes <- c("THEFT", "BATTERY", "NARCOTICS", "OTHER OFFENSE", "DECEPTIVE PRACTICE", "ASSAULT")
selected_data <- Dataset %>%
filter(`Primary.Type` %in% selected_crimes)
# Calcular la frecuencia de cada mes por año para los tipos de crimen seleccionados
freq_table <- selected_data %>%
count(Year, Month, `Primary.Type`)
# Crear el gráfico de líneas conectadas para los tipos de crimen seleccionados
ggplot(freq_table, aes(x = Month, y = n, group = interaction(Year, `Primary.Type`), color = as.factor(Year))) +
geom_line(aes(group = interaction(Year, `Primary.Type`))) +
geom_point() +
labs(title = "VII. Frecuencia de crímenes por mes y año en Chicago",
x = "Mes",
y = "Frecuencia",
color = "Año") +
scale_x_discrete(labels = month.abb) +
theme_minimal() +
facet_wrap(~`Primary.Type`, scales = "free_y", ncol = 3) +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
Resulta intrigante identificar los meses con la mayor cantidad de casos reportados, especialmente al considerar los seis tipos de crímenes más frecuentes. El gráfico VII refleja claramente que el delito de robo (THEFT) alcanza su punto álgido en julio, coincidiendo con la temporada de verano. Por otro lado, los casos de asalto (ASSAULT) y agresión (BATTERY) exhiben picos notables de mayo a octubre, sugiriendo una posible correlación con condiciones climáticas más cálidas y un aumento en las actividades al aire libre durante estos meses.
Sin embargo, la dinámica es diferente para el crimen de práctica engañosa (DECEPTIVE PRACTICE), que presenta sus picos en marzo. Este patrón podría asociarse con eventos específicos o situaciones estacionales distintas. En un análisis general, se destaca que los últimos meses e inicios del año experimentan una disminución en la incidencia de estos seis delitos, fenómeno que parece vinculado a factores climáticos y eventos especiales asociados a la temporada.
Es crucial profundizar en el análisis considerando también factores históricos, geográficos y socioeconómicos para obtener una comprensión más completa de los patrones observados. La exploración de tendencias a lo largo del tiempo y en diferentes contextos puede proporcionar insights valiosos sobre la dinámica de la criminalidad en Chicago.
# Ajustar el tamaño de la ventana de visualización
options(repr.plot.width=10, repr.plot.height=6)
# Tu código para crear el mapa de calor aquí
library(ggmap)
## ℹ Google's Terms of Service: <https://mapsplatform.google.com>
## Stadia Maps' Terms of Service: <https://stadiamaps.com/terms-of-service/>
## OpenStreetMap's Tile Usage Policy: <https://operations.osmfoundation.org/policies/tiles/>
## ℹ Please cite ggmap if you use it! Use `citation("ggmap")` for details.
library(dplyr)
# Establecer clave de la API de Google Maps
apiKey <- "AIzaSyAuP4WbtmKdVTS_Ep2Kh5uAaPjPGtgtWtU"
ggmap::register_google(key = apiKey)
# Convertir las columnas de longitud y latitud a formato numérico
Dataset$Longitude <- as.numeric(gsub(",", ".", Dataset$Longitude))
Dataset$Latitude <- as.numeric(gsub(",", ".", Dataset$Latitude))
# Crear un mapa más grande de Chicago (ajustar el valor de zoom según sea necesario)
city <- get_map(location = 'chicago', zoom = 11, source = 'google')
## ℹ <https://maps.googleapis.com/maps/api/staticmap?center=chicago&zoom=11&size=640x640&scale=2&maptype=terrain&language=en-EN&key=xxx>
## ℹ <https://maps.googleapis.com/maps/api/geocode/json?address=chicago&key=xxx>
chiMap <- ggmap(city)
# Crear un mapa de calor
heatMap <- chiMap +
stat_density_2d(data = Dataset, aes(x = Longitude, y = Latitude, fill = ..level.., alpha = ..level..), geom = "polygon", color = "white") +
scale_fill_gradient(low = "blue", high = "red") +
scale_alpha(range = c(0, 0.3), guide = FALSE) +
labs(title = "Mapa de Calor en Chicago", x = "Longitud", y = "Latitud") +
theme_minimal()
# Mostrar el mapa de calor
print(heatMap)
## Warning: The dot-dot notation (`..level..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(level)` instead.
## ℹ The deprecated feature was likely used in the ggmap package.
## Please report the issue at <https://github.com/dkahle/ggmap/issues>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: Removed 20573 rows containing non-finite values (`stat_density2d()`).
## Warning: The `guide` argument in `scale_*()` cannot be `FALSE`. This was deprecated in
## ggplot2 3.3.4.
## ℹ Please use "none" instead.
## ℹ The deprecated feature was likely used in the ggmap package.
## Please report the issue at <https://github.com/dkahle/ggmap/issues>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Al observar el mapa anterior, se destacan claramente los puntos calientes donde se reportan más crímenes en la ciudad. Se nota una intensificación del color más oscuro hacia la costa del lago Michigan, indicando una concentración de incidentes. Este fenómeno puede asociarse a la aglomeración de personas atraídas por el turismo y actividades recreativas, ya que esta área suele ser el epicentro comercial de Chicago.
Además, se aprecia una notable intensidad en la zona sureste de Chicago, abarcando áreas como Austin y West Garfield Park. Esta concentración también puede relacionarse con la afluencia de personas en estos lugares, lo que, a su vez, podría contribuir a delitos concretos como BATTERY y THEFT.
Es digno de mención que las zonas que registran menos crímenes se encuentran al sur de Chicago, abarcando áreas como SOUTH SIDE y SOUTH SHORE. Asimismo, la zona norte de la ciudad, especialmente en lugares como Lincoln Park y Rogers Park, muestra una incidencia menor de crímenes. Este patrón podría asociarse a la menor densidad poblacional en estas áreas, contribuyendo a un entorno generalmente más seguro.
library(ggmap)
library(dplyr)
#install.packages("knitr")
library(knitr)
apiKey <- "AIzaSyAuP4WbtmKdVTS_Ep2Kh5uAaPjPGtgtWtU"
ggmap::register_google(key = apiKey)
map <- qmap(location = 'chicago', zoom = 9, source = 'google')
## ℹ <https://maps.googleapis.com/maps/api/staticmap?center=chicago&zoom=9&size=640x640&scale=2&maptype=terrain&language=en-EN&key=xxx>
## ℹ <https://maps.googleapis.com/maps/api/geocode/json?address=chicago&key=xxx>
Dataset$Longitude <- as.numeric(gsub(",", ".", Dataset$Longitude))
Dataset$Latitude <- as.numeric(gsub(",", ".", Dataset$Latitude))
#Clustering
coords <- Dataset[,c(18,17)]
colnames(coords) <- c("lon","lat")
set.seed(123)
# Kmeans
grupos <- kmeans(coords, 6, iter.max = 100, nstart = 1)
Dataset$cluster <- grupos$cluster
# Agrupar los datos por el número de cluster y el tipo de crimen, contando la frecuencia de cada crimen
top_crimes_by_cluster <- Dataset %>%
group_by(cluster, Primary.Type) %>%
summarise(count = n()) %>%
top_n(3, count) %>%
arrange(cluster, desc(count))
## `summarise()` has grouped output by 'cluster'. You can override using the
## `.groups` argument.
Dataset<- Dataset %>%
filter(Longitude >= -87.93432)
#scatter plot
plot <- ggplot(Dataset, aes(Longitude,Latitude))
plot <- plot + geom_point(alpha=0.3, color=Dataset$cluster)
# Convex hulls
cluster1 <- subset(Dataset, Dataset$cluster==1)
cluster2 <- subset(Dataset, Dataset$cluster==2)
cluster3 <- subset(Dataset, Dataset$cluster==3)
cluster4 <- subset(Dataset, Dataset$cluster==4)
cluster5 <- subset(Dataset, Dataset$cluster==5)
cluster6 <- subset(Dataset, Dataset$cluster==6)
# Obtener indices. Funciona solo con datos x,y
indexes1 <- chull(cluster1[,c(18,17)])
indexes2 <- chull(cluster2[,c(18,17)])
indexes3 <- chull(cluster3[,c(18,17)])
indexes4 <- chull(cluster4[,c(18,17)])
indexes5 <- chull(cluster5[,c(18,17)])
indexes6 <- chull(cluster6[,c(18,17)])
# Obtener coordenadas
hullCluster1 <- cluster1[indexes1,]
hullCluster2 <- cluster2[indexes2,]
hullCluster3 <- cluster3[indexes3,]
hullCluster4 <- cluster4[indexes4,]
hullCluster5 <- cluster5[indexes5,]
hullCluster6 <- cluster6[indexes6,]
#scatter plot
plot <- ggplot(Dataset, aes(Longitude,Latitude))
plot <- plot + geom_point(alpha=0.3, color=Dataset$cluster)
plot <- plot + geom_polygon(data=hullCluster1, alpha=.2, fill='darkblue')
plot <- plot + geom_polygon(data=hullCluster2, alpha=.2, fill='aquamarine2')
plot <- plot + geom_polygon(data=hullCluster3, alpha=.2, fill='azure3')
plot <- plot + geom_polygon(data=hullCluster4, alpha=.2, fill= 'brown3')
plot <- plot + geom_polygon(data=hullCluster5, alpha=.2, fill= 'chartreuse3')
plot <- plot + geom_polygon(data=hullCluster6, alpha=.2, fill= 'darkorchid4')
# Suponiendo que ya tienes los clusters generados en Dataset$cluster
centroides <- Dataset %>%
group_by(cluster) %>%
summarise(centroid_lon = mean(Longitude), centroid_lat = mean(Latitude))
# Convertir los centroides a un formato de texto para mostrar en el gráfico
centroides$cluster <- as.character(centroides$cluster)
centroides_label <- centroides
View(centroides)
city <- get_map(location = 'chicago', zoom = 10, source = 'google')
## ℹ <https://maps.googleapis.com/maps/api/staticmap?center=chicago&zoom=10&size=640x640&scale=2&maptype=terrain&language=en-EN&key=xxx>
## ℹ <https://maps.googleapis.com/maps/api/geocode/json?address=chicago&key=xxx>
chiMap <- ggmap(city)
# Agregar puntos al mapa
chiMap <- chiMap +
geom_point(data = Dataset, aes(x = Longitude, y = Latitude, color = Primary.Type), size = 2) +
scale_color_discrete(guide = "none") # Desactivar la leyenda de colores para los puntos
# Agregar polígonos de clusters al mapa
chiMap <- ggmap(city) +
geom_point(data = Dataset, aes(x = Longitude, y = Latitude, color = Primary.Type), size = 2) +
geom_polygon(data = hullCluster1, aes(x = Longitude, y = Latitude), color = "darkorange", fill = "darkorange", alpha = 0.2) +
geom_polygon(data = hullCluster2, aes(x = Longitude, y = Latitude), color = "gold", fill = "gold", alpha = 0.2) +
geom_polygon(data = hullCluster3, aes(x = Longitude, y = Latitude), color = "darkorchid", fill = "darkorchid", alpha = 0.2) +
geom_polygon(data = hullCluster4, aes(x = Longitude, y = Latitude), color = "darkcyan", fill = "darkcyan", alpha = 0.2) +
geom_polygon(data = hullCluster5, aes(x = Longitude, y = Latitude), color = "deeppink", fill = "deeppink", alpha = 0.2) +
geom_polygon(data = hullCluster6, aes(x = Longitude, y = Latitude), color = "darkgreen", fill = "darkgreen", alpha = 0.2) +
scale_fill_identity(guide = "none") + # Desactivar la leyenda de colores para los polígonos
geom_text(data = centroides_label, aes(x = centroid_lon, y = centroid_lat, label = cluster), size = 5, color = "white") + # Mostrar números grandes en los centroides
guides(color = FALSE, fill = FALSE) # Desactivar las leyendas de color y relleno
## Warning: The `<scale>` argument of `guides()` cannot be `FALSE`. Use "none" instead as
## of ggplot2 3.3.4.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
chiMap # Mostrar el mapa resultante sin leyenda
# Tu código existente para generar 'top_crimes_by_cluster'
# Formatear la tabla con kable
styled_table <- kable(
top_crimes_by_cluster,
format = "html",
caption = "Top 3 de los Crímenes mas recurrentes",
table.attr = "style='border-collapse: collapse; width: 100%;'",
col.names = c("Cluster", "Tipo de Crimen", "Cantidad")
)
styled_table # Esto imprimirá la tabla en un formato más estilizado
| Cluster | Tipo de Crimen | Cantidad |
|---|---|---|
| 1 | THEFT | 4115 |
| 1 | BATTERY | 3032 |
| 1 | CRIMINAL DAMAGE | 2189 |
| 2 | THEFT | 10841 |
| 2 | BATTERY | 5336 |
| 2 | CRIMINAL DAMAGE | 4075 |
| 3 | BATTERY | 9265 |
| 3 | THEFT | 9072 |
| 3 | CRIMINAL DAMAGE | 5513 |
| 4 | NARCOTICS | 12782 |
| 4 | BATTERY | 11549 |
| 4 | THEFT | 8477 |
| 5 | THEFT | 16121 |
| 5 | BATTERY | 6001 |
| 5 | DECEPTIVE PRACTICE | 3889 |
| 6 | BATTERY | 13480 |
| 6 | THEFT | 12085 |
| 6 | CRIMINAL DAMAGE | 7012 |
Al dividir la ciudad de Chicago en 6 áreas basadas en el agrupamiento de crímenes por cluster y sacando el top 3 de estos, se revelan aspectos destacados en cada área:
Zona 1: En esta área, los crímenes principalmente están relacionados con robos, seguidos por agresiones físicas y daños criminales. Esta tendencia sugiere una marcada incidencia de delitos de propiedad y violencia física. Se destaca por ser la zona con menor cantidad de delitos reportados, pero con una prevalencia notable de crímenes relacionados con robos y violencia física. Por ende, se recomienda un enfoque estratégico para la prevención de robos y control de la violencia en esta área en particular.
Zona 2: En esta área, los delitos de agresiones físicas son los más frecuentes, seguidos por los robos, mientras que los actos de vandalismo tienen una menor incidencia. Esta área puede beneficiarse de estrategias orientadas a reducir la violencia y mejorar la vigilancia para mitigar los robos.
Zona 3 (Centro de Chicago): Esta área exhibe una marcada prevalencia de robos, que representan aproximadamente el 64% de los delitos principales, seguidos por agresiones físicas y fraude/estafa. Este patrón indica una elevada actividad comercial y un constante flujo de personas. Se sugiere enfocarse en medidas de seguridad y vigilancia para proteger las zonas comerciales y prevenir delitos financieros
Zona 4: Los robos son predominantes, seguidos por un número menor de agresiones físicas y un índice ligeramente más bajo de vandalismo. Recomendaría considerar un incremento en la presencia policial y en el patrullaje para reducir estos delitos y fortalecer la seguridad ciudadana.
Zona 5: Esta área se destaca por la prevalencia de delitos vinculados a narcóticos y agresiones físicas, con un número inferior de robos. Esta combinación de crímenes sugiere la urgencia de implementar medidas preventivas y de seguridad específicas. Sería crucial enfocarse en estrategias destinadas a combatir el tráfico de drogas y reducir la violencia física para mejorar significativamente la seguridad en esta zona.
Zona 6: Esta área presenta similitudes con la Zona 2, evidenciando casos frecuentes de agresiones físicas, robos y vandalismo. Se presume que esta zona puede tener una densa concentración de población, conformada por un entorno mixto entre áreas residenciales y comerciales. Estrategias orientadas a reducir la violencia y proteger tanto los hogares como los negocios podrían ser consideradas prioridades fundamentales para esta zona.
Conclusión
Se concluye que en los crimenes mas reportados son THEFT (Robo), BATTERY (Agresión Fisica), Criminal Damage (Daño Criminal), Narcotics (Narcotics) y OTHER OFFENSE (Otro delitos) y el mes con mayor tasa de crimenes es julio y a su vez el inicio y final de año reporta menor cantidad de casos, esto se vincula principalmente a factores climaticos.
Al examinar tanto el mapa de crímenes como la tabla que detalla los delitos más recurrentes por zona, se destaca la presencia constante de incidentes de THEFT y BATTERY en todas las áreas de la ciudad. Este hallazgo sugiere que estos tipos de crímenes son omnipresentes en términos generales en Chicago. Además, se observa que la Zona 1 registra una mayor incidencia de crímenes relacionados con narcóticos (Narcotics), lo que podría vincularse con las condiciones específicas de esta área.
Es relevante destacar que estos patrones de crímenes reportados están estrechamente ligados a las condiciones locales de cada lugar. La concentración de crímenes en el centro de la ciudad puede asociarse a una mayor densidad poblacional, actividad comercial y turística, factores que suelen contribuir a la incidencia delictiva.
En contraste, se evidencia una menor cantidad de crímenes reportados en las zonas norte y sur de Chicago. Este fenómeno podría vincularse directamente con la menor densidad poblacional en estas áreas y, posiblemente, con una dinámica sociodemográfica diferente.
En resumen, los datos revelan que la naturaleza y la frecuencia de los crímenes en Chicago están intrínsecamente relacionadas con las características particulares de cada lugar. Este análisis subraya la importancia de considerar factores locales al abordar cuestiones de seguridad y destaca la variabilidad de la incidencia delictiva en diferentes zonas de la ciudad.