Ejemplo: Índice de Competitividad Global (ICG) Desarrollado por el Foro Económico Mundial para evaluar la capacidad de los países para proporcionar altos niveles de prosperidad y bienestar a sus ciudadanos.

Se divide en 12 pilares: 1. Calidad de las institucines públicas y privadas 2. Calidad y extensión de la infraestructura básica 3. Adopción de las TIC’s 4. Estabilidad macroeconómica 5. Estado general de la salud pública 6. Calidad de la educación primaria, secundaria y profesional 7. Eficiencia y apertura de los mercados de bienes y servicios 8. Eficiencia del mercado laboral 9. Solidez y desarrollo del sistema financiero 10. Tamaño del mercado interno y externo 11. Capacidad de innovación 12. Dinamismo empresarial

# Asegúrate de tener las librerías necesarias
#install.packages("dplyr") 
#install.packages("stringr")

library(tidyr) #para la manipulación de datos en formato largo y ancho.
library(dplyr) #para la manipulación y resumen de datos.
library(stringr) #para operaciones con cadenas de texto.
library(ggplot2) #para la creación de gráficos.
library(readxl) #para leer archivos Excel
file_path <- setwd('C://Users//john//Desktop//Practica DS//Universidad del Bosque//2. Probabilidad y estadistica//Datasets') #setwd(): Establece el directorio de trabajo a la ruta especificada. Esto define dónde se buscarán y guardarán los archivos.
library(readxl)

# Abre un diálogo para elegir el archivo Excel
file_path <- file.choose() #file.choose(): Abre un diálogo para seleccionar el archivo Excel. Esto reemplaza la línea anterior de setwd(), permitiendo seleccionar un archivo dinámicamente.

# Lee la hoja de Excel
comp <- read_xlsx(file_path, sheet = "Data", range = "A4:EU3392") #read_xlsx(): Lee los datos del archivo Excel seleccionado, especificando la hoja y el rango de celdas.

Conclusiones: tenemos 151 Columnas y 3388 filas:

Columnas: Index (chr), Edition (dbl), Series Global ID (chr), Freeze date (dttm), Series name (chr), Series units (chr), Series order (dbl), Series code (if applicable), Series type (chr), Attribute (chr), Angola(chr), Albania (chr), United Arab Emirates (chr), Argentina (chr), Armenia (chr), Australia (chr), Austria (chr), Azerbaijan (chr), Burundi (chr), Belgium (chr), Benin (chr), Burkina Faso (chr), Bangladesh (chr), Bulgaria(chr), Bahrain (chr), Bosnia and Herzegovina (chr), Bolivia (chr), Brazil(chr), Barbados(chr), Brunei Darussalam(chr), Botswana(chr), Canada(chr), Switzerland (chr), Chile (chr), China (chr), Côte d’Ivoire (chr), Cameroon(chr), Congo, Democratic Rep. (chr), Colombia(chr), Cape Verde(chr), Costa Rica(chr), Cyprus(chr), Czech Republic (chr), Germany (chr), Denmark (chr), Dominican Republic (chr), Algeria (chr), Ecuador (chr), Egypt (chr), Spain (chr), Estonia (chr), Ethiopia(chr), Finland (chr), France(chr), Gabon (chr), United Kingdom (chr), Georgia (chr), Ghana (chr), Guinea(chr), Gambia, The (chr), Greece(chr), Guatemala (chr), Hong Kong SAR (chr), Honduras(chr), Croatia (chr), Haiti (chr), Hungary (chr), Indonesia (chr), India (chr), Ireland (chr), Iran, Islamic Rep. (chr), Iceland (chr), Israel(chr), Italy (chr), Jamaica (chr), Jordan(chr), Japan (chr), Kazakhstan (chr), Kenya (chr), Kyrgyz Republic(chr), Cambodia(chr), Korea, Rep. (chr), Kuwait(chr), Lao PDR (chr), Lebanon (chr), Sri Lanka (chr), Lesotho (chr), Lithuania (chr), Luxembourg (chr), Latvia(chr), Morocco (chr), Moldova (chr), Madagascar (chr), Mexico(chr), Macedonia, FYR (chr), Mali(chr), Malta (chr), Montenegro (chr), Mongolia(chr), Mozambique (chr), Mauritania (chr), Mauritius (chr), Malawi(chr), Malaysia(chr), Namibia (chr), Nigeria (chr), Nicaragua (chr), Netherlands (chr), Norway(chr), Nepal (chr), New Zealand (chr), Oman(chr), Pakistan(chr), Panama(chr), Peru(chr), Philippines (chr), Poland(chr), Portugal(chr), Paraguay(chr), Qatar (chr), Romania (chr), Russian Federation (chr), Rwanda(chr), Saudi Arabia (chr), Senegal (chr), Singapore (chr), El Salvador (chr), Serbia(chr), Slovak Republic(chr), Slovenia(chr), Sweden(chr), Eswatini(chr), Seychelles (chr), Chad(chr), Thailand(chr), Tajikistan (chr), Trinidad and Tobago (chr), Tunisia (chr), Turkey(chr), Taiwan, China (chr), Tanzania(chr), Uganda(chr), Ukraine (chr), Uruguay (chr), United States (chr), Venezuela (chr), Viet Nam (chr), Yemen (chr), South Africa (chr), Zambia(chr), Zimbabwe(chr)

