En este análisis exploraremos un dataset real de CSI Crimen Miami (más de 1000 registros y dos años de investigación sobre crímenes cometidos. El objetivo es aplicar análisis descriptivo, crear funciones estadísticas en R, y comparar resultados usando R Markdown para generar un reporte reproducible.
#install.packages(“tidyverse”)
#if (!require(“dplyr”)) # install.packages(“dplyr”) #if (!require(“readr”)) # install.packages(“readr”) #if (!require(“ggplot2”)) # install.packages(“ggplot2”)
datos_criminalistica <- read_csv("C:/Users/CEC/Documents/LENGUAJE_R_FJ/archive/crime_safety_dataset.csv")
glimpse(datos_criminalistica)
## Rows: 1,000
## Columns: 10
## $ id <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15…
## $ date <date> 2022-09-09, 2022-07-10, 2024-12-31, 2024-04-12, …
## $ time <time> 18:58:57, 12:10:59, 09:26:12, 23:17:28, 04:49:39…
## $ crime_type <chr> "Homicide", "Assault", "Burglary", "Vandalism", "…
## $ city <chr> "Philadelphia", "Phoenix", "San Antonio", "Philad…
## $ state <chr> "PA", "AZ", "TX", "PA", "TX", "IL", "PA", "TX", "…
## $ location_description <chr> "9916 Broadway", "6853 Oak St", "3760 Maple Ave",…
## $ victim_age <dbl> 34, 13, 23, 36, 26, 70, 48, 47, 28, 44, 29, 20, 3…
## $ victim_gender <chr> "Male", "Female", "Male", "Other", "Other", "Non-…
## $ victim_race <chr> "Other", "Black", "Asian", "Asian", "Other", "Oth…
#Análisis descriptivo básico
summary(datos_criminalistica)
## id date time crime_type
## Min. : 1.0 Min. :2020-07-31 Length:1000 Length:1000
## 1st Qu.: 250.8 1st Qu.:2021-10-25 Class1:hms Class :character
## Median : 500.5 Median :2023-01-10 Class2:difftime Mode :character
## Mean : 500.5 Mean :2023-01-19 Mode :numeric
## 3rd Qu.: 750.2 3rd Qu.:2024-04-29
## Max. :1000.0 Max. :2025-07-26
## city state location_description victim_age
## Length:1000 Length:1000 Length:1000 Min. :12.0
## Class :character Class :character Class :character 1st Qu.:33.0
## Mode :character Mode :character Mode :character Median :53.0
## Mean :52.2
## 3rd Qu.:72.0
## Max. :90.0
## victim_gender victim_race
## Length:1000 Length:1000
## Class :character Class :character
## Mode :character Mode :character
##
##
##
total_casos = nrow(datos_criminalistica)
print(total_casos)
## [1] 1000
##Funciones utilizadas #’ Calcula la media de edad de las víctimas #’ @param datos se refiere al campo “victim_age” de los datos cargados #’ @return Media calculada #’
media_victimas_fn <- function(datos){
sumav = sum(datos)
tamanio = length(datos)
return(sumav/tamanio)
}
media_victimas_fn(datos_criminalistica$victim_age)
## [1] 52.201
#’ Calcula la desviación estándar de las edad de las víctimas #’ @param datos se refiere al campo “victim_age” de los datos cargados #’ @return desviación estándar calculada #’
desviacion_estandar <- function(datos){
xm <- media_victimas_fn(datos)
resul <- sum((datos - xm)^2) / (length(datos) - 1)
return(sqrt(resul))
}
desviacion_estandar(datos_criminalistica$victim_age)
## [1] 22.91383
datos_criminalistica <- datos_criminalistica %>%
filter(victim_gender %in% c("Male", "Female"))
crimes_by_age_gender <- datos_criminalistica %>%
group_by(victim_age, victim_gender) %>%
summarise(total_crimes = n(), .groups = "drop") %>%
arrange(victim_age)
#Grafico # Crear gráfico de barras
ggplot(crimes_by_age_gender, aes(x = victim_age, y = total_crimes, fill = victim_gender)) +
geom_bar(stat = "identity", position = "dodge") +
labs(
title = "Total de crímenes por edad y sexo",
x = "Edad de la víctima",
y = "Número de crímenes",
fill = "Sexo"
) +
theme_minimal()
print(head(crimes_by_age_gender, 10))
## # A tibble: 10 × 3
## victim_age victim_gender total_crimes
## <dbl> <chr> <int>
## 1 12 Female 2
## 2 12 Male 4
## 3 13 Female 2
## 4 13 Male 3
## 5 14 Female 3
## 6 14 Male 6
## 7 15 Female 4
## 8 15 Male 1
## 9 16 Female 6
## 10 16 Male 2