A continuación, presento mi trabajo de proyecto final donde realizaré un analisis estadístico sobre los tipos de delitos ocurridos en la ciudad de Chicago durante el primer semestre del año 2020, en diferentes períodos e instancias de tiempo, así como también, las diferentes zonas en las que suelen ocurrir este tipo de crímenes. Se espera que este análisis comprenda diferentes dimensiones del problema, teniendo en cuenta las variables presentadas en el dataset.
Primero hacemos una visualización de los datos
crimes_chicago <<- read.csv("chicagoCrime2020.csv")
str(crimes_chicago) #==> Estructura del dataset
## 'data.frame': 91318 obs. of 26 variables:
## $ X : int 24279 24280 24283 24284 24285 24286 24287 24288 24289 24290 ...
## $ id : int 11938480 11939100 11939898 11940123 11940158 11941117 11942080 11942146 11942728 11942841 ...
## $ case_number : chr "JD100355" "JD101264" "JD102057" "JD102395" ...
## $ date : chr "2020-01-01 04:00:00" "2020-01-02 01:33:00" "2020-01-02 14:00:00" "2020-01-02 23:00:00" ...
## $ block : chr "048XX N WINCHESTER AVE" "003XX S CICERO AVE" "054XX S HOMAN AVE" "056XX W MADISON ST" ...
## $ iucr : chr "0930" "0486" "1310" "0263" ...
## $ primary_type : chr "MOTOR VEHICLE THEFT" "BATTERY" "CRIMINAL DAMAGE" "CRIM SEXUAL ASSAULT" ...
## $ description : chr "THEFT/RECOVERY: AUTOMOBILE" "DOMESTIC BATTERY SIMPLE" "TO PROPERTY" "AGGRAVATED: KNIFE/CUT INSTR" ...
## $ location_description: chr "STREET" "GAS STATION" "RESIDENCE" "VEHICLE NON-COMMERCIAL" ...
## $ arrest : chr "False" "True" "False" "False" ...
## $ domestic : chr "True" "False" "False" "False" ...
## $ beat : int 2032 1533 822 1513 423 733 621 423 423 924 ...
## $ district : int 20 15 8 15 4 7 6 4 4 9 ...
## $ ward : int 47 28 14 29 7 6 6 10 7 12 ...
## $ community_area : int 4 25 63 25 46 68 71 46 46 61 ...
## $ fbi_code : chr "07" "08B" "14" "02" ...
## $ x_coordinate : int 1162542 1144438 1154637 1138946 1194966 1171230 1172885 1197280 1195113 1166060 ...
## $ y_coordinate : int 1932100 1898165 1868368 1899461 1849540 1856757 1853815 1847679 1850446 1878849 ...
## $ year : int 2020 2020 2020 2020 2020 2020 2020 2020 2020 2020 ...
## $ updated_on : chr "2020-01-08 15:49:48" "2020-01-09 15:57:56" "2020-01-09 15:57:56" "2020-01-09 15:57:56" ...
## $ latitude : num 42 41.9 41.8 41.9 41.7 ...
## $ longitude : num -87.7 -87.7 -87.7 -87.8 -87.6 ...
## $ location : chr "(41.969341211, -87.677712622)" "(41.876581037, -87.745137513)" "(41.794616486, -87.708485645)" "(41.880238942, -87.76527117)" ...
## $ hash : chr "2020-01-01 04:00:00" "2020-01-02 01:33:00" "2020-01-02 14:00:00" "2020-01-02 23:00:00" ...
## $ point_date : logi NA NA NA NA NA NA ...
## $ geom : logi NA NA NA NA NA NA ...
summary(crimes_chicago) #==> Resumen estadistico
## X id case_number date
## Min. : 24279 Min. : 24889 Length:91318 Length:91318
## 1st Qu.:1781055 1st Qu.:11974960 Class :character Class :character
## Median :3564740 Median :12010619 Mode :character Mode :character
## Mean :3574290 Mean :11973896
## 3rd Qu.:5376446 3rd Qu.:12046081
## Max. :7135304 Max. :12085764
##
## block iucr primary_type description
## Length:91318 Length:91318 Length:91318 Length:91318
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## location_description arrest domestic beat
## Length:91318 Length:91318 Length:91318 Min. : 111
## Class :character Class :character Class :character 1st Qu.: 612
## Mode :character Mode :character Mode :character Median :1021
## Mean :1136
## 3rd Qu.:1654
## Max. :2535
##
## district ward community_area fbi_code
## Min. : 1.00 Min. : 1.00 Min. : 1.00 Length:91318
## 1st Qu.: 6.00 1st Qu.:10.00 1st Qu.:23.00 Class :character
## Median :10.00 Median :23.00 Median :32.00 Mode :character
## Mean :11.13 Mean :22.86 Mean :37.61
## 3rd Qu.:16.00 3rd Qu.:34.00 3rd Qu.:56.00
## Max. :31.00 Max. :50.00 Max. :77.00
## NA's :2
## x_coordinate y_coordinate year updated_on
## Min. :1092647 Min. :1813897 Min. :2020 Length:91318
## 1st Qu.:1152959 1st Qu.:1857892 1st Qu.:2020 Class :character
## Median :1166541 Median :1890260 Median :2020 Mode :character
## Mean :1164941 Mean :1884924 Mean :2020
## 3rd Qu.:1176618 3rd Qu.:1907957 3rd Qu.:2020
## Max. :1205112 Max. :1951507 Max. :2020
## NA's :751 NA's :751
## latitude longitude location hash
## Min. :41.64 Min. :-87.93 Length:91318 Length:91318
## 1st Qu.:41.77 1st Qu.:-87.71 Class :character Class :character
## Median :41.85 Median :-87.66 Mode :character Mode :character
## Mean :41.84 Mean :-87.67
## 3rd Qu.:41.90 3rd Qu.:-87.63
## Max. :42.02 Max. :-87.52
## NA's :751 NA's :751
## point_date geom
## Mode:logical Mode:logical
## NA's:91318 NA's:91318
##
##
##
##
##
Se eliminan las columnas ‘point_date’, ‘geom’ ya que no tiene datos. Adicional, para las columnas de Latitud y Longitud, se eliminan los registros que están con datos nulos
new_data_crimes_chicago<-crimes_chicago %>%
select(-point_date, -geom) # para borrar las columnas que no necesito
colSums(is.na(new_data_crimes_chicago)) # vemos que categorias tiene datos NA
## X id case_number
## 0 0 0
## date block iucr
## 0 0 0
## primary_type description location_description
## 0 0 0
## arrest domestic beat
## 0 0 0
## district ward community_area
## 0 2 0
## fbi_code x_coordinate y_coordinate
## 0 751 751
## year updated_on latitude
## 0 0 751
## longitude location hash
## 751 0 0
#Para el caso anterior las columnas latitude y longitude tiene 751 registros con NA,
new_data_crimes_chicago$location_description[is.na(new_data_crimes_chicago$location_description)] <- "Unknown" #Preservo datos porque me puedesn ser util
new_data_crimes_chicago <- new_data_crimes_chicago %>%
filter(!is.na(latitude) & !is.na(longitude)) #Elimino por
#Confirmo la limpieza
str(new_data_crimes_chicago)
## 'data.frame': 90567 obs. of 24 variables:
## $ X : int 24279 24280 24283 24284 24285 24286 24287 24288 24289 24290 ...
## $ id : int 11938480 11939100 11939898 11940123 11940158 11941117 11942080 11942146 11942728 11942841 ...
## $ case_number : chr "JD100355" "JD101264" "JD102057" "JD102395" ...
## $ date : chr "2020-01-01 04:00:00" "2020-01-02 01:33:00" "2020-01-02 14:00:00" "2020-01-02 23:00:00" ...
## $ block : chr "048XX N WINCHESTER AVE" "003XX S CICERO AVE" "054XX S HOMAN AVE" "056XX W MADISON ST" ...
## $ iucr : chr "0930" "0486" "1310" "0263" ...
## $ primary_type : chr "MOTOR VEHICLE THEFT" "BATTERY" "CRIMINAL DAMAGE" "CRIM SEXUAL ASSAULT" ...
## $ description : chr "THEFT/RECOVERY: AUTOMOBILE" "DOMESTIC BATTERY SIMPLE" "TO PROPERTY" "AGGRAVATED: KNIFE/CUT INSTR" ...
## $ location_description: chr "STREET" "GAS STATION" "RESIDENCE" "VEHICLE NON-COMMERCIAL" ...
## $ arrest : chr "False" "True" "False" "False" ...
## $ domestic : chr "True" "False" "False" "False" ...
## $ beat : int 2032 1533 822 1513 423 733 621 423 423 924 ...
## $ district : int 20 15 8 15 4 7 6 4 4 9 ...
## $ ward : int 47 28 14 29 7 6 6 10 7 12 ...
## $ community_area : int 4 25 63 25 46 68 71 46 46 61 ...
## $ fbi_code : chr "07" "08B" "14" "02" ...
## $ x_coordinate : int 1162542 1144438 1154637 1138946 1194966 1171230 1172885 1197280 1195113 1166060 ...
## $ y_coordinate : int 1932100 1898165 1868368 1899461 1849540 1856757 1853815 1847679 1850446 1878849 ...
## $ year : int 2020 2020 2020 2020 2020 2020 2020 2020 2020 2020 ...
## $ updated_on : chr "2020-01-08 15:49:48" "2020-01-09 15:57:56" "2020-01-09 15:57:56" "2020-01-09 15:57:56" ...
## $ latitude : num 42 41.9 41.8 41.9 41.7 ...
## $ longitude : num -87.7 -87.7 -87.7 -87.8 -87.6 ...
## $ location : chr "(41.969341211, -87.677712622)" "(41.876581037, -87.745137513)" "(41.794616486, -87.708485645)" "(41.880238942, -87.76527117)" ...
## $ hash : chr "2020-01-01 04:00:00" "2020-01-02 01:33:00" "2020-01-02 14:00:00" "2020-01-02 23:00:00" ...
Ahora realizo un analísis usando Barplots e histogramas para observar los picos y patrones en los delitos por tiempo.
Convertir la columna ‘date’ a formato fecha
new_data_crimes_chicago$date <- as.POSIXct(new_data_crimes_chicago$date, format = "%Y-%m-%d %H:%M:%S")
Extraemos componentes de tiempo
new_data_crimes_chicago$month <- month(new_data_crimes_chicago$date, label = TRUE, abbr = TRUE)
new_data_crimes_chicago$day_of_week <- wday(new_data_crimes_chicago$date, label = TRUE, abbr = TRUE)
new_data_crimes_chicago$hour <- hour(new_data_crimes_chicago$date)
ggplot(new_data_crimes_chicago, aes(x = month)) +
geom_bar(fill = "#4682B4", color = "black", alpha = 0.8) + #se le asigna color de cada barra y borde, alpha para transparencia
theme_minimal(base_size = 15) + # Ajustando el tamaño de fuente
labs(
title = "Crímenes por Mes en el primer semestre en Chicago (2020)",
subtitle = "Análisis basado en datos obtenidos.",
caption = "Fuente: Chicago Police Department",
x = "Mes",
y = "Número de Crímenes"
) +
#Configurando la apariencia
theme(
plot.title = element_text(hjust = 0.5, size = 18, face = "bold"), # Para Centrar el título
plot.subtitle = element_text(hjust = 0.5, size = 14, face = "italic"), # ParaCentrar el subtítulo
axis.title = element_text(size = 14, face = "bold"), # Dando estilo a etiquetas y los ejes ejes
axis.text = element_text(size = 12), # Ajustando texto de los ejes
panel.grid.major = element_line(color = "gray80"), # Personalizar las líneas de cuadrícula
panel.grid.minor = element_blank() # Eliminar cuadrícula menor
) +
scale_x_discrete(labels = toupper(levels(new_data_crimes_chicago$month))) + # Texto en mayúsculas para los meses
scale_y_continuous(expand = expansion(mult = c(0, 0.1))) # Ajustando las márgenes del eje Y
De la gráfica anterior se puede deducir que para el primer semestre del año 2020, la ocurrencia de delitos en Chicago tuvo una tendencia a la baja desde el mes de Enero al mes de Junio. Mas adelante se puede observar discriminado por el top 5 de mayores delitos cometidos que hubo una disminución significativa en delitos cometidos.
A continuación podemos observar la cantidad de delitos por día de la semana para el primer semestre del año 2020
ggplot(new_data_crimes_chicago, aes(x = day_of_week)) +
geom_bar(fill = "#ff4f33", color = "black", alpha = 0.8) + #se le asigna color de cada barra y borde, alpha para transparencia
theme_minimal(base_size = 15) + # Ajustando el tamaño de fuente
labs(
title = "Crímenes por día de la semana en el primer semestre en Chicago (2020)",
subtitle = "Análisis basado en datos obtenidos.",
caption = "Fuente: Chicago Police Department",
x = "Día",
y = "Número de Crímenes"
) +
#Configurando la apariencia
theme(
plot.title = element_text(hjust = 0.5, size = 18, face = "bold"), # Para Centrar el título
plot.subtitle = element_text(hjust = 0.5, size = 14, face = "italic"), # Para centrar el subtítulo
axis.title = element_text(size = 14, face = "bold"), # Dando estilo de las etiquetas y los ejes ejes
axis.text = element_text(size = 12), # Ajustando texto de los ejes
panel.grid.major = element_line(color = "gray80"), # Personalizando las líneas de cuadrícula
panel.grid.minor = element_blank()
) +
scale_x_discrete(labels = toupper(levels(new_data_crimes_chicago$day_of_week))) + # Texto en mayúsculas para los meses
scale_y_continuous(expand = expansion(mult = c(0, 0.1))) # Ajustando márgenes del eje Y
No existe una gran diferencia de la cantidad de delitos cometidos por día de la semana en el primer semestre del año 2020 pero se puede observar que los días viernes, sabados y domingos y un leve aumento en delitos reportados.
Los delitos suelen tener patrones horarios por lo que procedo a comparar cómo las horas de ocurrencias varían entre categorías de crimen. Cereo que nos puede brindar una mejor idea del problema de delitos.
Primero se obtiene la frecuencia por tipo de delito
attach(new_data_crimes_chicago)
crime_counts = as.data.frame(table(primary_type))
crime_counts = crime_counts[order(crime_counts$Freq, decreasing = TRUE),]
crime_counts
## primary_type Freq
## 3 BATTERY 18524
## 30 THEFT 18404
## 7 CRIMINAL DAMAGE 10715
## 2 ASSAULT 7741
## 10 DECEPTIVE PRACTICE 5668
## 23 OTHER OFFENSE 5622
## 4 BURGLARY 4075
## 18 MOTOR VEHICLE THEFT 3795
## 19 NARCOTICS 3692
## 31 WEAPONS VIOLATION 3173
## 27 ROBBERY 3155
## 9 CRIMINAL TRESPASS 2130
## 21 OFFENSE INVOLVING CHILDREN 877
## 26 PUBLIC PEACE VIOLATION 706
## 8 CRIMINAL SEXUAL ASSAULT 418
## 28 SEX OFFENSE 401
## 14 INTERFERENCE WITH PUBLIC OFFICER 386
## 12 HOMICIDE 280
## 1 ARSON 230
## 6 CRIM SEXUAL ASSAULT 123
## 24 PROSTITUTION 111
## 29 STALKING 67
## 5 CONCEALED CARRY LICENSE VIOLATION 65
## 16 KIDNAPPING 57
## 17 LIQUOR LAW VIOLATION 52
## 15 INTIMIDATION 51
## 20 OBSCENITY 26
## 11 GAMBLING 11
## 22 OTHER NARCOTIC VIOLATION 5
## 25 PUBLIC INDECENCY 4
## 13 HUMAN TRAFFICKING 3
ggplot(crime_counts, aes(x = reorder(primary_type, Freq), y = Freq)) +
geom_bar(stat = "identity", fill = "steelblue", color = "black", alpha = 0.8) + # Colores atractivos
theme_minimal(base_size = 14) + # Tema minimalista con tamaño de fuente ajustado
coord_flip() + # Invertir los ejes para mejor visualización
labs(
title = "Frecuencia de Tipos de Crímenes en Chicago",
subtitle = "Análisis basado en datos reportados en 2020",
x = "Tipo de Crimen",
y = "Frecuencia",
caption = "Fuente: Chicago Police Department"
) +
theme(
plot.title = element_text(hjust = 0.5, size = 18, face = "bold"), # Centrar y estilizar el título
plot.subtitle = element_text(hjust = 0.5, size = 14, face = "italic"), # Subtítulo centrado y en cursiva
axis.title.x = element_text(size = 12, face = "bold"), # Estilo para el eje Y
axis.title.y = element_text(size = 12, face = "bold"), # Estilo para el eje X
axis.text.y = element_text(size = 10), # Ajustar tamaño de etiquetas del eje Y
axis.text.x = element_text(size = 10), # Ajustar tamaño de etiquetas del eje X
panel.grid.major = element_line(color = "gray80"), # Líneas de cuadrícula
panel.grid.minor = element_blank() # Eliminar cuadrícula menor
)
La anterior gráfica nos muestra los tipos de delitos reportados a las
autoridades durante el rpimer semestre del año 2020 en la ciudad de
Chicago. Los delitos con mayor frecuencia son la Agresión (Battery),
Robo (Theft), vandalismo (Criminal Damage), Asaltos (Assault), Estafa
(deceptive pratice).
Ahora observemos de los tipos de delitos reportados, cualés son los que han terminado con personas arrestadas.
#Conversión a Tipo Lógico:
new_data_crimes_chicago$arrest <- as.logical(new_data_crimes_chicago$arrest)
arrest_analysis <- new_data_crimes_chicago %>%
group_by(primary_type) %>%
summarise(
total_crimes = n(),
total_arrests = sum(arrest),
arrest_rate = (total_arrests / total_crimes) * 100
) %>%
arrange(desc(arrest_rate)) # Ordenar por porcentaje de arrestos
# Crear el gráfico
ggplot(arrest_analysis, aes(x = reorder(primary_type, arrest_rate), y = arrest_rate)) +
geom_bar(stat = "identity", fill = "steelblue", color = "black", alpha = 0.8) +
coord_flip() + # Voltear los ejes para un gráfico horizontal
theme_minimal(base_size = 14) +
labs(
title = "Proporción de Arrestos por Tipo de Crimen en Chicago",
subtitle = "Porcentaje de crímenes que resultaron en un arresto",
x = "Tipo de Crimen",
y = "Porcentaje de Arrestos",
caption = "Fuente: Chicago Police Department (2020)"
) +
theme(
plot.title = element_text(hjust = 0.5, size = 18, face = "bold"),
plot.subtitle = element_text(hjust = 0.5, size = 14, face = "italic"),
axis.title = element_text(size = 14, face = "bold"),
axis.text = element_text(size = 10),
panel.grid.major = element_line(color = "gray80"),
panel.grid.minor = element_blank()
)
Se puede observar que para los delitos mas reportados como Agresión (Battery), Robo(Theft), delitos con mayor frecuencia, el porcentaje de arrestos no sobrepasa el 25%, mientras que delitos con poca fecuencia presentan un 100% en arrestos.
Por medio de boxplot miremos los tipo de delitos reportados por horas del día
ggplot(new_data_crimes_chicago, aes(x = primary_type, y = hour)) +
geom_boxplot(fill = "#13e706", color = "black", outlier.color = "red", outlier.size = 2, alpha = 0.9) +
theme_minimal(base_size = 15) +
labs(
title = "Distribución Horaria de Crímenes por Tipo de Crimen",
subtitle = "Cada caja muestra el rango de horas del día en que ocurren los crímenes",
caption = "Fuente: Chicago Police Department (2020)",
x = "Tipo de Crimen",
y = "Hora del Día"
) +
theme(
plot.title = element_text(hjust = 0.5, size = 18, face = "bold"),
plot.subtitle = element_text(hjust = 0.5, size = 14, face = "italic"),
axis.title = element_text(size = 14, face = "bold"),
axis.text.x = element_text(size = 10, angle = 45, hjust = 1), # Inclinar etiquetas para facilitar lectura
axis.text.y = element_text(size = 12),
panel.grid.major = element_line(color = "gray80"),
panel.grid.minor = element_blank()
) +
scale_y_continuous(breaks = seq(0, 23, 2), expand = expansion(mult = c(0, 0.1))) # Ajustar el eje Y
Aumento de delitos durante fines de semana o en horas nocturnas.
Concentración en Horarios Específicos:
Algunos delitos están altamente concentrados en ciertas horas del día. Podemos ver por ejemplo “Public Indecency” se comete principalmente en horarios muy específicos de la noche. - “Prostitution” ocurre en horarios nocturnos como se muestra por la mediana (aproximadamente a la medianoche) y los valores atípicos concentrados entre las 20:00 y las 2:00 am).
Crímenes Distribuidos Uniformemente:
Otros delitos tienen distribuciones más uniformes a lo largo del día, como “Theft” o “Battery” estos no parecen depender tanto de la hora.
Los puntos rojos representan valores atípicos, que son delitos que ocurrieron en horarios inusuales en comparación con la mayoría. Por ejemplo: - “Prostitution” tiene una notable cantidad de valores atípicos en horas diurnas, lo que podría ser inusual dado su patrón nocturno. “Public Indecency” también tiene valores atípicos temprano en la mañana.
Algunos tipos de crímenes como “Prostitution” y “Public Indecency” están claramente sesgados hacia horarios nocturnos, podemos interpretar que puede estar relacionado con la falta de control por parte de las autoridades en las horas de la noche o que estas actividades en el tiempo han ocurrido en estos horarios. Crímenes como “Theft” y “Criminal Damage” tienen un rango amplio de ocurrencia durante todo el día, esto podría deberse crímenes no están limitados a un período del día específico, ya que son muy comunes a cualquier hora del día.
Ahora vamos a analizar los cinco delitos mas frecuentes
De acuerdo al gráfico anterior, las agresiones físicas son las que mas casos se presentan, dentro de las agresiones los mas representativos son los casos de agresiones domésticas y agresiones simples.El robo tiene la segunda frecuencia, los robos se centran principalmente en robos de dinero por debajo de los USD 500, por encima de los USD 500 y robos a minoristas. Los actos delictivos, se enfocan en propiedades y vehículos, los asaltos son simples y en menor proporción son agravados mientras que para las actividades engañosas y fraudulentas, el número de casos es un poco más homogéneno con respecto a los demás crímenes, sin embargo, las dos actividades que más resaltan son fraudes con tarjetas de crédito y a entidades financieras.
A continuación una breve descripción de cómo es la distribución social, politica y urbana de la ciudad de Chicago.
Aspecto | Community Areas | Wards |
---|---|---|
Cantidad | 77 | 50 |
Propósito | Estudio demográfico/social | Representación política |
Estabilidad | Estables desde 1920 | Cambian cada 10 años |
Nombres/Números | Nombres descriptivos (e.g., Hyde Park) | Numerados (e.g., Ward 1) |
Cobertura | Basado en vecindarios | Divisiones político-geográficas |
## Reading layer `OGRGeoJSON' from data source
## `https://data.cityofchicago.org/api/geospatial/igwz-8jzy?method=export&format=GeoJSON'
## using driver `GeoJSON'
## Simple feature collection with 77 features and 9 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -87.94011 ymin: 41.64454 xmax: -87.52414 ymax: 42.02304
## Geodetic CRS: WGS 84
Veamos un mapa de calor para ver como se distribuyen el top 5 de los delitos mas cometidos en la ciudad de Chicago en el primer semestre del año 2020
## Reading layer `OGRGeoJSON' from data source
## `https://data.cityofchicago.org/api/geospatial/igwz-8jzy?method=export&format=GeoJSON'
## using driver `GeoJSON'
## Simple feature collection with 77 features and 9 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -87.94011 ymin: 41.64454 xmax: -87.52414 ymax: 42.02304
## Geodetic CRS: WGS 84
Se puede notar que las áreas con colores más cálidos (rojo y amarillo) representan alta densidad de crímenes lo que denota que hay una alta frecuencia de delitos en la zona norte de Chicago. Se tendría que hacer un analisis socioeconómico de cada “Community area” para poder entender mas a fondo por qué esta zonas son donde mas delitos se cometen. Las zonas centrales de Chicago tienen las áreas más densas de actividad delictiva. Los crímenes parecen seguir patrones espaciales relacionados con: - Densidad poblacional (mayor actividad en áreas urbanas). - Centros comerciales o áreas de alto tránsito.
Por ahora voy usar aprendizaje no supervisado (Clustering) para detectar si hay agrupamiento por delitos, por eso usaré del dataset las columnas de ubicación para aplicar aprendizaje no supervisado (Clustering).
Usaré K-means para dividir los grupos y minimizar la distancia entre los puntos dentro de cada grupo.
Mi idea es poder agrupar puntos geográficos a poder identificar zonas de alta y baja ocurrencia de delitos como pude interpretar en el mapa de calor que se visualizó anteriormente.
cluster_colors <- c("1" = "#E41A1C", "2" = "#377EB8", "3" = "#4DAF4A", "4" = "#984EA3")
# Elimino las filas innecsearias por valores faltantes y solo usaré Latitud y Longuitud para los
#puntos geográficos
data_cluster <- new_data_crimes_chicago %>%
filter(!is.na(latitude), !is.na(longitude)) %>%
select(latitude, longitude) #
# Este submuestreo lo hago ya que por el espacio de memoria RAM solo me permite hasta 15000 registros y observando el comportamiento del algoritmo y la información de la lecturas, es costoso su ejecución. La recomendación según la literatura era hacer un submuestreo
set.seed(123)
data_sample <- data_cluster %>% sample_n(15000)
# Escalar los datos. Normalizar las columnas a usar para que la desviación estandar sea igual a 1
data_scaled <- scale(data_sample)
# Método del Codo para determinar el número de clusters
#Con este método busco encontrar el número de cluster óptimo, para efecto de ejecución y según la gráfica, la curva deja de descender en k = 4
fviz_nbclust(data_scaled, kmeans, method = "wss") +
labs(title = "Método del Codo para Determinar Número de Clusters")
# Ajustar K-Means con el número óptimo de clusters
#Repito el algritmo 25 veces para garantizar la estabilidad del resultado
set.seed(123)
kmeans_result <- kmeans(data_scaled, centers = 4, nstart = 25)
# Agregar los resultados al dataset. se agrega una nueva columna al dataset.
data_sample$cluster <- as.factor(kmeans_result$cluster)
# Ver resultados del clustering
table(data_sample$cluster)
##
## 1 2 3 4
## 3909 2978 4386 3727
# Visualización de los clusters,
fviz_cluster(kmeans_result, data = data_scaled,
geom = "point", ellipse.type = "norm",
main = "Resultados del K-Means Clustering",
palette = cluster_colors) +
scale_color_manual(values = cluster_colors) +
labs(x = "Componente 1", y = "Componente 2")
La gráfica anterior permite ver los datos escalados en dos dimesiones y cada color representa un cluster diferente. Tambien se puede observar la dispersión de los datos en cada elipse. Dentro de lo que logro interpretar, los cluster están bien definidos según la literatura ya que esto sugiere que el k-means encontró valores espaciales en los datos, esto permite agrupar las coordenadas de los crimenes en 4 clusters distintos lo que se acerca a la interpretación con respecto al mapa de calor por el top de delitos cometidos, que hay caracteristicas geográficas similares en términos de concentración de delitos.
## Reading layer `OGRGeoJSON' from data source
## `https://data.cityofchicago.org/api/geospatial/igwz-8jzy?method=export&format=GeoJSON'
## using driver `GeoJSON'
## Simple feature collection with 77 features and 9 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -87.94011 ymin: 41.64454 xmax: -87.52414 ymax: 42.02304
## Geodetic CRS: WGS 84
El uso de K-means en este proyecto es para segementar de forma geográfica los puntos o locaciones (laitud y longitud) donde los delitos son similares. Ya que los delitos se agruparonen 4 clusters y fueron representados por colores, lo que me propongo es llevarlos al mapa de Chicago así como realicé el mapa de calor con anterioridad.
Patrones Observados:
Cluster 1 (Rojo): Se ubica en regiones sur y suroeste de Chicago, mostrando mayor densidad en esta área. Cluster 2 (Azul): Tiene una dispersión intermedia y cubre regiones cercanas al primer cluster. Cluster 3 (Verde): Se concentra en zonas más al norte o al centro de Chicago. Cluster 4 (Morado): Se extiende en la parte este y noreste con menor dispersión.
Lo anterior me permite interpretar que la ciudad de Chicago tiene zonas criticas que requieren mas atención por parte de las autoridades administrartivas de la ciudad, ya sea porque en estas zonas es donde hay mayor densidad poblacional, falta de oportunidades de estudio y trabajo, vulnerabilidad económica o falta de politicas de seguridad pública. Comparando los mapas, uno con clusters y otros con mapa de calor, encuentro que los mapas se complementan. El k-means me segmenta los datos en clusteres especifico y el mpa de calor me permite observa una vista de la densidad de crimenes.
Ahora voy a agregar los tipos de delitos y la hora en que se cometen para hacer un analisis mas profundo a los clusters. La idea es poder identificar los tipos de delito y la hora por cada cluster que se generó.
## latitude longitude hour primary_type cluster
## 1 41.89267 -87.61621 12 DECEPTIVE PRACTICE 4
## 2 41.88693 -87.63064 14 ROBBERY 4
## 3 41.74485 -87.60627 2 CRIMINAL DAMAGE 1
## 4 41.79479 -87.61679 12 ASSAULT 1
## 5 41.76224 -87.65994 12 THEFT 2
## 6 42.00500 -87.66087 23 CRIMINAL DAMAGE 4
se pudo evidenciar durante el desarrollo del trabajo, que el plasmar información de manera gráfica facilita el entendimiento del problema que se está abordando, por supuesto, esto implica un desafío importante porque se debe garantizar que los gráficos utilizados sean los correctos, sobre todo cuando se goza de mucha información para analizar como en el presente tema abordado, donde se logra concluir aquellas actividades de mayor incidencia delictiva en la ciudad de Chicago. De acuerdo al ejercicio realizado anteriormente y despues de observar lo mostrado antes y despues de la ejecución de los clusters se puede concluir que: