1. CREACIÓN DE LA BASE DE DATOS

En primer lugar, vamos a crear la base de datos que utilizaremos a lo largo del objetivo, detallando los indicadores en los que se centrará el análisis, así como los años seleccionados para cada uno de ellos.

1.1 CARGA DE LOS DATOS

Una vez descargados los datos de las fuentes correspondientes, el primer paso consistirá en cargar los archivos y seleccionar las variables pertinentes. En cada caso, elegiremos únicamente dos variables: la que contiene los nombres de los países y la variable específica que se va a estudiar, que será el índice determinado en cada situación.

COSTE DE VIDA

  • Años: 2011, 2013, 2015, 2017, 2019, 2020, 2021, 2022

Para el coste de vida, que es el foco de nuestra investigación, hemos decidido coger un amplio rango de años, de forma que podamos poner más atención a su evolución.

costevida2011 = read_xlsx("D:/2º/2º CUATRIMESTRE/PROY II/OBJETIVO 4_EVOLUCIÓN/Coste de vida 2011.xlsx")
costevida2011 = costevida2011[,2:3]
colnames(costevida2011) = c('Paises', 'Índice.Costo.Vida.2011')

costevida2013 = read_xlsx("D:/2º/2º CUATRIMESTRE/PROY II/OBJETIVO 4_EVOLUCIÓN/Coste de vida 2013.xlsx")
costevida2013 = costevida2013[,2:3]
colnames(costevida2013) = c('Paises', 'Índice.Costo.Vida.2013')

costevida2015 = read_xlsx("D:/2º/2º CUATRIMESTRE/PROY II/OBJETIVO 4_EVOLUCIÓN/Coste de vida 2015.xlsx")
costevida2015 = costevida2015[,2:3]
colnames(costevida2015) = c('Paises', 'Índice.Costo.Vida.2015')

costevida2017 = read_xlsx("D:/2º/2º CUATRIMESTRE/PROY II/OBJETIVO 4_EVOLUCIÓN/Coste de vida 2017.xlsx")
costevida2017 = costevida2017[,2:3]
colnames(costevida2017) = c('Paises', 'Índice.Costo.Vida.2017')

costevida2019 = read_xlsx("D:/2º/2º CUATRIMESTRE/PROY II/OBJETIVO 4_EVOLUCIÓN/Coste de vida 2019.xlsx")
costevida2019 = costevida2019[,2:3]
colnames(costevida2019) = c('Paises', 'Índice.Costo.Vida.2019')

costevida2020 = read_xlsx("D:/2º/2º CUATRIMESTRE/PROY II/OBJETIVO 4_EVOLUCIÓN/Coste de vida 2020.xlsx")
costevida2020 = costevida2020[,2:3]
colnames(costevida2020) = c('Paises', 'Índice.Costo.Vida.2020')

costevida2021 = read_xlsx("D:/2º/2º CUATRIMESTRE/PROY II/OBJETIVO 4_EVOLUCIÓN/Coste de vida 2021.xlsx")
costevida2021 = costevida2021[,2:3]
colnames(costevida2021) = c('Paises', 'Índice.Costo.Vida.2021')

costevida2022 = read_xlsx("D:/2º/2º CUATRIMESTRE/PROY II/OBJETIVO 4_EVOLUCIÓN/Coste de vida 2022.xlsx")
costevida2022 = costevida2022[,2:3]
colnames(costevida2022) = c('Paises', 'Índice.Costo.Vida.2022')

costevida = left_join(costevida2011, costevida2013)
## Joining with `by = join_by(Paises)`
costevida = left_join(costevida, costevida2015)
## Joining with `by = join_by(Paises)`
costevida = left_join(costevida, costevida2017)
## Joining with `by = join_by(Paises)`
costevida = left_join(costevida, costevida2019)
## Joining with `by = join_by(Paises)`
costevida = left_join(costevida, costevida2020)
## Joining with `by = join_by(Paises)`
costevida = left_join(costevida, costevida2021)
## Joining with `by = join_by(Paises)`
costevida = left_join(costevida, costevida2022)
## Joining with `by = join_by(Paises)`
head(costevida)
## # A tibble: 6 × 9
##   Paises    Índice.Costo.Vida.2011 Índice.Costo.Vida.2013 Índice.Costo.Vida.2015
##   <chr>                      <dbl>                  <dbl>                  <dbl>
## 1 Noruega                     140.                   174.                  119. 
## 2 Suiza                       131.                   152.                  126. 
## 3 Dinamarca                   120.                   120.                  101. 
## 4 Bélgica                     109.                   108.                   87.2
## 5 Australia                   108.                   134.                   99.3
## 6 Irlanda                     107.                   112.                   92.1
## # ℹ 5 more variables: Índice.Costo.Vida.2017 <dbl>,
## #   Índice.Costo.Vida.2019 <dbl>, Índice.Costo.Vida.2020 <dbl>,
## #   Índice.Costo.Vida.2021 <dbl>, Índice.Costo.Vida.2022 <dbl>

PIB

  • Años: 2019, 2020, 2021, 2022

En relación al PIB, hemos optado por escoger los años más recientes con el fin de analizar con mayor detalle los efectos de los recientes acontecimientos, tal como se explica en el informe.

PIBcapita2019 = read.csv('D:/2º/2º CUATRIMESTRE/PROY II/objetivo 4/pib_anual_per_capita2019.csv')
PIBcapita2019 = PIBcapita2019[,-1]

PIBcapita2020 = read.csv('D:/2º/2º CUATRIMESTRE/PROY II/objetivo 4/pib_anual_per_capita2020.csv')
PIBcapita2020 = PIBcapita2020[,-1]

PIBcapita2021 = read.csv('D:/2º/2º CUATRIMESTRE/PROY II/objetivo 4/pib_anual_per_capita2021.csv')
PIBcapita2021 = PIBcapita2021[,-1]

