Exploración Inicial de Datos

Preliminares

Este chunk de código se ejecuta al principio pero no se incluye en el documento final. Primero, establece la opción echo = TRUE para que todos los códigos se muestren en el documento. Luego, carga la biblioteca tidyverse, que contiene varias herramientas para análisis de datos. Finalmente, lee el archivo de datos CSV llamado “murders.csv” y lo guarda en el objeto “data”.

knitr::opts_chunk$set(echo = TRUE)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.0     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
data <- read.csv("./data/murders.csv")

Visualización Inicial

Se muestra las primeras filas del conjunto de datos con head(data) y la estructura del conjunto de datos con str(data). Esto permite una inspección inicial de los datos.

head(data)
##        state abb region population total
## 1    Alabama  AL  South    4779736   135
## 2     Alaska  AK   West     710231    19
## 3    Arizona  AZ   West    6392017   232
## 4   Arkansas  AR  South    2915918    93
## 5 California  CA   West   37253956  1257
## 6   Colorado  CO   West    5029196    65
data$region = factor(data$region)
str(data)
## 'data.frame':    51 obs. of  5 variables:
##  $ state     : chr  "Alabama" "Alaska" "Arizona" "Arkansas" ...
##  $ abb       : chr  "AL" "AK" "AZ" "AR" ...
##  $ region    : Factor w/ 4 levels "North Central",..: 3 4 4 3 4 4 2 3 3 3 ...
##  $ population: int  4779736 710231 6392017 2915918 37253956 5029196 3574097 897934 601723 19687653 ...
##  $ total     : int  135 19 232 93 1257 65 97 38 99 669 ...

Resumen Estadístico

Se proporciona un resumen estadístico de las variables numéricas en el conjunto de datos utilizando la función summary().

summary(data)
##     state               abb                      region     population      
##  Length:51          Length:51          North Central:12   Min.   :  563626  
##  Class :character   Class :character   Northeast    : 9   1st Qu.: 1696962  
##  Mode  :character   Mode  :character   South        :17   Median : 4339367  
##                                        West         :13   Mean   : 6075769  
##                                                           3rd Qu.: 6636084  
##                                                           Max.   :37253956  
##      total       
##  Min.   :   2.0  
##  1st Qu.:  24.5  
##  Median :  97.0  
##  Mean   : 184.4  
##  3rd Qu.: 268.0  
##  Max.   :1257.0

Visualización de Variables Numéricas

Se crea histogramas y diagramas de caja para las variables “total” (número total de homicidios) y “population” (población). Los histogramas muestran la distribución de los datos, mientras que los diagramas de caja muestran la dispersión y los valores atípicos.

#### Histogramas: Histograms provide a visual representation of the distribution of a numerical variable. They display the frequency of data points falling within certain intervals.

hist(data$total, main = "Histogram of Total Murders", xlab = "Total Murders", ylab = "Frequency", col = "skyblue")

hist(data$population / 10^6, main = "Histogram of Population (in millions)", xlab = "Population (in millions)", ylab = "Frequency", col = "lightgreen")

#### Boxplots: The boxplots provide a visual summary of the distribution of the data. They display the median, quartiles, and potential outliers.

boxplot(total/population*10^5 ~ region, data = data, main = "Rates by Region ", ylab = "rate", cex.axis =0.6 ,col = "salmon")

boxplot(total ~ region, data = data, cex.axis =0.6, main = "Murders by Region", ylab = "murders", col = "lightblue")

Visualización de Relaciones

Se crea un gráfico de dispersión para explorar la relación entre “total” (número total de homicidios) y “population” (población). Se divide la población por 10^5 para escalar los valores a un rango más manejable.

plot(data$population/10^5, data$total, xlab = "Population (in hundreds of thousands)", 
     ylab = "Total Murders",
     main = "Scatter plot of Total Murders vs Population",
     col = "darkblue",
     pch = 19)

Tabla de Contingencia

Se crea una tabla de contingencia que muestra la frecuencia de combinaciones entre las variables “abb” (abreviaturas de estados) y “region” (región geográfica).

