En este laboratorio se utiliza el conjunto de datos
Gapminder, que contiene información de distintos países
del mundo entre 1952 y 2007.
Incluye variables como:
country)continent)year)lifeExp)pop)gdpPercap)El objetivo es:
A continuación se presenta el análisis realizado en R.
glimpse(gapminder)
## Rows: 1,704
## Columns: 6
## $ country <fct> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", …
## $ continent <fct> Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asia, …
## $ year <int> 1952, 1957, 1962, 1967, 1972, 1977, 1982, 1987, 1992, 1997, …
## $ lifeExp <dbl> 28.801, 30.332, 31.997, 34.020, 36.088, 38.438, 39.854, 40.8…
## $ pop <int> 8425333, 9240934, 10267083, 11537966, 13079460, 14880372, 12…
## $ gdpPercap <dbl> 779.4453, 820.8530, 853.1007, 836.1971, 739.9811, 786.1134, …
Podemos ver que el conjunto tiene 1704 observaciones y 6 variables, con mediciones cada 5 años por país.
Para tener una fotografía reciente y comparable entre países, se filtran los registros del año 2007, último año disponible en el conjunto.
gap_2007 <- gapminder %>%
filter(year == 2007)
gap_2007 %>% head()
## # A tibble: 6 × 6
## country continent year lifeExp pop gdpPercap
## <fct> <fct> <int> <dbl> <int> <dbl>
## 1 Afghanistan Asia 2007 43.8 31889923 975.
## 2 Albania Europe 2007 76.4 3600523 5937.
## 3 Algeria Africa 2007 72.3 33333216 6223.
## 4 Angola Africa 2007 42.7 12420476 4797.
## 5 Argentina Americas 2007 75.3 40301927 12779.
## 6 Australia Oceania 2007 81.2 20434176 34435.
Se estudia la relación entre:
gdpPercap: PIB per cápitalifeExp: esperanza de vidacor_pearson <- cor(gap_2007$gdpPercap, gap_2007$lifeExp, method = "pearson")
cor_pearson
## [1] 0.6786624
También se calcula la matriz de correlación entre tres variables cuantitativas:
datos_quant <- gap_2007 %>%
select(lifeExp, gdpPercap, pop)
cor(datos_quant)
## lifeExp gdpPercap pop
## lifeExp 1.00000000 0.6786624 0.04755312
## gdpPercap 0.67866240 1.0000000 -0.05567560
## pop 0.04755312 -0.0556756 1.00000000
Interpretación breve
pop) no muestra una relación lineal tan
clara con estas dos variables.ggplot(gap_2007, aes(x = gdpPercap, y = lifeExp)) +
geom_point(alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, linewidth = 1) +
scale_x_log10() +
labs(
title = "Relación entre PIB per cápita y esperanza de vida (2007)",
x = "PIB per cápita (escala log10)",
y = "Esperanza de vida (años)"
) +
theme_minimal(base_size = 13)
Se observa una tendencia creciente: a mayor PIB per cápita, mayor esperanza de vida.
Ahora se analiza cómo se distribuye la esperanza de vida entre continentes mediante un diagrama de cajas (boxplot).
ggplot(gap_2007, aes(x = continent, y = lifeExp)) +
geom_boxplot(fill = "#56B4E9", alpha = 0.7) +
labs(
title = "Esperanza de vida por continente (2007)",
x = "Continente",
y = "Esperanza de vida (años)"
) +
theme_minimal(base_size = 13)
Comentarios
Se crea una nueva variable cualitativa según si la esperanza de vida está por encima de la mediana mundial de 2007.
mediana_life <- median(gap_2007$lifeExp)
gap_2007 <- gap_2007 %>%
mutate(grupo_life = if_else(lifeExp > mediana_life, "Alta", "Baja"))
mediana_life
## [1] 71.9355
tabla_cruzada <- table(gap_2007$continent, gap_2007$grupo_life)
tabla_cruzada
##
## Alta Baja
## Africa 5 47
## Americas 17 8
## Asia 18 15
## Europe 29 1
## Oceania 2 0
prop.table(tabla_cruzada, margin = 1)
##
## Alta Baja
## Africa 0.09615385 0.90384615
## Americas 0.68000000 0.32000000
## Asia 0.54545455 0.45454545
## Europe 0.96666667 0.03333333
## Oceania 1.00000000 0.00000000
tabla_df <- as.data.frame(tabla_cruzada)
ggplot(tabla_df, aes(x = Var2, y = Var1, fill = Freq)) +
geom_tile(color = "white") +
geom_text(aes(label = Freq), color = "black", size = 4) +
scale_fill_gradient(low = "#c7e9b4", high = "#081d58") +
labs(
title = "Tabla cruzada: Continente vs Grupo de esperanza de vida",
x = "Grupo de esperanza de vida",
y = "Continente",
fill = "Frecuencia"
) +
theme_minimal(base_size = 13)
Este gráfico muestra cuántos países de cada continente están en los grupos de esperanza de vida Alta y Baja.
ggplot(gap_2007, aes(x = continent, fill = grupo_life)) +
geom_bar(position = "fill") +
labs(
title = "Proporción de países con esperanza de vida alta o baja por continente (2007)",
x = "Continente",
y = "Proporción de países",
fill = "Grupo de esperanza de vida"
) +
scale_y_continuous(labels = percent_format()) +
theme_minimal(base_size = 13)
Interpretación
Para ilustrar el componente de pronóstico, se analizó la evolución de la esperanza de vida en Colombia.
colombia <- gapminder %>%
filter(country == "Colombia") %>%
select(year, lifeExp)
colombia
## # A tibble: 12 × 2
## year lifeExp
## <int> <dbl>
## 1 1952 50.6
## 2 1957 55.1
## 3 1962 57.9
## 4 1967 60.0
## 5 1972 61.6
## 6 1977 63.8
## 7 1982 66.7
## 8 1987 67.8
## 9 1992 68.4
## 10 1997 70.3
## 11 2002 71.7
## 12 2007 72.9
ts_colombia <- ts(colombia$lifeExp, start = 1952, frequency = 1)
ts_colombia
## Time Series:
## Start = 1952
## End = 1963
## Frequency = 1
## [1] 50.643 55.118 57.863 59.963 61.623 63.837 66.653 67.768 68.421 70.313
## [11] 71.682 72.889
autoplot(ts_colombia) +
labs(
title = "Evolución de la esperanza de vida en Colombia (1952–2007)",
x = "Año",
y = "Esperanza de vida (años)"
) +
theme_minimal(base_size = 13)
La serie muestra una tendencia creciente clara a lo largo del periodo analizado.
El modelo SES supone que la serie no presenta tendencia ni estacionalidad explícita. Se ajusta un modelo con pronósticos a 5 pasos.
modelo_ses <- ses(ts_colombia, h = 5)
summary(modelo_ses)
##
## Forecast method: Simple exponential smoothing
##
## Model Information:
## Simple exponential smoothing
##
## Call:
## ses(y = ts_colombia, h = 5)
##
## Smoothing parameters:
## alpha = 0.9999
##
## Initial states:
## l = 50.6436
##
## sigma: 2.3695
##
## AIC AICc BIC
## 54.33555 57.33555 55.79027
##
## Error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 1.85396 2.163068 1.854058 2.967531 2.967724 0.9167776 -0.110733
##
## Forecasts:
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 1964 72.88888 69.85221 75.92554 68.24470 77.53306
## 1965 72.88888 68.59460 77.18316 66.32135 79.45641
## 1966 72.88888 67.62957 78.14819 64.84546 80.93230
## 1967 72.88888 66.81600 78.96175 63.60122 82.17654
## 1968 72.88888 66.09923 79.67853 62.50501 83.27275
autoplot(modelo_ses) +
labs(
title = "Pronóstico de esperanza de vida en Colombia (SES)",
x = "Año",
y = "Esperanza de vida (años)"
) +
theme_minimal(base_size = 13)
El modelo SES genera pronósticos prácticamente constantes alrededor del último nivel observado, por lo que puede subestimar la tendencia creciente.
El método de Holt incorpora tanto nivel como tendencia, y es más adecuado para series que crecen o decrecen de forma sistemática.
modelo_holt <- holt(ts_colombia, h = 5)
summary(modelo_holt)
##
## Forecast method: Holt's method
##
## Model Information:
## Holt's method
##
## Call:
## holt(y = ts_colombia, h = 5)
##
## Smoothing parameters:
## alpha = 0.9999
## beta = 0.9999
##
## Initial states:
## l = 46.1852
## b = 4.4673
##
## sigma: 1.0732
##
## AIC AICc BIC
## 36.64952 46.64952 39.07405
##
## Error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -0.2717248 0.8762912 0.6737951 -0.4476425 1.041755 0.3331721
## ACF1
## Training set -0.09922659
##
## Forecasts:
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 1964 74.09598 72.72058 75.47138 71.99248 76.19948
## 1965 75.30294 72.22770 78.37819 70.59976 80.00613
## 1966 76.50991 71.36410 81.65572 68.64007 84.37974
## 1967 77.71687 70.18421 85.24954 66.19666 89.23709
## 1968 78.92384 68.72458 89.12310 63.32541 94.52226
autoplot(modelo_holt) +
labs(
title = "Pronóstico de esperanza de vida en Colombia (Método de Holt)",
x = "Año",
y = "Esperanza de vida (años)"
) +
theme_minimal(base_size = 13)
Los pronósticos de Holt son crecientes y se ajustan mejor al comportamiento histórico de la serie. El error de ajuste (MAPE y RMSE) es menor que en el modelo SES.
En esta sección se recopilan los comandos principales empleados en el análisis.
# Carga de paquetes y datos
library(gapminder)
library(tidyverse)
library(forecast)
library(scales)
data(gapminder)
# Filtrado año 2007
gap_2007 <- gapminder %>% filter(year == 2007)
# Correlaciones
cor(gap_2007$gdpPercap, gap_2007$lifeExp)
## [1] 0.6786624
datos_quant <- gap_2007 %>% select(lifeExp, gdpPercap, pop)
cor(datos_quant)
## lifeExp gdpPercap pop
## lifeExp 1.00000000 0.6786624 0.04755312
## gdpPercap 0.67866240 1.0000000 -0.05567560
## pop 0.04755312 -0.0556756 1.00000000
# Gráfico de dispersión
ggplot(gap_2007, aes(gdpPercap, lifeExp)) +
geom_point() + geom_smooth(method = "lm", se = FALSE) +
scale_x_log10()
# Boxplot por continente
ggplot(gap_2007, aes(continent, lifeExp)) +
geom_boxplot()
# Grupo de esperanza de vida
mediana_life <- median(gap_2007$lifeExp)
gap_2007 <- gap_2007 %>%
mutate(grupo_life = if_else(lifeExp > mediana_life, "Alta", "Baja"))
tabla_cruzada <- table(gap_2007$continent, gap_2007$grupo_life)
# Heatmap de la tabla cruzada
tabla_df <- as.data.frame(tabla_cruzada)
ggplot(tabla_df, aes(Var2, Var1, fill = Freq)) +
geom_tile() +
geom_text(aes(label = Freq))
# Serie de tiempo de Colombia
colombia <- gapminder %>%
filter(country == "Colombia") %>%
select(year, lifeExp)
ts_colombia <- ts(colombia$lifeExp, start = 1952, frequency = 1)
# Modelos de pronóstico
modelo_ses <- ses(ts_colombia, h = 5)
modelo_holt <- holt(ts_colombia, h = 5)