PIBcapita2022 = read.csv('D:/2º/2º CUATRIMESTRE/PROY II/objetivo 4/pib_anual_per_capita2022.csv')
PIBcapita2022 = PIBcapita2022[,-1]

PIB = left_join(PIBcapita2019, PIBcapita2020)
## Joining with `by = join_by(Paises)`
PIB = left_join(PIB, PIBcapita2021)
## Joining with `by = join_by(Paises)`
PIB = left_join(PIB, PIBcapita2022)
## Joining with `by = join_by(Paises)`
head(PIB)
##        Paises PIB.per.cápita.2019 PIB.per.cápita.2020 PIB.per.cápita.2021
## 1      España               26440               23610               25500
## 2    Alemania               41510               40950               43290
## 3 Reino Unido               37830               35353               39339
## 4     Francia               35970               33980               36660
## 5      Italia               30080               27940               30230
## 6    Portugal               20840               19470               20870
##   PIB.per.cápita.2022
## 1               27870
## 2               46180
## 3               43434
## 4               38590
## 5               32390
## 6               23290

FELICIDAD

  • Años: 2017, 2019, 2020, 2022

Del índice de felicidad nos interesa estudiar dos periodos distintos, uno antes de la pandemia y otro durante/después de la pandemia. De ahí la elección de los años especificados.

felicidad2017 = read_xlsx('D:\\2º\\2º CUATRIMESTRE\\PROY II\\objetivo 4\\indice_felicidad_2017.xlsx')
felicidad2017 = felicidad2017[,c(1,3)]
colnames(felicidad2017) = c('Paises','Índice.Felicidad.2017')
felicidad2017$Paises = gsub(" \\[\\+\\]", "", felicidad2017$Paises)

felicidad2019 = read_xlsx("D:/2º/2º CUATRIMESTRE/PROY II/OBJETIVO 4_EVOLUCIÓN/Felicidad 2019.xlsx")
felicidad2019 = felicidad2019[,c(1,3)]
colnames(felicidad2019) = c('Paises','Índice.Felicidad.2019')
felicidad2019$Paises = gsub(" \\[\\+\\]", "", felicidad2019$Paises)

felicidad2020 = read_xlsx('D:\\2º\\2º CUATRIMESTRE\\PROY II\\objetivo 4\\indice_felicidad_2020.xlsx')
felicidad2020 = felicidad2020[,c(1,3)]
colnames(felicidad2020) = c('Paises','Índice.Felicidad.2020')
felicidad2020$Paises = gsub(" \\[\\+\\]", "", felicidad2020$Paises)

felicidad2022 = read_xlsx("D:/2º/2º CUATRIMESTRE/PROY II/OBJETIVO 4_EVOLUCIÓN/Felicidad 2022.xlsx")
felicidad2022 = felicidad2022[,c(1,3)]
colnames(felicidad2022) = c('Paises','Índice.Felicidad.2022')
felicidad2022$Paises = gsub(" \\[\\+\\]", "", felicidad2022$Paises)

felicidad = left_join(felicidad2017, felicidad2019)
## Joining with `by = join_by(Paises)`
felicidad = left_join(felicidad, felicidad2020)
## Joining with `by = join_by(Paises)`
felicidad = left_join(felicidad, felicidad2022)
## Joining with `by = join_by(Paises)`
head(felicidad)
## # A tibble: 6 × 5
##   Paises      Índice.Felicidad.2017 Índice.Felicidad.2019 Índice.Felicidad.2020
##   <chr>                       <dbl>                 <dbl>                 <dbl>
## 1 España                       6.40                  6.35                  6.40
## 2 Alemania                     6.95                  6.98                  7.08
## 3 Reino Unido                  6.71                  7.05                  7.16
## 4 Francia                      6.44                  6.59                  6.66
## 5 Italia                       5.96                  6.22                  6.39
## 6 Portugal                     5.20                  5.69                  5.91
## # ℹ 1 more variable: Índice.Felicidad.2022 <dbl>

CONSUMO ENERGÍA

  • Años: 2011, 2019, 2022

Para analizar la evolución del consumo de energía, también hemos dividido el estudio en dos periodos, pero en este caso son más extensos. Esto se debe a que buscamos identificar cambios a largo plazo en dicho consumo.

consumo2011 = read_xlsx("D:/2º/2º CUATRIMESTRE/PROY II/OBJETIVO 4_EVOLUCIÓN/Consumo Electricidad per Cápita 2011.xlsx")
consumo2011 = consumo2011[,c(1,4)]
colnames(consumo2011) = c('Paises','Consumo.capita.kWh.2011')
consumo2011$Paises = gsub(" \\[\\+\\]", "", consumo2011$Paises)

consumo2019 = read_xlsx("D:/2º/2º CUATRIMESTRE/PROY II/OBJETIVO 4_EVOLUCIÓN/Consumo Electricidad per Cápita 2019.xlsx")
consumo2019 = consumo2019[,c(1,4)]
colnames(consumo2019) = c('Paises','Consumo.capita.kWh.2019')
consumo2019$Paises = gsub(" \\[\\+\\]", "", consumo2019$Paises)

consumo2022 = read_xlsx("D:/2º/2º CUATRIMESTRE/PROY II/OBJETIVO 4_EVOLUCIÓN/Consumo Electricidad per Cápita 2022.xlsx")
consumo2022 = consumo2022[,c(1,5)]
colnames(consumo2022) = c('Paises','Consumo.capita.kWh.2022')
consumo2022$Paises = gsub(" \\[\\+\\]", "", consumo2022$Paises)