Enumero 1 fila: Vamos a desglosar un bloque completo para un país específico:

Angola Nombre del país: Angola Fila 1: (No disponible o vacío) Fila 2: 136 (Ranking del país en el índice de competitividad global) Fila 3: 38.112485933497503 (Puntuación específica en el índice de competitividad global) Fila 4: 2019 edition (Edición del informe del cual proviene esta información) Fila 5: World Economic Forum, [i]Global Competitiveness Report 2019[i] (Fuente del informe) Fila 6: (No disponible o vacío)

Interpretación Ranking: Indica la posición del país en la lista global de competitividad, donde un número más bajo representa una posición más alta (más competitiva). Puntuación: Es una medida numérica que cuantifica la competitividad del país según el informe. Edición y Fuente: Proporciona contexto sobre la versión del informe y la organización que lo publica.

Extrayendo los doce pilares de la columna “Series name”, los “SCORE”, los años 2018 y 2019, y dejando solo las columnas de interés. También convirtiendo los valores de los países en números.

comp <- comp %>%
  filter(grepl("pillar", `Series name`) &
         Attribute == "SCORE" &
         Edition %in% c(2018,2019)) %>%
  select(-c(1,3:4,6:10)) %>%
  mutate(across(Angola:Zimbabwe, as.numeric),
         `Series name` = str_replace(`Series name`, "Labor", "Labour"))

#1. filter(): Filtra el dataframe comp para incluir solo filas donde la columna Series name contiene "pillar", el atributo es "SCORE", y la edición es 2018 o 2019.
#2. select(): Elimina columnas específicas (1, 3:4, 6:10).
#3. mutate(). #across(): Convierte las columnas de países de caracteres a numéricos. str_replace(): Reemplaza "Labor" por "Labour" en la columna Series name.

# Pasando los datos a una tabla larga
# y luego ancha

comp <- comp %>% 
  pivot_longer(Angola:Zimbabwe, 
               names_to = "Country",
               values_to = "GCI") %>%
  pivot_wider(names_from = `Series name`,
              values_from = GCI) %>%
  rename_with(~ c("Año", "País", 
                  paste("Pilar", 1:12, sep = " "))) %>%
  na.omit()

