This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.
When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:
summary(cars)
## speed dist
## Min. : 4.0 Min. : 2.00
## 1st Qu.:12.0 1st Qu.: 26.00
## Median :15.0 Median : 36.00
## Mean :15.4 Mean : 42.98
## 3rd Qu.:19.0 3rd Qu.: 56.00
## Max. :25.0 Max. :120.00
You can also embed plots, for example:
Note that the echo = FALSE parameter was added to the
code chunk to prevent printing of the R code that generated the
plot.
# 📦 Instalar y cargar paquetes necesarios para el EDA
packages <- c("tidyverse", "janitor", "ggplot2", "ggthemes", "DataExplorer", "corrplot")
for (pkg in packages) {
if (!require(pkg, character.only = TRUE)) {
install.packages(pkg)
library(pkg, character.only = TRUE)
} else {
library(pkg, character.only = TRUE)
}
}
## Loading required package: 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.2 ✔ tibble 3.3.0
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.1.0
## ── 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
## Loading required package: janitor
##
##
## Attaching package: 'janitor'
##
##
## The following objects are masked from 'package:stats':
##
## chisq.test, fisher.test
##
##
## Loading required package: ggthemes
##
## Loading required package: DataExplorer
##
## Loading required package: corrplot
##
## corrplot 0.95 loaded
library(tidyverse)
library(janitor)
library(ggplot2)
library(DataExplorer)
library(ggthemes)
library(skimr)
# Cargar datos
df <- read_csv("NCHS_-_Leading_Causes_of_Death__United_States_20250813.csv")
## Rows: 10868 Columns: 6
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (3): 113 Cause Name, Cause Name, State
## dbl (3): Year, Deaths, Age-adjusted Death Rate
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
df <- clean_names(df) # convierte nombres a snake_case
glimpse(df)
## Rows: 10,868
## Columns: 6
## $ year <dbl> 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017…
## $ x113_cause_name <chr> "Accidents (unintentional injuries) (V01-X59,Y…
## $ cause_name <chr> "Unintentional injuries", "Unintentional injur…
## $ state <chr> "United States", "Alabama", "Alaska", "Arizona…
## $ deaths <dbl> 169936, 2703, 436, 4184, 1625, 13840, 3037, 20…
## $ age_adjusted_death_rate <dbl> 49.4, 53.8, 63.7, 56.2, 51.8, 33.2, 53.6, 53.2…
Introducción y descripción inicial de los datos
El conjunto de datos cargado proviene de la fuente NCHS (National Center for Health Statistics) y representa las principales causas de muerte en los Estados Unidos. El archivo incluye 10,868 registros y está compuesto por 6 variables que describen estadísticas de mortalidad en distintas regiones y años del país.
Este conjunto de datos permite analizar cómo varían las tasas de mortalidad en función del estado, el tiempo y la causa de muerte. La variable age_adjusted_death_rate es particularmente importante, ya que elimina el sesgo demográfico asociado a poblaciones con diferentes estructuras etarias, lo que facilita comparaciones más justas entre estados y años.
El análisis exploratorio de estos datos es crucial para entender:
La evolución temporal de las principales causas de muerte.
La distribución geográfica de ciertas enfermedades.
Patrones generales de salud pública a lo largo del tiempo.
# Verificar duplicados
sum(duplicated(df))
## [1] 0
# Revisar valores faltantes
colSums(is.na(df))
## year x113_cause_name cause_name
## 0 0 0
## state deaths age_adjusted_death_rate
## 0 0 0
# Reemplazar nombres de columnas largos
df <- df %>%
rename(
icd_cause = x113_cause_name,
cause = cause_name,
state = state,
deaths = deaths,
rate = age_adjusted_death_rate
)
Resultado: 0 registros duplicados Esto indica que no hay entradas repetidas, lo cual es una muy buena señal Resultado: 0 valores faltantes en ninguna columna Esto significa que el conjunto de datos está completo y no requiere imputación. Aquí se realiza una limpieza semántica de nombres de columnas, reemplazando etiquetas largas o poco legibles por nombres más simples y descriptivos.
Este cambio mejora la legibilidad y eficiencia del análisis, especialmente al crear visualizaciones o realizar agrupaciones.
# 🧼 Eliminar duplicados (si existieran)
df <- df %>% distinct()
# 📊 Exploración rápida del contenido
skimr::skim(df)
| Name | df |
| Number of rows | 10868 |
| Number of columns | 6 |
| _______________________ | |
| Column type frequency: | |
| character | 3 |
| numeric | 3 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| icd_cause | 0 | 1 | 10 | 69 | 0 | 11 | 0 |
| cause | 0 | 1 | 4 | 23 | 0 | 11 | 0 |
| state | 0 | 1 | 4 | 20 | 0 | 52 | 0 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| year | 0 | 1 | 2008.00 | 5.48 | 1999.0 | 2003.0 | 2008.0 | 2013.00 | 2017.0 | ▇▇▆▇▇ |
| deaths | 0 | 1 | 15459.91 | 112876.02 | 21.0 | 612.0 | 1718.5 | 5756.50 | 2813503.0 | ▇▁▁▁▁ |
| rate | 0 | 1 | 127.56 | 223.64 | 2.6 | 19.2 | 35.9 | 151.72 | 1087.3 | ▇▁▁▁▁ |
# 🧮 Conteo de valores únicos por columna
sapply(df, function(x) length(unique(x)))
## year icd_cause cause state deaths rate
## 19 11 11 52 5964 2490
Diversidad de Datos por Variable
year: 19 valores únicos, lo que indica que hay datos desde 1999 hasta 2017, lo cual permite un análisis de tendencias temporales.
icd_cause y cause: Cada uno tiene 11 categorías únicas, lo que implica que se están evaluando 11 causas distintas de muerte.
state: 52 valores únicos, lo cual cubre los 50 estados de EE.UU. más D.C. y posiblemente un total nacional.
deaths: 5,964 valores únicos. Esto sugiere variabilidad significativa en los conteos de muertes por estado, causa y año.
rate: 2,490 valores únicos, mostrando que hay un gran nivel de variación en las tasas ajustadas por edad.
# 📦 Instalar y cargar paquete naniar si no está presente
if (!require(naniar)) {
install.packages("naniar")
library(naniar)
} else {
library(naniar)
}
## Loading required package: naniar
##
## Attaching package: 'naniar'
## The following object is masked from 'package:skimr':
##
## n_complete
# 🔍 Revisión general de NA
colSums(is.na(df))
## year icd_cause cause state deaths rate
## 0 0 0 0 0 0
# 📊 Porcentaje de valores faltantes
miss_var_summary(df)
## # A tibble: 6 × 3
## variable n_miss pct_miss
## <chr> <int> <num>
## 1 year 0 0
## 2 icd_cause 0 0
## 3 cause 0 0
## 4 state 0 0
## 5 deaths 0 0
## 6 rate 0 0
# 📈 Visualización de patrones de NA
gg_miss_var(df) +
labs(title = "Porcentaje de NA por variable")
summary(df)
## year icd_cause cause state
## Min. :1999 Length:10868 Length:10868 Length:10868
## 1st Qu.:2003 Class :character Class :character Class :character
## Median :2008 Mode :character Mode :character Mode :character
## Mean :2008
## 3rd Qu.:2013
## Max. :2017
## deaths rate
## Min. : 21 Min. : 2.6
## 1st Qu.: 612 1st Qu.: 19.2
## Median : 1718 Median : 35.9
## Mean : 15460 Mean : 127.6
## 3rd Qu.: 5756 3rd Qu.: 151.7
## Max. :2813503 Max. :1087.3
colnames(df)
## [1] "year" "icd_cause" "cause" "state" "deaths" "rate"
names(df)
## [1] "year" "icd_cause" "cause" "state" "deaths" "rate"
Descripción general del dataset
El conjunto de datos tiene 10,868 observaciones y 6 variables:
year: año de registro.
icd_cause: código de la causa según la Clasificación Internacional de Enfermedades (ICD).
cause: nombre de la causa de muerte.
state: estado de EE.UU.
deaths: número absoluto de muertes.
rate: tasa de muertes ajustada por edad.
Variables categóricas (icd_cause, cause, state)
Estas variables son de tipo carácter (texto), y se reporta que todas tienen longitud 10868, lo que indica que no hay datos faltantes. El resumen no muestra estadísticos para estas columnas porque no son numéricas, pero sabemos por análisis anteriores que:
Hay 11 causas distintas (cause).
Hay 52 estados (state).
Y 19 códigos ICD distintos (icd_cause), como confirmaste antes con skimr.
Variables numéricas year
Rango: 1999 a 2017.
Mediana y media: 2008.
Esto confirma que hay datos anuales completos para un período de 19 años.
deaths (muertes absolutas)
Rango: de 21 a 2,813,503 muertes.
Mediana: 1,718 muertes.
Promedio: ~15,460 muertes, con una desviación estándar muy alta (112,876), lo que indica alta dispersión o la existencia de valores extremadamente grandes (outliers).
Es posible que algunas causas o estados representen una carga desproporcionada de mortalidad.
rate (tasa ajustada por edad)
Rango: de 2.6 a 1087.3 muertes por 100,000 personas.
Mediana: 35.9, media: 127.6.
Dispersión alta también aquí (SD ≈ 223.6), lo que indica diferencias significativas entre estados o causas.
# 📦 Cargar ggplot2 si no lo has hecho ya
library(ggplot2)
# 👀 Ver niveles de cada variable categórica
df %>%
select(where(is.character)) %>%
map(table)
## $icd_cause
##
## Accidents (unintentional injuries) (V01-X59,Y85-Y86)
## 988
## All Causes
## 988
## Alzheimer's disease (G30)
## 988
## Cerebrovascular diseases (I60-I69)
## 988
## Chronic lower respiratory diseases (J40-J47)
## 988
## Diabetes mellitus (E10-E14)
## 988
## Diseases of heart (I00-I09,I11,I13,I20-I51)
## 988
## Influenza and pneumonia (J09-J18)
## 988
## Intentional self-harm (suicide) (*U03,X60-X84,Y87.0)
## 988
## Malignant neoplasms (C00-C97)
## 988
## Nephritis, nephrotic syndrome and nephrosis (N00-N07,N17-N19,N25-N27)
## 988
##
## $cause
##
## All causes Alzheimer's disease Cancer
## 988 988 988
## CLRD Diabetes Heart disease
## 988 988 988
## Influenza and pneumonia Kidney disease Stroke
## 988 988 988
## Suicide Unintentional injuries
## 988 988
##
## $state
##
## Alabama Alaska Arizona
## 209 209 209
## Arkansas California Colorado
## 209 209 209
## Connecticut Delaware District of Columbia
## 209 209 209
## Florida Georgia Hawaii
## 209 209 209
## Idaho Illinois Indiana
## 209 209 209
## Iowa Kansas Kentucky
## 209 209 209
## Louisiana Maine Maryland
## 209 209 209
## Massachusetts Michigan Minnesota
## 209 209 209
## Mississippi Missouri Montana
## 209 209 209
## Nebraska Nevada New Hampshire
## 209 209 209
## New Jersey New Mexico New York
## 209 209 209
## North Carolina North Dakota Ohio
## 209 209 209
## Oklahoma Oregon Pennsylvania
## 209 209 209
## Rhode Island South Carolina South Dakota
## 209 209 209
## Tennessee Texas United States
## 209 209 209
## Utah Vermont Virginia
## 209 209 209
## Washington West Virginia Wisconsin
## 209 209 209
## Wyoming
## 209
La variable categórica icd_cause representa la causa de muerte codificada según una clasificación internacional (CIE-10), y cuenta con 11 niveles o categorías diferentes, cada una con 988 observaciones. Estas causas incluyen desde enfermedades crónicas como diabetes, enfermedades cardíacas, Alzheimer y cáncer, hasta causas externas como lesiones no intencionales y suicidio. La variable cause es una versión más resumida o estandarizada de icd_cause, también con 11 categorías y 988 registros por categoría, lo que indica una relación uno a uno con icd_cause. Por otro lado, la variable state contiene 52 niveles, incluyendo los 50 estados de EE. UU., el Distrito de Columbia y una categoría para “United States” como país completo, cada uno con 209 observaciones. Esta distribución sugiere una cobertura geográfica completa y equitativa por estado, lo cual es clave para realizar análisis comparativos regionales de mortalidad. Esta estructura de datos bien balanceada facilitará análisis robustos por causa de muerte, ubicación y año.
# 📊 Distribución de muertes por causa
df %>%
count(`cause`) %>%
arrange(desc(n)) %>%
ggplot(aes(x = reorder(`cause`, n), y = n)) +
geom_col(fill = "darkred") +
coord_flip() +
labs(
title = "Frecuencia de causas de muerte",
x = "Causa de muerte",
y = "Número de registros"
) +
theme_minimal()
En tus imágenes se ve que:
Hay 988 registros por causa.
La variable state tiene 52 niveles (incluyendo “United States”).
La variable year va de 1999 a 2017 → 19 años.
Entonces: 52 estados × 19 años = 988 combinaciones Eso confirma que para cada causa hay una entrada por cada combinación de estado y año. Por eso el conteo de registros por causa da 988.
Conclusión
Sí, es normal dado el diseño del dataset. No es un error, sino una estructura consistente con series temporales por causa y estado.
# 📊 Distribución de muertes (muertes absolutas)
ggplot(df, aes(x = deaths)) +
geom_histogram(fill = "tomato", bins = 30) +
labs(title = "Distribución de número de muertes",
x = "Muertes", y = "Frecuencia") +
theme_minimal()
# 📊 Tasa ajustada de mortalidad
ggplot(df, aes(x = rate)) +
geom_histogram(fill = "darkgreen", bins = 30) +
labs(title = "Distribución de tasa ajustada por edad",
x = "Tasa ajustada", y = "Frecuencia") +
theme_minimal()
Interpretación detallada:
Distribución bimodal:
Se observan dos picos claramente diferenciados:
Uno en el rango de 0 a ~300, con un pico principal muy marcado entre 0 y 50, lo que es esperable en tasas ajustadas por edad, típicamente inferiores a 100 o 200 en condiciones normales.
Otro pico inusual y aislado entre 600 y 1000, que no sigue la lógica de una distribución normal de tasas y es inusualmente alto.
Distribución sesgada a la derecha:
Aunque el mayor número de observaciones se concentra en valores bajos (0–100), los valores extremos hacia la derecha estiran la distribución.
Esta asimetría sugiere que la media no es representativa del comportamiento general de la variable.
# 📦 Boxplot para detectar outliers
ggplot(df, aes(y = deaths)) +
geom_boxplot(fill = "goldenrod") +
labs(title = "Boxplot del número de muertes") +
theme_minimal()
Distribución altamente asimétrica (sesgada a la derecha): La mayoría de los datos de muertes se encuentran agrupados cerca del valor mínimo (cercano a 0), mientras que existen unos pocos valores muy altos que están alejados del resto (los puntos dispersos hacia arriba). Esto indica que, en la mayoría de los casos, los registros tienen números bajos de muertes, pero hay algunos eventos extremos con un número muy elevado de muertes (probablemente agregados nacionales o causas muy prevalentes en ciertos estados o años).
Presencia de outliers (valores atípicos): Los puntos ubicados muy por encima del cuerpo principal del gráfico (los círculos negros) representan casos extremos que están fuera del rango típico. Estos deben examinarse más de cerca, ya que podrían ser errores, eventos excepcionales o datos acumulados (por ejemplo, totales nacionales frente a estatales).
# 📦 Cargar librerías necesarias
if (!require(GGally)) install.packages("GGally"); library(GGally)
## Loading required package: GGally
if (!require(corrplot)) install.packages("corrplot"); library(corrplot)
# 🧮 Seleccionar variables numéricas para análisis de correlación
num_vars <- df %>%
select(where(is.numeric)) %>%
na.omit() # Aseguramos que no haya NAs en la matriz
# 🔢 Matriz de correlación
cor_matrix <- cor(num_vars)
# 📉 Visualizar matriz de correlación
corrplot(cor_matrix, method = "color", type = "upper",
tl.col = "black", tl.cex = 0.8,
title = "Matriz de Correlación", mar = c(0,0,1,0))
# 🔍 Gráfico multivariado con GGally (máx 5-6 variables para claridad)
num_sample <- df %>%
select(deaths, rate, cause) %>%
na.omit()
GGally::ggpairs(num_sample)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Este gráfico muestra la correlación entre las variables numéricas: year,
deaths y rate.
year y deaths: La correlación es prácticamente nula (blanco). Esto indica que el número de muertes no ha tenido una tendencia clara a aumentar o disminuir con el paso de los años.
year y rate: También muestra muy poca o nula correlación, lo que sugiere que la tasa ajustada por edad no ha cambiado consistentemente con los años.
deaths y rate: Hay una correlación positiva moderada (color azul claro), lo cual tiene sentido, ya que en general a mayor número de muertes, se espera una mayor tasa ajustada (aunque no es perfecta, lo que sugiere variabilidad en población u otros factores).
Este gráfico brinda una visión más detallada de las relaciones:
Distribuciones (diagonales):
deaths: distribución sesgada, con muchos valores bajos y unos pocos valores muy altos (outliers).
rate: presenta una distribución bimodal o al menos con un grupo secundario elevado, lo que ya se vio antes en el histograma.
deaths vs rate: se reafirma la correlación positiva débil (r = 0.231). Hay una nube dispersa de puntos, pero se aprecia una ligera tendencia creciente.
cause con deaths y rate:
Los boxplots muestran mucha variabilidad según la causa. Algunas causas tienen muchas muertes pero una tasa baja (o al revés), lo que sugiere que las tasas están ajustadas por población o edad.
Hay outliers en varias causas, especialmente en deaths, como ya se vio en el boxplot anterior.
## 📌 Número total de muertes por estado
df %>%
group_by(state) %>%
summarise(total_deaths = sum(deaths, na.rm = TRUE)) %>%
arrange(desc(total_deaths)) %>%
print(n = Inf) # Mostrar todos los estados
## # A tibble: 52 × 2
## state total_deaths
## <chr> <dbl>
## 1 United States 84009152
## 2 California 8169513
## 3 Florida 5868231
## 4 Texas 5535028
## 5 New York 5161056
## 6 Pennsylvania 4304492
## 7 Ohio 3716207
## 8 Illinois 3489953
## 9 Michigan 3011369
## 10 North Carolina 2608123
## 11 New Jersey 2397044
## 12 Georgia 2326265
## 13 Tennessee 2012251
## 14 Virginia 1989346
## 15 Indiana 1934641
## 16 Missouri 1905549
## 17 Massachusetts 1812189
## 18 Washington 1635078
## 19 Wisconsin 1607291
## 20 Alabama 1603535
## 21 Arizona 1572443
## 22 Maryland 1469677
## 23 Kentucky 1423885
## 24 Louisiana 1409567
## 25 South Carolina 1364864
## 26 Minnesota 1288025
## 27 Oklahoma 1243157
## 28 Oregon 1064013
## 29 Colorado 1039435
## 30 Mississippi 992097
## 31 Arkansas 987455
## 32 Connecticut 981027
## 33 Iowa 954486
## 34 Kansas 831840
## 35 West Virginia 721988
## 36 Nevada 652604
## 37 New Mexico 521279
## 38 Nebraska 513032
## 39 Utah 472567
## 40 Maine 433412
## 41 Idaho 375595
## 42 New Hampshire 353884
## 43 Rhode Island 327640
## 44 Hawaii 320652
## 45 Montana 294784
## 46 Delaware 255015
## 47 South Dakota 244178
## 48 North Dakota 202091
## 49 Vermont 179348
## 50 District of Columbia 168907
## 51 Wyoming 145154
## 52 Alaska 117890
## 📌 Tasa de mortalidad promedio por estado
df %>%
group_by(state) %>%
summarise(avg_rate = mean(rate, na.rm = TRUE)) %>%
arrange(desc(avg_rate)) %>%
print(n = Inf)
## # A tibble: 52 × 2
## state avg_rate
## <chr> <dbl>
## 1 Mississippi 159.
## 2 West Virginia 154.
## 3 Alabama 153.
## 4 Kentucky 152.
## 5 Oklahoma 152.
## 6 Louisiana 151.
## 7 Tennessee 149.
## 8 Arkansas 148.
## 9 South Carolina 140.
## 10 Missouri 138.
## 11 Georgia 138.
## 12 Indiana 138.
## 13 District of Columbia 137.
## 14 Ohio 137.
## 15 North Carolina 134.
## 16 Nevada 134.
## 17 Michigan 132.
## 18 Pennsylvania 129.
## 19 Texas 128.
## 20 Delaware 128.
## 21 Wyoming 127.
## 22 Kansas 126.
## 23 Maine 126.
## 24 Illinois 126.
## 25 United States 126.
## 26 Montana 125.
## 27 Virginia 125.
## 28 Maryland 123.
## 29 New Mexico 123.
## 30 Alaska 123.
## 31 Idaho 121.
## 32 South Dakota 121.
## 33 Iowa 120.
## 34 Oregon 120.
## 35 Wisconsin 120.
## 36 Rhode Island 120.
## 37 Nebraska 119.
## 38 Vermont 119.
## 39 New Hampshire 119.
## 40 Washington 118.
## 41 New Jersey 118.
## 42 Arizona 117.
## 43 North Dakota 116.
## 44 Florida 116.
## 45 New York 115.
## 46 Massachusetts 114.
## 47 Utah 114.
## 48 Colorado 113.
## 49 California 112.
## 50 Connecticut 111.
## 51 Minnesota 108.
## 52 Hawaii 99.2
## 📌 Número total de muertes por año
df %>%
group_by(year) %>%
summarise(total_deaths = sum(deaths, na.rm = TRUE)) %>%
arrange(year)
## # A tibble: 19 × 2
## year total_deaths
## <dbl> <dbl>
## 1 1999 8594450
## 2 2000 8611090
## 3 2001 8631566
## 4 2002 8724520
## 5 2003 8720806
## 6 2004 8523496
## 7 2005 8675996
## 8 2006 8561880
## 9 2007 8540026
## 10 2008 8689930
## 11 2009 8551328
## 12 2010 8641568
## 13 2011 8769558
## 14 2012 8839734
## 15 2013 9014608
## 16 2014 9129652
## 17 2015 9451294
## 18 2016 9556734
## 19 2017 9790068
## 📌 Top 10 causas con más muertes acumuladas
df %>%
group_by(cause) %>%
summarise(total_deaths = sum(deaths, na.rm = TRUE)) %>%
arrange(desc(total_deaths)) %>%
slice_max(total_deaths, n = 10)
## # A tibble: 10 × 2
## cause total_deaths
## <chr> <dbl>
## 1 All causes 95457138
## 2 Heart disease 24445280
## 3 Cancer 21687288
## 4 Stroke 5453046
## 5 CLRD 5189854
## 6 Unintentional injuries 4695640
## 7 Alzheimer's disease 2989632
## 8 Diabetes 2799886
## 9 Influenza and pneumonia 2189282
## 10 Kidney disease 1717226
# Muertes por estado
df %>%
group_by(state) %>%
summarise(total_deaths = sum(deaths, na.rm = TRUE)) %>%
arrange(desc(total_deaths)) %>%
top_n(10, total_deaths) %>%
ggplot(aes(x = reorder(state, total_deaths), y = total_deaths)) +
geom_col(fill = "steelblue") +
coord_flip() +
labs(title = "Top 10 Estados con más muertes",
x = "Estado", y = "Total de muertes")
# Tasa de mortalidad promedio por causa
df %>%
group_by(cause) %>%
summarise(mean_rate = mean(rate, na.rm = TRUE)) %>%
arrange(desc(mean_rate)) %>%
top_n(10, mean_rate) %>%
ggplot(aes(x = reorder(cause, mean_rate), y = mean_rate)) +
geom_col(fill = "darkred") +
coord_flip() +
labs(title = "Top 10 Causas con mayor tasa de mortalidad promedio",
x = "Causa", y = "Tasa promedio")
Estados con mayor número total de muertes:
El gráfico muestra claramente que “United States” tiene un número significativamente mayor de muertes que cualquier estado individual.
Esto sugiere que en la base de datos se ha agregado una categoría general para todo el país, además de los estados individuales.
Entre los estados individuales, los que tienen más muertes son:
California
Florida
Texas
New York
… y así sucesivamente hasta North Carolina.
Estos estados también tienden a tener grandes poblaciones, lo cual puede explicar por qué lideran en número total de muertes.
La variable representada aquí es la tasa ajustada de mortalidad promedio por causa.
La causa “All causes” lidera con una tasa de mortalidad promedio cercana a 800, como era de esperarse, ya que incluye todas las causas de muerte.
Las siguientes causas con mayor tasa promedio son:
Heart disease (Enfermedades del corazón)
Cancer
Stroke
CLRD (Chronic Lower Respiratory Diseases)
Las tasas de causas como diabetes, influenza y neumonía, y enfermedad renal son menores, aunque también relevantes.
Conclusión: Las enfermedades cardiovasculares y el cáncer son las principales causas de mortalidad promedio en EE. UU., lo que concuerda con estadísticas globales. Este tipo de análisis por tasa (en lugar de número total de muertes) es clave para comparar la gravedad relativa de distintas causas sin el sesgo del tamaño poblacional.
df %>%
select(deaths, rate) %>%
cor() # correlación simple
## deaths rate
## deaths 1.0000000 0.2310479
## rate 0.2310479 1.0000000
plot(df$rate, df$deaths,
main = "Relación entre tasa ajustada y número de muertes",
xlab = "Tasa ajustada por edad",
ylab = "Número de muertes",
pch = 19, col = "darkgreen")
Se observan agrupamientos de puntos (clusters) en ciertas regiones del gráfico, especialmente:
Uno denso con tasas ajustadas entre 0 y 300 y muertes bajas.
Otro entre 600 y 900 de tasa ajustada, con algunos registros que tienen más de 2 millones de muertes.
Esto sugiere que hay diferencias notables entre grupos de datos, probablemente debidas a la categoría “All causes” vs. causas específicas de muerte, o diferencias por estado/población.
Aunque uno podría esperar que a mayor tasa ajustada haya más muertes, en este gráfico no se observa una clara correlación lineal.
Hay muchos puntos con tasas altas pero con pocos fallecimientos, lo que indica que la tasa ajustada no depende exclusivamente del número absoluto de muertes, sino que se ajusta por factores demográficos (como la edad).
# Detectar outliers en "deaths"
outliers_deaths <- boxplot.stats(df$deaths)$out
# Detectar outliers en "rate"
outliers_rate <- boxplot.stats(df$rate)$out
# Filtrar registros eliminando outliers de deaths y rate
df_sin_outliers <- df[!(df$deaths %in% outliers_deaths | df$rate %in% outliers_rate), ]
# Comparar histogramas antes y después
par(mfrow=c(2,1))
hist(df$rate, breaks = 30, main = "Distribución original de tasa", col = "gray", xlab = "Rate")
hist(df_sin_outliers$rate, breaks = 30, main = "Distribución sin outliers", col = "darkgreen", xlab = "Rate")
En la parte superior, observamos una distribución altamente sesgada a la derecha (asimetría positiva).
Hay una gran concentración de datos en valores bajos (cerca de 0), pero también existen valores extremadamente altos que se consideran outliers.
Estos valores extremos distorsionan la visualización y resumen estadístico, como la media o la desviación estándar.
En la parte inferior, se muestra la distribución luego de eliminar los outliers.
La forma de la distribución mejora: sigue sesgada, pero mucho más concentrada en valores que representan el comportamiento central del conjunto de datos.
La eliminación de outliers permite una mejor visualización y análisis, y evita que los valores extremos dominen el comportamiento estadístico del conjunto.