consumo = left_join(consumo2011, consumo2019)
## Joining with `by = join_by(Paises)`
consumo = left_join(consumo, consumo2022)
## Joining with `by = join_by(Paises)`
head(consumo)
## # A tibble: 6 × 4
##   Paises    Consumo.capita.kWh.2…¹ Consumo.capita.kWh.2…² Consumo.capita.kWh.2…³
##   <chr>                      <dbl>                  <dbl>                  <dbl>
## 1 España                     5768.                  5592.                  5259.
## 2 Alemania                   6811                   6222.                  6147 
## 3 Reino Un…                  5170.                  4614.                  4283.
## 4 Francia                    6892.                  6639.                  6595.
## 5 Italia                     5318.                  4762.                  5085.
## 6 Portugal                   4702.                  4769.                  4612.
## # ℹ abbreviated names: ¹​Consumo.capita.kWh.2011, ²​Consumo.capita.kWh.2019,
## #   ³​Consumo.capita.kWh.2022

GASTO PÚBLICO EN DEFENSA

  • Años: 2019, 2022

En relación al gasto público en defensa, nos limitaremos a analizar únicamente dos años que consideramos representativos de los eventos que queremos estudiar. Además, en este caso, el indicador que utilizaremos en los cálculos y gráficos es el resultado de multiplicar el gasto público en millones de euros por el porcentaje destinado específicamente a defensa. Esto nos proporciona los millones de euros invertidos en defensa en cada país. La razón detrás de este enfoque se debe a que la cantidad total de gasto público puede haber experimentado una disminución o aumento, mientras que el porcentaje destinado a defensa puede haber experimentado cambios opuestos. Al utilizar este enfoque, evitamos obtener resultados erróneos sobre la variación del gasto en defensa.

gastodefensa2019 = read_xlsx("D:/2º/2º CUATRIMESTRE/PROY II/OBJETIVO 4_EVOLUCIÓN/Gasto Público 2019.xlsx")
gastodefensa2019 = gastodefensa2019
gastodefensa2019$Países = gsub(" \\[\\+\\]", "", gastodefensa2019$Países)
gastodefensa2019$Gasto.Defensa.2019 = (gastodefensa2019$`G. Público (M.€)` * gastodefensa2019$`Gasto Defensa (%Gto Pub)`)/100
gastodefensa2019 = gastodefensa2019[,c(1,9)]
colnames(gastodefensa2019)[1] =  'Paises'

gastodefensa2022 = read_xlsx("D:/2º/2º CUATRIMESTRE/PROY II/OBJETIVO 4_EVOLUCIÓN/Gasto Público 2022.xlsx")
gastodefensa2022 = gastodefensa2022
gastodefensa2022$Países = gsub(" \\[\\+\\]", "", gastodefensa2022$Países)
gastodefensa2022$Gasto.Defensa.2022 = (gastodefensa2022$`G. Público (M.€)` * gastodefensa2022$`Gasto Defensa (%Gto Pub)`) / 100
gastodefensa2022 = gastodefensa2022[,c(1,9)]
colnames(gastodefensa2022)[1] = 'Paises'

defensa = left_join(gastodefensa2019, gastodefensa2022)
## Joining with `by = join_by(Paises)`
head(defensa)
## # A tibble: 6 × 3
##   Paises      Gasto.Defensa.2019 Gasto.Defensa.2022
##   <chr>                    <dbl>              <dbl>
## 1 España                   113.               171. 
## 2 Alemania                 467.               484. 
## 3 Reino Unido              537.               569. 
## 4 Francia                  444.               493. 
## 5 Italia                   212.               286. 
## 6 Portugal                  30.4               43.2

CONVERSIÓN

Para finalizar, hemos cargado una base de datos que incluye los nombres de los países en inglés. Esta elección nos permitirá utilizar bibliotecas y herramientas que facilitan la creación de representaciones visuales geográficas, lo cual será de gran utilidad para nuestro análisis.

conversion = read.csv('D:/2º/2º CUATRIMESTRE/PROY II/OBJETIVO 4_EVOLUCIÓN/paises_conversion.csv')[,1:2]
colnames(conversion) = c('Paises','Country')
head(conversion)
##       Paises     Country
## 1 Afganistán Afghanistan
## 2    Albania     Albania
## 3   Alemania     Germany
## 4    Andorra     Andorra
## 5     Angola      Angola
## 6    Anguila    Anguilla

1.2 CONCATENACIÓN

El siguiente paso es concatenar todas las variables seleccionadas, excepto la de conversión, la cual uniremos con el resto de la base de datos tras el tratamiento de los valores faltantes.

bd = left_join(costevida, PIB)
## Joining with `by = join_by(Paises)`
bd = left_join(bd, felicidad)
## Joining with `by = join_by(Paises)`
bd = left_join(bd, consumo)
## Joining with `by = join_by(Paises)`
bd = left_join(bd, defensa)
## Joining with `by = join_by(Paises)`
bd
## # A tibble: 83 × 22
##    Paises   Índice.Costo.Vida.2011 Índice.Costo.Vida.2013 Índice.Costo.Vida.2015
##    <chr>                     <dbl>                  <dbl>                  <dbl>
##  1 Noruega                   140.                    174.                  119. 
##  2 Suiza                     131.                    152.                  126. 
##  3 Dinamar…                  120.                    120.                  101. 
##  4 Bélgica                   109.                    108.                   87.2
##  5 Austral…                  108.                    134.                   99.3
##  6 Irlanda                   107.                    112.                   92.1
##  7 Países …                  106.                    104.                   86.0
##  8 Francia                   101.                    103.                   88.4
##  9 Suecia                    101.                    114.                   82.9
## 10 Finland…                   98.6                   107.                   89.7
## # ℹ 73 more rows
## # ℹ 18 more variables: Índice.Costo.Vida.2017 <dbl>,
## #   Índice.Costo.Vida.2019 <dbl>, Índice.Costo.Vida.2020 <dbl>,
## #   Índice.Costo.Vida.2021 <dbl>, Índice.Costo.Vida.2022 <dbl>,
## #   PIB.per.cápita.2019 <int>, PIB.per.cápita.2020 <int>,
## #   PIB.per.cápita.2021 <int>, PIB.per.cápita.2022 <int>,
## #   Índice.Felicidad.2017 <dbl>, Índice.Felicidad.2019 <dbl>, …