#pivot_longer(): Convierte las columnas de países a un formato largo, creando dos columnas nuevas: Country y GCI.
#pivot_wider(): Convierte el formato largo de nuevo a ancho, usando los valores de Series name como nombres de columnas.
#rename_with(): Renombra las columnas, creando nombres más descriptivos como "Pilar 1", "Pilar 2", etc.
#na.omit(): Elimina filas con valores NA.
glimpse(comp)
## Rows: 279
## Columns: 14
## $ Año        <dbl> 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019,…
## $ País       <chr> "Angola", "Albania", "United Arab Emirates", "Argentina", "…
## $ `Pilar 1`  <dbl> 37.61545, 51.87481, 73.25884, 49.85289, 56.24956, 72.94070,…
## $ `Pilar 2`  <dbl> 40.19701, 57.69324, 88.48554, 68.29266, 69.40846, 79.15897,…
## $ `Pilar 3`  <dbl> 30.54782, 52.87828, 91.86652, 57.99488, 62.01999, 73.61636,…
## $ `Pilar 4`  <dbl> 40.60706, 70.00000, 100.00000, 33.92222, 75.00000, 100.0000…
## $ `Pilar 5`  <dbl> 46.89510, 85.89447, 72.17866, 83.80055, 80.72112, 94.90731,…
## $ `Pilar 6`  <dbl> 29.07538, 68.97111, 70.61322, 72.25490, 66.77603, 80.55830,…
## $ `Pilar 7`  <dbl> 37.71366, 54.36372, 71.74190, 46.95643, 59.09889, 71.38546,…
## $ `Pilar 8`  <dbl> 46.82557, 65.26328, 66.16103, 51.83999, 66.43215, 69.06673,…
## $ `Pilar 9`  <dbl> 38.42208, 53.29207, 73.83632, 52.85038, 60.15702, 85.89473,…
## $ `Pilar 10` <dbl> 53.88143, 39.57631, 70.33540, 68.59910, 37.52167, 72.61740,…
## $ `Pilar 11` <dbl> 36.74951, 61.80452, 69.27076, 58.30485, 62.54521, 75.28515,…
## $ `Pilar 12` <dbl> 18.81977, 29.75820, 52.34047, 41.74707, 39.39242, 69.52840,…
# Resumiendo los datos

# Promedio, máximo y mínimo de cada pilar
comp %>% 
  summarise(Mín.Ins = min(`Pilar 1`),
            Prom.Ins = mean(`Pilar 1`),
            Máx.Ins = max(`Pilar 1`))
# A tibble: 1 × 3
  Mín.Ins Prom.Ins Máx.Ins
    <dbl>    <dbl>   <dbl>
1    25.7     55.2    81.6
#summarise(): Calcula el mínimo, promedio y máximo de la columna Pilar 1.
Resumen = comp %>% 
  summarise(across(`Pilar 1`:`Pilar 12`,
                   list(
                     Mín = ~ min(.x),
                     Prom = ~ mean(.x),
                     Máx = ~ max(.)))) %>%
  pivot_longer(cols = everything(), 
               names_to = "Medida",
               values_to = "Valor") %>%
  separate(Medida, 
           into = c("Pilar", "Medida"), sep = "_") %>%
  pivot_wider(names_from = Medida,
              values_from = Valor) %>%
  data.frame()

#summarise(): Calcula el mínimo, promedio y máximo para cada pilar (columnas Pilar 1 a Pilar 12).
#pivot_longer(): Convierte el dataframe a formato largo, donde cada pilar tiene tres medidas (mínimo, promedio, máximo).
#separate(): Divide la columna Medida en dos columnas: Pilar y Medida.
#pivot_wider(): Convierte el formato largo de nuevo a ancho, para obtener un dataframe con una columna para cada medida.
#data.frame(): Convierte el resultado a un dataframe.
glimpse(Resumen)
## Rows: 12
## Columns: 4
## $ Pilar <chr> "Pilar 1", "Pilar 2", "Pilar 3", "Pilar 4", "Pilar 5", "Pilar 6"…
## $ Mín   <dbl> 25.72139, 26.87824, 10.76895, 0.00000, 11.93262, 28.24768, 35.43…
## $ Prom  <dbl> 55.20166, 65.52816, 53.91287, 79.89787, 75.58199, 61.10224, 55.9…
## $ Máx   <dbl> 81.55430, 95.70355, 92.83646, 100.00000, 100.00000, 87.87808, 81…
ggplot(Resumen, aes(x = Pilar)) +
  geom_point(aes(y = Prom)) +
  geom_line(aes(y = Prom, group = 1)) +
  geom_line(aes(y = Mín, group = 1), linetype = "dashed") +
  geom_line(aes(y = Máx, group = 1), linetype = "dashed")

