para las posiciones tenemos la siguiente distribucion:
Chi-squared test for given probabilities
data: tablechi
X-squared = 2382.2, df = 9, p-value < 2.2e-16
Se realizo prueba chi cuadrado para verificar diferencias significativas las frecuencias, de posicion, con un valor p menor que 0.05, lo que indica que existen diferencias.
Tratamiento de datos
A fin de evitar superposiciones en los graficos finales, se realizaron los procesos de correlacion de kendall y pruebas de normalidad Shapiro wilk para determinar alta correlacion y normalidad respectivamente, realizandolo grupo a gupo con tres categorias principales, vairbles de ataque, de defensa y mixtas, por ejemplo, de la categoria de variables de ataque, el grupo de variables, de acciones de creacion, esta conformado por las variables,“SCA”, “SCAPassLive”, “SCAPassDead”, “SCADrib”, “SCASh”, “SCAFld”, “SCADef”, “GCA”, se eligieron las de menor correlacion y luego con las variables de las categorias resultantes en los demas grupos, depurando del total de 118 variables a 66, 22 de ataque, 38 de defensa y 6 mixtas, luego, de las catrgorias de ataque y las mixtas, se eligen las 10 de menor correlacion entre si, se prsentan a continuacion las 10 variables depuradas para cada categoria de ataque y defensa:
Analisis de Componentes principalesDefensa
Realizamos entonces un analisis para las variables de defensa por posicion:
Realizamos el analisis de componentes principales para establecer la relacion entre la posicion y las distintas variables.
Mostramos a continucaion la matriz rotación, que nos indica cuánto contribuye cada variable original a cada componente principal. Los valores (cargas) varían de -1 a 1, donde valores absolutos más grandes indican una mayor contribución de la variable al componente. Para la dimension 1 vemos las tres mayores cargas negativas en Tkl, TklWon y TklDri,lo que indica que esta nos habla de exito en variables asociadas a acciones defensivas.
Para la dimension 2 vemos las tres mayores cargas psotivas en, TklWon,Tkl y TklDri,lo que indica que esta nos habla de exito en variables asociadas a acciones ofensivas.
Se tiene entonces “brand.pc” que a partir de los valores obtenidos en las dimensiones PC, representa la varianza explicada acumulada por las componentes principales, ordenadas de mayor a menor varianza.
En el grafico PCA for player position el diagrama de dispersión muestra cómo se distribuyen los distintos tipos de jugadores (coloreados por su posición) según dos componentes principales que has interpretado como ejes “defensa” (PC1) y “ataque” (PC2):
Eje X (PC1): Defensa
A la derecha (valores altos de PC1) aparecen los jugadores con perfil más defensivo: sobre todo porteros (GK, puntos azul turquesa) y defensas (DF, puntos rojos).
A la izquierda (valores bajos de PC1) se sitúan los jugadores con menor énfasis en tareas defensivas, especialmente delanteros (FW, puntos verdes oscuros).
Eje Y (PC2): Ataque:
En la parte superior (valores altos de PC2) están los jugadores más orientados al ataque: por ejemplo, extremos o delanteros muy ofensivos (FWDF, MFDF, MFFW).
En la parte inferior (valores bajos de PC2) se sitúan los que aportan menos en fase ofensiva (defensas centrales muy posicionales o porteros).
En el grafico variables-PCA de consenos, nos muestra como las variables principales de la dimension 1, tienen cargas negativas altas en las dos dimensiones y las variables principales de la dimension 2, presentan cargas altas en la dimension dos, pero negativas en la dimension 1.
En el grafico de Player position, PC1(63,51%) y PC2(23,03%) explican el 86.5% de la varianza. Esto significa que el 13.5% de la información está en los otros componentes (PC3 a PC12). Por lo tanto, el grafico simplifica algunas relaciones entre las variables, de la data suministrada.
Vemos que las posiciones FW y MFFW, se encuentran cerca de las variables shots y GCA, es decir que estas posiciones y las variables tienen una importancia en la explicacion de la varianza con alto exito en defensa y ataque simultaneamente, ademas, se relacionan entre si, contrario ejemplo de la posicion FWMF, tambien, de alto desempeño en ataque y defensa, pero sin relacion alguna con una variable cuantitativa propriamente, se pueden realizar este tipo de analisis para las demas posiciones, en los cuadrantes II,III y IV
El gráfico de Variables PCA nos explica nuevamente, por medio de los cosenos cuadrados de las variables en los componentes, cuáles aportan más de forma negativa o positiva.
Buscamos los vectores de mayor longitud y observamos que hay dos grupos de colores:
Azul oscuro: Los vectores más largos se encuentran en el cuadrante III, lo que indica que las variables defensivas están marcadas por un bajo rendimiento tanto en ataque como en defensa al mismo tiempo.
Azul claro: A excepción de la flecha clara de alta longitud que se observa en el cuadrante III, la mayoría de este tono se encuentran en el cuadrante II, indicando que las variables de ataque están marcadas por un buen desempeño en ataque, pero no en defensa.
Finalmente vemos otra forma de representacion de la proporcion de varianza explicada por el analisis
#pca_resultprop_varianza <- pca_result$sdev^2/sum(pca_result$sdev^2)ggplot(data =data.frame(prop_varianza, pc =1:length(prop_varianza)),aes(x = pc, y = prop_varianza)) +geom_col(width =0.3) +scale_y_continuous(limits =c(0,1)) +theme_bw() +labs(x ="Principal Component",y ="Prop. of variance explained")
Para evaluar la relación entre las posiciones y las distintas variables, se empleó el Análisis de Componentes Principales (ACP). Previamente, se realizó el test de normalidad de Shapiro-Wilk para todas las variables, determinando que ninguna de ellas seguía una distribución normal. Se calculó el determinante de la matriz de correlación de Kendall para identificar la presencia de multicolinealidad, seleccionando aquellas variables con alta correlación para su exclusión en el análisis.
1. Estandarización de datos: Dado que las variables pueden tener diferentes escalas, se estandarizaron (media = 0, desviación estándar = 1) para garantizar comparabilidad.
2. Cálculo de la matriz de correlación: Se utilizó la matriz de Kendall para capturar las relaciones entre variables no normales.
Technical Sheet:
To evaluate the relationship between positions and various variables, Principal Component Analysis (PCA) was employed. Prior to this, the Shapiro-Wilk normality test was conducted for all variables, revealing that none followed a normal distribution. The determinant of the Kendall correlation matrix was calculated to identify the presence of multicollinearity, selecting those variables with high correlation for exclusion from the analysis.
Data Standardization: Since variables may have different scales, they were standardized (mean = 0, standard deviation = 1) to ensure comparability.
Calculation of the Correlation Matrix: The Kendall correlation matrix was used to capture relationships between non-normal variables.
Component Extraction: Eigenvalues and eigenvectors of the correlation matrix were computed. Eigenvalues indicate the amount of variance explained by each component, while eigenvectors define the directions of the new axes.
Component Selection: Criteria such as the Kaiser rule (eigenvalues > 1) or the cumulative percentage of explained variance (e.g., >70-80%) were applied to determine how many components to retain.
Interpretation of Loadings: The loadings of variables on each component allowed identification of which variables contribute most to each dimension, facilitating the interpretation of results in the context of the evaluated positions.
3. Extracción de componentes: Se calcularon los autovalores y autovectores de la matriz de correlación. Los autovalores indican la cantidad de varianza explicada por cada componente, y los autovectores definen las direcciones de los nuevos ejes.
4. Selección de componentes: Se empleó un criterio como el de Kaiser (autovalores > 1) o el porcentaje acumulado de varianza explicada (e.g., >70-80%) para determinar cuántos componentes retener.
5. Interpretación de cargas: Las cargas de las variables en cada componente permitieron identificar qué variables contribuyen más a cada dimensión, facilitando la interpretación de los resultados en el contexto de las posiciones evaluadas.
Source Code
---title: "Análisis de Componentes Principales por posición"format: html: self-contained: true code-tools: true---## Contexto```{r, include=FALSE}###################### PRIMERO CARGA LOS PAQUETES#install.packages("GGally")library(pheatmap)library(readxl)library(DT)###################### PRIMERO CARGA LOS PAQUETESif (!require("pacman")) install.packages("pacman")library(FactoMineR)library(gplots)library(RColorBrewer)library(corrplot)library(dplyr)library(forcats) # Para manejar factores# cargar paquetes necesariospacman::p_load( FactoMineR, tidyverse, factoextra, haven, naniar, corrplot, readr, gridExtra, incidence, easypackages, readxl, dplyr, gplots, kableExtra, apyramid, janitor, flextable, lubridate, stringr, rio, bench, sf, cleaner, DT, leaflet, leaflet.extras, esquisse, tseries, forecast, skimr, tsibble, epicontacts, distcrete, epitrix, EpiEstim, projections, magrittr, binom, ape, outbreaker2, knitr, broom, ggridges, scales)library(writexl)library(GGally)library(ggforce) # Para agregar elipses y círculoslibrary(pheatmap)library(qgraph)#install.packages("kableExtra")#Instalar los paquetes#if (!require("pacman")) install.packages("pacman"); pacman::p_load(effsize, gplots, naniar, corrplot, readr, gridExtra, rcompanion, flextable, incidence, easypackages, FactoMineR, tidyverse, factoextra, haven, janitor, readxl, dplyr, kableExtra, apyramid, ggplot2, tidyr, lubridate, stringr, rio, bench, sf, cleaner, DT, leaflet, leaflet.extras, esquisse, tseries, forecast, skimr, tsibble, epicontacts, distcrete, epitrix, EpiEstim, projections, magrittr, binom, ape, outbreaker2, knitr, broom, ggridges, scales, psych, plotly, DescTools, effectsize)#if (!require("pacman")) install.packages("pacman"); pacman::p_load(caret,qgraph,webshot)library(effsize)#install.packages("effsize")#install.packages("gplots")#install.packages(c( "naniar", "corrplot"))#install.packages("readr")library(readr)library(gridExtra)# Instalar el paquete rcompanion si no está instaladoif (!requireNamespace("rcompanion", quietly = TRUE)) { install.packages("rcompanion")}# Cargar el paquetelibrary(rcompanion)# Mostrar la tabla con flextablelibrary(flextable)library(incidence) #core functionslibrary(easypackages)#recargar varias librerias en una sola lineapaquetes <- c("FactoMineR", "tidyverse", "factoextra", "haven", "naniar", "corrplot")libraries(paquetes)#Sys.setlocale("LC_ALL", "en_US.UTF-8")#Sys.setenv(LANG = "spa")library(janitor)#para los comandos tablylibrary(readxl) library(dplyr)library(gplots)library(FactoMineR)#GRAFICAR ACMlibrary(factoextra)library(kableExtra)#PARA DECORAR LAS TABLASlibrary(apyramid)#PARA REALIZAR PIRAMIDElibrary(ggplot2)#PARA DIBUJARlibrary(readxl)#PARA LEER EXCELlibrary(dplyr) # manipulacion de datolibrary(janitor)#para los comandos tablylibrary(factoextra)library(gplots)#graficos#if (!require("pacman")) install.packages("pacman")# cargar paquetes necesariospacman::p_load( tidyr, dplyr, lubridate, stringr, rio, bench, janitor, # reclin2, sf, readr, cleaner, #plotly, DT, leaflet, leaflet.extras, esquisse., tseries, tidyverse, janitor, forecast, skimr, tsibble)#install.packages("epicontacts")library(epicontacts)#install.packages("distcrete")library(distcrete)#install.packages("epitrix")library(epitrix)#install.packages("EpiEstim")library(EpiEstim)library(projections)library(magrittr)library(binom)library(ape)library(outbreaker2)library(knitr)library(broom)library(ggridges)library(scales)#install.packages("ggridges")library(dplyr)library(tidyr)library(psych)library(PerformanceAnalytics)library(corrplot)library(plotly)library(flextable)library(dplyr)#install.packages(c("dplyr", "tidyverse", "readxl", "DescTools", "effectsize"))library(dplyr)library(readxl)library(DescTools)library(effectsize)library(readxl)library(dplyr)```Tenemos los siguientes datos:```{r, include=FALSE, message=FALSE, warning=FALSE}Player_performance_5_ligas <- read_excel("D:/nocturno/temporales/estadistica del deporte/Analisis_de_componentes_principales_Rugbi/nueva_version/Analisis_de_componentes_principales_Rugbi_op2/Analisis_de_componentes_principales_Rugbi/Player performance 5 ligas.xlsx")#View(Player_performance_5_ligas)#colnames(Player_performance_5_ligas)#head(Player_performance_5_ligas[1])#Factorizamos cada variablePlayer_performance_5_ligas_ <- Player_performance_5_ligas %>% mutate( # Conversión de tipos de datos across(1:6, as.factor),across(7, as.numeric),across(8, as.factor), across(9:124, as.numeric))``````{r, echo=FALSE, message=FALSE, warning=FALSE}datatable( Player_performance_5_ligas_, rownames = FALSE, extensions = c("Buttons", "Scroller"), options = list( scrollX = TRUE, scrollY = "500px", scroller = TRUE, dom = "Bfrtip", buttons = c("copy", "csv", "excel") ))```para las posiciones tenemos la siguiente distribucion:```{r, echo=FALSE}calc_ci <- function(count, total, conf.level = 0.95) { prop <- count / total z <- qnorm(1 - (1 - conf.level) / 2) se <- sqrt(prop * (1 - prop) / total) lower <- prop - z * se upper <- prop + z * se return(c(percent(lower, accuracy = 0.01), percent(upper, accuracy = 0.01)))} # Crear la tabla de frecuencias y formatear los porcentajes table <- Player_performance_5_ligas_ %>% tabyl(Pos)%>%adorn_pct_formatting() # Asignar nombres uniformes a las columnas colnames(table) <- c("Posicion", "Frecuencia", "Porcentaje") # Calcular intervalos de confianza para las proporciones total <- sum(table$Frecuencia) ci <- t(apply(table[, 2, drop = FALSE], 1, function(x) calc_ci(x, total))) colnames(ci) <- c("CI_Lower", "CI_Upper") table <- cbind(table, ci)datatable( table, rownames = FALSE, extensions = c("Buttons", "Scroller"), options = list( scrollX = TRUE, scrollY = "500px", scroller = TRUE, dom = "Bfrtip", buttons = c("copy", "csv", "excel") ))ggplot(table, aes(x = Posicion, y = Frecuencia, fill = Posicion)) + geom_bar(stat = "identity") + # Mostrar eje y como porcentajes labs(title = "Distribution of positions", x = "Positon", y = "Frecuency") + theme_minimal() + theme(legend.position = "none", axis.text.x = element_text(angle = 45, hjust = 1))tablechi <- table(Player_performance_5_ligas_[, 4]) # Prueba chi cuadrado chi <- chisq.test(tablechi) chi```Se realizo prueba chi cuadrado para verificar diferencias significativas las frecuencias, de posicion, con un valor p menor que 0.05, lo que indica que existen diferencias.## Tratamiento de datosA fin de evitar superposiciones en los graficos finales, se realizaron los procesos de correlacion de kendall y pruebas de normalidad Shapiro wilk para determinar alta correlacion y normalidad respectivamente, realizandolo grupo a gupo con tres categorias principales, vairbles de ataque, de defensa y mixtas, por ejemplo, de la categoria de variables de ataque, el grupo de variables, de acciones de creacion, esta conformado por las variables,"SCA", "SCAPassLive", "SCAPassDead", "SCADrib", "SCASh", "SCAFld", "SCADef", "GCA", se eligieron las de menor correlacion y luego con las variables de las categorias resultantes en los demas grupos, depurando del total de 118 variables a 66, 22 de ataque, 38 de defensa y 6 mixtas, luego, de las catrgorias de ataque y las mixtas, se eligen las 10 de menor correlacion entre si, se prsentan a continuacion las 10 variables depuradas para cada categoria de ataque y defensa:```{r, include=FALSE, message=FALSE}resultados_variables_list<-list()tabla_final_lista <-list()Estadisticas_partidos <- c( "MP","Starts", "Min","90s","Pos" , "Age")Estadisticas_disparo<- c( "Goals","Shots", "SoT%","G/SH","G/SoT" , "ShoDist", "ShoFK", "ShoPK", "PKatt")# Pases Completados TotalesEstadisticas_pases <- c( "PassTotCmp", "PassTotAtt", "PassTotCmp%", "PassTotDist", "PassTotPrgDist", "PassShoCmp", "PassShoAtt", "PassShoCmp%", "PassMedCmp", "PassMedAtt", "PassMedCmp%", "PassLonCmp", "PassLonAtt", "PassLonCmp%", "Assists", "PassAss", "Pass3rd", "PPA", "CrsPA", "PassProg", "PassLive", "PassDead", "TB", "Sw", "PassCrs", "TI", "CK")Estadisticas_acciones_creacion <- c( "SCA", "SCAPassLive", "SCAPassDead", "SCADrib", "SCASh", "SCAFld", "SCADef", "GCA")Estadisticas_acciones_creacion <- c( "SCA", "SCAPassLive", "SCAPassDead", "SCADrib", "SCASh", "SCAFld", "SCADef", "GCA")Estadisticas_defensa <- c( "Tkl", "TklWon", "TklDef3rd", "TklMid3rd", "TklAtt3rd", "TklDri", "TklDriAtt", "TklDri%", "TklDriPast", "Blocks", "BlkSh", "Int", "Tkl+Int", "Clr", "Err")# Control del Balón y ConduccionesEstadisticas_control_balon <- c( "Touches", "TouDefPen", "TouDef3rd", "TouMid3rd", "TouAtt3rd", "TouAttPen", "TouLive", "ToAtt", "ToSuc", "ToSuc%", "ToTkl", "ToTkl%")# Conducciones y RecepcionesEstadisticas_conducciones_recepciones <- c( "Carries", "CarTotDist", "CarPrgDist", "CarProg", "Car3rd", "CPA", "CarMis", "CarDis", "Rec", "RecProg")# Faltas y DisciplinaEstadisticas_faltas_disciplina <- c( "CrdY", "CrdR", "2CrdY", "Fls", "Fld", "Off")# CentrosEstadisticas_centros <- c( "AerWon", "AerLost", "AerWon%")# Crear una lista con las dos categoríaslista_categorias <- list( partidos = Estadisticas_partidos, disparo = Estadisticas_disparo, pases = Estadisticas_pases, acciones_creacion = Estadisticas_acciones_creacion, defensa = Estadisticas_defensa, control_balon = Estadisticas_control_balon, conducciones_recepciones = Estadisticas_conducciones_recepciones, faltas_disciplina = Estadisticas_faltas_disciplina, centros = Estadisticas_centros)guardar_datos_baja_cor_diferenciados<-list()num_categoria<-1for (num_categoria in 1:9) {sublista_partidos <- lista_categorias[[num_categoria]] # Usamos [[1]] para extraer el elemento, no [1] que devuelve una listasublista_partidos# Seleccionar elementos según los números#columnas_deseadas <- c(lista_categorias[1][num_categoria:length(Estadisticas_partidos)],lista_categorias$disparo[num_categoria+1:(length(Estadisticas_disparo)-1)])columnas_deseadas <- c(sublista_partidos)#lista_categorias[1]columnas_deseadas#colnames(Player_performance_5_ligas)#indices_columnas# Obtener los índices de las columnasindices_columnas <- which(colnames(Player_performance_5_ligas_) %in% columnas_deseadas)# Extraer las columnas usando los índices#analisis_pca1<-Player_performance_5_ligas_[, indices_columnas]#anexo_mas################################################################analisis_pca1_2<-cbind.data.frame(Player_performance_5_ligas_[4],Player_performance_5_ligas_[7],Player_performance_5_ligas_[9:124])analisis_pca1_2<-Player_performance_5_ligas_[indices_columnas]# Cargar librerías necesariaslibrary(dplyr)# Asumimos que analisis_pca es tu base de datos# Seleccionamos solo las columnas numéricas (excluimos Pos si es categórica)numeric_vars <- analisis_pca1_2 %>% select_if(is.numeric)# Realizamos la prueba de Shapiro-Wilk para cada variable numéricanormality_tests <- sapply(numeric_vars, function(x) { if (sum(!is.na(x)) > 3) { # Shapiro-Wilk requiere al menos 4 observaciones no NA shapiro.test(x)$p.value } else { NA # Si hay menos de 4 observaciones, devolvemos NA }})# Creamos un dataframe con los resultados de normalidadnormality_results <- data.frame( Variable = names(numeric_vars), P_Valor = normality_tests, Cumple_Normalidad = ifelse(normality_tests > 0.05, "Cumple", "No Cumple"), stringsAsFactors = FALSE)# Mostramos los resultados de normalidad con la interpretaciónprint(normality_results)# Separamos las variables en dos subbases# Variables que cumplen el supuesto de normalidadvars_cumplen <- normality_results %>% filter(Cumple_Normalidad == "Cumple") %>% pull(Variable)#vars_cumplen# Variables que NO cumplen el supuesto de normalidadvars_no_cumplen <- normality_results %>% filter(Cumple_Normalidad == "No Cumple") %>% pull(Variable)# Creamos las subbases# Subbase con variables que cumplen el supuesto (incluye la columna Pos si existe)if (length(vars_cumplen) > 0) { analisis_pca_cumple <- analisis_pca1_2 %>% select(any_of(c("Pos", vars_cumplen)))} else { analisis_pca_cumple <- data.frame(Pos = analisis_pca1_2$Pos) # Si no hay variables, solo mantenemos Pos}# Subbase con variables que NO cumplen el supuesto (incluye la columna Pos si existe)if (length(vars_no_cumplen) > 0) { analisis_pca_no_cumple <- analisis_pca1_2 %>% select(any_of(c("Pos", vars_no_cumplen)))} else { analisis_pca_no_cumple <- data.frame(Pos = analisis_pca$Pos) # Si no hay variables, solo mantenemos Pos}# Mostramos las subbasesprint("Subbase con variables que cumplen el supuesto de normalidad:")print(head(analisis_pca_cumple))print("Subbase con variables que NO cumplen el supuesto de normalidad:")print(head(analisis_pca_no_cumple))data_corr<-analisis_pca1_2[,2:length(colnames(analisis_pca1_2))]matriz_cor <- cor(data_corr, method = "kendall")# Crear datos simuladosset.seed(123)# Aplicar el código anteriorumbral <- 0.9library(tidyverse)cor_df <- as.data.frame(as.table(matriz_cor)) %>% filter(Var1 != Var2) %>% mutate(abs_cor = abs(Freq)) %>% filter(abs_cor > umbral) %>% select(Var1, Var2, abs_cor)vars_alta_cor <- unique(c(as.character(cor_df$Var1), as.character(cor_df$Var2)))vars_alta_cordatos_baja_cor1 <- analisis_pca1_2[, !colnames(analisis_pca1_2) %in% vars_alta_cor] # Grupo de baja guardar_datos_baja_cor_diferenciados[[num_categoria]]<-datos_baja_cor1tabla_final_lista <- guardar_datos_baja_cor_diferenciados[[num_categoria]]}combined_table <- do.call(cbind, guardar_datos_baja_cor_diferenciados)data_corr_f<-combined_table[,2:length(colnames(combined_table))]matriz_cor_f <- cor(data_corr_f, method = "kendall")# Crear datos simuladosset.seed(123)# Aplicar el código anteriorumbral <- 0.9library(tidyverse)cor_df_f <- as.data.frame(as.table(matriz_cor_f)) %>% filter(Var1 != Var2) %>% mutate(abs_cor = abs(Freq)) %>% filter(abs_cor > umbral) %>% select(Var1, Var2, abs_cor)vars_alta_cor_f <- unique(c(as.character(cor_df_f$Var1), as.character(cor_df_f$Var2)))vars_alta_cor_fdatos_baja_cor1 <- combined_table[, !colnames(combined_table) %in% vars_alta_cor] # Grupo de baja variables_categorias_df <- data.frame(Variable = character(), Categoria = character(), stringsAsFactors = FALSE)# Iterar sobre las variables que quedaron en datos_baja_cor1for (var in colnames(datos_baja_cor1)) { # Iterar sobre las categorías en lista_categorias for (categoria in names(lista_categorias)) { # Verificar si la variable pertenece a la categoría actual if (var %in% lista_categorias[[categoria]]) { # Agregar la variable y su categoría al dataframe variables_categorias_df <- rbind(variables_categorias_df, data.frame(Variable = var, Categoria = categoria, stringsAsFactors = FALSE)) break # Salir del bucle una vez que se encuentra la categoría } }}defensivas<-variables_categorias_df%>%filter(Categoria=="defensa"|Categoria=="disparo" |Categoria=="pases"|Categoria=="acciones_creacion" | ( (Variable=="ToTkl"|Variable=="ToTkl%"|Variable=="CrdY"|Variable=="CrdR"|Variable=="2CrdY"|Variable=="Fls")))ofensivas<-variables_categorias_df%>%filter(Categoria=="conducciones_recepciones" | Categoria=="control_balon" & (Variable!="ToTkl"|Variable!="ToTkl%"|Variable!="Fld"|Variable!="Off"))mixtas<-variables_categorias_df%>%filter( Categoria=="centros"|Categoria=="partidos")# Calcular la suma de correlaciones absolutas para cada variable en matriz_cor_fcor_sums <- rowSums(abs(matriz_cor_f), na.rm = TRUE)# Crear un dataframe con las variables y su puntaje de correlacióncor_importance <- data.frame( Variable = names(cor_sums), Cor_Sum = cor_sums, stringsAsFactors = FALSE)# Unir con las categorías defensivas y ofensivas# Para Defensivasdefensivas_importance <- cor_importance %>% filter(Variable %in% defensivas$Variable) %>% arrange(desc(Cor_Sum)) %>% # Ordenar por puntaje de correlación descendente slice_head(n = 10) # Seleccionar las 10 principales# Para Ofensivasofensivas_importance <- cor_importance %>% filter(Variable %in% ofensivas$Variable) %>% arrange(desc(Cor_Sum)) %>% # Ordenar por puntaje de correlación descendente slice_head(n = 10) # Seleccionar las 10 principales# Para Ofensivasmixtas_importance <- cor_importance %>% filter(Variable %in% mixtas$Variable) %>% arrange(desc(Cor_Sum)) %>% # Ordenar por puntaje de correlación descendente slice_head(n = 3) # Seleccionar las 10 principales# Mostrar el dataframe resultante``````{r, echo=FALSE}analisis_pca1_gen<-cbind.data.frame(Player_performance_5_ligas_[4],Player_performance_5_ligas_[7],Player_performance_5_ligas_[9:124])data_corr_gen<-analisis_pca1_gen[,2:length(colnames(analisis_pca1_gen))]matriz_cor_gen <- cor(data_corr_gen, method = "kendall")pheatmap( matriz_cor_gen, cluster_rows = FALSE, # Desactiva clustering/dendrograma en filas cluster_cols = FALSE, fontsize_row = 4, # Tamaño etiquetas filas fontsize_col = 4, # Tamaño etiquetas columnas display_numbers = FALSE, fontsize_number = 2, # Mostrar valores de correlación number_format = "%.2f", # Formato de 2 decimales number_color = "black", na_col = "white", # Color para celdas NA (triángulo superior) main = "General correlation matrix")datatable(mixtas, caption = "Variables Mixtas")datatable(defensivas_importance, caption = "Variables Defensivas")datatable(ofensivas_importance, caption = "Variables Ofensivas")```## Analisis de Componentes principalesDefensaRealizamos entonces un analisis para las variables de defensa por posicion:```{r, echo=FALSE}analisis_pca0<-cbind.data.frame(Player_performance_5_ligas_[4],Player_performance_5_ligas_[7],Player_performance_5_ligas_[9:22])#colnames(analisis_pca0)columnas_deseadas <- c( "MP","Starts", "Min","90s","Pos" , "Age")#colnames(Player_performance_5_ligas)# Obtener los índices de las columnasindices_columnas <- which(colnames(Player_performance_5_ligas_) %in% columnas_deseadas)#indices_columnas# Extraer las columnas usando los índicesanalisis_pca<-cbind(datos_baja_cor1[, c(mixtas$Variable[1:3])],datos_baja_cor1[, c(defensivas_importance$Variable)])#########################################################################3result <- PCA(analisis_pca[,2:length(colnames(analisis_pca))],graph=FALSE,scale.unit = FALSE)#result$var#plot(result,choix="var")analisis_pca_M<-as.matrix(analisis_pca[2:length(colnames(analisis_pca))])brand.sc <- analisis_pcabrand.sc [ , 2:length(colnames(analisis_pca))] <- data.frame(scale(analisis_pca [ , 2:length(colnames(analisis_pca))]))#summary(brand.sc)corrplot::corrplot(cor(brand.sc [ , 2:length(colnames(analisis_pca))], method = "kendall") , order="hclust")brand.mean <- aggregate (. ~ Pos , data=brand.sc , mean)#brand.meanrownames(brand.mean) <- brand.mean [ , 1] # la marca como nombre de filasbrand.mean <- brand.mean [ , -1] # eliminamos la columna de marca#brand.meanpar(mar=c(1,1,1,1))pheatmap( as.matrix(brand.mean), cluster_rows = FALSE, # Desactiva clustering/dendrograma en filas cluster_cols = FALSE, fontsize_row = 4, # Tamaño etiquetas filas fontsize_col = 4, # Tamaño etiquetas columnas display_numbers = TRUE, fontsize_number = 2, # Mostrar valores de correlación number_format = "%.2f", # Formato de 2 decimales number_color = "black", na_col = "white", # Color para celdas NA (triángulo superior) main = "Correlación Matrix")```Realizamos el analisis de componentes principales para establecer la relacion entre la posicion y las distintas variables.Mostramos a continucaion la matriz rotación, que nos indica cuánto contribuye cada variable original a cada componente principal. Los valores (cargas) varían de -1 a 1, donde valores absolutos más grandes indican una mayor contribución de la variable al componente. Para la dimension 1 vemos las tres mayores cargas negativas en Tkl, TklWon y TklDri,lo que indica que esta nos habla de exito en variables asociadas a acciones defensivas.Para la dimension 2 vemos las tres mayores cargas psotivas en, TklWon,Tkl y TklDri,lo que indica que esta nos habla de exito en variables asociadas a acciones ofensivas.```{r, echo=FALSE, include=FALSE}brand.pc <- prcomp(brand.sc [ , 2:length(colnames(analisis_pca))])#summary(brand.pc)#par(mar=c(1,1,1,1))#plot(brand.pc , type="l")brand.mean<-brand.mean[1:10,1:10]brand.mu.pc <- prcomp(brand.mean , scale=TRUE)#summary(brand.mu.pc)#brand.mu.pc$centerbiplot(brand.mu.pc , main="Player position" , cex=c(0.45 , 0.45))#summary(brand.mu.pc)# Normalizar las variables numéricasdata_pca_scaled <- scale(select(analisis_pca, -Pos))# Aplicar PCApca_result <- prcomp(data_pca_scaled, center = TRUE, scale. = TRUE)pca_result$rotation[,1:2]datatable( pca_result$rotation[,1:2], rownames = FALSE, extensions = c("Buttons", "Scroller"), options = list( scrollX = TRUE, scrollY = "500px", scroller = TRUE, dom = "Bfrtip", buttons = c("copy", "csv", "excel") ))par(mar=c(1,1,1,1))plot(brand.pc , type="l")# Convertir los resultados del PCA en un dataframe para graficarpca_df <- as.data.frame(pca_result$x)#pca_dfpca_df$Pos <- analisis_pca$Pos # Agregar la posición del jugador# Graficar PCA con ggplot2library(ggplot2)pca_pos<-ggplot(pca_df, aes(x = PC1, y = PC2, color = Pos)) + geom_point(alpha = 0.7) + theme_minimal() + labs(title = "PCA for player position", x = "Principal Component 1", y = "Principal Component 2")pca_pos#Los porteros tienden a estar más dispersos hacia PC1 positivo (valores entre 5 y 10). Esto indica que los porteros tienen características que los diferencian notablemente de otras posiciones en las variables que contribuyen a PC1.#Delanteros (FW, verde): Los delanteros también están más dispersos hacia PC1 positivo, pero menos que los porteros. Esto sugiere que comparten algunas características con los porteros en PC1, pero son menos extremos# Graficar un Biplot para ver la contribución de cada variable#par(mar=c(1,1,1,1))#biplot(pca_result, scale = 0)fviz_pca_var(pca_result, col.var = "cos2", geom.var = "arrow", labelsize = 2, repel = FALSE)par(mar=c(1,1,1,1))#biplot(pca_result, scale = 0, cex = 0.5, col = c("dodgerblue3", "deeppink3"))``````{r, echo=FALSE}pca_result$rotation[,1:2]summary(brand.mu.pc)```Se tiene entonces "brand.pc" que a partir de los valores obtenidos en las dimensiones PC, representa la varianza explicada acumulada por las componentes principales, ordenadas de mayor a menor varianza.```{r, echo=FALSE}par(mar=c(1,1,1,1))plot(brand.pc , type="l")```En el grafico PCA for player position el diagrama de dispersión muestra cómo se distribuyen los distintos tipos de jugadores (coloreados por su posición) según dos componentes principales que has interpretado como ejes “defensa” (PC1) y “ataque” (PC2):1. **Eje X (PC1): Defensa** A la derecha (valores altos de PC1) aparecen los jugadores con perfil más defensivo: sobre todo porteros (GK, puntos azul turquesa) y defensas (DF, puntos rojos). A la izquierda (valores bajos de PC1) se sitúan los jugadores con menor énfasis en tareas defensivas, especialmente delanteros (FW, puntos verdes oscuros).2. **Eje Y (PC2): Ataque:** En la parte superior (valores altos de PC2) están los jugadores más orientados al ataque: por ejemplo, extremos o delanteros muy ofensivos (FWDF, MFDF, MFFW). En la parte inferior (valores bajos de PC2) se sitúan los que aportan menos en fase ofensiva (defensas centrales muy posicionales o porteros). En el grafico variables-PCA de consenos, nos muestra como las variables principales de la dimension 1, tienen cargas negativas altas en las dos dimensiones y las variables principales de la dimension 2, presentan cargas altas en la dimension dos, pero negativas en la dimension 1.## ```{r, echo=FALSE}pca_pos```En el grafico de Player position, **P**C1(63,51%) y PC2(23,03%) explican el 86.5% de la varianza. Esto significa que el 13.5% de la información está en los otros componentes (PC3 a PC12). Por lo tanto, el grafico simplifica algunas relaciones entre las variables, de la data suministrada.Vemos que las posiciones FW y MFFW, se encuentran cerca de las variables shots y GCA, es decir que estas posiciones y las variables tienen una importancia en la explicacion de la varianza con alto exito en defensa y ataque simultaneamente, ademas, se relacionan entre si, contrario ejemplo de la posicion FWMF, tambien, de alto desempeño en ataque y defensa, pero sin relacion alguna con una variable cuantitativa propriamente, se pueden realizar este tipo de analisis para las demas posiciones, en los cuadrantes II,III y IV```{r, echo=FALSE}biplot(brand.mu.pc , main="Player position" , cex=c(0.7 , 0.7))```El gráfico de Variables PCA nos explica nuevamente, por medio de los cosenos cuadrados de las variables en los componentes, cuáles aportan más de forma negativa o positiva.Buscamos los vectores de mayor longitud y observamos que hay dos grupos de colores:- - **Azul oscuro**: Los vectores más largos se encuentran en el cuadrante III, lo que indica que las variables defensivas están marcadas por un bajo rendimiento tanto en ataque como en defensa al mismo tiempo.- - **Azul claro**: A excepción de la flecha clara de alta longitud que se observa en el cuadrante III, la mayoría de este tono se encuentran en el cuadrante II, indicando que las variables de ataque están marcadas por un buen desempeño en ataque, pero no en defensa.```{r, echo=FALSE}fviz_pca_var(pca_result, col.var = "cos2", geom.var = "arrow", labelsize = 2, repel = FALSE)```Finalmente vemos otra forma de representacion de la proporcion de varianza explicada por el analisis```{r}#pca_resultprop_varianza <- pca_result$sdev^2/sum(pca_result$sdev^2)ggplot(data =data.frame(prop_varianza, pc =1:length(prop_varianza)),aes(x = pc, y = prop_varianza)) +geom_col(width =0.3) +scale_y_continuous(limits =c(0,1)) +theme_bw() +labs(x ="Principal Component",y ="Prop. of variance explained")```## Analisis de Componentes principales AtacantesRealizamos el analisis para variables de ataque:```{r, echo=FALSE}analisis_pca2<-cbind(datos_baja_cor1[, c(mixtas$Variable[1:3])],datos_baja_cor1[, c(ofensivas_importance$Variable)])#########################################################################3result1 <- PCA(analisis_pca2[,2:length(colnames(analisis_pca2))],graph=FALSE,scale.unit = FALSE)#result$var#plot(result,choix="var")analisis_pca_M2<-as.matrix(analisis_pca2[2:length(colnames(analisis_pca2))])brand.sc1 <- analisis_pca2brand.sc1 [ , 2:length(colnames(analisis_pca2))] <- data.frame(scale(analisis_pca2 [ , 2:length(colnames(analisis_pca2))]))#summary(brand.sc)corrplot::corrplot(cor(brand.sc1 [ , 2:length(colnames(analisis_pca2))], method = "kendall") , order="hclust")brand.mean1 <- aggregate (. ~ Pos , data=brand.sc1 , mean)#brand.meanrownames(brand.mean1) <- brand.mean1 [ , 1] # la marca como nombre de filasbrand.mean1 <- brand.mean1 [ , -1] # eliminamos la columna de marca#brand.meanpar(mar=c(1,1,1,1))pheatmap( as.matrix(brand.mean1), cluster_rows = FALSE, # Desactiva clustering/dendrograma en filas cluster_cols = FALSE, fontsize_row = 4, # Tamaño etiquetas filas fontsize_col = 4, # Tamaño etiquetas columnas display_numbers = TRUE, fontsize_number = 2, # Mostrar valores de correlación number_format = "%.2f", # Formato de 2 decimales number_color = "black", na_col = "white", # Color para celdas NA (triángulo superior) main = "Correlation Matrix")brand.pc1 <- prcomp(brand.sc1 [ , 2:length(colnames(analisis_pca2))])#summary(brand.pc)par(mar=c(1,1,1,1))plot(brand.pc1 , type="l")brand.mean1<-cbind(brand.mean1[1:10,10:12],brand.mean1[1:3])brand.mu.pc1 <- prcomp(brand.mean1 , scale=TRUE)#summary(brand.mu.pc)#brand.mu.pc$centerbiplot(brand.mu.pc1 , main="Player position" , cex=c(0.55 , 0.55))summary(brand.mu.pc1)# Normalizar las variables numéricasdata_pca_scaled1 <- scale(select(analisis_pca2, -Pos))# Aplicar PCApca_result1 <- prcomp(data_pca_scaled1, center = TRUE, scale. = TRUE)pca_result1$rotation[,1:2]datatable( pca_result1$rotation[,1:2], rownames = FALSE, extensions = c("Buttons", "Scroller"), options = list( scrollX = TRUE, scrollY = "500px", scroller = TRUE, dom = "Bfrtip", buttons = c("copy", "csv", "excel") ))# Convertir los resultados del PCA en un dataframe para graficarpca_df1 <- as.data.frame(pca_result1$x)#pca_dfpca_df1$Pos <- analisis_pca2$Pos # Agregar la posición del jugador# Graficar PCA con ggplot2library(ggplot2)pca_pos1<-ggplot(pca_df1, aes(x = PC1, y = PC2, color = Pos)) + geom_point(alpha = 0.7) + theme_minimal() + labs(title = "PCA for player position", x = "Principal Component 1", y = "Principal Component 2")pca_pos1# Graficar un Biplot para ver la contribución de cada variable#par(mar=c(1,1,1,1))#biplot(pca_result, scale = 0)fviz_pca_var(pca_result1, col.var = "cos2", geom.var = "arrow", labelsize = 2, repel = FALSE)par(mar=c(1,1,1,1))#biplot(pca_result, scale = 0, cex = 0.5, col = c("dodgerblue3", "deeppink3"))```**Ficha técnica:**Para evaluar la relación entre las posiciones y las distintas variables, se empleó el Análisis de Componentes Principales (ACP). Previamente, se realizó el test de normalidad de Shapiro-Wilk para todas las variables, determinando que ninguna de ellas seguía una distribución normal. Se calculó el determinante de la matriz de correlación de Kendall para identificar la presencia de multicolinealidad, seleccionando aquellas variables con alta correlación para su exclusión en el análisis.1\. **Estandarización de datos**: Dado que las variables pueden tener diferentes escalas, se estandarizaron (media = 0, desviación estándar = 1) para garantizar comparabilidad.2\. **Cálculo de la matriz de correlación**: Se utilizó la matriz de Kendall para capturar las relaciones entre variables no normales.**Technical Sheet:**To evaluate the relationship between positions and various variables, Principal Component Analysis (PCA) was employed. Prior to this, the Shapiro-Wilk normality test was conducted for all variables, revealing that none followed a normal distribution. The determinant of the Kendall correlation matrix was calculated to identify the presence of multicollinearity, selecting those variables with high correlation for exclusion from the analysis.1. **Data Standardization**: Since variables may have different scales, they were standardized (mean = 0, standard deviation = 1) to ensure comparability.2. **Calculation of the Correlation Matrix**: The Kendall correlation matrix was used to capture relationships between non-normal variables.3. **Component Extraction**: Eigenvalues and eigenvectors of the correlation matrix were computed. Eigenvalues indicate the amount of variance explained by each component, while eigenvectors define the directions of the new axes.4. **Component Selection**: Criteria such as the Kaiser rule (eigenvalues \> 1) or the cumulative percentage of explained variance (e.g., \>70-80%) were applied to determine how many components to retain.5. **Interpretation of Loadings**: The loadings of variables on each component allowed identification of which variables contribute most to each dimension, facilitating the interpretation of results in the context of the evaluated positions.3\. **Extracción de componentes**: Se calcularon los autovalores y autovectores de la matriz de correlación. Los autovalores indican la cantidad de varianza explicada por cada componente, y los autovectores definen las direcciones de los nuevos ejes.4\. **Selección de componentes**: Se empleó un criterio como el de Kaiser (autovalores \> 1) o el porcentaje acumulado de varianza explicada (e.g., \>70-80%) para determinar cuántos componentes retener.5\. **Interpretación de cargas**: Las cargas de las variables en cada componente permitieron identificar qué variables contribuyen más a cada dimensión, facilitando la interpretación de los resultados en el contexto de las posiciones evaluadas.