1.3 FALTANTES

Para crear esta base de datos, es necesario contar con datos completos, ya que realizaremos operaciones matemáticas sobre ellos. Después de eliminar los valores faltantes, reducimos el número de países de 83 a 69, número que consideramos suficiente para realizar nuestro análisis con éxito.

plot_missing(bd)

bd = na.omit(bd)

1.4 CONCATENACIÓN 2

El último paso para dejar la base de datos con la que vamos a trabajar a lo largo del objetivo finalizada, es unir la variable de conversión comentada anteriormente.

bd = left_join(bd, conversion)
## Joining with `by = join_by(Paises)`

Además, vamos a volver a ver si hay algún faltante y cuáles son, tras introducir la nueva variable por si fuera necesario escribir manualmente alguna conversión.

faltantes = rownames(bd)[apply(is.na(bd), 1, function(x) sum(x) / length(x) > 0)]
bd[faltantes, 1]
## # A tibble: 2 × 1
##   Paises             
##   <chr>              
## 1 Estados Unidos     
## 2 Macedonia del Norte

Como vemos hay dos países que no se han traducido correctamente. Consecuentemente, buscamos la posición de ambos países y sustituimos en la variable Country el valor correspondiente.

bd[26,23] = 'USA'
bd[64,23] = 'Macedonia'
bd
## # A tibble: 69 × 23
##    Paises   Índice.Costo.Vida.2011 Índice.Costo.Vida.2013 Índice.Costo.Vida.2015
##    <chr>                     <dbl>                  <dbl>                  <dbl>
##  1 Noruega                   140.                    174.                  119. 
##  2 Suiza                     131.                    152.                  126. 
##  3 Dinamar…                  120.                    120.                  101. 
##  4 Bélgica                   109.                    108.                   87.2
##  5 Austral…                  108.                    134.                   99.3
##  6 Irlanda                   107.                    112.                   92.1
##  7 Países …                  106.                    104.                   86.0
##  8 Francia                   101.                    103.                   88.4
##  9 Suecia                    101.                    114.                   82.9
## 10 Finland…                   98.6                   107.                   89.7
## # ℹ 59 more rows
## # ℹ 19 more variables: Índice.Costo.Vida.2017 <dbl>,
## #   Índice.Costo.Vida.2019 <dbl>, Índice.Costo.Vida.2020 <dbl>,
## #   Índice.Costo.Vida.2021 <dbl>, Índice.Costo.Vida.2022 <dbl>,
## #   PIB.per.cápita.2019 <int>, PIB.per.cápita.2020 <int>,
## #   PIB.per.cápita.2021 <int>, PIB.per.cápita.2022 <int>,
## #   Índice.Felicidad.2017 <dbl>, Índice.Felicidad.2019 <dbl>, …

2. EVOLUCIÓN DE LAS VARIABLES

En este apartado vamos a calcular las variaciones y vamos a mostrar las representaciones necesarias para dar respuesta a las preguntas de análisis.

COSTE DE VIDA

En este caso, vamos a representar un gráfico de líneas que nos permita observar toda la evolución de este índice. Para ello, primero vamos a crear una nueva base de datos que tan solo incluya los años y las medias respectivas del indicador para cada año.

años = c('2011','2013', '2015', '2017','2019','2020','2021','2022')
medias = colMeans(bd[, 2:9])
datos = data.frame(años = años, medias = round(medias,2))
head(datos)
##                        años medias
## Índice.Costo.Vida.2011 2011  70.70
## Índice.Costo.Vida.2013 2013  75.98
## Índice.Costo.Vida.2015 2015  62.44
## Índice.Costo.Vida.2017 2017  54.55
## Índice.Costo.Vida.2019 2019  51.91
## Índice.Costo.Vida.2020 2020  52.50

A partir de estos resultados y haciendo uso de la librería highchart representamos el gráfico deseado.

highchart() %>%
  hc_chart(type = 'line') %>%
  hc_xAxis(categories = datos$años) %>%
  hc_add_series(datos$medias, name = 'Índice de coste de vida', dataLabels = list(enabled = TRUE)) %>%
  hc_exporting(enabled = TRUE) %>%
  hc_plotOptions(series = list(animation = FALSE))

También vamos a representar un mapa de la variación de 2019 a 2022 que son los años iniciales que queríamos estudiar.

bd$cv.variacion19a22 = ((bd$Índice.Costo.Vida.2022 - bd$Índice.Costo.Vida.2019) / bd$Índice.Costo.Vida.2019) * 100
summary(bd$cv.variacion19a22)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -22.3364  -3.2596  -0.4600  -0.2137   3.3669  20.3324

Apoyándonos de los resultados obtenidos a partir del resumen de la nueva variable, establecemos los límites para la clasificación según si han disminuido, si han disminuido mucho, si han incrementado o si han incrementado mucho. Cabe destacar que un cuartil puede incluir tanto valores positivos como negativos por lo que nos basaremos en los valores del primer y tercer cuartil separándolos por el valor 0. De esta forma, se representarán aquellos países cuya variación es positiva en verde y aquellos que muestren una variación negativa en rojo.

bd <- bd %>%
  mutate(grupo = case_when(
    cv.variacion19a22 < -3.2596 ~ "mucha disminución",
    cv.variacion19a22 < 0 ~ "disminución",
    cv.variacion19a22 > 3.3669 ~ "mucho incremento",
    cv.variacion19a22 > 0 ~ "incremento",
    TRUE ~ "sin cambio"
  ))

