R Markdown

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

Including Plots

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)
Data summary
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.