1. Introducción

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.

2. Librerías utilizadas

#install.packages(“tidyverse”)

#if (!require(“dplyr”)) # install.packages(“dplyr”) #if (!require(“readr”)) # install.packages(“readr”) #if (!require(“ggplot2”)) # install.packages(“ggplot2”)

Se trabajara con el archivo “crime_safety_dataset.csv”

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

Filtrar solo géneros masculino y femenino

datos_criminalistica <- datos_criminalistica %>%
  filter(victim_gender %in% c("Male", "Female"))

Agrupar por edad y género

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()

Mostrar los primeros 10 resultados

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