world_map <- map_data("world")

datos_mapa <- bd %>%
  select(Country, grupo) %>%
  distinct() %>%
  full_join(world_map, by = c("Country" = "region"))

# Crear el gráfico de mapas utilizando ggplot2
ggplot(datos_mapa, aes(x = long, y = lat, group = group, fill = grupo)) +
  geom_polygon(color = "black", size = 0.2) +
  coord_equal() +
  theme_void() +
  scale_fill_manual(values = c(
    "mucha disminución" = "#E74C3C",
    "disminución" = "#F5B7B1",
    "incremento" = "#ABEBC6",
    "mucho incremento" = "#239B56",
    "sin cambio" = "gray"
  )) +
  labs(title = "Variación coste de vida 2019-2022") +
  guides(fill = guide_legend(title = "Grupos"))
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Como hemos podido observar antes en el gráfico de líneas, en realidad este mapa no nos es de mucha utilidad ya que no estamos teniendo en cuenta los cambios producidos entre estos años. Es decir, sabemos que en 2020 y 2021 se produce un incremento que el cálculo de la variación no ha tenido en cuenta. Es por ello que preferimos utilizar el primero de los gráficos.

PIB

De la misma forma que en el coste de vida, vamos a estudiar con detalle la evolución del PIB desde 2019 hasta 2022 año por año y, posteriormente, representaremos gráficamente la variación entre este rango.

años = c('2019','2020','2021','2022')
medias = colMeans(bd[, 10:13])
datos = data.frame(años = años, medias = round(medias,2))
head(datos)
##                     años   medias
## PIB.per.cápita.2019 2019 21592.83
## PIB.per.cápita.2020 2020 20248.19
## PIB.per.cápita.2021 2021 22442.14
## PIB.per.cápita.2022 2022 25320.75
highchart() %>%
  hc_chart(type = 'line') %>%
  hc_xAxis(categories = datos$años) %>%
  hc_add_series(datos$medias, name = 'PIB', dataLabels = list(enabled = TRUE)) %>%
  hc_exporting(enabled = TRUE) %>%
  hc_plotOptions(series = list(animation = FALSE))
bd$pib.variacion19a22 = ((bd$PIB.per.cápita.2022 - bd$PIB.per.cápita.2019) / bd$PIB.per.cápita.2019) * 100
summary(bd$pib.variacion19a22)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -47.247   5.408  13.417  13.715  25.219  53.849

En este caso, tanto el primer como el tercer cuartil son positivos así que arbitrariamente elegiremos los valores -10 y 10 para establecer los límites de cambio de grupo de un país.

bd[26,23] = 'USA'
bd <- bd %>%
  mutate(grupo = case_when(
    pib.variacion19a22 < -10 ~ "mucha disminución",
    pib.variacion19a22 < 0 ~ "disminución",
    pib.variacion19a22 > 10 ~ "mucho incremento",
    pib.variacion19a22 > 0 ~ "incremento",
    TRUE ~ "sin cambio"
  ))

world_map <- map_data("world")

datos_mapa <- bd %>%
  select(Country, grupo) %>%
  distinct() %>%
  full_join(world_map, by = c("Country" = "region"))

# Crear el gráfico de mapas utilizando ggplot2
ggplot(datos_mapa, aes(x = long, y = lat, group = group, fill = grupo)) +
  geom_polygon(color = "black", size = 0.2) +
  coord_equal() +
  theme_void() +
  scale_fill_manual(values = c(
    "mucha disminución" = "#E74C3C",
    "disminución" = "#F5B7B1",
    "incremento" = "#ABEBC6",
    "mucho incremento" = "#239B56",
    "sin cambio" = "gray"
  )) +
  labs(title = "Variación PIB 2019-2022") +
  guides(fill = guide_legend(title = "Grupos"))

También podríamos utilizar mapas dinámicos para su representación pero su visualización no es muy clara ya que no separa valores positivos y negativos, sino que utiliza su propia escala, por lo que nos ceñiremos a representar los mapas estáticos.