#ggplot(): Crea un gráfico con Pilar en el eje x.
#geom_point(): Añade puntos para el promedio de cada pilar.
#geom_line(): Añade líneas para el promedio, mínimo y máximo, diferenciando el mínimo y máximo con líneas discontinuas.

Otra forma de hacer el grafico anterior:

#install.packages('plotly')
#install.packages("ggiraph")
library(ggplot2)
library(plotly)

Adjuntando el paquete: 'plotly'
The following object is masked from 'package:ggplot2':

    last_plot
The following object is masked from 'package:stats':

    filter
The following object is masked from 'package:graphics':

    layout
library(ggiraph)

# Crear el gráfico interactivo con ggiraph
p <- ggplot(Resumen, aes(x = Pilar)) +
  geom_point_interactive(aes(y = Prom, tooltip = paste("Promedio:", Prom))) +
  geom_line_interactive(aes(y = Prom, group = 1, tooltip = "Promedio")) +
  geom_line_interactive(aes(y = Mín, group = 1, linetype = "dashed", tooltip = "Mínimo")) +
  geom_line_interactive(aes(y = Máx, group = 1, linetype = "dashed", tooltip = "Máximo"))

# Convertir el gráfico ggplot a interactivo
interactive_plot <- girafe(ggobj = p)

# Mostrar el gráfico interactivo
interactive_plot
# Promedio de cada pilar agrupado por año
library(dplyr)
Prom <- comp %>%
  group_by(Año) %>%
  summarize(across(`Pilar 1`:`Pilar 12`,
                  \(x) mean(x, narm = TRUE))) %>%
  pivot_longer(cols = `Pilar 1`:`Pilar 12`,
               names_to = 'Medida',
               values_to = 'Promedio') %>%
mutate(Año = factor(Año)) %>%
data.frame()

#group_by(): Agrupa el dataframe comp por Año.
#summarize(): Calcula el promedio de cada pilar por año, usando na.rm = TRUE para manejar valores NA.
#pivot_longer(): Convierte las columnas de pilares a formato largo.
#mutate(): Convierte la columna Año a un factor.
#data.frame(): Convierte el resultado a un dataframe.
glimpse(Prom)
## Rows: 24
## Columns: 3
## $ Año      <fct> 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2…
## $ Medida   <chr> "Pilar 1", "Pilar 2", "Pilar 3", "Pilar 4", "Pilar 5", "Pilar…
## $ Promedio <dbl> 55.33251, 65.66184, 52.46483, 79.70833, 75.76191, 60.93871, 5…
ggplot(Prom, aes(x = Medida, y = Promedio, 
                 group = Año, colour = Año)) +
  geom_point() +
  geom_line()

#ggplot(): Crea un gráfico con Medida en el eje x y Promedio en el eje y.
#geom_point(): Añade puntos para el promedio de cada medida por año.
#geom_line(): Añade líneas para conectar los puntos, agrupadas por Año y coloreadas según el año.

Grafico interactivo del ejercicio anterior:

# Carga los paquetes
library(ggplot2)
library(plotly)

# Asumiendo que 'Prom' es tu dataframe con las columnas 'Medida', 'Promedio', y 'Año'
# Genera el gráfico con ggplot2
p <- ggplot(Prom, aes(x = Medida, y = Promedio, 
                      group = Año, colour = Año)) +
  geom_point() +
  geom_line()

# Convierte el gráfico ggplot a un gráfico interactivo
interactive_plot <- ggplotly(p)

