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")
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 ...
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
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")
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)
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
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
Dataset: “https://raw.githubusercontent.com/rafalab/dslabs/master/inst/extdata/murders.csv”