bd[26,23] = 'United States of America'
mapdata <- get_data_from_map(download_map_data("custom/world.js"))
glimpse(mapdata)
## Rows: 213
## Columns: 14
## $ `hc-group`       <chr> "admin0", "admin0", "admin0", "admin0", "admin0", "ad…
## $ `hc-middle-x`    <dbl> 0.48, 0.57, 0.68, 0.52, 0.58, 0.34, 0.28, 0.50, 0.41,…
## $ `hc-middle-y`    <dbl> 0.54, 0.58, 0.68, 0.66, 0.41, 0.43, 0.04, 0.52, 0.56,…
## $ `hc-key`         <chr> "fo", "um", "us", "jp", "sc", "in", "fr", "fm", "cn",…
## $ `hc-a2`          <chr> "FO", "UM", "US", "JP", "SC", "IN", "FR", "FM", "CN",…
## $ name             <chr> "Faroe Islands", "United States Minor Outlying Island…
## $ labelrank        <chr> "6", "5", "2", "2", "6", "2", "2", "6", "2", "2", "5"…
## $ `country-abbrev` <chr> "Faeroe Is.", "U.S. MOI", "U.S.A.", "Japan", "Syc.", …
## $ subregion        <chr> "Northern Europe", "Seven seas (open ocean)", "Northe…
## $ `region-wb`      <chr> "Europe & Central Asia", "East Asia & Pacific", "Nort…
## $ `iso-a3`         <chr> "FRO", "UMI", "USA", "JPN", "SYC", "IND", "FRA", "FSM…
## $ `iso-a2`         <chr> "FO", "UM", "US", "JP", "SC", "IN", "FR", "FM", "CN",…
## $ `woe-id`         <chr> "23424816", "28289407", "23424977", "23424856", "2342…
## $ continent        <chr> "Europe", "North America", "North America", "Asia", "…
glimpse(bd)
## Rows: 69
## Columns: 26
## $ Paises                  <chr> "Noruega", "Suiza", "Dinamarca", "Bélgica", "A…
## $ Índice.Costo.Vida.2011  <dbl> 139.53, 130.98, 119.67, 109.39, 107.83, 107.11…
## $ Índice.Costo.Vida.2013  <dbl> 173.85, 151.77, 119.95, 108.04, 133.66, 112.33…
## $ Índice.Costo.Vida.2015  <dbl> 118.59, 126.03, 100.60, 87.22, 99.32, 92.09, 8…
## $ Índice.Costo.Vida.2017  <dbl> 106.31, 122.06, 83.02, 75.36, 80.66, 76.98, 72…
## $ Índice.Costo.Vida.2019  <dbl> 100.99, 121.16, 81.38, 72.97, 72.08, 75.35, 74…
## $ Índice.Costo.Vida.2020  <dbl> 101.43, 122.40, 83.00, 71.78, 73.54, 75.91, 73…
## $ Índice.Costo.Vida.2021  <dbl> 106.09, 131.75, 91.67, 78.52, 84.14, 83.11, 78…
## $ Índice.Costo.Vida.2022  <dbl> 100.90, 123.35, 84.12, 72.61, 77.75, 76.05, 75…
## $ PIB.per.cápita.2019     <int> 68270, 75150, 53210, 41660, 48470, 72400, 4688…
## $ PIB.per.cápita.2020     <int> 60020, 75120, 53480, 39830, 46502, 74860, 4567…
## $ PIB.per.cápita.2021     <int> 76630, 77750, 57520, 43350, 53988, 84940, 4879…
## $ PIB.per.cápita.2022     <int> 101050, 87410, 63680, 46990, 62673, 98260, 531…
## $ Índice.Felicidad.2017   <dbl> 7.537, 7.494, 7.522, 6.891, 7.284, 6.977, 7.37…
## $ Índice.Felicidad.2019   <dbl> 7.554, 7.480, 7.600, 6.923, 7.228, 7.021, 7.48…
## $ Índice.Felicidad.2020   <dbl> 7.488, 7.560, 7.646, 6.864, 7.223, 7.094, 7.44…
## $ Índice.Felicidad.2022   <dbl> 7.365, 7.512, 7.636, 6.805, 7.162, 7.041, 7.41…
## $ Consumo.capita.kWh.2011 <dbl> 23042.9, 7112.6, 6045.2, 7650.3, 10033.1, 5411…
## $ Consumo.capita.kWh.2019 <dbl> 23053.7, 6376.6, 5855.0, 7331.4, 9348.3, 5688.…
## $ Consumo.capita.kWh.2022 <dbl> 24117.4, 6604.2, 6500.9, 7171.6, 9216.7, 6451.…
## $ Gasto.Defensa.2019      <dbl> 68.6257440, 46.7233732, 40.7397485, 43.2282816…
## $ Gasto.Defensa.2022      <dbl> 78.1276726, 49.8533374, 43.6008960, 56.1956189…
## $ Country                 <chr> "Norway", "Switzerland", "Denmark", "Belgium",…
## $ cv.variacion19a22       <dbl> -0.08911773, 1.80752724, 3.36692062, -0.493353…
## $ grupo                   <chr> "mucho incremento", "mucho incremento", "mucho…
## $ pib.variacion19a22      <dbl> 48.015234, 16.314039, 19.676752, 12.794047, 29…
valor_min <- min(bd$pib.variacion19a22, na.rm = TRUE)
valor_max <- max(bd$pib.variacion19a22, na.rm = TRUE)

color_scale = colorRampPalette(c("#D4E6F1", "#154360"))
num_colors = 4
colors = color_scale(num_colors)
bd$rango = cut(bd$pib.variacion19a22, breaks = num_colors)
bd$color = colors[as.integer(bd$rango)]

hcmap("custom/world.js", data = bd, value = "pib.variacion19a22",
      joinBy = c("name", "Country"), name = "PIB",
      dataLabels = list(enabled = FALSE, format = '{point.name}'),
      borderColor = "#AEB6BF", borderWidth = 0.1,
      tooltip = list(valueDecimals = 2),
      colorAxis = bd$color)

FELICIDAD

En este caso vamos a representar dos mapas, uno para cada periodo a estudiar (antes de la pandemia y durante/después de la pandemia). Por tanto, vamos a calcular las variaciones porcentuales entre 2017 y 2019 por una parte, y 2020 y 2022 por otra.

bd$fel.variacion17a19 = ((bd$Índice.Felicidad.2019 - bd$Índice.Felicidad.2017) / bd$Índice.Felicidad.2017) * 100
summary(bd$fel.variacion17a19)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -12.2452  -1.4443   0.4644   0.3637   3.4991   9.5861
bd[26,23] = 'USA'
bd <- bd %>%
  mutate(grupo = case_when(
    fel.variacion17a19 < -1.443 ~ "mucha disminución",
    fel.variacion17a19 < 0 ~ "disminución",
    fel.variacion17a19 > 3.4991 ~ "mucho incremento",
    fel.variacion17a19 > 0 ~ "incremento",
    TRUE ~ "sin cambio"
  ))

world_map <- map_data("world")

datos_mapa <- bd %>%
  select(Country, grupo) %>%
  distinct() %>%
  full_join(world_map, by = c("Country" = "region"))

