para las Naciones tenemos la siguiente distribucion:
Warning in plot_theme(plot): The `legend.Nationition` theme element is not
defined in the element hierarchy.
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 naciones, con un valor p menor que 0.05, lo que indica que existen diferencias.
Tratamiento de datos
Aqui voooy
Analisis de Componentes principales Defensa
Realizamos entonces un analisis para las variables de defensa por liga:
Realizamos el analisis de componentes principales para establecer la relacion entre la liga y las distintas variables
prop_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 ="Componente principal",y ="Prop. de varianza explicada")
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 TklAtt3rd,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.
Importance of components:
PC1 PC2 PC3 PC4 PC5
Standard deviation 1.9984 1.6515 1.4101 1.1361 2.017e-16
Proportion of Variance 0.3993 0.2727 0.1988 0.1291 0.000e+00
Cumulative Proportion 0.3993 0.6721 0.8709 1.0000 1.000e+00
la grafica “brand.pc” 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.
par(mar=c(1,1,1,1))plot(brand.pc , type="l")
Grafico PCA for player position
El diagrama de dispersión muestra cómo se distribuyen los distintos tipos de jugadores (coloreados por su nacion) según dos componentes principales.
Eje X (PC1): Defensa
Vemos que la mayoria de puntos se ubican en valores cercanos al 0, tambien se preenta una concentracion importante de puntos en los cuadrantes II y III, lo que indica que la mayoria de ligas presentan poca probabilidad de exito en desenfa.
Eje Y (PC2): Ataque:
En la parte superior (valores altos de PC2) encontramos un punto en la liga de brasil, es decir que tenemos un jugador con baja probabilidad de defensa exitosa, pero alta de ataque, vemos que en esta misma liga se presenta el peor de los escenarios, bajo ataque y baja defensa, sus puntos estan mas dispersos que otras ligas, por tanto no es adecuado dar un comportamiento especifico a esta liga.
pca_Nation
Grafico de Player position
Tenemos que , PC1(39,9%) y PC2(27,27%) explican el 67.17 de la varianza. Esto significa que el 32.83% 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 la liga inglesa se relaciona con las variables MP, PPA, Shots, con alta efectividad en ataque aunque defensa negativa
En españa la edad se asocia con la efectividad en defensa, la liga italiana se muestra como la que tiene mejores resultados en defensa y ataque para las variables SCA y Shotdist
par(mar=c(1,1,1,1))biplot(brand.mu.pc , main="Lagues vs defensive variables" , cex=c(0.55 , 0.55))
Gráfico de Variables PCA
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.
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 TouAtt3rd, ToAtt, RecProg,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, TouDef3rd, TouDefPen, ToSuc, lo que indica que esta nos habla de exito en variables asociadas a acciones ofensivas.
Importance of components:
PC1 PC2 PC3 PC4 PC5
Standard deviation 2.2706 1.3232 0.8955 0.54008 1.293e-16
Proportion of Variance 0.6445 0.2188 0.1002 0.03646 0.000e+00
Cumulative Proportion 0.6445 0.8633 0.9635 1.00000 1.000e+00
Grafico de Player position
Tenemos que , PC1(64,45%) y PC2(21,88%) explican el 86.33 de la varianza. Esto significa que el 13.67% 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 la liga inglesa se relaciona con las variables MP, PPA, Shots, con alta efectividad en ataque aunque defensa negativa
En Francia ToAtt y CarProg se asocia con la efectividad en defensa, la inglesa se encuentra cercana a MP como la que tiene mejores resultados en defensa y ataque.
El diagrama de dispersión muestra cómo se distribuyen los distintos tipos de jugadores (coloreados por su nacion) según dos componentes principales.
Eje X (PC1): Defensa
Vemos que la mayoria de puntos se ubican en valores cercanos al 0, en defensa, tambien se preenta una concentracion importante de puntos en los cuadrantes II y III, lo que indica que la mayoria de ligas presentan poca probabilidad de exito en desenfa.
Eje Y (PC2): Ataque:
En la parte superior (valores altos de PC2) encontramos un punto en la liga de Holanda, es decir que tenemos un jugador con baja probabilidad de defensa exitosa, pero alta de ataque, los demas puntos en el eje y tienden a agruparse como las demas ligas en valores de alta defensa pero bajo ataque.
pca_Nation1
Ficha técnica:
Para evaluar la relación entre las ligas 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 leagues 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 Nationitions.
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 Nationiciones evaluadas.
Source Code
---title: "Análisis de Componentes Principales por ligas"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 tiNation de datos across(1:6, as.factor),across(7, as.numeric),across(8, as.factor), across(9:124, as.numeric))Player_performance_5_ligas_ <- Player_performance_5_ligas_ %>% mutate(Nation = if_else(Nation == "ESP", "SPAIN", Nation))``````{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 Naciones tenemos la siguiente distribucion:```{r, echo=FALSE, message=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(Nation)%>%adorn_pct_formatting() # Asignar nombres uniformes a las columnas colnames(table) <- c("League", "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") ))table <- table[order(-table$Frecuencia), ]naciones<-10tablefrec<-table[1:naciones,1:2]ggplot(tablefrec, aes(x = League, y = Frecuencia, fill = League)) + geom_bar(stat = "identity") + # Mostrar eje y como porcentajes labs(title = "Distribution of the top 10 leagues", x = "League", y = "Frecuency") + theme_minimal() + theme(legend.Nationition = "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 naciones, con un valor p menor que 0.05, lo que indica que existen diferencias.## Tratamiento de datos```{r, include=FALSE, message=FALSE}resultados_variables_list<-list()tabla_final_lista <-list()Estadisticas_partidos <- c( "MP","Starts", "Min","90s","Nation" , "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 Nation 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 Nation si existe)if (length(vars_cumplen) > 0) { analisis_pca_cumple <- analisis_pca1_2 %>% select(any_of(c("Nation", vars_cumplen)))} else { analisis_pca_cumple <- data.frame(Nation = analisis_pca1_2$Nation) # Si no hay variables, solo mantenemos Nation}# Subbase con variables que NO cumplen el supuesto (incluye la columna Nation si existe)if (length(vars_no_cumplen) > 0) { analisis_pca_no_cumple <- analisis_pca1_2 %>% select(any_of(c("Nation", vars_no_cumplen)))} else { analisis_pca_no_cumple <- data.frame(Nation = analisis_pca$Nation) # Si no hay variables, solo mantenemos Nation}# 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")```Aqui voooy## Analisis de Componentes principales DefensaRealizamos entonces un analisis para las variables de defensa por liga:```{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","Nation" , "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 (. ~ Nation , 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 liga y las distintas variables```{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")numero_variables<-10filas_deseadas <- c("ENG","ITA","SPAIN","GER","FRA")#cambiar las filas deseadas para agregar mas ligasligas<-as.data.frame(rownames(brand.mean))# Obtener los índices de las columnasindices_filas <- which(ligas$`rownames(brand.mean)` %in% filas_deseadas)indices_filasbrand.mean<-brand.mean[indices_filas,1:numero_variables]brand.mu.pc <- prcomp(brand.mean , scale=TRUE)#summary(brand.mu.pc)#brand.mu.pc$centerbiplot(brand.mu.pc , main="Lagues vs defensive variables" , cex=c(0.55 , 0.55))summary(brand.mu.pc)# Normalizar las variables numéricasdata_pca_scaled <- scale(select(analisis_pca, -Nation))# Aplicar PCApca_result <- prcomp(data_pca_scaled, center = TRUE, scale. = TRUE)# Convertir los resultados del PCA en un dataframe para graficarpca_df <- as.data.frame(pca_result$x)#pca_dfpca_df$Nation <- analisis_pca$Nation # Agregar la Nationición del jugador# Obtener valores únicos de League en tablefrecunique_leagues <- unique(tablefrec$League)# Filtrar pca_df con los valores únicos de Leaguepca_df_filtered <- pca_df %>% filter(Nation %in% unique_leagues)# Graficar PCA con ggplot2library(ggplot2)pca_Nation<-ggplot(pca_df_filtered, aes(x = PC1, y = PC2, color = Nation)) + geom_point(alpha = 0.7) + theme_minimal() + labs(title = "PCA for players leagues", x = "Principal Component 1", y = "Principal Component 2")pca_Nation#Los porteros tienden a estar más dispersos hacia PC1 Nationitivo (valores entre 5 y 10). Esto indica que los porteros tienen características que los diferencian notablemente de otras Nationiciones en las variables que contribuyen a PC1.#Delanteros (FW, verde): Los delanteros también están más dispersos hacia PC1 Nationitivo, 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}pca_resultpca_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") ))prop_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 ="Componente principal",y ="Prop. de varianza explicada")```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 TklAtt3rd,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}pca_result$rotation[,1:2]summary(brand.mu.pc)```la grafica “brand.pc” 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}par(mar=c(1,1,1,1))plot(brand.pc , type="l")```**Grafico PCA for player position**El diagrama de dispersión muestra cómo se distribuyen los distintos tipos de jugadores (coloreados por su nacion) según dos componentes principales.1. **Eje X (PC1): Defensa** Vemos que la mayoria de puntos se ubican en valores cercanos al 0, tambien se preenta una concentracion importante de puntos en los cuadrantes II y III, lo que indica que la mayoria de ligas presentan poca probabilidad de exito en desenfa. **Eje Y (PC2): Ataque:** En la parte superior (valores altos de PC2) encontramos un punto en la liga de brasil, es decir que tenemos un jugador con baja probabilidad de defensa exitosa, pero alta de ataque, vemos que en esta misma liga se presenta el peor de los escenarios, bajo ataque y baja defensa, sus puntos estan mas dispersos que otras ligas, por tanto no es adecuado dar un comportamiento especifico a esta liga.```{r}pca_Nation```**Grafico de Player position**Tenemos que , **P**C1(39,9%) y PC2(27,27%) explican el 67.17 de la varianza. Esto significa que el 32.83% 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 la liga inglesa se relaciona con las variables MP, PPA, Shots, con alta efectividad en ataque aunque defensa negativaEn españa la edad se asocia con la efectividad en defensa, la liga italiana se muestra como la que tiene mejores resultados en defensa y ataque para las variables SCA y Shotdist```{r}par(mar=c(1,1,1,1))biplot(brand.mu.pc , main="Lagues vs defensive variables" , cex=c(0.55 , 0.55))```**Gráfico de Variables PCA**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}par(mar=c(1,1,1,1))fviz_pca_var(pca_result, col.var ="cos2", geom.var ="arrow", labelsize =2, repel =FALSE)```## Analisis de Componentes principales ataqueRealizamos 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 (. ~ Nation , 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 = "Correlación 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")numero_variables<-9filas_deseadas <- c("ENG","ITA","SPAIN","GER","FRA")#cambiar las filas deseadas para agregar mas ligasligas<-as.data.frame(rownames(brand.mean1))# Obtener los índices de las columnasindices_filas <- which(ligas$`rownames(brand.mean1)` %in% filas_deseadas)indices_filasbrand.mean1<-brand.mean1[indices_filas,1:numero_variables] brand.mean1<-cbind(brand.mean1[1:3],brand.mean1[5:9]) brand.mu.pc1 <- prcomp(brand.mean1 , scale=TRUE)#summary(brand.mu.pc)#brand.mu.pc$center#biplot(brand.mu.pc1 , main="Leagues" , cex=c(0.7 , 0.7))brand.mu.pc1 <- prcomp(brand.mean1 , scale=TRUE)summary(brand.mu.pc1)#brand.mu.pc$centerbiplot(brand.mu.pc1 , main="League vs attack variables" , cex=c(0.55 , 0.55))#summary(brand.mu.pc1)# Normalizar las variables numéricasdata_pca_scaled1 <- scale(select(analisis_pca2, -Nation))# Aplicar PCApca_result1 <- prcomp(data_pca_scaled1, center = TRUE, scale. = TRUE)# Convertir los resultados del PCA en un dataframe para graficarpca_df1 <- as.data.frame(pca_result1$x)#pca_dfpca_df1$Nation <- analisis_pca2$Nation # Agregar la Nationición del jugador# Obtener valores únicos de League en tablefrecunique_leagues <- unique(tablefrec$League)# Filtrar pca_df con los valores únicos de Leaguepca_df_filtered1 <- pca_df1 %>% filter(Nation %in% unique_leagues)# Graficar PCA con ggplot2library(ggplot2)pca_Nation1<-ggplot(pca_df_filtered1, aes(x = PC1, y = PC2, color = Nation)) + geom_point(alpha = 0.7) + theme_minimal() + labs(title = "PCA for players leagues", x = "Principal Component 1", y = "Principal Component 2")pca_Nation1# 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"))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") ))```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 TouAtt3rd, ToAtt, RecProg,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, TouDef3rd, TouDefPen, ToSuc, lo que indica que esta nos habla de exito en variables asociadas a acciones ofensivas.```{r}pca_result1$rotation[,1:2]summary(brand.mu.pc1)```**Grafico de Player position**Tenemos que , **P**C1(64,45%) y PC2(21,88%) explican el 86.33 de la varianza. Esto significa que el 13.67% 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 la liga inglesa se relaciona con las variables MP, PPA, Shots, con alta efectividad en ataque aunque defensa negativaEn Francia ToAtt y CarProg se asocia con la efectividad en defensa, la inglesa se encuentra cercana a MP como la que tiene mejores resultados en defensa y ataque.```{r}par(mar=c(1,1,1,1)) biplot(brand.mu.pc1 , main="Lagues vs offensive variables" , cex=c(0.55 , 0.55)) ```**Grafico PCA for player position**El diagrama de dispersión muestra cómo se distribuyen los distintos tipos de jugadores (coloreados por su nacion) según dos componentes principales.1. **Eje X (PC1): Defensa** Vemos que la mayoria de puntos se ubican en valores cercanos al 0, en defensa, tambien se preenta una concentracion importante de puntos en los cuadrantes II y III, lo que indica que la mayoria de ligas presentan poca probabilidad de exito en desenfa. **Eje Y (PC2): Ataque:** En la parte superior (valores altos de PC2) encontramos un punto en la liga de Holanda, es decir que tenemos un jugador con baja probabilidad de defensa exitosa, pero alta de ataque, los demas puntos en el eje y tienden a agruparse como las demas ligas en valores de alta defensa pero bajo ataque.```{r}pca_Nation1```**Ficha técnica:**Para evaluar la relación entre las ligas 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 leagues 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 Nationitions.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 Nationiciones evaluadas.