table (data$abb, data$region)
##     
##      North Central Northeast South West
##   AK             0         0     0    1
##   AL             0         0     1    0
##   AR             0         0     1    0
##   AZ             0         0     0    1
##   CA             0         0     0    1
##   CO             0         0     0    1
##   CT             0         1     0    0
##   DC             0         0     1    0
##   DE             0         0     1    0
##   FL             0         0     1    0
##   GA             0         0     1    0
##   HI             0         0     0    1
##   IA             1         0     0    0
##   ID             0         0     0    1
##   IL             1         0     0    0
##   IN             1         0     0    0
##   KS             1         0     0    0
##   KY             0         0     1    0
##   LA             0         0     1    0
##   MA             0         1     0    0
##   MD             0         0     1    0
##   ME             0         1     0    0
##   MI             1         0     0    0
##   MN             1         0     0    0
##   MO             1         0     0    0
##   MS             0         0     1    0
##   MT             0         0     0    1
##   NC             0         0     1    0
##   ND             1         0     0    0
##   NE             1         0     0    0
##   NH             0         1     0    0
##   NJ             0         1     0    0
##   NM             0         0     0    1
##   NV             0         0     0    1
##   NY             0         1     0    0
##   OH             1         0     0    0
##   OK             0         0     1    0
##   OR             0         0     0    1
##   PA             0         1     0    0
##   RI             0         1     0    0
##   SC             0         0     1    0
##   SD             1         0     0    0
##   TN             0         0     1    0
##   TX             0         0     1    0
##   UT             0         0     0    1
##   VA             0         0     1    0
##   VT             0         1     0    0
##   WA             0         0     0    1
##   WI             1         0     0    0
##   WV             0         0     1    0
##   WY             0         0     0    1

Visualización con ggplot2

Se utiliza la biblioteca ggplot2 para crear una visualización de la relación entre “abb” (abreviaturas de estados) y “total” (número total de homicidios). Primero, se realizan algunas transformaciones en los datos, como convertir la variable “region” en un factor, calcular la tasa de homicidios por cada 100,000 habitantes y reordenar las abreviaturas de estado según la tasa de homicidios.

Luego, se crea un gráfico de dispersión / barras con ggplot(), donde los puntos representan cada estado y la tasa de homicidios se muestra en el eje y. Se aplican algunas personalizaciones de estilo, como rotar las etiquetas del eje x y voltear los ejes y colocar leyendas para cada eje y un titulo para la gráfica.

data <- data %>% mutate(region = factor (region), rate = total / population * 10^5) %>% mutate(abb = reorder(abb, rate))

# Creamos un gráfico de barras horizontales para visualizar la tasa de homicidios por estado

  # Datos y estética
  ggplot(data, aes (x=abb, y=rate )) + # Establecemos las variables para el eje x (estados) y el eje y (tasa de homicidios)

  
  # Geometría
  #geom_point(color = "darkred", size = 2, alpha = 0.7) #Creamos un gráfico de dispersión (deshabilitado)
  geom_bar(stat = "identity", width = NULL, color="darkred", alpha =0.7) + # Creamos el gráfico de barras
  
  # Temas
  theme(axis.text.y = element_text(size = 6, angle = 0, vjust = 0.2, hjust = 1), # Ajustamos el tamaño y la orientación de las etiquetas en el eje y
        axis.text.x = element_text(size = 10, vjust = 0.2, hjust = 1, angle = 0)) + # Ajustamos el tamaño y la orientación de las etiquetas en el eje y
    scale_x_discrete(expand = c(0, 0)) + # Expandimos el eje x
    scale_y_continuous(expand = expansion(mult=(c(0, 0))), breaks = seq(0, max(data$rate+2), by = 2), limits = c(0, max(data$rate) + 2)) + # Expandimos el eje y y establecemos los intervalos de las etiquetas

  # Coordinadas
  coord_flip() + # Rotamos el gráfico para intercambiar los ejes x e y
  
  # Etiquetas
  labs(x = "State", # Establecemos el título del eje x
       y = "Murder Rate (per 100,000 people)", # Establecemos el título del eje y
       title = "Murder Rate Variation Across States") # Establecemos el título del gráfico