Para el presente estudio se han seleccionado cinco archivos de datos provenientes de la base de datos oficial de Eurostat. Estos archivos proporcionan información detallada sobre las compras y ventas realizadas a través de Internet, así como sobre el grado de adopción y uso de Internet tanto en los hogares como a nivel individual en los países del continente europeo. El objetivo de este apartado es cargar correctamente los datos de cada archivo, realizar los tratamientos necesarios para su homogeneización y combinarlos en un único conjunto de datos, lo cual permitirá un desarrollo técnico más ágil y coherente en las etapas posteriores del análisis.
# Leer el archivo como texto plano
lines <- readLines("estat-individuals-using-internet")
# Separar la cabecera por tabulador y extraer los años
header <- unlist(strsplit(lines[1], "\t"))
years <- trimws(header[-1]) # Omitimos la primera columna (freq,...,geo\TIME_PERIOD)
# Procesar las líneas de datos (desde la segunda en adelante)
data_lines <- lines[-1]
# Extraer datos
data <- lapply(data_lines, function(line) {
parts <- unlist(strsplit(line, "\t"))
# Extraer el código del país (último elemento separado por coma)
full_code <- trimws(parts[1])
country_code <- sub(".*,(\\w{2,})$", "\\1", full_code)
# Procesar los valores por año
values <- trimws(parts[-1])
# Reemplazar ":" con NA y limpiar notas (como "91.23 b")
values <- gsub("[a-z]+", "", values) # quitar letras como b, e
values[values == ":"] <- NA # convertir ":" a NA
values <- as.numeric(values) # convertir a numérico
return(c(country_code, values))
})
# Convertir a data.frame
df_using_internet <- as.data.frame(do.call(rbind, data), stringsAsFactors = FALSE)
# Asignar nombres de columnas
colnames(df_using_internet) <- c("geo", years)
# Convertir columnas numéricas
df_using_internet[, -1] <- lapply(df_using_internet[, -1], as.numeric)
# Ver las primeras filas
head(df_using_internet)
## geo 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024
## 1 AL NA NA NA NA NA 61.67 67.56 71.45 78.89 82.49 83.10 86.12
## 2 AT 76.71 77.31 80.62 81.81 84.86 85.34 86.18 85.92 89.32 90.46 91.99 91.96
## 3 BA NA NA NA NA NA 67.71 68.52 71.89 74.91 NA 82.46 85.91
## 4 BE 80.08 82.96 83.46 83.99 85.60 87.13 88.93 90.18 91.39 93.04 93.57 94.71
## 5 BG 51.25 53.66 54.59 57.86 61.91 63.63 66.84 69.18 73.93 78.97 79.83 81.92
## 6 CH NA 86.49 NA NA 91.23 NA 95.06 NA 96.41 NA 98.20 NA
# Leer archivo como texto plano
lines <- readLines("estat-internet-use") # Cambia esto al nombre real del archivo
# Extraer cabecera
header <- unlist(strsplit(lines[1], "\t"))
years <- trimws(header[-1]) # Omitimos la primera columna
# Leer líneas de datos
data_lines <- lines[-1]
# Procesar cada línea
data <- lapply(data_lines, function(line) {
parts <- unlist(strsplit(line, "\t"))
# Extraer país (último elemento separado por coma)
full_code <- trimws(parts[1])
geo <- sub(".*,", "", full_code)
# Valores desde 2013 a 2024
values <- trimws(parts[-1])
# Limpiar: ":" -> NA, quitar letras como "b", "e", etc.
values[values == ":"] <- NA
values <- gsub("[^0-9.]", "", values) # eliminar letras y símbolos raros
return(c(geo, values))
})
# Convertir a data.frame
df_internet_use <- as.data.frame(do.call(rbind, data), stringsAsFactors = FALSE)
# Asignar nombres de columnas
colnames(df_internet_use) <- c("geo", years)
# Convertir valores a numéricos
df_internet_use[, -1] <- lapply(df_internet_use[, -1], as.numeric)
# Verificar resultado
head(df_internet_use)
## geo 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024
## 1 AL NA NA NA NA NA 64.99 69.64 73.93 80.12 85.82 85.61 88.44
## 2 AT 81.58 82.46 84.63 85.11 88.39 87.82 88.49 89.01 92.92 94.16 95.72 95.34
## 3 BA NA NA NA NA NA 71.82 70.89 74.36 76.67 NA 84.01 86.72
## 4 BE 83.03 86.15 86.06 87.31 88.83 89.93 91.41 92.16 93.62 94.53 95.26 96.32
## 5 BG 56.18 59.24 60.33 62.21 65.89 67.42 70.58 74.27 78.22 83.11 83.97 87.05
## 6 CH NA 90.59 NA NA 94.52 NA 96.82 NA 98.41 NA 99.32 NA
# Leer el archivo como texto plano
lines <- readLines("estat-level-internet-access") # Cambia esto por el nombre real
# Separar la cabecera por tabulador y extraer los años
header <- unlist(strsplit(lines[1], "\t"))
years <- trimws(header[-1]) # Omitimos la primera columna con etiquetas
# Procesar las líneas de datos
data_lines <- lines[-1]
# Extraer y limpiar los datos
data <- lapply(data_lines, function(line) {
parts <- unlist(strsplit(line, "\t"))
# Extraer código del país (último elemento de la primera columna separada por coma)
full_id <- trimws(parts[1])
country_code <- sub(".*,(\\w{2,})$", "\\1", full_id)
# Limpiar los valores: quitar letras, ":" a NA, convertir a número
values <- trimws(parts[-1])
values[values == ":"] <- NA
values <- gsub("[^0-9.]", "", values)
return(c(country_code, values))
})
# Convertir a data.frame
df_level_internet <- as.data.frame(do.call(rbind, data), stringsAsFactors = FALSE)
# Asignar nombres de columnas
colnames(df_level_internet) <- c("geo", years)
# Convertir columnas numéricas
df_level_internet[, -1] <- lapply(df_level_internet[, -1], as.numeric)
# Ver resultado
head(df_level_internet)
## geo 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024
## 1 AL NA NA NA NA NA 83.64 85.45 87.15 90.87 98.44 97.72 98.15
## 2 AT 80.86 80.99 82.42 85.09 88.79 88.78 89.91 90.40 95.00 93.15 94.98 94.96
## 3 BA NA NA NA NA NA 69.19 72.03 72.84 75.49 NA 81.55 84.19
## 4 BE 80.05 82.80 81.83 84.79 85.97 87.27 89.73 90.86 91.97 94.44 94.48 94.62
## 5 BG 53.71 56.65 59.14 63.54 67.33 72.13 75.07 78.85 83.53 87.31 88.50 92.12
## 6 CH NA 90.63 NA NA 93.06 NA 95.51 NA 98.67 NA 99.66 NA
lines <- readLines("estat-ecommerce.tsv")
header <- strsplit(lines[1], "\t")[[1]]
years <- trimws(header[-1])
data_lines <- lines[-1]
data <- lapply(data_lines, function(line){
parts <- strsplit(line, "\t")[[1]]
full_id <- trimws(parts[1])
country_code <- sub(".*,(\\w{2,})$", "\\1", full_id)
values <- trimws(parts[-1])
values[values == ":"] <- NA
values <- gsub("[^0-9.]", "", values)
c(country_code, values)
})
df_ecommerce <- as.data.frame(do.call(rbind, data), stringsAsFactors = FALSE)
colnames(df_ecommerce) <- c("geo", years)
df_ecommerce[ , -1] <- lapply(df_ecommerce[ , -1], as.numeric)
head(df_ecommerce)
## geo 2020 2021 2022 2023 2024
## 1 AL 14.43 17.18 29.75 32.98 37.52
## 2 AT 66.30 63.17 65.65 72.17 70.73
## 3 BA 27.96 29.95 NA 34.71 43.91
## 4 BE 72.72 75.19 74.83 75.26 76.08
## 5 BG 30.95 33.04 40.54 45.19 49.78
## 6 CH NA 82.69 NA 83.42 NA
lines <- readLines("estat-selling.tsv")
header <- strsplit(lines[1], "\t")[[1]]
years <- trimws(header[-1])
data <- lapply(lines[-1], function(line){
parts <- strsplit(line, "\t")[[1]]
country_code <- sub(".*,(\\w{2,})$", "\\1", trimws(parts[1]))
values <- trimws(parts[-1])
values[values == ":"] <- NA
values <- gsub("[^0-9.]", "", values)
c(country_code, values)
})
df_selling <- as.data.frame(do.call(rbind, data), stringsAsFactors = FALSE)
colnames(df_selling) <- c("geo", years)
df_selling[ , -1] <- lapply(df_selling[ , -1], as.numeric)
head(df_selling)
## geo 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024
## 1 AL NA NA NA NA NA 1.31 0.54 0.61 0.54 4.33 5.26 3.41
## 2 AT 12.35 11.20 10.47 11.04 13.13 13.86 12.07 14.98 27.74 27.01 29.73 27.84
## 3 BA NA NA NA NA NA 7.50 7.78 8.36 12.49 NA 12.89 18.79
## 4 BE 18.75 19.63 18.61 20.36 20.13 18.73 23.70 26.88 26.96 29.96 29.49 34.11
## 5 BG 10.15 6.67 8.97 6.39 4.93 8.20 6.34 6.90 6.19 9.87 8.64 12.68
## 6 CH NA 16.42 NA NA 22.80 NA 25.29 NA 29.38 NA 28.82 NA
level_long <- df_level_internet %>%
pivot_longer(-geo, names_to = "year", values_to = "value") %>%
mutate(variable = "level_internet")
use_long <- df_internet_use %>%
pivot_longer(-geo, names_to = "year", values_to = "value") %>%
mutate(variable = "internet_use")
using_long <- df_using_internet %>%
pivot_longer(-geo, names_to = "year", values_to = "value") %>%
mutate(variable = "using_internet")
ecommerce_long <- df_ecommerce %>%
pivot_longer(-geo, names_to = "year", values_to = "value") %>%
mutate(variable = "ecommerce")
selling_long <- df_selling %>%
pivot_longer(-geo, names_to = "year", values_to = "value") %>%
mutate(variable = "selling")
df_combined <- bind_rows(level_long,
use_long,
using_long,
ecommerce_long,
selling_long)
df_combined <- df_combined %>%
mutate(year = as.integer(year)) %>% # convierte año a num
arrange(geo, year, variable)
df_combined = read_csv("internet_data_estat.csv") %>% clean_names()
head(df_combined)
## # A tibble: 6 × 4
## geo year value variable
## <chr> <dbl> <dbl> <chr>
## 1 AL 2013 NA internet_use
## 2 AL 2013 NA internet_use
## 3 AL 2013 NA internet_use
## 4 AL 2013 NA internet_use
## 5 AL 2013 NA level_internet
## 6 AL 2013 NA selling
La limpieza, el análisis exploratorio y el planteamiento de la solución y su correspondiente desarrollo técnico se realizarán partiendo del archivo df_combined que incluye la información de los 5 archivos de datos.
Antes de proceder con el análisis técnico, resulta necesario realizar una fase de limpieza y análisis exploratorio de los datos. Este paso permite identificar valores faltantes, outliers, inconsistencias y patrones generales que podrían afectar a la calidad del análisis posterior. Además, facilita la comprensión de la estructura de los datos y ayuda a tomar decisiones informadas sobre qué transformaciones o filtrados son necesarios para alcanzar los objetivos del estudio.
Dado que el tratamiento de los valores faltantes dependerá del tipo de análisis que se realice posteriormente, en esta fase no se procederá a su eliminación. En su lugar, se opta por conservarlos y simplemente observar su distribución con el fin de anticipar posibles implicaciones analíticas y familiarizarnos con la estructura general de los datos.
skim(df_combined)
| Name | df_combined |
| Number of rows | 3666 |
| Number of columns | 4 |
| _______________________ | |
| Column type frequency: | |
| character | 2 |
| numeric | 2 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| geo | 0 | 1 | 2 | 9 | 0 | 39 | 0 |
| variable | 0 | 1 | 7 | 14 | 0 | 5 | 0 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| year | 0 | 1.0 | 2018.87 | 3.47 | 2013.00 | 2016.00 | 2019.00 | 2022.00 | 2024 | ▆▅▅▅▇ |
| value | 354 | 0.9 | 65.32 | 32.05 | 0.07 | 33.88 | 79.25 | 90.47 | 100 | ▃▁▁▃▇ |
# Heatmap de presencia/ausencia
vis_miss(df_combined, cluster = TRUE) +
ggplot2::labs(title = "Mapa de valores ausentes")
# % de NA por variable-año
na_by_var_year <- df_combined %>%
group_by(variable, year) %>%
summarise(na_pct = mean(is.na(value))*100, .groups="drop")
ggplot(na_by_var_year, aes(year, na_pct, colour = variable)) +
geom_line() + geom_point() +
labs(y = "% NA", title = "Evolución de NA por serie")
df_combined %>%
filter(!is.na(value)) %>%
ggplot(aes(value)) +
geom_histogram(bins = 30) +
facet_wrap(~variable, scales = "free") +
labs(title = "Distribución de cada indicador", x = "Valor")
En este panel se muestra la frecuencia con la que aparecen los distintos valores de cada variable a lo largo del periodo y para todos los países. Las variables relacionadas con la adopción de Internet (level_internet, internet_use y using_internet) presentan distribuciones claramente sesgadas hacia la derecha, lo que indica que la mayoría de los países alcanzan porcentajes elevados (entre el 70 % y el 100 %). Esto sugiere que tanto el acceso como el uso de Internet están ya ampliamente extendidos y próximos a su punto de saturación. Por el contrario, las variables asociadas al comercio electrónico (ecommerce y especialmente selling) muetran distribuciones más planas y desplazadas hacia la izquierda, reflejando una adopción más limitada y heterogénea entre países. En conjunto, los datos revelan que, si bien la conectividad está prácticamente generalizada, las actividades económicas digitales aún presentan un notable margen de desarrollo.
df_combined %>%
filter(!is.na(value)) %>%
ggplot(aes(x = variable, y = value)) +
geom_boxplot(outlier.colour = "red", outlier.alpha = 0.3) +
coord_flip() +
labs(title = "Boxplots con outliers resaltados")
El gráfico de boxplots resume la distribución de cada variable y destaca los valores atípicos mediante puntos rojos. Las variables asociadas al acceso y uso de Internet (level_internet, internet_use y using_internet) presentan medianas elevadas y rangos intercuartílicos estrechos, lo que confirma que la mayoría de los países cuentan con un nivel alto y bastante homogéneo de conectividad. Los outliers que aparecen por debajo del rango corresponden a países con menor penetración digital. En contraste, ecommerce y especialmente selling muestran cajas más bajas y alargadas, con medianas más reducidas y una mayor dispersión, lo que refleja una adopción más desigual del comercio electrónico. Los outliers, tanto por encima como por debajo, indican que algunos países se sitúan como líderes o rezagados en digitalización comercial, lo que refuerza la idea de que el acceso a Internet está prácticamente consolidado, mientras que las actividades económicas digitales aún avanzan a ritmos muy distintos entre países.
El objetivo principal del análisis es estudiar el auge del comercio digital en Europa y evaluar hasta qué punto puede estar vinculado con transformaciones en el comercio internacional, especialmente en lo que respecta al comercio de materias primas. Para alcanzar este objetivo, la solución se desarrolla en dos fases diferenciadas pero complementarias. En la primera fase se realiza un análisis detallado del crecimiento del comercio digital (ventas y compras online) y de su posible relación con variables como el acceso, uso e intensidad en la conectividad digital. Esta parte no implica cruces con otras bases externas, sino que se centra en entender la dinámica interna del fenómeno digital (mediante gráficos evolutivos, correlaciones y regresiones con efectos fijos), identificando patrones temporales y factores que podrían haber impulsado el cambio. En la segunda fase se incorporan otras dimensiones económicas (PIB medio, comercio internacional de materias primas) con el fin de cruzarlas con las métricas digitales. Aquí se aplican técnicas como el clustering por países o el análisis conjunto con datos de exportaciones físicas, lo que permite explorar si existe algún tipo de coherencia entre la transformación digital y el posicionamiento económico tradicional. De este modo, la solución propuesta combina una aproximación descriptiva inicial con una perspectiva más estructural e interpretativa, que permite integrar el fenómeno digital en un marco económico más amplio.
En este apartado se estudia la relación entre la adopción digital (medida a través de tres variables: acceso a Internet (level_internet), frecuencia de uso (internet_use) y habilidades digitales (using_internet)) y el nivel de comercio electrónico, tanto en la dimensión de compras (ecommerce) como de ventas online (selling). Para ello, se emplea el análisis de correlación, una técnica estadística que permite identificar asociaciones lineales entre variables continuas. Esta herramienta resulta especialmente adecuada en esta fase del estudio porque permite detectar patrones iniciales de dependencia entre variables sin necesidad de imponer un modelo causal ni realizar transformaciones complejas. Se comienza con una matriz de correlaciones centrada en el año más reciente disponible (2024), lo que proporciona una instantánea actualizada del vínculo entre conectividad digital y comercio electrónico. Posteriormente, se amplía la perspectiva mediante un gráfico de correlaciones dinámico que recorre toda la serie temporal disponible (2013–2024), lo que permite observar si las relaciones entre variables se han fortalecido, debilitado o mantenido estables a lo largo del tiempo. Esta estrategia permite explorar la hipótesis de que el desarrollo del comercio digital no solo depende del acceso a Internet, sino también de una combinación de factores como la frecuencia y la calidad del uso. Además, el análisis temporal incorpora la posibilidad de interpretar anomalías o cambios bruscos, como los derivados de la pandemia de la COVID-19, que podrían haber alterado las dinámicas normales del comercio electrónico. En conjunto, el análisis de correlación actúa aquí como una primera aproximación exploratoria que permite identificar posibles vínculos relevantes que serán contrastados más adelante mediante técnicas más robustas como la regresión.
latest_year <- max(df_combined$year, na.rm = TRUE)
cor_base <- df_combined %>%
filter(year == latest_year) %>%
group_by(geo, variable) %>%
summarise(value = mean(value, na.rm = TRUE), .groups = "drop") %>%
pivot_wider(names_from = variable, values_from = value)
cor_num <- cor_base %>%
select(-geo) %>%
mutate(across(everything(), as.numeric)) %>%
select(where(~ !all(is.na(.))))
cor_mat <- cor(cor_num, use = "pairwise.complete.obs")
corrplot(cor_mat, method = "color", type = "upper",
tl.cex = 0.8,
title = paste("Correlaciones –", latest_year),
mar = c(0,0,1.5,0))
La matriz de correlaciones para el año 2024 revela que todas las relaciones entre las variables analizadas son positivas, aunque con intensidades distintas. El vínculo más fuerte se da entre (ecommerce) y (selling), lo cual resulta lógico, ya que ambas representan nuestras dos variables dependientes (es decir, las que reflejan la actividad comercial digital). Es razonable suponer que, si hay más personas comprando en línea, también haya más personas vendiendo. Sin embargo, estas correlaciones internas entre indicadores de comercio electrónico no son el foco principal del análisis. Lo que realmente nos interesa es comprobar si los niveles de adopción digital (medidos a través del acceso a Internet (level_internet), el uso frecuente (internet_use) y las habilidades digitales (using_internet)) tienen relación con el nivel de actividad comercial online. En este sentido, (level_internet) muestra una correlación moderada (aproximadamente 0,5–0,6) con las demás variables, lo que sugiere que tener acceso a Internet es una condición necesaria, pero no suficiente, para un desarrollo pleno del comercio digital. En cambio, (using_internet), que refleja habilidades digitales, se asocia más estrechamente con la actividad comercial online, lo que refuerza la idea de que no basta con estar conectado, sino que es necesario saber utilizar eficazmente la tecnología. En conjunto, los resultados parecen reflejar una “escalera de madurez digital”: primero viene el acceso, luego el uso habitual, y finalmente la adopción económica a través del comercio electrónico.
# 1) un valor por geo-variable-año
clean_base <- df_combined %>%
group_by(year, geo, variable) %>%
summarise(value = mean(value, na.rm = TRUE), .groups = "drop")
# 2) correlaciones por año → formato largo var1-var2-rho
cor_long <- clean_base %>%
pivot_wider(names_from = variable, values_from = value) %>%
nest(data = -year) %>%
mutate(cor_tbl = map(data, ~{
m <- cor(select(.x, -geo), use = "pairwise.complete.obs")
as_tibble(m, rownames = "var1") |>
pivot_longer(-var1, names_to = "var2", values_to = "rho")
})) %>%
select(year, cor_tbl) %>%
unnest(cor_tbl)
# 3) heat-map animado (slider automático)
plot_ly(
cor_long,
x = ~var1,
y = ~var2,
z = ~rho,
frame = ~year, # ← genera el slider
type = "heatmap",
colorscale = "RdBu",
reversescale = TRUE,
zmin = -1, zmax = 1,
hovertemplate = "Año %{frame}<br>%{x} vs %{y}: %{z:.2f}<extra></extra>"
) %>%
layout(title = "Correlaciones dinámicas (mueve el deslizador)",
xaxis = list(title = ""),
yaxis = list(title = ""))
Si nos centramos en la relación entre (selling) y el resto de variables, se observa que las correlaciones tienden a intensificarse progresivamente con el paso de los años (se oscurecen en el mapa de calor), lo que indicaría una asociación cada vez más fuerte entre el comercio digital y los indicadores de adopción digital. Sin embargo, en 2024 esta tendencia se revierte de forma abrupta (las correlaciones se aclaran de nuevo), lo cual resulta llamativo y merece una revisión más detallada.
Por otro lado, a partir de 2020 aparece la variable de compras digitales (ecommerce), y desde ese momento muestra una correlación muy alta con las variables independientes. Esta relación se va debilitando en los años posteriores, especialmente en 2022 y 2024, cuando las correlaciones se reducen de forma más visible. Es posible que esta evolución esté relacionada con el impacto de la COVID-19: durante los años de mayor incidencia de la pandemia, muchos países europeos impusieron restricciones a la movilidad, lo que disparó el uso del comercio electrónico como alternativa a las compras físicas. Esta adopción acelerada explicaría las correlaciones tan elevadas observadas inicialmente.
Lo curioso es que la pérdida de correlación no sigue un patrón lineal: tras una caída en 2022, las correlaciones se refuerzan de nuevo en 2023, antes de volver a caer en 2024. Esta irregularidad podría deberse a factores externos no observados o a posibles inconsistencias en los datos. En cualquier caso, se trata de un fenómeno interesante que merecería un análisis más profundo.
En este apartado se analiza la evolución temporal del comercio en línea (ventas y compras digitales por individuos) en Europa desde 2013. Para ello, se emplean gráficos de líneas que permiten observar cómo ha cambiado el nivel de adopción del comercio electrónico a lo largo del tiempo, tanto a nivel individual por país como en promedio general. Esta técnica es especialmente útil para detectar patrones de crecimiento, cambios de ritmo y posibles puntos de inflexión (como los generados por la COVID-19), que pueden marcar un antes y un después en la digitalización comercial. Se utilizan dos enfoques complementarios: por un lado, representaciones de trayectorias individuales por país con una curva suavizada (loess) que resume la tendencia global sin depender de promedios estrictos por año; y por otro, gráficos del valor medio exacto anual que muestran de forma clara la evolución conjunta del fenómeno. Esta doble estrategia permite captar tanto la variabilidad entre países como el comportamiento agregado, aportando una visión más rica y detallada del proceso de transformación digital en Europa.
ggplot(selling_long, aes(x = as.integer(year), y = value, group = geo)) +
geom_line(alpha = 0.3, color = "gray50") +
geom_smooth(aes(group = 1), method = "loess", se = FALSE, color = "steelblue", size = 1.2) +
scale_x_continuous(breaks = seq(2013, 2023, by = 1)) + # años como enteros
labs(
title = "Evolución de las ventas digitales por país (individuos)",
x = "Año",
y = "Nivel de ventas digitales (%)"
) +
theme_minimal()
Este gráfico muestra la evolución del nivel de ventas digitales por parte de individuos en cada país europeo desde 2013 hasta 2024. Cada línea gris representa un país distinto, lo que permite observar trayectorias variadas: algunos países presentan un crecimiento sostenido, mientras que otros muestran estancamiento o incluso descensos puntuales. La línea azul, generada mediante una suavización loess, resume la tendencia general del conjunto y refleja una evolución ascendente a lo largo del tiempo. Este tipo de ajuste no calcula promedios anuales exactos, sino que proporciona una estimación continua basada en todos los puntos disponibles, lo cual permite captar la forma global del fenómeno sin estar condicionado por fluctuaciones puntuales. En conjunto, la visualización permite detectar tanto la diversidad entre países como la tendencia agregada hacia una mayor adopción del comercio digital.
selling_long %>%
group_by(year) %>%
summarise(avg_selling = mean(value, na.rm = TRUE)) %>%
ggplot(aes(x = as.integer(year), y = avg_selling)) +
geom_line(size = 1.1, color = "black") +
geom_point(size = 2) +
scale_x_continuous(breaks = seq(2013, 2023, by = 1)) + # ticks enteros
labs(
title = "Promedio de ventas digitales (todos los países)",
x = "Año",
y = "Valor medio de ventas digitales"
) +
theme_minimal()
Este gráfico representa el valor medio anual de ventas digitales entre todos los países disponibles para cada año. A diferencia del anterior, aquí los valores están agregados por año: se calcula la media exacta de las ventas digitales de todos los países para 2013, luego para 2014, y así sucesivamente. El resultado es una línea escalonada que muestra claramente cómo ha evolucionado el promedio global año a año, con puntos concretos que reflejan directamente los datos agregados. Este tipo de visualización es ideal para analizar la tendencia temporal de forma precisa y cuantificable, especialmente útil cuando se quiere resumir la evolución general del fenómeno digital a nivel internacional.
ggplot(ecommerce_long, aes(x = as.integer(year), y = value, group = geo)) +
geom_line(alpha = 0.3, color = "gray50") +
geom_smooth(aes(group = 1), method = "loess", se = FALSE, color = "darkgreen", size = 1.2) +
scale_x_continuous(breaks = seq(2013, 2023, by = 1)) +
labs(
title = "Evolución de las compras digitales por país (individuos)",
x = "Año",
y = "Nivel de compras digitales (%)"
) +
theme_minimal()
Este gráfico muestra cómo ha evolucionado el nivel de compras digitales realizadas por individuos en cada país desde 2020. Las líneas grises permiten observar trayectorias muy diversas entre países, con algunos alcanzando niveles altos y otros mostrando avances más lentos. La línea verde suavizada representa la tendencia global aproximada, calculada con una regresión loess. Aunque no refleja valores promedio exactos por año, esta línea indica que el uso del ecommerce ha crecido de forma sostenida a lo largo del tiempo.
ecommerce_long %>%
group_by(year) %>%
summarise(avg_buying = mean(value, na.rm = TRUE)) %>%
ggplot(aes(x = as.integer(year), y = avg_buying)) +
geom_line(size = 1.1, color = "darkgreen") +
geom_point(size = 2) +
scale_x_continuous(breaks = seq(2013, 2023, by = 1)) +
labs(
title = "Promedio de compras digitales (todos los países)",
x = "Año",
y = "Valor medio de compras digitales"
) +
theme_minimal()
Este segundo gráfico representa la evolución del promedio anual de compras digitales entre todos los países disponibles. A diferencia del gráfico anterior, cada punto refleja el valor medio exacto de compras digitales en un año determinado.
En este apartado se analiza el efecto de la conectividad digital sobre el comercio en línea (ventas y compras) utilizando modelos de regresión de datos de panel, una técnica explicada en la asignatura de tercer curso Evaluación, Despliegue y Monitorización de Modelos. A diferencia del análisis de correlación realizado anteriormente (que capta relaciones bivariadas simples), el modelo de regresión permite estimar efectos parciales, es decir, aislar el impacto específico de cada variable de conectividad (como el uso de Internet o las habilidades digitales) sobre el nivel de comercio digital, controlando por las diferencias estructurales entre países y los cambios comunes en el tiempo. Esta técnica es especialmente adecuada cuando se trabaja con datos estructurados por país y año, ya que permite separar los efectos propios de cada país (infraestructura, legislación, hábitos) de los efectos compartidos por todos los países en determinados años (como la pandemia o cambios regulatorios europeos). Tras verificar estadísticamente que el modelo más adecuado es el de efectos fijos, se estiman regresiones independientes para ventas y compras digitales, lo que permite obtener una lectura más precisa y contextualizada de qué factores impulsan realmente el desarrollo del comercio electrónico en Europa.
Haciendo pruebas para la regresión hemos constatado que no hemos tenido en cuenta los datos duplicados, así que los dropearemos en un momento:
clean <- df_combined %>% # geo, year, variable, value
group_by(geo, year, variable) %>%
summarise(value = mean(value, na.rm = TRUE), .groups = "drop")
Además, para hacer la regresión nos va a ser más útil tener el dataset en formato ancho (lo tenemos en formato largo cuando hicimos el combinado), de modo que cada columna sea una variable.
panel <- clean %>%
pivot_wider(names_from = variable, values_from = value)
Ahora que ya tenemos los datos en versión “datos de panel” vamos a filtrar por las variables y vamos a dropear los NA:
panel_sell <- panel %>% drop_na(selling)
panel_ecomm <- panel %>% drop_na(ecommerce)
pdata_sell <- pdata.frame(panel_sell, index = c("geo", "year"))
pdata_ecomm <- pdata.frame(panel_ecomm, index = c("geo", "year"))
Ahora sí, procedemos a realizar las regresiones utilizando la librería plm de R (la que se utiliza en la asignatura de tercer curso Evaluación, Despliegue y Monitorización de Modelos). Dado que es muy probable que existan características propias de cada país (como la infraestructura digital, la legislación o las condiciones regulatorias) que estén correlacionadas con el uso de Internet, resulta apropiado aplicar un modelo de efectos fijos. No obstante, estimaremos los tres modelos posibles (pooling, efectos aleatorios y efectos fijos) y aplicaremos los contrastes de homogeneidad y de Hausman para confirmar empíricamente que el modelo de efectos fijos (within) es el más adecuado para nuestro caso.
# modelo de pool de datos (pooling)
m_ols_sell <- plm(selling ~ using_internet + internet_use + level_internet,
data = pdata_sell,
model = "pooling")
# modelo de efectis fijos (within)
m_fe_sell <- plm(selling ~ using_internet + internet_use + level_internet,
data = pdata_sell,
model = "within",
effect = "twoways")
# modelo de efectos variables (random)
m_re_sell <- plm(selling ~ using_internet + internet_use + level_internet,
data = pdata_sell,
model = "random",
effect = "twoways")
CONTRASTE DE HOMOGENEIDAD:
pFtest(m_fe_sell, m_ols_sell)
##
## F test for twoways effects
##
## data: selling ~ using_internet + internet_use + level_internet
## F = 23.359, df1 = 49, df2 = 368, p-value < 2.2e-16
## alternative hypothesis: significant effects
La hipótesis nula plantea que no existen diferencias significativas entre los individuos (países), lo que justificaría el uso del modelo de pooling (datos agrupados). Por el contrario, la hipótesis alternativa sostiene que sí existen diferencias estructurales entre los países, por lo que sería más adecuado emplear un modelo que las tenga en cuenta (como el de efectos fijos).
El resultado del test nos lleva a rechazar la hipótesis nula, lo que indica que sí hay heterogeneidad entre los países. Por tanto, corresponde utilizar el modelo de efectos fijos (within).
CONTRASTE DE HAUSMAN:
phtest(m_fe_sell, m_re_sell)
##
## Hausman Test
##
## data: selling ~ using_internet + internet_use + level_internet
## chisq = 34.188, df = 3, p-value = 1.809e-07
## alternative hypothesis: one model is inconsistent
La hipótesis nula establece que no hay diferencias significativas entre los estimadores del modelo de efectos fijos y el de efectos aleatorios. Si se rechaza esta hipótesis (p-valor suficientemente bajo), se interpreta que los efectos aleatorios están correlacionados con alguna de las variables explicativas, lo cual invalida sus estimaciones. En ese caso, se debe optar por el modelo de efectos fijos (within).
Por el contrario, si no se rechaza la hipótesis nula, se asume que no existe dicha correlación y, por tanto, se prefiere el modelo de efectos aleatorios, ya que sus estimadores son más eficientes.
En nuestro caso, el test de Hausman nos lleva a rechazar la hipótesis nula, por lo que corresponde quedarnos con el modelo de efectos fijos (within).
m_years <- plm(
selling ~ using_internet + internet_use + level_internet + factor(year),
data = pdata_sell,
model = "within", # transformación within
effect = "individual" # solo quita α_i (país); mantiene las dummies de año
)
summary(m_years)
## Oneway (individual) effect Within Model
##
## Call:
## plm(formula = selling ~ using_internet + internet_use + level_internet +
## factor(year), data = pdata_sell, effect = "individual", model = "within")
##
## Unbalanced Panel: n = 39, T = 4-12, N = 421
##
## Residuals:
## Min. 1st Qu. Median 3rd Qu. Max.
## -13.50402 -2.26582 -0.27458 1.75976 17.22483
##
## Coefficients:
## Estimate Std. Error t-value Pr(>|t|)
## using_internet -0.166681 0.129840 -1.2837 0.2000418
## internet_use -0.053151 0.178188 -0.2983 0.7656512
## level_internet 0.154369 0.112285 1.3748 0.1700319
## factor(year)2014 0.181223 1.048454 0.1728 0.8628664
## factor(year)2015 1.168590 1.075045 1.0870 0.2777416
## factor(year)2016 0.325177 1.126118 0.2888 0.7729281
## factor(year)2017 1.841786 1.133032 1.6255 0.1049043
## factor(year)2018 2.694715 1.177676 2.2882 0.0226944 *
## factor(year)2019 2.642900 1.244076 2.1244 0.0343040 *
## factor(year)2020 3.727508 1.313187 2.8385 0.0047837 **
## factor(year)2021 5.012523 1.392641 3.5993 0.0003628 ***
## factor(year)2022 5.432234 1.470238 3.6948 0.0002535 ***
## factor(year)2023 6.739615 1.500189 4.4925 9.437e-06 ***
## factor(year)2024 8.608562 1.570069 5.4829 7.786e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Total Sum of Squares: 8778
## Residual Sum of Squares: 6622.8
## R-Squared: 0.24552
## Adj. R-Squared: 0.13891
## F-statistic: 8.55399 on 14 and 368 DF, p-value: 4.4935e-16
Las tres variables de conectividad (using_internet, internet_use y level_internet) presentan coeficientes pequeños y, además, carecen de significación estadística. Esto implica que, al introducirlas simultáneamente en el modelo, los cambios anuales en cuánta gente usa Internet o con qué intensidad lo hace ya no explican variaciones adicionales en la proporción de empresas que venden en línea. La causa más probable es la existencia de colinealidad entre ellas, es decir, que se solapan y se neutralizan mutuamente.
Lo realmente revelador se encuentra en los efectos de año: entre 2014 y 2017 no se observa un salto claro respecto al año base (2013), pero a partir de 2018 todos los países experimentan un empuje positivo que se intensifica progresivamente. En 2018 y 2019 el aumento se sitúa en torno a 2 o 3 puntos porcentuales; en 2020 —a pesar de la pandemia— asciende a casi 4 puntos; en 2021 y 2022 supera los 5; y en 2023 y 2024 alcanza entre 6,5 y 8,5 puntos porcentuales por encima de 2013. En otras palabras, algo compartido a nivel europeo (como la mejora en la logística transfronteriza, la consolidación de marketplaces, los cambios normativos o el aprendizaje digital acelerado por la COVID-19) está impulsando las ventas online más allá de lo que podría explicarse simplemente por un mayor número de personas conectadas. En conjunto, el análisis sugiere que el crecimiento del comercio electrónico en Europa desde 2018 se debe principalmente a factores estructurales comunes, más que a incrementos marginales en la conectividad individual de cada país.
m2_years <- plm(
ecommerce ~ using_internet + internet_use + level_internet + factor(year),
data = pdata_sell,
model = "within", # transformación within
effect = "individual" # solo quita α_i (país); mantiene las dummies de año
)
summary(m_years)
## Oneway (individual) effect Within Model
##
## Call:
## plm(formula = selling ~ using_internet + internet_use + level_internet +
## factor(year), data = pdata_sell, effect = "individual", model = "within")
##
## Unbalanced Panel: n = 39, T = 4-12, N = 421
##
## Residuals:
## Min. 1st Qu. Median 3rd Qu. Max.
## -13.50402 -2.26582 -0.27458 1.75976 17.22483
##
## Coefficients:
## Estimate Std. Error t-value Pr(>|t|)
## using_internet -0.166681 0.129840 -1.2837 0.2000418
## internet_use -0.053151 0.178188 -0.2983 0.7656512
## level_internet 0.154369 0.112285 1.3748 0.1700319
## factor(year)2014 0.181223 1.048454 0.1728 0.8628664
## factor(year)2015 1.168590 1.075045 1.0870 0.2777416
## factor(year)2016 0.325177 1.126118 0.2888 0.7729281
## factor(year)2017 1.841786 1.133032 1.6255 0.1049043
## factor(year)2018 2.694715 1.177676 2.2882 0.0226944 *
## factor(year)2019 2.642900 1.244076 2.1244 0.0343040 *
## factor(year)2020 3.727508 1.313187 2.8385 0.0047837 **
## factor(year)2021 5.012523 1.392641 3.5993 0.0003628 ***
## factor(year)2022 5.432234 1.470238 3.6948 0.0002535 ***
## factor(year)2023 6.739615 1.500189 4.4925 9.437e-06 ***
## factor(year)2024 8.608562 1.570069 5.4829 7.786e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Total Sum of Squares: 8778
## Residual Sum of Squares: 6622.8
## R-Squared: 0.24552
## Adj. R-Squared: 0.13891
## F-statistic: 8.55399 on 14 and 368 DF, p-value: 4.4935e-16
Este modelo analiza, dentro de cada país, cómo ha evolucionado el nivel de compras online (ecommerce) entre 2020 (año base) y 2024. A diferencia de lo observado en el caso de las ventas digitales, aquí las métricas de adopción digital sí resultan significativas: un incremento de un punto porcentual en el porcentaje de población que “usa Internet” se asocia con un aumento de aproximadamente 0,4 puntos en las compras online; y, de forma aún más clara, una mejora en el “nivel de habilidades digitales” genera un incremento cercano a 0,9 puntos porcentuales en el mismo contexto país-año. En cambio, el tercer indicador (“uso frecuente de Internet”) no aporta evidencia relevante: su coeficiente es negativo y carece de significación estadística, lo que indica que su efecto está solapado con los otros dos y no añade información adicional.
En cuanto a los efectos de año, la evolución es más estable que en el caso de las ventas: entre 2021 y 2023 se mantiene alrededor de +1 punto respecto a 2020, y solo en 2024 se observa un salto más marcado, con un aumento de +2,3 puntos porcentuales. Este repunte final podría estar vinculado a la consolidación de métodos de pago paneuropeos o al impacto de la inflación, que habría incentivado la búsqueda de mejores precios en línea.
El modelo presenta un buen ajuste (R² ≈ 0,70), lo que indica que explica cerca del 70 % de la variación dentro de cada país, y supera claramente el test global de significación. Esto confirma que la combinación entre la adopción digital y los factores coyunturales recientes permite comprender gran parte del comportamiento de los consumidores en relación con las compras en línea. En resumen, en el caso de ecommerce, la conectividad y las competencias digitales nacionales siguen siendo el principal motor de crecimiento, mientras que los factores comunes a nivel europeo juegan un papel secundario, justo al contrario que en el análisis de las ventas, donde el contexto compartido predominaba.
# Extraer las dummies de año
coef_sell <- broom::tidy(m_years) %>% # convierte a tibble
filter(str_detect(term, "^factor\\(year\\)")) %>% # solo dummies
mutate(year = as.integer(str_remove(term, "factor\\(year\\)"))) %>%
select(year, estimate) %>%
bind_rows(tibble(year = 2013, estimate = 0)) # año base con 0
coef_ecom <- broom::tidy(m2_years) %>%
filter(str_detect(term, "^factor\\(year\\)")) %>%
mutate(year = as.integer(str_remove(term, "factor\\(year\\)"))) %>%
select(year, estimate) %>%
bind_rows(tibble(year = 2020, estimate = 0)) # base 2020 = 0
df_plot <- bind_rows(
coef_sell %>% mutate(serie = "Selling"),
coef_ecom %>% mutate(serie = "Ecommerce")
)
ggplot(df_plot, aes(x = year, y = estimate, colour = serie)) +
geom_line(size = 1) +
geom_point(size = 2) +
scale_x_continuous(breaks = 2013:2024) +
labs(title = "Efectos de año sobre ventas y compras online",
subtitle = "Coeficientes de las dummies de año (base: 2013 en Selling, 2020 en Ecommerce)",
x = "Año",
y = "Coeficiente (p.p.)",
colour = NULL) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
El gráfico resume el “efecto calendario” que impulsa, más allá de la mera conectividad digital, tanto las ventas online (línea turquesa) como las compras online (línea roja) en Europa. Cada punto representa cuántos puntos porcentuales adicionales aporta un año determinado respecto al año base (2013 en selling y 2020 en ecommerce), una vez descontadas las diferencias específicas de cada país y el efecto directo del número de personas conectadas a Internet.
En el caso de las ventas, se observa una trayectoria ascendente desde 2013. El contexto europeo se ha ido volviendo progresivamente más favorable (mejora de la logística transfronteriza, consolidación de marketplaces, incentivos fiscales), alcanzando un primer pico justo antes de la pandemia. En 2022 el avance se ralentiza, posiblemente debido a disrupciones logísticas e incertidumbre económica, pero en 2023 retoma fuerza y en 2024 se produce el mayor salto de toda la serie, lo que podría reflejar el efecto acumulado de inversiones digitales y políticas comunes como el mercado único digital.
En cuanto a las compras, los datos comienzan en 2020, por lo que ese año sirve como referencia. El fuerte incremento de 2021 coincide con la ola de adopción forzada provocada por la COVID-19. En 2022 y 2023 la evolución se estabiliza, lo que sugiere un periodo de consolidación en los hábitos del consumidor. En 2024, sin embargo, se observa un nuevo repunte, que podría estar vinculado a la implementación de métodos de pago paneuropeos o a la presión inflacionaria que incentiva la comparación de precios en línea.
La comparación de ambas curvas revela una dinámica interesante: desde 2021, las empresas parecen haber acelerado su digitalización a un ritmo mayor que el crecimiento de la demanda. La brecha que se abre en 2024 podría interpretarse como un exceso de capacidad, o bien, en una lectura optimista, como una señal de que la oferta se está adelantando estratégicamente a una nueva fase de expansión del comercio electrónico en Europa.
En este apartado se analiza la relación entre el desarrollo del comercio digital y el tamaño económico de los países europeos, representado por su Producto Interior Bruto (PIB) medio desde 2013. Para ello, se aplica una técnica de clustering no supervisado (concretamente k-means) que permite identificar patrones comunes y formar grupos de países similares en función de su nivel de PIB y el crecimiento de sus ventas y compras digitales.
Esta técnica resulta especialmente adecuada en esta fase del análisis porque permite explorar estructuras latentes en los datos sin imponer una relación lineal, a diferencia de la regresión. Así, nos ayuda a descubrir perfiles de países según su nivel de desarrollo económico y su ritmo de transformación digital. El objetivo no es solo confirmar relaciones existentes, como se hizo con la correlación y la regresión, sino ahondar en las diferencias entre países, detectando grupos homogéneos o casos atípicos que puedan ser relevantes para futuras políticas o estrategias de digitalización.
Además, la técnica de clustering complementa el análisis anterior al aportar una perspectiva más estructural: permite observar si los países más digitalizados tienden a concentrarse en ciertos rangos de PIB o si, por el contrario, economías más modestas están logrando avances más rápidos en ecommerce. La selección del número óptimo de clusters se justifica mediante los métodos del codo (elbow) y la silueta (silhouette), lo que refuerza la robustez del análisis.
En resumen, el uso del clustering está plenamente justificado aquí porque permite explorar patrones de coevolución entre la economía general y el comercio digital de forma visual, intuitiva y sin requerir supuestos fuertes, proporcionando una visión segmentada del ecosistema europeo de digitalización comercial.
Dado que el archivo que contiene los datos del Producto Interior Bruto por país (archivo union_europea_PIB.xlsx) presenta una estructura extensa y algunas columnas con formatos que pueden generar errores durante la importación, se opta por utilizar la librería openxlsx, una alternativa más robusta y flexible para la lectura de archivos Excel en R. Esta elección permite asegurar una carga estable y controlada de los datos económicos que se emplearán para analizar la relación entre el PIB medio y el desarrollo del comercio digital en los países europeos.
# Datos que vamos a usar
ue <- read.xlsx("union_europea_PIB.xlsx", colNames = TRUE)
# selling_long
# ecommerce_long
head(ue)
## DATAFLOW LAST.UPDATE freq
## 1 ESTAT:NAMA_10_A10(1.0) 27/02/25 23:00:00 Annual
## 2 ESTAT:NAMA_10_A10(1.0) 27/02/25 23:00:00 Annual
## 3 ESTAT:NAMA_10_A10(1.0) 27/02/25 23:00:00 Annual
## 4 ESTAT:NAMA_10_A10(1.0) 27/02/25 23:00:00 Annual
## 5 ESTAT:NAMA_10_A10(1.0) 27/02/25 23:00:00 Annual
## 6 ESTAT:NAMA_10_A10(1.0) 27/02/25 23:00:00 Annual
## unit nace_r2
## 1 Chain linked volumes (2005), million euro Agriculture, forestry and fishing
## 2 Chain linked volumes (2005), million euro Agriculture, forestry and fishing
## 3 Chain linked volumes (2005), million euro Agriculture, forestry and fishing
## 4 Chain linked volumes (2005), million euro Agriculture, forestry and fishing
## 5 Chain linked volumes (2005), million euro Agriculture, forestry and fishing
## 6 Chain linked volumes (2005), million euro Agriculture, forestry and fishing
## na_item geo TIME_PERIOD OBS_VALUE OBS_FLAG CONF_STATUS
## 1 Value added, gross Albania 2019 2086.6 b <NA>
## 2 Value added, gross Albania 2020 2124.1 <NA> <NA>
## 3 Value added, gross Albania 2021 2088.3 <NA> <NA>
## 4 Value added, gross Albania 2022 1987.6 <NA> <NA>
## 5 Value added, gross Albania 2023 1951.3 p <NA>
## 6 Value added, gross Austria 1995 2953.8 <NA> <NA>
## Columna1
## 1 <NA>
## 2 <NA>
## 3 <NA>
## 4 <NA>
## 5 <NA>
## 6 <NA>
Primero vamos a usar los datos de la unión europea por sectores:
ue_clean <- ue %>%
# Seleccionar solo las columnas necesarias
select(unit, nace_r2, na_item, geo, TIME_PERIOD, OBS_VALUE) %>%
# Filtrar datos a partir del año 2013
filter(TIME_PERIOD >= 2013) %>%
# Eliminar duplicados
distinct()
# Ver una muestra del resultado
head(ue_clean)
## unit nace_r2
## 1 Chain linked volumes (2005), million euro Agriculture, forestry and fishing
## 2 Chain linked volumes (2005), million euro Agriculture, forestry and fishing
## 3 Chain linked volumes (2005), million euro Agriculture, forestry and fishing
## 4 Chain linked volumes (2005), million euro Agriculture, forestry and fishing
## 5 Chain linked volumes (2005), million euro Agriculture, forestry and fishing
## 6 Chain linked volumes (2005), million euro Agriculture, forestry and fishing
## na_item geo TIME_PERIOD OBS_VALUE
## 1 Value added, gross Albania 2019 2086.6
## 2 Value added, gross Albania 2020 2124.1
## 3 Value added, gross Albania 2021 2088.3
## 4 Value added, gross Albania 2022 1987.6
## 5 Value added, gross Albania 2023 1951.3
## 6 Value added, gross Austria 2013 3334.4
Se usará clustering:
# 1. PIB medio desde 2013
pib_por_pais <- ue_clean %>%
filter(TIME_PERIOD >= 2013, na_item == "Value added, gross") %>%
group_by(geo) %>%
summarise(mean_gdp = mean(OBS_VALUE, na.rm = TRUE), .groups = "drop")
# 2. Crecimiento en ventas ecommerce desde 2013
crecimiento_ventas <- selling_long %>%
filter(!is.na(value), year >= 2013) %>%
group_by(geo) %>%
summarise(growth_selling = (last(value) - first(value)) / first(value))
# 3. Crecimiento en compras ecommerce desde 2013
crecimiento_compras <- ecommerce_long %>%
filter(!is.na(value), year >= 2013) %>%
group_by(geo) %>%
summarise(growth_buying = (last(value) - first(value)) / first(value))
pib_por_pais <- pib_por_pais %>%
mutate(geo = countrycode(geo, origin = "country.name", destination = "iso2c"))
# Unir todas las métricas por país
df_cluster <- pib_por_pais %>%
left_join(crecimiento_ventas, by = "geo") %>%
left_join(crecimiento_compras, by = "geo") %>%
drop_na()
df_cluster
## # A tibble: 35 × 4
## geo mean_gdp growth_selling growth_buying
## <chr> <dbl> <dbl> <dbl>
## 1 AL 49354. 1.60 1.94
## 2 AT 22813. 1.25 0.119
## 3 BE 27278. 0.819 0.0861
## 4 BA 1495. 1.51 0.811
## 5 BG 4865. 0.249 0.847
## 6 HR 3191. 1.50 0.274
## 7 CY 1326. 11.2 0.444
## 8 CZ 166500. 0.0785 0.203
## 9 DK 72523. 0.458 0.0174
## 10 EE 1508. 1.05 0.150
## # ℹ 25 more rows
Se procede a realizar el análisis de clustering utilizando un número inicial de centros arbitrario (k = 4) con el objetivo de explorar patrones de agrupación entre los países europeos en función de su PIB medio y el crecimiento del comercio digital. Esta elección preliminar permite observar posibles estructuras en los datos antes de determinar el número óptimo de clusters mediante métodos más rigurosos como Elbow y Silhouette.
# Escalar los datos (sin la columna 'geo')
df_scaled <- df_cluster %>%
column_to_rownames("geo") %>%
scale()
# K-means clustering (4 clusters sugeridos)
set.seed(123)
kmeans_result <- kmeans(df_scaled, centers = 4, nstart = 25)
# Añadir resultados de clustering
df_cluster$cluster <- factor(kmeans_result$cluster)
ggplot(df_cluster, aes(x = mean_gdp, y = growth_selling, color = cluster, label = geo)) +
geom_point(size = 3, alpha = 0.8) +
geom_text(vjust = -0.5, size = 3) +
scale_x_continuous(labels = scales::comma) +
labs(
title = "Clustering de países según PIB y crecimiento en ecommerce (k = 4)",
subtitle = "PIB medio desde 2013 vs. crecimiento en ventas digitales por país",
x = "PIB medio desde 2013 (millones de euros)",
y = "Crecimiento relativo en ventas digitales",
color = "Cluster"
) +
theme_minimal()
Cada punto del gráfico representa un país europeo, y su color indica el cluster al que ha sido asignado según su perfil económico y digital. El análisis ha agrupado los países en función de dos variables clave: su PIB medio desde 2013 (indicador de desarrollo económico) y su crecimiento relativo en ventas digitales (indicador de madurez digital).
Ejemplo de interpretación de los grupos identificados con k = 4:
Cluster 1 (rojo): países con PIB bajo o medio y crecimiento limitado en ecommerce.
Cluster 2 (verde): países similares al grupo anterior, posiblemente con pequeñas diferencias en el ritmo de digitalización.
Cluster 3 (azul): un país de alto PIB pero crecimiento digital moderado (probablemente una economía consolidada con menor dinamismo reciente).
Cluster 4 (morado): país con fuerte crecimiento digital a pesar de un PIB reducido, lo que sugiere un proceso acelerado de transformación digital en una economía emergente.
A continuación, se utilizarán dos métodos complementarios (Elbow y Silhouette) para estimar de forma más precisa cuál sería el número óptimo de clusters que mejor representa la estructura latente de los datos.
df_scaled <- df_cluster %>%
select(where(is.numeric)) %>% # seleccionar solo columnas numéricas
scale() %>%
as.data.frame() # opcional: vuelve a data.frame
rownames(df_scaled) <- df_cluster$geo # añade los nombres de países como filas
set.seed(123)
wss <- sapply(1:10, function(k) {
kmeans(df_scaled, centers = k, nstart = 25)$tot.withinss
})
plot(1:10, wss, type = "b", pch = 19, frame = FALSE,
xlab = "Número de clusters (k)", ylab = "Suma total intra-cluster (WSS)",
main = "Método del codo para elegir k óptimo")
Este método no parece aportar una solución clara, aunque no parece desorbitado pensar que cuatro clusteres es el método óptimo. Quizás entre 2 y 4 esté la solución. Afinaremos más con silhuette
2: MÉTODO SILHUETTE
sil_width <- sapply(2:10, function(k) {
pam_fit <- pam(df_scaled, diss = FALSE, k = k)
pam_fit$silinfo$avg.width
})
plot(2:10, sil_width, type = "b", pch = 19,
xlab = "Número de clusters (k)",
ylab = "Anchura promedio de silueta",
main = "Análisis de silueta para elegir k óptimo")
Los resultados del análisis sugieren que el número óptimo de clusters se
sitúa en cuatro (k = 4), aunque alternativas como k = 2 o k = 3 también
podrían ofrecer estructuras interpretables.
A partir de la segmentación final, observamos que los países europeos se agrupan en cuatro perfiles diferenciados según su PIB medio desde 2013 y su crecimiento en ventas digitales. Dos de los clusters concentran la mayoría de países con niveles de PIB medio o bajo y un ritmo de digitalización moderado, diferenciándose levemente en su trayectoria de crecimiento. Hungría (cluster 3) aparece como un caso atípico: presenta un PIB considerablemente más alto que otros países con evolución digital similar, lo que apunta a una economía consolidada pero con menor dinamismo reciente en ecommerce. En contraste, Chipre (cluster 4) destaca como un outlier positivo: a pesar de tener un PIB reducido, muestra un crecimiento muy elevado en ventas digitales, lo que refleja una adopción digital acelerada.
Este patrón refuerza la idea de que el desarrollo del ecommerce no depende únicamente del tamaño económico del país. Algunas economías más pequeñas parecen estar liderando el proceso de transformación digital, superando incluso a países con mayor capacidad estructural o histórica.
A continuación, se analiza la relación entre el nivel de comercio digital (ventas online por individuos) y el comercio exterior tradicional de bienes físicos (exportaciones de commodities), con el objetivo de explorar si existe algún vínculo entre la actividad económica digital y la inserción comercial clásica de los países.
Para ello, se utilizan datos del año 2015, ya que es el único año común entre ambas fuentes: por un lado, el indicador de ventas digitales (extraído del panel selling_long), y por otro, el volumen de exportaciones físicas (obtenido del archivo commodity.xlsx, que contiene información sobre el valor exportado en USD). La técnica elegida para este análisis es una correlación lineal (coeficiente de Pearson), complementada con una representación gráfica mediante un diagrama de dispersión con recta de regresión ajustada. Esta aproximación es adecuada en este contexto porque permite evaluar si existe una asociación lineal entre el grado de digitalización comercial (ventas online) y la capacidad exportadora tradicional de los países europeos en ese año.
Este análisis complementa el enfoque anterior basado en regresiones y clustering, ya que introduce una nueva dimensión: el vínculo entre lo digital y lo físico en términos de comercio internacional. Mientras los modelos anteriores se centraban en las dinámicas internas (uso de Internet, evolución temporal y PIB), aquí se explora si una mayor madurez digital puede estar asociada con un mayor dinamismo exportador, lo cual puede resultar clave para identificar sinergias entre ambos tipos de economía en un entorno global cada vez más interconectado.
commodity_raw <- read.xlsx("commodity.xlsx", colNames = TRUE)
# Limpiar y filtrar commodity
commodity_clean <- commodity_raw %>%
# Normalizar nombres
rename_with(tolower) %>%
rename(country = pais) %>%
# Convertir columnas a tipo adecuado
mutate(
year = as.integer(year),
trade_usd = as.numeric(trade_usd),
weight_kg = as.numeric(weight_kg),
quantity = as.numeric(quantity)
) %>%
# Filtrar solo datos del año 2015
filter(year == 2015) %>%
# Filtrar registros válidos
filter(!is.na(trade_usd), !is.na(country)) %>%
# Convertir a códigos ISO2
mutate(country = countrycode(country, origin = "country.name", destination = "iso2c")) %>%
filter(!is.na(country)) %>%
# Agrupar por país
group_by(country, year) %>%
summarise(
total_trade_usd = sum(trade_usd, na.rm = TRUE),
total_weight_kg = sum(weight_kg, na.rm = TRUE),
total_quantity = sum(quantity, na.rm = TRUE),
.groups = "drop"
)
# Filtrar selling solo para 2015
selling_2015 <- selling_long %>%
filter(year == 2015) %>%
rename(country = geo) %>%
mutate(year = as.integer(year))
# Unir ambos datasets
merged_data <- inner_join(selling_2015, commodity_clean, by = c("country", "year"))
# Vista previa
head(merged_data)
## # A tibble: 6 × 7
## country year value variable total_trade_usd total_weight_kg total_quantity
## <chr> <int> <dbl> <chr> <dbl> <dbl> <dbl>
## 1 AT 2015 10.5 selling 264534441075 53324158755 48442156602
## 2 BE 2015 18.6 selling 752781316621 215894375717 211780524561
## 3 BG 2015 8.97 selling 46704161797 25667700820 24609883007
## 4 CH 2015 NA selling 306305078884 1747155970 1688366084
## 5 CZ 2015 13.5 selling 203434099612 50594583708 44652356940
## 6 DE 2015 31.5 selling 1761975112787 167306667654 162013742503
merged_data <- merged_data %>%
slice(-4)
# Ver correlaciones lineales (Pearson)
correlations <- merged_data %>%
summarise(
cor_selling_trade = cor(value, total_trade_usd, use = "complete.obs")
)
ggplot(merged_data, aes(x = value, y = total_trade_usd)) +
geom_point(alpha = 0.7, size = 3) +
geom_smooth(method = "lm", se = FALSE, color = "steelblue") +
labs(
title = "Relación entre ventas digitales y exportaciones físicas (2015)",
x = "Ventas digitales por individuos (value)",
y = "Exportaciones de commodities (USD)"
) +
theme_minimal()
El gráfico muestra una relación positiva entre el nivel de ventas digitales por individuo y el volumen de exportaciones físicas (en USD) en el año 2015. Aunque la tendencia general apunta a que los países con mayor actividad en comercio digital tienden a exportar más bienes físicos, la dispersión de los puntos indica que la relación no es especialmente fuerte ni perfectamente lineal. Esto sugiere que entran en juego otros factores, como el tamaño económico del país, su estructura productiva o su especialización exportadora. En conjunto, los resultados respaldan parcialmente la hipótesis de que el desarrollo del comercio digital puede acompañar, o al menos coexistir, con una mayor inserción en el comercio internacional tradicional, lo cual es relevante para entender el papel de la digitalización como palanca de crecimiento económico global.