# Crear el gráfico de mapas utilizando ggplot2
ggplot(datos_mapa, aes(x = long, y = lat, group = group, fill = grupo)) +
  geom_polygon(color = "black", size = 0.2) +
  coord_equal() +
  theme_void() +
  scale_fill_manual(values = c(
    "mucha disminución" = "#E74C3C",
    "disminución" = "#F5B7B1",
    "incremento" = "#ABEBC6",
    "mucho incremento" = "#239B56",
    "sin cambio" = "gray"
  )) +
  labs(title = "Variación felicidad 2017-2019") +
  guides(fill = guide_legend(title = "Grupos"))

bd$fel.variacion20a22 = ((bd$Índice.Felicidad.2022 - bd$Índice.Felicidad.2020) / bd$Índice.Felicidad.2020) * 100
summary(bd$fel.variacion20a22)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -38.0763  -1.5687   0.1537  -0.1666   1.8264  11.4668
bd[26,23] = 'USA'
bd <- bd %>%
  mutate(grupo = case_when(
    fel.variacion20a22 < -1.5687 ~ "mucha disminución",
    fel.variacion20a22 < 0 ~ "disminución",
    fel.variacion20a22 > 1.8264 ~ "mucho incremento",
    fel.variacion20a22 > 0 ~ "incremento",
    TRUE ~ "sin cambio"
  ))

world_map <- map_data("world")

datos_mapa <- bd %>%
  select(Country, grupo) %>%
  distinct() %>%
  full_join(world_map, by = c("Country" = "region"))

# Crear el gráfico de mapas utilizando ggplot2
ggplot(datos_mapa, aes(x = long, y = lat, group = group, fill = grupo)) +
  geom_polygon(color = "black", size = 0.2) +
  coord_equal() +
  theme_void() +
  scale_fill_manual(values = c(
    "mucha disminución" = "#E74C3C",
    "disminución" = "#F5B7B1",
    "incremento" = "#ABEBC6",
    "mucho incremento" = "#239B56",
    "sin cambio" = "gray"
  )) +
  labs(title = "Variación felicidad 2020-2022") +
  guides(fill = guide_legend(title = "Grupos"))

CONSUMO ENERGÍA

En cuanto al consumo de energía también vamos a diferenciar dos periodos, 2011-2019 y 2019-2022, siguiendo el mismo proceso que en el apartado anterior.

bd$ce.variacion11a19 = ((bd$Consumo.capita.kWh.2019 - bd$Consumo.capita.kWh.2011) / bd$Consumo.capita.kWh.2011) * 100
summary(bd$ce.variacion11a19)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -21.227  -3.146   5.469   9.045  20.082  55.402
bd[26,23] = 'USA'
bd <- bd %>%
  mutate(grupo = case_when(
    ce.variacion11a19 < -3.146 ~ "mucha disminución",
    ce.variacion11a19 < 0 ~ "disminución",
    ce.variacion11a19 > 20.082 ~ "mucho incremento",
    ce.variacion11a19 > 0 ~ "incremento",
    TRUE ~ "sin cambio"
  ))

world_map <- map_data("world")

datos_mapa <- bd %>%
  select(Country, grupo) %>%
  distinct() %>%
  full_join(world_map, by = c("Country" = "region"))

# Crear el gráfico de mapas utilizando ggplot2
ggplot(datos_mapa, aes(x = long, y = lat, group = group, fill = grupo)) +
  geom_polygon(color = "black", size = 0.2) +
  coord_equal() +
  theme_void() +
  scale_fill_manual(values = c(
    "mucha disminución" = "#E74C3C",
    "disminución" = "#F5B7B1",
    "incremento" = "#ABEBC6",
    "mucho incremento" = "#239B56",
    "sin cambio" = "gray"
  )) +
  labs(title = "Variación consumo energía 2011-2019") +
  guides(fill = guide_legend(title = "Grupos"))

bd$ce.variacion19a22 = ((bd$Consumo.capita.kWh.2022 - bd$Consumo.capita.kWh.2019) / bd$Consumo.capita.kWh.2019) * 100
summary(bd$ce.variacion19a22)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -14.315  -1.207   2.183   3.370   6.267  26.802
bd[26,23] = 'USA'
bd <- bd %>%
  mutate(grupo = case_when(
    ce.variacion19a22 < -1.207 ~ "mucha disminución",
    ce.variacion19a22 < 0 ~ "disminución",
    ce.variacion19a22 > 6.267 ~ "mucho incremento",
    ce.variacion19a22 > 0 ~ "incremento",
    TRUE ~ "sin cambio"
  ))

world_map <- map_data("world")

datos_mapa <- bd %>%
  select(Country, grupo) %>%
  distinct() %>%
  full_join(world_map, by = c("Country" = "region"))

# Crear el gráfico de mapas utilizando ggplot2
ggplot(datos_mapa, aes(x = long, y = lat, group = group, fill = grupo)) +
  geom_polygon(color = "black", size = 0.2) +
  coord_equal() +
  theme_void() +
  scale_fill_manual(values = c(
    "mucha disminución" = "#E74C3C",
    "disminución" = "#F5B7B1",
    "incremento" = "#ABEBC6",
    "mucho incremento" = "#239B56",
    "sin cambio" = "gray"
  )) +
  labs(title = "Variación consumo energía 2019-2022") +
  guides(fill = guide_legend(title = "Grupos"))

Países con mejor economía

Para responder con mayor certeza a la pregunta planteada sobre si los países más ricos o desarrollados han disminuido su consumo de energía, vamos a apoyarnos de los resultados obtenidos en el objetivo 1 y 2, en el que se ha conseguido clasificar los países que mayor puntúan en la categoría económica.