# Muestra el gráfico interactivo
interactive_plot
# Promedio y desviación estándar de cada pilar por año

Desc <- comp %>% 
  group_by(Año) %>%
  summarise(across(`Pilar 1`:`Pilar 12`,
                   list(Prom = ~ mean(.x, na.rm = TRUE),
                        Desv = ~ sd(.x, na.rm = TRUE)))) %>%
  pivot_longer(cols = `Pilar 1_Prom`:`Pilar 12_Desv`, 
               names_to = "Medida",
               values_to = "Valor") %>%
  separate(Medida, 
           into = c("Pilar", "Medida"), sep = "_") %>%
  pivot_wider(names_from = Medida,
              values_from = Valor) %>%
  mutate(Año = factor(Año))
Desc
# A tibble: 24 × 4
   Año   Pilar     Prom  Desv
   <fct> <chr>    <dbl> <dbl>
 1 2018  Pilar 1   55.3 11.7 
 2 2018  Pilar 2   65.7 15.8 
 3 2018  Pilar 3   52.5 19.5 
 4 2018  Pilar 4   79.7 17.4 
 5 2018  Pilar 5   75.8 19.3 
 6 2018  Pilar 6   60.9 14.7 
 7 2018  Pilar 7   56.6  8.24
 8 2018  Pilar 8   59.4  9.16
 9 2018  Pilar 9   61.7 13.6 
10 2018  Pilar 10  54.5 17.4 
# ℹ 14 more rows
#group_by(): Agrupa por Año.
#summarise(): Calcula el promedio y la desviación estándar para cada pilar.
#pivot_longer(): Convierte el dataframe a formato largo con las medidas Prom y Desv.
#separate(): Divide la columna Medida en Pilar y Medida.
#pivot_wider(): Convierte a formato ancho para tener columnas separadas para Prom y Desv.
#mutate(): Convierte Año a un factor.
glimpse(Desc)
## Rows: 24
## Columns: 4
## $ Año   <fct> 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018…
## $ Pilar <chr> "Pilar 1", "Pilar 2", "Pilar 3", "Pilar 4", "Pilar 5", "Pilar 6"…
## $ Prom  <dbl> 55.33251, 65.66184, 52.46483, 79.70833, 75.76191, 60.93871, 56.5…
## $ Desv  <dbl> 11.728454, 15.771322, 19.479146, 17.376075, 19.318632, 14.723275…
ggplot(Desc, aes(x = Pilar, y = Prom, fill = Año)) +
  geom_bar(stat = "identity")

#ggplot(): Crea un gráfico de barras con Pilar en el eje x y Prom en el eje y.
#geom_bar(): Crea barras con el promedio de cada pilar por año, rellenadas con colores según Año.

Grafico interactivo del ejercicio anterior

# Carga los paquetes
library(ggplot2)
library(plotly)

# Asumiendo que 'Desc' es tu dataframe con las columnas 'Pilar', 'Prom', y 'Año'
# Genera el gráfico de barras con ggplot2
p <- ggplot(Desc, aes(x = Pilar, y = Prom, fill = Año)) +
  geom_bar(stat = "identity") +
  labs(x = "Pilar", y = "Promedio", title = "Promedio de Cada Pilar por Año")

# Convierte el gráfico ggplot a un gráfico interactivo
interactive_plot <- ggplotly(p)

# Muestra el gráfico interactivo
interactive_plot
#ggplot(Desc, aes(x = Pilar, y = Prom, fill = Año)): Crea el gráfico con ggplot2 donde Pilar está en el eje x, Prom en el eje y, y las barras están coloreadas por Año.

#geom_bar(stat = "identity"): Crea un gráfico de barras usando los valores directamente (sin contar los datos, que es lo que stat = "identity" indica).

#labs(x = "Pilar", y = "Promedio", title = "Promedio de Cada Pilar por Año"): Agrega etiquetas y un título al gráfico.

#ggplotly(p): Convierte el gráfico de ggplot2 a un gráfico interactivo usando plotly.