Se aplica el Análisis de Componentes Principales a los datos de la tabla histórica de la Copa Libertadores de América (datos agregados desde el año 1960 hasta el 2022), con el objetivo de determinar un índice de rendimiento de los clubes que han participado de dicha competición desde 1960 hasta el 2022. El indicador clave utilizado para determinar sus posiciones en un ranking de rendimiento suele ser la cantidad total de puntos obtenidos, seguido por el gol diferencia y por la cantidad de goles a favor. En este caso, se pretende que estos indicadores y otros más conformen un índice de rendimiento con el fin de obtener un mejor ranking histórico.
Primero, se lee un archivo CSV desde una URL de Github y se lo guarda en un objeto llamado “df”. Los nombres de las columnas de “df” se imprimen utilizando la función “names”.
df = read.csv("https://raw.githubusercontent.com/AlcidesOxa/datos/master/CopaLibertadores.csv")
names(df)
[1] "X" "País" "Part." "Títs." "Subts." "PJ"
[7] "PG" "PE" "PP" "GF" "GC" "DG"
[13] "Pts."
Los indicadores a considerar son:
Cantidad de participaciones en las ediciones de la copa libertadores
Número de títulos obtenidos
Número de subtítulos obtenidos
Partidos jugados
Partidos ganados
Partidos empatados
Partidos perdidos
Goles a favor
Goles en contra
Diferencia de goles
Puntos
La columna X contiene los nombres de los equipos. Se crea un nuevo data.frame omitiendo la 1ra columna y se los establecen como nombre de filas del nuevo data.frame, es decir, se crea un nuevo objeto “X” que es una subselección de “df” que excluye la primera columna. También se asignan los nombres de fila de “X” como los valores de la primera columna de “df”.
X = df[,-1]
row.names(X) = df$X
head(X)
Se calcula una matriz de correlación utilizando la función “cor” con “X” como entrada (omitiendo la 1ra columna que es el nombre del país del club, y no es una variables numérica) y se guarda en un objeto llamado “R”. Luego se visualiza la matriz de correlación utilizando la función “corrplot”, con las opciones de matriz triangular inferior, color negro de letras y rotación de 45 grados, y con la omisión de la diagonal principal.
library(corrplot)
Warning: package ‘corrplot’ was built under R version 4.1.3corrplot 0.92 loaded
R = cor(X[,-1])
corrplot(R, type = 'lower', tl.col = 'black', tl.srt = 45, diag = F)
Se observa que todas las correlaciones lineales son positivas, por tanto las asociaciones lineales entre pares de variables es directa. Sólo la diferencia de goles tiene bajas correlaciones con el resto.
Se realiza un análisis de componentes principales utilizando la función “PCA” de FactoMineR, estableciendo que la 1ra variable, que es el país del club, es cualitativa suplementaria. Por defecto el análisis se realiza con las variables estandarizadas, y se omite el gráfico biplot en esta parte. Asimismo, se guardan los resultados en un objeto llamado “acp”. Los valores propios del PCA se imprimen redondeados a cuatro decimales.
library(FactoMineR)
acp = PCA(X, quali.sup = 1, graph = F)
round(acp$eig, 4)
eigenvalue percentage of variance
comp 1 8.8709 80.6445
comp 2 1.4776 13.4330
comp 3 0.3328 3.0251
comp 4 0.2460 2.2366
comp 5 0.0442 0.4019
comp 6 0.0110 0.0997
comp 7 0.0094 0.0850
comp 8 0.0068 0.0622
comp 9 0.0013 0.0119
comp 10 0.0000 0.0000
comp 11 0.0000 0.0000
cumulative percentage of variance
comp 1 80.6445
comp 2 94.0775
comp 3 97.1026
comp 4 99.3392
comp 5 99.7411
comp 6 99.8408
comp 7 99.9258
comp 8 99.9880
comp 9 100.0000
comp 10 100.0000
comp 11 100.0000
Se obtienen dos autovalores mayores a 1, por tanto, dos componentes principales tienen varianza mayor a 1, y explican el equivalente a más de una variable. Los dos componentes de mayor varianza explican el 94% de la variabilidad total. Dos autovalores son cero debido a que existen dos relaciones de exacta dependencia lineal entre las variables.
La función “fviz_screeplot” de la librería factoextra se utiliza para visualizar la cantidad de varianza explicada por cada componente principal.
library(factoextra)
Warning: package ‘factoextra’ was built under R version 4.1.3Loading required package: ggplot2
Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
fviz_screeplot(acp)
Se muestran los vectores propios asociados a los 5 mayores valores propios, dado que por defecto la función “PCA” establece el número de componentes a 5, lo cual se puede modificar con el argumento “ncp”. Asimismo, se muestra con la función “corrplot” la transpuesta de la matriz de correlaciones cruzadas entre variables observadas y componentes principales.
acp$var$coord
Dim.1 Dim.2 Dim.3
Part. 0.9497406 -0.296439289 0.040483525
Títs. 0.7126637 0.528979202 0.333190502
Subts. 0.7780583 0.361945484 -0.466534149
PJ 0.9896613 -0.137020241 0.013549791
PG 0.9917992 0.081463477 0.027099393
PE 0.9723700 -0.123897677 -0.016350937
PP 0.9054158 -0.410205040 0.016874123
GF 0.9942108 0.007118134 0.009240869
GC 0.9320558 -0.353353183 0.005608012
DG 0.5387879 0.800785896 0.011770511
Pts. 0.9898368 0.061064987 0.026941027
Dim.4 Dim.5
Part. 0.01902565 -0.005502995
Títs. 0.31787305 -0.014048547
Subts. 0.21435454 0.002451164
PJ -0.02761134 -0.011240755
PG -0.07373980 0.035811288
PE -0.06736921 -0.184255583
PP 0.06230195 0.055950843
GF -0.08035722 0.049840723
GC 0.02131932 0.049331490
DG -0.25749141 0.021240032
Pts. -0.10413057 0.010575634
corrplot(t(acp$var$cor), tl.col = 'black', tl.srt = 45)
El 1er componente tiene elevadas correlaciones con Participaciones, Partidos jugados, Partidos ganados, Partidos empatados, Partidos perdidos, Goles a favor, Goles en contra, y Puntos, y correlaciones algo más menores con Títulos y Subtítulos. Entonces, el 1er componente refleja la persistencia de participación en la Copa Libertadores, y con menor fuerza el éxito.
El 2do componente tiene una alta asociación lineal directa con la Diferencia de goles, y algo menos con títulos, asimismo, se tienen asociaciones lineales inversas con Partidos perdidos y Goles en contra, por lo tanto, este 2do componente refleja mejor el éxito en las participaciones en general.
Los resultados del PCA se visualizan utilizando varias funciones de visualización, como “fviz_pca”, “fviz_pca_var” y “fviz_pca_ind”, que muestran diferentes aspectos de los datos. El biplot se muestra con “fviz_pca”
fviz_pca(acp)
En este caso se observa cómo Partidos ganados, Goles a favor, Partidos empatados y Partidos jugados se asocian con el primer eje o componente, donde los equipos que obtienen altas puntuaciones en dicho componente son River Plate, Boca Juniors, Peñarol, Nacional y Olimpia. Debido a que éste eje está más relacionado a la persistencia en participación y en parte al éxito por la persistencia, entonces, los equipos mencionados son los más persistentes que a la vez han logrado éxitos por su persistencia.
El segundo eje está más asociado a Diferencia de goles y Títulos, donde destacan Boca Juniors y Palmeiras. Este eje representa el éxito al margen de la persistencia, entonces, los equipos mencionados son los más exitosos descontando la persistencia.
Para visualizar solamente las variables, representadas por los vectores propios, se aplica “fviz_pca_var”
fviz_pca_var(acp)
Para visualizar solamente las observaciones se aplica “fviz_pca_ind”, en este caso se establece que se muestre sólo el nombre de la observación
fviz_pca_ind(acp, geom = "text")
Finalmente, se crean objetos llamados “equipos” que contienen los nombres de las filas de “X” que cumplen ciertas condiciones, en este caso, el país de pertenencia del club, y se utilizan para visualizar las observaciones correspondientes en un gráfico de componentes principales utilizando la función “fviz_pca_ind”. Se muestra por ejemplo para Argentina
equipos = row.names(X)[X$País == "Argentina"]
fviz_pca_ind(acp, geom = "text", select.ind = list(name = equipos))
Asimismo, se pueden obtener de otros países, por ejemplo de Chile
equipos = row.names(X)[X$País == "Chile"]
fviz_pca_ind(acp, geom = "text", select.ind = list(name = equipos))
Asimismo, se pueden añadir elipses de confianza por cada categoría de la variable suplementaria cualitativa, en este caso el país que se encuentra en la posición 1 del data.frame
fviz_pca_ind(acp, habillage = 1, label = "none", addEllipses = T, ellipse.level = 0.95)
Las elipses en este caso se superponen en gran parte, debido a que los países cuentan con clubes que han tenido participaciones muy diversas, algunos muy persistentes y exitosos, otros exitosos sin ser necesariamente persistentes, también persistentes sin mucho éxito, y no persistentes con poco éxito.
Se crea un nuevo objeto “Z” que contiene las coordenadas de las observaciones en las dos primeras dimensiones del PCA, y se ordenan según su puntuación en cada dimensión utilizando la función “order”.
Entonces, el ranking de éxito por persistencia es, ordenando por la primera columna
Z = as.data.frame(acp$ind$coord[,1:2])
Z[order(-Z$Dim.1),]
Y el ranking de éxito al margen de la persistencia es, ordenando por la segunda columna
Z[order(-Z$Dim.2),]