# Insertar la base yleer las primeras 10 filas de la base library(readr)data <-read_csv("C:/Users/MINEDUCYT/Downloads/data.csv")
New names:
• `` -> `...33`
Warning: One or more parsing issues, call `problems()` on your data frame for details,
e.g.:
dat <- vroom(...)
problems(dat)
Rows: 568 Columns: 33
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (1): diagnosis
dbl (31): id, radius_mean, texture_mean, perimeter_mean, area_mean, smoothne...
lgl (1): ...33
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
data
# A tibble: 568 × 33
id diagnosis radius_mean texture_mean perimeter_mean area_mean
<dbl> <chr> <dbl> <dbl> <dbl> <dbl>
1 842302 M 18.0 10.4 123. 1001
2 842517 M 20.6 17.8 133. 1326
3 84300903 M 19.7 21.2 130 1203
4 84348301 M 11.4 20.4 77.6 386.
5 84358402 M 20.3 14.3 135. 1297
6 843786 M 12.4 15.7 82.6 477.
7 844359 M 18.2 20.0 120. 1040
8 84458202 M 13.7 20.8 90.2 578.
9 844981 M 13 21.8 87.5 520.
10 84501001 M 12.5 24.0 84.0 476.
# ℹ 558 more rows
# ℹ 27 more variables: smoothness_mean <dbl>, compactness_mean <dbl>,
# concavity_mean <dbl>, `concave points_mean` <dbl>, symmetry_mean <dbl>,
# fractal_dimension_mean <dbl>, radius_se <dbl>, texture_se <dbl>,
# perimeter_se <dbl>, area_se <dbl>, smoothness_se <dbl>,
# compactness_se <dbl>, concavity_se <dbl>, `concave points_se` <dbl>,
# symmetry_se <dbl>, fractal_dimension_se <dbl>, radius_worst <dbl>, …
Se carga la librería readr para leer archivos .csv. Luego se importa el archivo llamado data.csv y se guarda en el objeto data. Al final, se muestra el contenido del dataset (por defecto, RStudio muestra solo las primeras filas).
# 1. Exportar la base y leer las primeras filasimport pandas as pddata = pd.read_csv("C:/Users/MINEDUCYT/Downloads/data.csv")print(data.head(10))
id diagnosis ... fractal_dimension_worst Unnamed: 32
0 842302 M ... 0.11890 NaN
1 842517 M ... 0.08902 NaN
2 84300903 M ... 0.08758 NaN
3 84348301 M ... 0.17300 NaN
4 84358402 M ... 0.07678 NaN
5 843786 M ... 0.12440 NaN
6 844359 M ... 0.08368 NaN
7 84458202 M ... 0.11510 NaN
8 844981 M ... 0.10720 NaN
9 84501001 M ... 0.20750 NaN
[10 rows x 33 columns]
Se cuenta cuántos valores faltantes (NA) hay en todo el conjunto de datos.
2. Limpieza de los datos
library(tidyverse)
Warning: package 'tidyverse' was built under R version 4.3.3
Warning: package 'lubridate' was built under R version 4.3.3
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.3 ✔ purrr 1.0.2
✔ forcats 1.0.0 ✔ stringr 1.5.0
✔ ggplot2 3.4.4 ✔ tibble 3.2.1
✔ lubridate 1.9.3 ✔ tidyr 1.3.0
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(FactoMineR) # Para PCA
Warning: package 'FactoMineR' was built under R version 4.3.3
library(factoextra) # Para visualización
Warning: package 'factoextra' was built under R version 4.3.3
Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
# Cargar datos especificando posibles valores nulos y eliminandar SOLO las columnas con NAdata_r <- data %>%select(-id) %>%# Eliminar columnas donde TODOS los valores son NAselect(where(~!all(is.na(.)))) %>%mutate(diagnosis =as.factor(diagnosis)) %>%filter(complete.cases(.))# Verificar que solo se eliminaron 2 columnacat("Número de columnas eliminadas:", ncol(data) -ncol(data_r), "\n")
Explicación:
Se crea una nueva versión del dataset (data_r) realizando varios pasos:
Se elimina la columna id (no es útil para el análisis).
Se eliminan las columnas que solo tienen NA.
Se convierte la variable diagnosis a tipo factor (porque es categórica)
Se eliminan las filas que tengan algún valor faltante.
# 2. Limpieza de los datosimport numpy as np# Eliminar columnas donde TODOS los valores son NAdata_r = data.drop(columns=['id']).dropna(axis=1, how='all')# Convertir diagnosis a categórico y eliminar filas con NAdata_r['diagnosis'] = data_r['diagnosis'].astype('category')data_r = data_r.dropna()print(f"Número de columnas eliminadas: {len(data.columns) -len(data_r.columns)}")
Número de columnas eliminadas: 2
print(data_r.head())
diagnosis radius_mean ... symmetry_worst fractal_dimension_worst
0 M 17.99 ... 0.4601 0.11890
1 M 20.57 ... 0.2750 0.08902
2 M 19.69 ... 0.3613 0.08758
3 M 11.42 ... 0.6638 0.17300
4 M 20.29 ... 0.2364 0.07678
[5 rows x 31 columns]
# Verificar valores faltantesprint(f"Valores faltantes después de limpieza: {data_r.isna().sum().sum()}")
Valores faltantes después de limpieza: 0
sum(is.na(data_r))
[1] 0
Se confirma que ya no hay valores faltantes (NA) en el nuevo dataset data_r.
3. Cambiar el nombre de las variables para una mejor comprension
traducciones <-c("radius_mean"="radio_media", # Diámetro promedio del núcleo celular"texture_mean"="textura_media", # Variación del color (grises)"perimeter_mean"="perimetro_media", # Longitud del contorno celular"area_mean"="area_media", # Tamaño del área nuclear"smoothness_mean"="suavidad_media", # Regularidad de los bordes"compactness_mean"="compacidad_media", # Relación perímetro²/área"concavity_mean"="concavidad_media", # Severidad de hendiduras en el contorno"concave points_mean"="puntos_concavos_media", # Número de porciones cóncavas"symmetry_mean"="simetria_media", # Equilibrio de la forma celular"fractal_dimension_mean"="dimension_fractal_media") # Complejidad geométricatraducciones_se <-c("radius_se"="radio_error_estándar","texture_se"="textura_error_estándar","perimeter_se"="perímetro_error_estándar","area_se"="área_error_estándar","smoothness_se"="suavidad_error_estándar","compactness_se"="compacidad_error_estándar","concavity_se"="concavidad_error_estándar","concave points_se"="puntos_cóncavos_error_estándar","symmetry_se"="simetría_error_estándar","fractal_dimension_se"="dimensión_fractal_error_estándar")traducciones_worst <-c("radius_worst"="radio_maximo", # Mayor diámetro nuclear observado"texture_worst"="textura_maxima", # Máxima heterogeneidad de textura"perimeter_worst"="perimetro_maximo", # Contorno más irregular"area_worst"="area_maxima", # Área nuclear más extensa"smoothness_worst"="suavidad_minima", # Bordes menos regulares "compactness_worst"="compacidad_maxima", # Forma más densa/irregular"concavity_worst"="concavidad_maxima", # Hendiduras más pronunciadas"concave points_worst"="puntos_concavos_maximos", # Máximo número de concavidades"symmetry_worst"="simetria_minima", # Asimetría más marcada"fractal_dimension_worst"="dimension_fractal_maxima")# Complejidad geométrica extrema# Combinar todas las traduccionestraducciones_completas <-c(traducciones, traducciones_se, traducciones_worst)# Renombrar columnas (diagnosis')names(data_r) <-ifelse(names(data_r) %in%c("diagnosis"),names(data_r), traducciones_completas[names(data_r)])# Verificarhead(data_r, 3)
Muestra correlaciones entre variables numéricas. Colores fuertes (azul/rojo) indican relaciones lineales altas, útiles para justificar PCA
Variables como radio_media ,área_media y perimetro_media suelen correlacionarse fuertemente (redundancia que PCA puede reducir).
# Verificar que los datos sean numéricos y no tengan NA en las filassummary(data_r) # Resumen de las variables
diagnosis radio_media textura_media perimetro_media area_media
B:356 Min. : 6.981 Min. : 9.71 Min. : 43.79 Min. : 143.5
M:212 1st Qu.:11.707 1st Qu.:16.17 1st Qu.: 75.20 1st Qu.: 420.3
Median :13.375 Median :18.84 Median : 86.29 Median : 551.4
Mean :14.139 Mean :19.28 Mean : 92.05 Mean : 655.7
3rd Qu.:15.797 3rd Qu.:21.79 3rd Qu.:104.15 3rd Qu.: 784.1
Max. :28.110 Max. :39.28 Max. :188.50 Max. :2501.0
suavidad_media compacidad_media concavidad_media puntos_concavos_media
Min. :0.06251 Min. :0.01938 Min. :0.00000 Min. :0.00000
1st Qu.:0.08640 1st Qu.:0.06517 1st Qu.:0.02958 1st Qu.:0.02035
Median :0.09589 Median :0.09312 Median :0.06155 Median :0.03360
Mean :0.09644 Mean :0.10445 Mean :0.08896 Mean :0.04901
3rd Qu.:0.10533 3rd Qu.:0.13043 3rd Qu.:0.13100 3rd Qu.:0.07401
Max. :0.16340 Max. :0.34540 Max. :0.42680 Max. :0.20120
simetria_media dimension_fractal_media radio_error_estándar
Min. :0.1060 Min. :0.04996 Min. :0.1115
1st Qu.:0.1620 1st Qu.:0.05770 1st Qu.:0.2324
Median :0.1792 Median :0.06155 Median :0.3240
Mean :0.1812 Mean :0.06280 Mean :0.4052
3rd Qu.:0.1957 3rd Qu.:0.06613 3rd Qu.:0.4798
Max. :0.3040 Max. :0.09744 Max. :2.8730
textura_error_estándar perímetro_error_estándar área_error_estándar
Min. :0.3602 Min. : 0.757 Min. : 6.802
1st Qu.:0.8331 1st Qu.: 1.605 1st Qu.: 17.850
Median :1.1080 Median : 2.285 Median : 24.565
Mean :1.2165 Mean : 2.867 Mean : 40.374
3rd Qu.:1.4743 3rd Qu.: 3.360 3rd Qu.: 45.237
Max. :4.8850 Max. :21.980 Max. :542.200
suavidad_error_estándar compacidad_error_estándar concavidad_error_estándar
Min. :0.001713 Min. :0.002252 Min. :0.00000
1st Qu.:0.005166 1st Qu.:0.013133 1st Qu.:0.01510
Median :0.006374 Median :0.020460 Median :0.02592
Mean :0.007041 Mean :0.025515 Mean :0.03195
3rd Qu.:0.008151 3rd Qu.:0.032455 3rd Qu.:0.04212
Max. :0.031130 Max. :0.135400 Max. :0.39600
puntos_cóncavos_error_estándar simetría_error_estándar
Min. :0.000000 Min. :0.007882
1st Qu.:0.007663 1st Qu.:0.015128
Median :0.010950 Median :0.018725
Mean :0.011817 Mean :0.020531
3rd Qu.:0.014730 3rd Qu.:0.023398
Max. :0.052790 Max. :0.078950
dimensión_fractal_error_estándar radio_maximo textura_maxima
Min. :0.0008948 Min. : 7.93 Min. :12.02
1st Qu.:0.0022445 1st Qu.:13.03 1st Qu.:21.07
Median :0.0031955 Median :14.97 Median :25.41
Mean :0.0037967 Mean :16.28 Mean :25.67
3rd Qu.:0.0045585 3rd Qu.:18.80 3rd Qu.:29.68
Max. :0.0298400 Max. :36.04 Max. :49.54
perimetro_maximo area_maxima suavidad_minima compacidad_maxima
Min. : 50.41 Min. : 185.2 Min. :0.07117 Min. :0.02729
1st Qu.: 84.15 1st Qu.: 515.7 1st Qu.:0.11660 1st Qu.:0.14758
Median : 97.67 Median : 686.5 Median :0.13135 Median :0.21300
Mean :107.35 Mean : 881.7 Mean :0.13244 Mean :0.25460
3rd Qu.:125.53 3rd Qu.:1085.0 3rd Qu.:0.14602 3rd Qu.:0.33930
Max. :251.20 Max. :4254.0 Max. :0.22260 Max. :1.05800
concavidad_maxima puntos_concavos_maximos simetria_minima
Min. :0.0000 Min. :0.00000 Min. :0.1565
1st Qu.:0.1159 1st Qu.:0.06497 1st Qu.:0.2504
Median :0.2275 Median :0.10002 Median :0.2821
Mean :0.2727 Mean :0.11481 Mean :0.2901
3rd Qu.:0.3835 3rd Qu.:0.16168 3rd Qu.:0.3180
Max. :1.2520 Max. :0.29100 Max. :0.6638
dimension_fractal_maxima
Min. :0.05504
1st Qu.:0.07147
Median :0.08005
Mean :0.08397
3rd Qu.:0.09208
Max. :0.20750
r_data_numeric <- data_r[, sapply(data_r, is.numeric)] # Solo columnas numéricasr_data_clean <-na.omit(r_data_numeric) # Eliminar filas con NA (si las hay)r_data_scaled <-scale(r_data_clean) # Estandarizar (media=0, sd=1)
summary(r_data_scaled)
radio_media textura_media perimetro_media area_media
Min. :-2.0351 Min. :-2.2261 Min. :-1.9900 Min. :-1.4566
1st Qu.:-0.6912 1st Qu.:-0.7235 1st Qu.:-0.6947 1st Qu.:-0.6695
Median :-0.2171 Median :-0.1036 Median :-0.2374 Median :-0.2967
Mean : 0.0000 Mean : 0.0000 Mean : 0.0000 Mean : 0.0000
3rd Qu.: 0.4717 3rd Qu.: 0.5826 3rd Qu.: 0.4991 3rd Qu.: 0.3652
Max. : 3.9726 Max. : 4.6520 Max. : 3.9775 Max. : 5.2473
suavidad_media compacidad_media concavidad_media puntos_concavos_media
Min. :-2.43102 Min. :-1.6112 Min. :-1.1161 Min. :-1.2636
1st Qu.:-0.71921 1st Qu.:-0.7438 1st Qu.:-0.7450 1st Qu.:-0.7389
Median :-0.03886 Median :-0.2145 Median :-0.3439 Median :-0.3972
Mean : 0.00000 Mean : 0.0000 Mean : 0.0000 Mean : 0.0000
3rd Qu.: 0.63684 3rd Qu.: 0.4920 3rd Qu.: 0.5275 3rd Qu.: 0.6447
Max. : 4.79813 Max. : 4.5637 Max. : 4.2388 Max. : 3.9243
simetria_media dimension_fractal_media radio_error_estándar
Min. :-2.74235 Min. :-1.8182 Min. :-1.0582
1st Qu.:-0.70113 1st Qu.:-0.7229 1st Qu.:-0.6227
Median :-0.07116 Median :-0.1783 Median :-0.2928
Mean : 0.00000 Mean : 0.0000 Mean : 0.0000
3rd Qu.: 0.52872 3rd Qu.: 0.4704 3rd Qu.: 0.2688
Max. : 4.47807 Max. : 4.9027 Max. : 8.8912
textura_error_estándar perímetro_error_estándar área_error_estándar
Min. :-1.5511 Min. :-1.0425 Min. :-0.7375
1st Qu.:-0.6944 1st Qu.:-0.6235 1st Qu.:-0.4948
Median :-0.1965 Median :-0.2872 Median :-0.3473
Mean : 0.0000 Mean : 0.0000 Mean : 0.0000
3rd Qu.: 0.4669 3rd Qu.: 0.2438 3rd Qu.: 0.1068
Max. : 6.6451 Max. : 9.4453 Max. :11.0237
suavidad_error_estándar compacidad_error_estándar concavidad_error_estándar
Min. :-1.7729 Min. :-1.2994 Min. :-1.0585
1st Qu.:-0.6238 1st Qu.:-0.6916 1st Qu.:-0.5583
Median :-0.2217 Median :-0.2823 Median :-0.1998
Mean : 0.0000 Mean : 0.0000 Mean : 0.0000
3rd Qu.: 0.3695 3rd Qu.: 0.3877 3rd Qu.: 0.3369
Max. : 8.0160 Max. : 6.1380 Max. :12.0615
puntos_cóncavos_error_estándar simetría_error_estándar
Min. :-1.9196 Min. :-1.5296
1st Qu.:-0.6748 1st Qu.:-0.6535
Median :-0.1408 Median :-0.2184
Mean : 0.0000 Mean : 0.0000
3rd Qu.: 0.4732 3rd Qu.: 0.3466
Max. : 6.6560 Max. : 7.0643
dimensión_fractal_error_estándar radio_maximo textura_maxima
Min. :-1.0959 Min. :-1.7294 Min. :-2.21988
1st Qu.:-0.5862 1st Qu.:-0.6743 1st Qu.:-0.74717
Median :-0.2270 Median :-0.2715 Median :-0.04293
Mean : 0.0000 Mean : 0.0000 Mean : 0.00000
3rd Qu.: 0.2877 3rd Qu.: 0.5206 3rd Qu.: 0.65155
Max. : 9.8349 Max. : 4.0917 Max. : 3.88241
perimetro_maximo area_maxima suavidad_minima compacidad_maxima
Min. :-1.6960 Min. :-1.2234 Min. :-2.68944 Min. :-1.4453
1st Qu.:-0.6910 1st Qu.:-0.6429 1st Qu.:-0.69540 1st Qu.:-0.6805
Median :-0.2884 Median :-0.3427 Median :-0.04799 Median :-0.2645
Mean : 0.0000 Mean : 0.0000 Mean : 0.00000 Mean : 0.0000
3rd Qu.: 0.5415 3rd Qu.: 0.3572 3rd Qu.: 0.59614 3rd Qu.: 0.5386
Max. : 4.2850 Max. : 5.9239 Max. : 3.95721 Max. : 5.1083
concavidad_maxima puntos_concavos_maximos simetria_minima
Min. :-1.3078 Min. :-1.7498 Min. :-2.1572
1st Qu.:-0.7518 1st Qu.:-0.7596 1st Qu.:-0.6416
Median :-0.2169 Median :-0.2255 Median :-0.1297
Mean : 0.0000 Mean : 0.0000 Mean : 0.0000
3rd Qu.: 0.5316 3rd Qu.: 0.7143 3rd Qu.: 0.4513
Max. : 4.6972 Max. : 2.6853 Max. : 6.0353
dimension_fractal_maxima
Min. :-1.6011
1st Qu.:-0.6919
Median :-0.2169
Mean : 0.0000
3rd Qu.: 0.4490
Max. : 6.8369
grafico de matriz de correlación
library(tidyverse)library(corrplot)# Calcular matriz de correlacióncor_matrix <-cor(r_data_scaled)# Crear una máscara para mostrar solo correlaciones |r| > 0.7masked_matrix <- cor_matrixmasked_matrix[abs(masked_matrix) <0.7] <-NA# Ocultar valores bajos# Visualizacióncorrplot(masked_matrix,method ="color", # Usar colorestype ="upper", # Mostrar solo triángulo superiortl.col ="black", # Color de las etiquetastl.cex =0.6, # Tamaño de letra ajustadotl.srt =45, # Rotar etiquetas 45°addCoef.col ="black", # Color de los coeficientesnumber.cex =0.6, # Tamaño de los númerosna.label =" ", # Ocultar valores NA (|r| < 0.7)diag =FALSE, # Ocultar diagonal (1's redundantes)title ="Correlaciones Altas (|r| > 0.7)")
Muestra solo las relaciones más relevantes (ej: radio_media vs perimetro_media )
# 4. Análisis Exploratorio (EDA) - Matriz de correlaciónimport matplotlib.pyplot as pltimport seaborn as sns# Matriz de correlacióncorr_matrix = data_r.select_dtypes(include=[np.number]).corr()plt.figure(figsize=(12, 10))sns.heatmap(corr_matrix, cmap='coolwarm', annot=False, fmt=".2f")plt.title("Matriz de Correlación")plt.tight_layout()plt.show()
# Preparación de datos para PCAfrom sklearn.preprocessing import StandardScaler# Seleccionar solo variables numéricas y escalarnumeric_data = data_r.select_dtypes(include=[np.number])scaler = StandardScaler()data_scaled = scaler.fit_transform(numeric_data)# Resumen de datos escaladosprint(pd.DataFrame(data_scaled).describe())
pca_result <- prcomp(r_data_scaled, scale. = TRUE): Realiza el PCA sobre datos estandarizados.
summary(pca_result): Muestra la varianza explicada por cada componente.
Ejemplo: PC1 explica ~44.2% de la varianza, PC2 ~19%, etc.
# 5. Realizar el PCAfrom sklearn.decomposition import PCApca = PCA()pca_result = pca.fit_transform(data_scaled)# Resumen de varianza explicadaprint("Varianza explicada por cada componente:")
fviz_eig(pca_r): Gráfico de sedimentación. Muestra la varianza explicada por cada componente.
Punto de inflexión (codo) donde la varianza adicional añadida por nuevos componentes es mínima (ej: después de PC1-PC3).
b) Criterio de Kaiser (autovalores > 1)
autovalores <- pca_result$sdev^2# Varianza de cada PCn_kaiser <-sum(autovalores >1) # Componentes con autovalor > 1cat("Número de componentes según Kaiser:", n_kaiser, "\n")
Número de componentes según Kaiser: 6
Selecciona componentes con autovalor > 1 ( 6 componentes). Debido u a que las componentes con autovalores mayores a 1 retienen información significativa
a) Scree Plot (gráfico de sedimentación)
library(ggplot2)varianza_explicada <- autovalores /sum(autovalores) *100df_scree <-data.frame(PC =1:length(autovalores), Varianza = varianza_explicada)ggplot(df_scree, aes(x = PC, y = Varianza)) +geom_point(size =3, color ="#0404E2") +geom_line(color ="#880000") +geom_hline(yintercept =100/ncol(r_data_scaled), linetype ="dashed", color ="#1B7161") +# Línea de Kaiserlabs(title ="Scree Plot", x ="Componente Principal", y ="% Varianza Explicada") +theme_minimal()
Combinacion entre el grafico de sedimentacón con la linea de Kaiser para tener otro criterio para sabercantas componentes utilizar
c) Varianza acumulada
varianza_acumulada <-cumsum(varianza_explicada)n_varianza <-which(varianza_acumulada >=80)[1] # Primer PC que supera 80%cat("Número de componentes para 80% de varianza:", n_varianza, "\n")
Número de componentes para 80% de varianza: 5
cumsum(varianza_explicada): Calcula la varianza acumulada.
n_varianza <- which(varianza_acumulada >= 80)[1]: Identifica el número mínimo de componentes para explicar ≥80% de varianza (ej: 5 componentes).
library(psych)
Warning: package 'psych' was built under R version 4.3.3
Attaching package: 'psych'
The following objects are masked from 'package:ggplot2':
%+%, alpha
parallel <-fa.parallel(r_data_scaled, fa ="pc", plot =TRUE)
Warning in fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
The estimated weights for the factor scores are probably incorrect. Try a
different factor score estimation method.
Parallel analysis suggests that the number of factors = NA and the number of components = 5
n_parallel <- parallel$ncomp # Número sugerido
El análisis paralelo es una técnica avanzada que determina cuántos componentes principales retener en un PCA comparando los autovalores de tus datos reales con los de conjuntos de datos aleatorios. Mediante la función fa.parallel() del paquete psych, se generan datos aleatorios con la misma dimensión que los datos originales y se grafican sus autovalores promedio (línea roja) contra los autovalores reales (línea azul). El número óptimo de componentes corresponde al punto donde los autovalores reales caen por debajo de los aleatorios, evitando así retener componentes que solo capturan ruido. Este método es más confiable que reglas arbitrarias como el criterio de Kaiser (autovalor > 1) y ayuda a optimizar la reducción de dimensionalidad sin perder información relevante.
# 6. Determinar número de componentes# a) Scree Plotplt.figure(figsize=(10, 6))plt.plot(range(1, len(pca.explained_variance_ratio_)+1), pca.explained_variance_ratio_, 'bo-', label='Varianza individual')plt.plot(range(1, len(pca.explained_variance_ratio_)+1), np.cumsum(pca.explained_variance_ratio_), 'rs-', label='Varianza acumulada')plt.axhline(y=0.8, color='g', linestyle='--', label='80% varianza')plt.xlabel('Número de componentes')plt.ylabel('Varianza explicada')plt.title('Scree Plot')plt.legend()plt.grid()plt.show()
# b) Criterio de Kaiser (autovalores > 1)autovalores = pca.explained_variance_n_kaiser =sum(autovalores >1)print(f"Número de componentes según Kaiser: {n_kaiser}")
Número de componentes según Kaiser: 6
# c) Varianza acumulada 80%varianza_acumulada = np.cumsum(pca.explained_variance_ratio_)n_varianza = np.where(varianza_acumulada >=0.8)[0][0] +1print(f"Número de componentes para 80% de varianza: {n_varianza}")
Número de componentes para 80% de varianza: 5
7 seleccionar 6 componentes
pca_result <-prcomp(r_data_scaled, scale. =FALSE)# Extraer cargas factoriales (loadings) para las primeras N componentes (ej: 6)cargas <-as.data.frame(pca_result$rotation[, 1:6]) # Ajusta el número de PCscargas$Variable <-rownames(cargas) # Añadir nombres de variables originalescargas
Se ejecuta el PCA con prcomp usando los datos escalados y se extraen las cargas factoriales (loadings) de los primeros 6 componentes. Estas cargas muestran cómo contribuye cada variable original a cada componente, almacenándose en un dataframe que incluye los nombres de las variables para su posterior análisis.
8 grafico de combinaciones de pares de componentes principales
library(factoextra)# Crear combinaciones de pares de componentes principales (PC1 a PC6)pares_pcs <-combn(1:6, 2, simplify =FALSE)# Función para graficar un par de componentes principales con fviz_pca_vargraficar_par_fviz <-function(par) {fviz_pca_var( pca_result,axes = par, # Par de componentes, ej. c(1, 2)col.var ="blue", # Color de vectoresrepel =TRUE# Evita que se sobrepongan los textos ) +ggtitle(paste0("Cargas: PC", par[1], " vs PC", par[2]))}# Visualizar individualmente los gráficosfor (par in pares_pcs) {print(graficar_par_fviz(par))readline(prompt ="Presiona ENTER para ver el siguiente gráfico...")}
Presiona ENTER para ver el siguiente gráfico...
Presiona ENTER para ver el siguiente gráfico...
Presiona ENTER para ver el siguiente gráfico...
Presiona ENTER para ver el siguiente gráfico...
Presiona ENTER para ver el siguiente gráfico...
Presiona ENTER para ver el siguiente gráfico...
Presiona ENTER para ver el siguiente gráfico...
Presiona ENTER para ver el siguiente gráfico...
Presiona ENTER para ver el siguiente gráfico...
Presiona ENTER para ver el siguiente gráfico...
Presiona ENTER para ver el siguiente gráfico...
Presiona ENTER para ver el siguiente gráfico...
Presiona ENTER para ver el siguiente gráfico...
Presiona ENTER para ver el siguiente gráfico...
Presiona ENTER para ver el siguiente gráfico...
Se generan gráficos para todas las combinaciones posibles de pares de componentes (PC1 vs PC2, PC1 vs PC3, etc.) usando fviz_pca_var( ) Cada gráfico muestra las variables como vectores, donde su dirección y longitud indican su correlación con los componentes, ayudando a identificar patrones visuales entre dimensiones reducidas.
# 8. Gráficos de pares de componentes principalesfrom sklearn.preprocessing import StandardScalerfrom sklearn.decomposition import PCAimport matplotlib.pyplot as pltimport numpy as np# Realizar PCA con 6 componentespca = PCA(n_components=6)pca_result = pca.fit_transform(data_scaled)# Obtener las cargas de las variablesloadings = pca.components_.T * np.sqrt(pca.explained_variance_)# Crear gráficos para cada par de componentesfig, axes = plt.subplots(nrows=5, ncols=3, figsize=(20, 25))axes = axes.flatten()for i, (ax, (pc1, pc2)) inenumerate(zip(axes, [(x, y) for x inrange(6) for y inrange(x+1, 6)])):# Graficar las cargas ax.scatter(loadings[:, pc1], loadings[:, pc2], alpha=0)# Añadir etiquetas para cada variablefor j, var inenumerate(numeric_data.columns): ax.arrow(0, 0, loadings[j, pc1], loadings[j, pc2], head_width=0.03, head_length=0.03, fc='blue', ec='blue') ax.text(loadings[j, pc1]*1.15, loadings[j, pc2]*1.15, var, color='black', ha='center', va='center', fontsize=8) ax.axhline(y=0, color='gray', linestyle='--') ax.axvline(x=0, color='gray', linestyle='--') ax.set_xlabel(f'PC{pc1+1} ({pca.explained_variance_ratio_[pc1]:.1%})') ax.set_ylabel(f'PC{pc2+1} ({pca.explained_variance_ratio_[pc2]:.1%})') ax.set_title(f'Cargas: PC{pc1+1} vs PC{pc2+1}') ax.grid()plt.tight_layout()plt.show()
library(dplyr)library(tidyr)library(purrr)# me aseguro de tener esto: la matriz de cargas y los nombres de PC1 a PC6cargas_pc1_6 <- cargas %>%select(Variable, starts_with("PC")) %>%select(1:7)# Obtener todas las combinaciones de 2 componentes entre PC1 y PC6combinaciones <-combn(paste0("PC", 1:6), 2, simplify =FALSE)# Función para extraer top 3 variables por cada partabla_variables_por_par <-map_dfr(combinaciones, function(par) { pc_x <- par[1] pc_y <- par[2] top_x <- cargas_pc1_6 %>%select(Variable, !!pc_x) %>%arrange(desc(abs(.data[[pc_x]]))) %>%slice(1:3) %>%mutate(Componente = pc_x) top_y <- cargas_pc1_6 %>%select(Variable, !!pc_y) %>%arrange(desc(abs(.data[[pc_y]]))) %>%slice(1:3) %>%mutate(Componente = pc_y)bind_rows(top_x, top_y) %>%mutate(Par =paste(pc_x, "vs", pc_y)) %>%select(Par, Componente, Variable, !!sym(pc_x), !!sym(pc_y))})# Mostrar resultadotabla_variables_por_par
Par Componente
puntos_concavos_media...1 PC1 vs PC2 PC1
concavidad_media...2 PC1 vs PC2 PC1
puntos_concavos_maximos...3 PC1 vs PC2 PC1
dimension_fractal_media...4 PC1 vs PC2 PC2
dimensión_fractal_error_estándar...5 PC1 vs PC2 PC2
dimension_fractal_maxima...6 PC1 vs PC2 PC2
puntos_concavos_media...7 PC1 vs PC3 PC1
concavidad_media...8 PC1 vs PC3 PC1
puntos_concavos_maximos...9 PC1 vs PC3 PC1
textura_error_estándar...10 PC1 vs PC3 PC3
suavidad_error_estándar...11 PC1 vs PC3 PC3
simetría_error_estándar...12 PC1 vs PC3 PC3
puntos_concavos_media...13 PC1 vs PC4 PC1
concavidad_media...14 PC1 vs PC4 PC1
puntos_concavos_maximos...15 PC1 vs PC4 PC1
textura_maxima...16 PC1 vs PC4 PC4
textura_media...17 PC1 vs PC4 PC4
textura_error_estándar...18 PC1 vs PC4 PC4
puntos_concavos_media...19 PC1 vs PC5 PC1
concavidad_media...20 PC1 vs PC5 PC1
puntos_concavos_maximos...21 PC1 vs PC5 PC1
suavidad_media...22 PC1 vs PC5 PC5
concavidad_error_estándar...23 PC1 vs PC5 PC5
suavidad_minima...24 PC1 vs PC5 PC5
puntos_concavos_media...25 PC1 vs PC6 PC1
concavidad_media...26 PC1 vs PC6 PC1
puntos_concavos_maximos...27 PC1 vs PC6 PC1
simetria_minima...28 PC1 vs PC6 PC6
simetría_error_estándar...29 PC1 vs PC6 PC6
suavidad_minima...30 PC1 vs PC6 PC6
dimension_fractal_media...31 PC2 vs PC3 PC2
dimensión_fractal_error_estándar...32 PC2 vs PC3 PC2
dimension_fractal_maxima...33 PC2 vs PC3 PC2
textura_error_estándar...34 PC2 vs PC3 PC3
suavidad_error_estándar...35 PC2 vs PC3 PC3
simetría_error_estándar...36 PC2 vs PC3 PC3
dimension_fractal_media...37 PC2 vs PC4 PC2
dimensión_fractal_error_estándar...38 PC2 vs PC4 PC2
dimension_fractal_maxima...39 PC2 vs PC4 PC2
textura_maxima...40 PC2 vs PC4 PC4
textura_media...41 PC2 vs PC4 PC4
textura_error_estándar...42 PC2 vs PC4 PC4
dimension_fractal_media...43 PC2 vs PC5 PC2
dimensión_fractal_error_estándar...44 PC2 vs PC5 PC2
dimension_fractal_maxima...45 PC2 vs PC5 PC2
suavidad_media...46 PC2 vs PC5 PC5
concavidad_error_estándar...47 PC2 vs PC5 PC5
suavidad_minima...48 PC2 vs PC5 PC5
dimension_fractal_media...49 PC2 vs PC6 PC2
dimensión_fractal_error_estándar...50 PC2 vs PC6 PC2
dimension_fractal_maxima...51 PC2 vs PC6 PC2
simetria_minima...52 PC2 vs PC6 PC6
simetría_error_estándar...53 PC2 vs PC6 PC6
suavidad_minima...54 PC2 vs PC6 PC6
textura_error_estándar...55 PC3 vs PC4 PC3
suavidad_error_estándar...56 PC3 vs PC4 PC3
simetría_error_estándar...57 PC3 vs PC4 PC3
textura_maxima...58 PC3 vs PC4 PC4
textura_media...59 PC3 vs PC4 PC4
textura_error_estándar...60 PC3 vs PC4 PC4
textura_error_estándar...61 PC3 vs PC5 PC3
suavidad_error_estándar...62 PC3 vs PC5 PC3
simetría_error_estándar...63 PC3 vs PC5 PC3
suavidad_media...64 PC3 vs PC5 PC5
concavidad_error_estándar...65 PC3 vs PC5 PC5
suavidad_minima...66 PC3 vs PC5 PC5
textura_error_estándar...67 PC3 vs PC6 PC3
suavidad_error_estándar...68 PC3 vs PC6 PC3
simetría_error_estándar...69 PC3 vs PC6 PC3
simetria_minima...70 PC3 vs PC6 PC6
simetría_error_estándar...71 PC3 vs PC6 PC6
suavidad_minima...72 PC3 vs PC6 PC6
textura_maxima...73 PC4 vs PC5 PC4
textura_media...74 PC4 vs PC5 PC4
textura_error_estándar...75 PC4 vs PC5 PC4
suavidad_media...76 PC4 vs PC5 PC5
concavidad_error_estándar...77 PC4 vs PC5 PC5
suavidad_minima...78 PC4 vs PC5 PC5
textura_maxima...79 PC4 vs PC6 PC4
textura_media...80 PC4 vs PC6 PC4
textura_error_estándar...81 PC4 vs PC6 PC4
simetria_minima...82 PC4 vs PC6 PC6
simetría_error_estándar...83 PC4 vs PC6 PC6
suavidad_minima...84 PC4 vs PC6 PC6
suavidad_media...85 PC5 vs PC6 PC5
concavidad_error_estándar...86 PC5 vs PC6 PC5
suavidad_minima...87 PC5 vs PC6 PC5
simetria_minima...88 PC5 vs PC6 PC6
simetría_error_estándar...89 PC5 vs PC6 PC6
suavidad_minima...90 PC5 vs PC6 PC6
Variable
puntos_concavos_media...1 puntos_concavos_media
concavidad_media...2 concavidad_media
puntos_concavos_maximos...3 puntos_concavos_maximos
dimension_fractal_media...4 dimension_fractal_media
dimensión_fractal_error_estándar...5 dimensión_fractal_error_estándar
dimension_fractal_maxima...6 dimension_fractal_maxima
puntos_concavos_media...7 puntos_concavos_media
concavidad_media...8 concavidad_media
puntos_concavos_maximos...9 puntos_concavos_maximos
textura_error_estándar...10 textura_error_estándar
suavidad_error_estándar...11 suavidad_error_estándar
simetría_error_estándar...12 simetría_error_estándar
puntos_concavos_media...13 puntos_concavos_media
concavidad_media...14 concavidad_media
puntos_concavos_maximos...15 puntos_concavos_maximos
textura_maxima...16 textura_maxima
textura_media...17 textura_media
textura_error_estándar...18 textura_error_estándar
puntos_concavos_media...19 puntos_concavos_media
concavidad_media...20 concavidad_media
puntos_concavos_maximos...21 puntos_concavos_maximos
suavidad_media...22 suavidad_media
concavidad_error_estándar...23 concavidad_error_estándar
suavidad_minima...24 suavidad_minima
puntos_concavos_media...25 puntos_concavos_media
concavidad_media...26 concavidad_media
puntos_concavos_maximos...27 puntos_concavos_maximos
simetria_minima...28 simetria_minima
simetría_error_estándar...29 simetría_error_estándar
suavidad_minima...30 suavidad_minima
dimension_fractal_media...31 dimension_fractal_media
dimensión_fractal_error_estándar...32 dimensión_fractal_error_estándar
dimension_fractal_maxima...33 dimension_fractal_maxima
textura_error_estándar...34 textura_error_estándar
suavidad_error_estándar...35 suavidad_error_estándar
simetría_error_estándar...36 simetría_error_estándar
dimension_fractal_media...37 dimension_fractal_media
dimensión_fractal_error_estándar...38 dimensión_fractal_error_estándar
dimension_fractal_maxima...39 dimension_fractal_maxima
textura_maxima...40 textura_maxima
textura_media...41 textura_media
textura_error_estándar...42 textura_error_estándar
dimension_fractal_media...43 dimension_fractal_media
dimensión_fractal_error_estándar...44 dimensión_fractal_error_estándar
dimension_fractal_maxima...45 dimension_fractal_maxima
suavidad_media...46 suavidad_media
concavidad_error_estándar...47 concavidad_error_estándar
suavidad_minima...48 suavidad_minima
dimension_fractal_media...49 dimension_fractal_media
dimensión_fractal_error_estándar...50 dimensión_fractal_error_estándar
dimension_fractal_maxima...51 dimension_fractal_maxima
simetria_minima...52 simetria_minima
simetría_error_estándar...53 simetría_error_estándar
suavidad_minima...54 suavidad_minima
textura_error_estándar...55 textura_error_estándar
suavidad_error_estándar...56 suavidad_error_estándar
simetría_error_estándar...57 simetría_error_estándar
textura_maxima...58 textura_maxima
textura_media...59 textura_media
textura_error_estándar...60 textura_error_estándar
textura_error_estándar...61 textura_error_estándar
suavidad_error_estándar...62 suavidad_error_estándar
simetría_error_estándar...63 simetría_error_estándar
suavidad_media...64 suavidad_media
concavidad_error_estándar...65 concavidad_error_estándar
suavidad_minima...66 suavidad_minima
textura_error_estándar...67 textura_error_estándar
suavidad_error_estándar...68 suavidad_error_estándar
simetría_error_estándar...69 simetría_error_estándar
simetria_minima...70 simetria_minima
simetría_error_estándar...71 simetría_error_estándar
suavidad_minima...72 suavidad_minima
textura_maxima...73 textura_maxima
textura_media...74 textura_media
textura_error_estándar...75 textura_error_estándar
suavidad_media...76 suavidad_media
concavidad_error_estándar...77 concavidad_error_estándar
suavidad_minima...78 suavidad_minima
textura_maxima...79 textura_maxima
textura_media...80 textura_media
textura_error_estándar...81 textura_error_estándar
simetria_minima...82 simetria_minima
simetría_error_estándar...83 simetría_error_estándar
suavidad_minima...84 suavidad_minima
suavidad_media...85 suavidad_media
concavidad_error_estándar...86 concavidad_error_estándar
suavidad_minima...87 suavidad_minima
simetria_minima...88 simetria_minima
simetría_error_estándar...89 simetría_error_estándar
suavidad_minima...90 suavidad_minima
PC1 PC2 PC3
puntos_concavos_media...1 -0.2609276 NA NA
concavidad_media...2 -0.2584581 NA NA
puntos_concavos_maximos...3 -0.2508727 NA NA
dimension_fractal_media...4 NA -0.3662761 NA
dimensión_fractal_error_estándar...5 NA -0.2797543 NA
dimension_fractal_maxima...6 NA -0.2752046 NA
puntos_concavos_media...7 -0.2609276 NA NA
concavidad_media...8 -0.2584581 NA NA
puntos_concavos_maximos...9 -0.2508727 NA NA
textura_error_estándar...10 NA NA 0.3724489
suavidad_error_estándar...11 NA NA 0.3085693
simetría_error_estándar...12 NA NA 0.2873798
puntos_concavos_media...13 -0.2609276 NA NA
concavidad_media...14 -0.2584581 NA NA
puntos_concavos_maximos...15 -0.2508727 NA NA
textura_maxima...16 NA NA NA
textura_media...17 NA NA NA
textura_error_estándar...18 NA NA NA
puntos_concavos_media...19 -0.2609276 NA NA
concavidad_media...20 -0.2584581 NA NA
puntos_concavos_maximos...21 -0.2508727 NA NA
suavidad_media...22 NA NA NA
concavidad_error_estándar...23 NA NA NA
suavidad_minima...24 NA NA NA
puntos_concavos_media...25 -0.2609276 NA NA
concavidad_media...26 -0.2584581 NA NA
puntos_concavos_maximos...27 -0.2508727 NA NA
simetria_minima...28 NA NA NA
simetría_error_estándar...29 NA NA NA
suavidad_minima...30 NA NA NA
dimension_fractal_media...31 NA -0.3662761 NA
dimensión_fractal_error_estándar...32 NA -0.2797543 NA
dimension_fractal_maxima...33 NA -0.2752046 NA
textura_error_estándar...34 NA NA 0.3724489
suavidad_error_estándar...35 NA NA 0.3085693
simetría_error_estándar...36 NA NA 0.2873798
dimension_fractal_media...37 NA -0.3662761 NA
dimensión_fractal_error_estándar...38 NA -0.2797543 NA
dimension_fractal_maxima...39 NA -0.2752046 NA
textura_maxima...40 NA NA NA
textura_media...41 NA NA NA
textura_error_estándar...42 NA NA NA
dimension_fractal_media...43 NA -0.3662761 NA
dimensión_fractal_error_estándar...44 NA -0.2797543 NA
dimension_fractal_maxima...45 NA -0.2752046 NA
suavidad_media...46 NA NA NA
concavidad_error_estándar...47 NA NA NA
suavidad_minima...48 NA NA NA
dimension_fractal_media...49 NA -0.3662761 NA
dimensión_fractal_error_estándar...50 NA -0.2797543 NA
dimension_fractal_maxima...51 NA -0.2752046 NA
simetria_minima...52 NA NA NA
simetría_error_estándar...53 NA NA NA
suavidad_minima...54 NA NA NA
textura_error_estándar...55 NA NA 0.3724489
suavidad_error_estándar...56 NA NA 0.3085693
simetría_error_estándar...57 NA NA 0.2873798
textura_maxima...58 NA NA NA
textura_media...59 NA NA NA
textura_error_estándar...60 NA NA NA
textura_error_estándar...61 NA NA 0.3724489
suavidad_error_estándar...62 NA NA 0.3085693
simetría_error_estándar...63 NA NA 0.2873798
suavidad_media...64 NA NA NA
concavidad_error_estándar...65 NA NA NA
suavidad_minima...66 NA NA NA
textura_error_estándar...67 NA NA 0.3724489
suavidad_error_estándar...68 NA NA 0.3085693
simetría_error_estándar...69 NA NA 0.2873798
simetria_minima...70 NA NA NA
simetría_error_estándar...71 NA NA NA
suavidad_minima...72 NA NA NA
textura_maxima...73 NA NA NA
textura_media...74 NA NA NA
textura_error_estándar...75 NA NA NA
suavidad_media...76 NA NA NA
concavidad_error_estándar...77 NA NA NA
suavidad_minima...78 NA NA NA
textura_maxima...79 NA NA NA
textura_media...80 NA NA NA
textura_error_estándar...81 NA NA NA
simetria_minima...82 NA NA NA
simetría_error_estándar...83 NA NA NA
suavidad_minima...84 NA NA NA
suavidad_media...85 NA NA NA
concavidad_error_estándar...86 NA NA NA
suavidad_minima...87 NA NA NA
simetria_minima...88 NA NA NA
simetría_error_estándar...89 NA NA NA
suavidad_minima...90 NA NA NA
PC4 PC5 PC6
puntos_concavos_media...1 NA NA NA
concavidad_media...2 NA NA NA
puntos_concavos_maximos...3 NA NA NA
dimension_fractal_media...4 NA NA NA
dimensión_fractal_error_estándar...5 NA NA NA
dimension_fractal_maxima...6 NA NA NA
puntos_concavos_media...7 NA NA NA
concavidad_media...8 NA NA NA
puntos_concavos_maximos...9 NA NA NA
textura_error_estándar...10 NA NA NA
suavidad_error_estándar...11 NA NA NA
simetría_error_estándar...12 NA NA NA
puntos_concavos_media...13 NA NA NA
concavidad_media...14 NA NA NA
puntos_concavos_maximos...15 NA NA NA
textura_maxima...16 -0.6317652 NA NA
textura_media...17 -0.6026098 NA NA
textura_error_estándar...18 -0.3628306 NA NA
puntos_concavos_media...19 NA NA NA
concavidad_media...20 NA NA NA
puntos_concavos_maximos...21 NA NA NA
suavidad_media...22 NA 0.3685010 NA
concavidad_error_estándar...23 NA -0.3535108 NA
suavidad_minima...24 NA 0.3260452 NA
puntos_concavos_media...25 NA NA NA
concavidad_media...26 NA NA NA
puntos_concavos_maximos...27 NA NA NA
simetria_minima...28 NA NA 0.5002492
simetría_error_estándar...29 NA NA 0.4925274
suavidad_minima...30 NA NA -0.3663533
dimension_fractal_media...31 NA NA NA
dimensión_fractal_error_estándar...32 NA NA NA
dimension_fractal_maxima...33 NA NA NA
textura_error_estándar...34 NA NA NA
suavidad_error_estándar...35 NA NA NA
simetría_error_estándar...36 NA NA NA
dimension_fractal_media...37 NA NA NA
dimensión_fractal_error_estándar...38 NA NA NA
dimension_fractal_maxima...39 NA NA NA
textura_maxima...40 -0.6317652 NA NA
textura_media...41 -0.6026098 NA NA
textura_error_estándar...42 -0.3628306 NA NA
dimension_fractal_media...43 NA NA NA
dimensión_fractal_error_estándar...44 NA NA NA
dimension_fractal_maxima...45 NA NA NA
suavidad_media...46 NA 0.3685010 NA
concavidad_error_estándar...47 NA -0.3535108 NA
suavidad_minima...48 NA 0.3260452 NA
dimension_fractal_media...49 NA NA NA
dimensión_fractal_error_estándar...50 NA NA NA
dimension_fractal_maxima...51 NA NA NA
simetria_minima...52 NA NA 0.5002492
simetría_error_estándar...53 NA NA 0.4925274
suavidad_minima...54 NA NA -0.3663533
textura_error_estándar...55 NA NA NA
suavidad_error_estándar...56 NA NA NA
simetría_error_estándar...57 NA NA NA
textura_maxima...58 -0.6317652 NA NA
textura_media...59 -0.6026098 NA NA
textura_error_estándar...60 -0.3628306 NA NA
textura_error_estándar...61 NA NA NA
suavidad_error_estándar...62 NA NA NA
simetría_error_estándar...63 NA NA NA
suavidad_media...64 NA 0.3685010 NA
concavidad_error_estándar...65 NA -0.3535108 NA
suavidad_minima...66 NA 0.3260452 NA
textura_error_estándar...67 NA NA NA
suavidad_error_estándar...68 NA NA NA
simetría_error_estándar...69 NA NA NA
simetria_minima...70 NA NA 0.5002492
simetría_error_estándar...71 NA NA 0.4925274
suavidad_minima...72 NA NA -0.3663533
textura_maxima...73 -0.6317652 NA NA
textura_media...74 -0.6026098 NA NA
textura_error_estándar...75 -0.3628306 NA NA
suavidad_media...76 NA 0.3685010 NA
concavidad_error_estándar...77 NA -0.3535108 NA
suavidad_minima...78 NA 0.3260452 NA
textura_maxima...79 -0.6317652 NA NA
textura_media...80 -0.6026098 NA NA
textura_error_estándar...81 -0.3628306 NA NA
simetria_minima...82 NA NA 0.5002492
simetría_error_estándar...83 NA NA 0.4925274
suavidad_minima...84 NA NA -0.3663533
suavidad_media...85 NA 0.3685010 NA
concavidad_error_estándar...86 NA -0.3535108 NA
suavidad_minima...87 NA 0.3260452 NA
simetria_minima...88 NA NA 0.5002492
simetría_error_estándar...89 NA NA 0.4925274
suavidad_minima...90 NA NA -0.3663533
9 Asignar cada variable a la PC donde tenga mayor peso absoluto
library(tidyverse)# Identificar la PC con mayor carga (absoluta) para cada variableasignacion_pc <- cargas %>%pivot_longer(cols =-Variable, names_to ="PC", values_to ="Carga") %>%group_by(Variable) %>%slice_max(order_by =abs(Carga), n =1) %>%# Selecciona la PC con mayor |Carga|ungroup() %>%arrange(PC, desc(abs(Carga))) # Ordenar por PC y luego por |Carga|# Ver el resultadoprint(asignacion_pc, n =Inf) # Muestra todas las variables
ggplot(asignacion_pc, aes(x = PC, y =reorder(Variable, Carga), fill = Carga)) +geom_tile(color ="white") +scale_fill_gradient2(low ="red", mid ="white", high ="blue",midpoint =0, limits =c(-1, 1) ) +theme_minimal() +labs(title ="Asignación de Variables a Componentes Principales",subtitle ="Cada variable asignada a la PC donde tiene mayor peso absoluto",x ="Componente Principal",y ="Variable Original",fill ="Carga" ) +theme(axis.text.y =element_text(size =8),axis.text.x =element_text(angle =45, hjust =1) )
Cada variable se asigna al componente donde tenga la carga absoluta más alta, usando slice_max( ) Esto se visualiza con un mapa de calor geom_tile ( ) que muestra variables ordenadas por componente, con colores (rojo/azul) indicando cargas negativas/positivas, respectivamente.
# 9. Asignar cada variable a la PC donde tenga mayor peso absoluto# Crear DataFrame con las cargasloadings_df = pd.DataFrame( loadings, columns=[f'PC{i+1}'for i inrange(n_components)], index=numeric_data.columns)# Identificar la PC con mayor carga absoluta para cada variableasignacion_pc = loadings_df.abs().idxmax(axis=1).reset_index()asignacion_pc.columns = ['Variable', 'PC']asignacion_pc['Carga'] = [loadings_df.loc[var, pc] for var, pc inzip(asignacion_pc['Variable'], asignacion_pc['PC'])]# Ordenar por PC y luego por carga absolutaasignacion_pc = asignacion_pc.sort_values(['PC', 'Carga'], key=lambda x: np.abs(x) if x.name =='Carga'else x)print(asignacion_pc)
10 Asignar cada variable a la PC donde tenga su máxima carga (absoluta)
asignacion_completa <- cargas %>%pivot_longer(cols =-Variable, names_to ="PC", values_to ="Carga") %>%group_by(Variable) %>%slice_max(order_by =abs(Carga), n =1, with_ties =FALSE) %>%# 1 PC por variable (sin empates)ungroup() %>%arrange(PC, desc(abs(Carga))) # Ordenar por PC y carga
Similar al paso 9, pero asegurando que cada variable se asigne a un solo componente (evitando empates con with_ties = FALSE), lo que simplifica la interpretación al eliminar ambigüedades en la asignación.
# 10. Visualización de asignación de variables a PCsplt.figure(figsize=(12, 8))sns.heatmap( loadings_df, cmap='coolwarm', center=0, annot=True, fmt=".2f", linewidths=0.5, cbar_kws={'label': 'Carga factorial'})plt.title('Cargas Factoriales por Variable y Componente Principal')plt.xlabel('Componente Principal')plt.ylabel('Variable Original')plt.tight_layout()plt.show()
11 Renombrar las PCs basado en el tema común de sus variables
library(dplyr)library(stringr)# Palabras clave por temáticatemas <-list( Tamaño =c("radio", "area", "perimetro"),Textura =c("textura", "suavidad"),Irregularidad =c("concavidad", "puntos_concavos"), Simetría =c("simetria"),Fractal =c("dimension_fractal"), Misceláneo =character(0) # Para casos que no encajen en lo anterior)# Función que asigna tema en base a palabras claveasignar_tema <-function(variables) { temas_encontrados <-sapply(temas, function(keywords) {any(sapply(keywords, function(k) any(str_detect(variables, k)))) }) tema <-names(temas_encontrados)[which(temas_encontrados)]if (length(tema) ==0) "Misceláneo"elsepaste(tema, collapse ="_")}# Generar nombres temáticos por componentenombres_pc <- asignacion_completa %>%group_by(PC) %>%summarise(Variables =list(Variable)) %>%mutate(Tema =sapply(Variables, asignar_tema),Nombre_PC =paste0(PC, "_", Tema) )# Ver resultadosnombres_pc
Los componentes se renombran según temas comunes en sus variables clave (ej: PC1 = “Tamaño_Global” si agrupa “radio”, “área”). Se usan listas de palabras clave (temas) y la función str_detect( ) para automatizar esta categorización.
# 11. Renombrar las PCs basado en temas comunes# Definir palabras clave por temáticatemas = {'Tamaño': ['radio', 'area', 'perimetro'],'Textura': ['textura', 'suavidad'],'Irregularidad': ['concavidad', 'puntos_concavos'],'Simetría': ['simetria'],'Fractal': ['dimension_fractal'],'Misceláneo': []}# Función para asignar temadef asignar_tema(variables): temas_encontrados = []for tema, palabras in temas.items():ifany(any(palabra in var.lower() for palabra in palabras) for var in variables): temas_encontrados.append(tema)return'_'.join(temas_encontrados) if temas_encontrados else'Misceláneo'# Generar nombres temáticos por componentenombres_pc = []for pc in asignacion_pc['PC'].unique(): vars_pc = asignacion_pc[asignacion_pc['PC'] == pc]['Variable'].tolist() tema = asignar_tema(vars_pc) nombres_pc.append({'PC': pc, 'Variables': vars_pc, 'Tema': tema, 'Nombre_PC': f"{pc}_{tema}"})nombres_pc_df = pd.DataFrame(nombres_pc)print(nombres_pc_df[['PC', 'Nombre_PC', 'Tema']])
PC ... Tema
0 PC1 ... Tamaño_Textura_Irregularidad_Simetría
1 PC2 ... Fractal
2 PC3 ... Textura
3 PC4 ... Textura
4 PC6 ... Simetría
[5 rows x 3 columns]
12 Tabla resumen y exportación
nombres_personalizados <-c("PC1"="PC1_Tamaño_Global","PC2"="PC2_Textura_Compleja","PC3"="PC3_Irregularidad","PC4"="PC4_Simetria","PC5"="PC5_Densidad","PC6"="PC6_Miscelaneo")# Asignar nombres a las componentesasignacion <- asignacion_completa %>%mutate(PC_Nombre = nombres_personalizados[PC])asignacion
Se crea una tabla final con nombres personalizados para cada componente (ej: PC1_Tamaño_Global) y se asigna a cada variable su componente correspondiente, facilitando la exportación y reporte de resultados.
# 12. Tabla resumen y visualización final# Asignar nombres personalizadosnombres_personalizados = {'PC1': 'PC1_Tamaño_Global','PC2': 'PC2_Textura_Compleja','PC3': 'PC3_Irregularidad','PC4': 'PC4_Simetria','PC5': 'PC5_Densidad','PC6': 'PC6_Miscelaneo'}asignacion_completa = asignacion_pc.copy()asignacion_completa['PC_Nombre'] = asignacion_completa['PC'].map(nombres_personalizados)# Visualización finalplt.figure(figsize=(12, 8))sns.scatterplot( data=asignacion_completa, x='PC', y='Variable', hue='Carga', size=np.abs(asignacion_completa['Carga']), sizes=(50, 200), palette='coolwarm')plt.title('Asignación Completa de Variables a Componentes Principales')plt.xlabel('Componente Principal')plt.ylabel('Variable Original')plt.xticks(ticks=range(n_components), labels=[nombres_personalizados[f'PC{i+1}'] for i inrange(n_components)], rotation=45)
([<matplotlib.axis.XTick object at 0x000002C9EE213890>, <matplotlib.axis.XTick object at 0x000002C9F4721F90>, <matplotlib.axis.XTick object at 0x000002C9F4722850>, <matplotlib.axis.XTick object at 0x000002C9F4722FD0>, <matplotlib.axis.XTick object at 0x000002C9F4723750>, <matplotlib.axis.XTick object at 0x000002C9F4721E50>], [Text(0, 0, 'PC1_Tamaño_Global'), Text(1, 0, 'PC2_Textura_Compleja'), Text(2, 0, 'PC3_Irregularidad'), Text(3, 0, 'PC4_Simetria'), Text(4, 0, 'PC5_Densidad'), Text(5, 0, 'PC6_Miscelaneo')])
plt.grid()plt.tight_layout()plt.show()
13 Visualización (Todas las variables por PC)
ggplot(asignacion, aes(x = PC_Nombre, y = Variable, fill = Carga)) +geom_tile(color ="white") +scale_fill_gradient2(low ="red", mid ="white", high ="blue", midpoint =0) +theme_minimal() +labs(title ="Asignación Completa de Variables a Componentes Principales",x ="Componente Principal (Nombre Temático)",y ="Variable Original",fill ="Carga" ) +theme(axis.text.x =element_text(angle =45, hjust =1),axis.text.y =element_text(size =7) )
Se grafica la asignación completa con ggplot( ), mostrando variables y componentes en un mapa de calor organizado temáticamente. Esto resume cómo las variables originales se agrupan en dimensiones reducidas, destacando las relaciones clave para el análisis de cáncer de mama.