paises_ranking_economico <- bd[bd$Paises %in% c("Italia", "Suiza", "Noruega", "Singapur", "Estados Unidos", "Islandia", "Irlanda", "Dinamarca", "Australia"),c(1,18,19,20, 23)]
paises_ranking_economico
## # A tibble: 9 × 5
##   Paises    Consumo.capita.kWh.2…¹ Consumo.capita.kWh.2…² Consumo.capita.kWh.2…³
##   <chr>                      <dbl>                  <dbl>                  <dbl>
## 1 Noruega                   23043.                 23054.                 24117.
## 2 Suiza                      7113.                  6377.                  6604.
## 3 Dinamarca                  6045.                  5855                   6501.
## 4 Australia                 10033.                  9348.                  9217.
## 5 Irlanda                    5412.                  5689.                  6452.
## 6 Italia                     5318.                  4762.                  5085.
## 7 Islandia                  51155.                 51049.                 49725.
## 8 Singapur                   8199.                  8973.                  9701.
## 9 Estados …                 12471.                 12142.                 11974.
## # ℹ abbreviated names: ¹​Consumo.capita.kWh.2011, ²​Consumo.capita.kWh.2019,
## #   ³​Consumo.capita.kWh.2022
## # ℹ 1 more variable: Country <chr>
highchart() %>%
     hc_chart(type = 'column') %>%
     hc_xAxis(categories = paises_ranking_economico$Paises) %>%
     hc_add_series(
          paises_ranking_economico$Consumo.capita.kWh.2011,
          name = 'Año 2011',
          dataLabels = list(enabled = TRUE),
          color = '#EC7063'
     ) %>%
     hc_add_series(
          paises_ranking_economico$Consumo.capita.kWh.2019,
          name = 'Año 2019',
          dataLabels = list(enabled = TRUE),
          color = '#979A9A'
     ) %>%
     hc_add_series(
          paises_ranking_economico$Consumo.capita.kWh.2022,
          name = 'Año 2022',
          dataLabels = list(enabled = TRUE),
          color = '#85C1E9'
     ) %>%
     hc_exporting(enabled = TRUE) %>%
     hc_plotOptions(series = list(animation = FALSE))

También podemos realizar este proceso con los clusters de países que más contribuyen a la formación de la primera componente principal (cuya contribución más alta es del PIB) que serían: Noruega, Europa Norte-Australia (Francia, Dinamarca y Australia) y America Norte-Arabia (Estados Unidos, Canadá y Arabia Saudita)

paisesmayoreconomia <- bd[bd$Paises %in% c("Noruega","Francia", "Dinamarca", "Australia", "Estados Unidos", "Canadá", "Arabia Saudita"),c(1,18,19, 20, 23) ]
paisesmayoreconomia
## # A tibble: 7 × 5
##   Paises    Consumo.capita.kWh.2…¹ Consumo.capita.kWh.2…² Consumo.capita.kWh.2…³
##   <chr>                      <dbl>                  <dbl>                  <dbl>
## 1 Noruega                   23043.                 23054.                 24117.
## 2 Dinamarca                  6045.                  5855                   6501.
## 3 Australia                 10033.                  9348.                  9217.
## 4 Francia                    6892.                  6639.                  6595.
## 5 Canadá                    15965.                 14554.                 14512 
## 6 Arabia S…                  7453.                  9690                   9645.
## 7 Estados …                 12471.                 12142.                 11974.
## # ℹ abbreviated names: ¹​Consumo.capita.kWh.2011, ²​Consumo.capita.kWh.2019,
## #   ³​Consumo.capita.kWh.2022
## # ℹ 1 more variable: Country <chr>
highchart() %>%
     hc_chart(type = 'column') %>%
     hc_xAxis(categories = paisesmayoreconomia$Paises) %>%
     hc_add_series(
          paisesmayoreconomia$Consumo.capita.kWh.2011,
          name = 'Año 2011',
          dataLabels = list(enabled = TRUE),
          color = '#EC7063'
     ) %>%
     hc_add_series(
          paisesmayoreconomia$Consumo.capita.kWh.2019,
          name = 'Año 2019',
          dataLabels = list(enabled = TRUE),
          color = '#979A9A'
     ) %>%
     hc_add_series(
          paisesmayoreconomia$Consumo.capita.kWh.2022,
          name = 'Año 2022',
          dataLabels = list(enabled = TRUE),
          color = '#85C1E9'
     ) %>%
     hc_exporting(enabled = TRUE) %>%
     hc_plotOptions(series = list(animation = FALSE))

GASTO PÚBLICO EN DEFENSA

Por útlimo, vamos a estudiar la variación del gasto público destinado en defensa, de la misma forma que en el resto de indicadores.

bd$gpd.variacion19a22 = ((bd$Gasto.Defensa.2022 - bd$Gasto.Defensa.2019) / bd$Gasto.Defensa.2019) * 100
summary(bd$gpd.variacion19a22)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
## -69.386  -2.278   6.815  10.044  23.193  68.792       3
bd[26,23] = 'USA'
bd <- bd %>%
  mutate(grupo = case_when(
    gpd.variacion19a22 < -2.278 ~ "mucha disminución",
    gpd.variacion19a22 < 0 ~ "disminución",
    gpd.variacion19a22 > 23.193 ~ "mucho incremento",
    gpd.variacion19a22 > 0 ~ "incremento",
    TRUE ~ "sin cambio"
  ))

world_map <- map_data("world")

datos_mapa <- bd %>%
  select(Country, grupo) %>%
  distinct() %>%
  full_join(world_map, by = c("Country" = "region"))

# Crear el gráfico de mapas utilizando ggplot2
ggplot(datos_mapa, aes(x = long, y = lat, group = group, fill = grupo)) +
  geom_polygon(color = "black", size = 0.2) +
  coord_equal() +
  theme_void() +
  scale_fill_manual(values = c(
    "mucha disminución" = "#E74C3C",
    "disminución" = "#F5B7B1",
    "incremento" = "#ABEBC6",
    "mucho incremento" = "#239B56",
    "sin cambio" = "gray"
  )) +
  labs(title = "Variación gasto público en defensa 2019-2022") +
  guides(fill = guide_legend(title = "Grupos"))