Tarea2_seminario1_PCA

1. Exportar la base

# 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 filas
import pandas as pd

data = 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]
# Contar valores faltantes
print(f"Valores faltantes totales: {data.isna().sum().sum()}")
Valores faltantes totales: 569
sum(is.na(data))
[1] 568

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 NA
data_r <- data %>% 
  select(-id) %>% 
    # Eliminar columnas donde TODOS los valores son NA
  select(where(~!all(is.na(.)))) %>%  
  mutate(diagnosis = as.factor(diagnosis)) %>%
  filter(complete.cases(.))

# Verificar que solo se eliminaron 2 columna
cat("Número de columnas eliminadas:", ncol(data) - ncol(data_r), "\n")
Número de columnas eliminadas: 2 
head(data_r)
# A tibble: 6 × 31
  diagnosis radius_mean texture_mean perimeter_mean area_mean smoothness_mean
  <fct>           <dbl>        <dbl>          <dbl>     <dbl>           <dbl>
1 M                18.0         10.4          123.      1001           0.118 
2 M                20.6         17.8          133.      1326           0.0847
3 M                19.7         21.2          130       1203           0.110 
4 M                11.4         20.4           77.6      386.          0.142 
5 M                20.3         14.3          135.      1297           0.100 
6 M                12.4         15.7           82.6      477.          0.128 
# ℹ 25 more variables: 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>,
#   texture_worst <dbl>, perimeter_worst <dbl>, area_worst <dbl>, …

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 datos
import numpy as np

# Eliminar columnas donde TODOS los valores son NA
data_r = data.drop(columns=['id']).dropna(axis=1, how='all')

# Convertir diagnosis a categórico y eliminar filas con NA
data_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 faltantes
print(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étrica


traducciones_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 traducciones
traducciones_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)]
)

# Verificar
head(data_r, 3)
# A tibble: 3 × 31
  diagnosis radio_media textura_media perimetro_media area_media suavidad_media
  <fct>           <dbl>         <dbl>           <dbl>      <dbl>          <dbl>
1 M                18.0          10.4            123.       1001         0.118 
2 M                20.6          17.8            133.       1326         0.0847
3 M                19.7          21.2            130        1203         0.110 
# ℹ 25 more variables: compacidad_media <dbl>, concavidad_media <dbl>,
#   puntos_concavos_media <dbl>, simetria_media <dbl>,
#   dimension_fractal_media <dbl>, radio_error_estándar <dbl>,
#   textura_error_estándar <dbl>, perímetro_error_estándar <dbl>,
#   área_error_estándar <dbl>, suavidad_error_estándar <dbl>,
#   compacidad_error_estándar <dbl>, concavidad_error_estándar <dbl>,
#   puntos_cóncavos_error_estándar <dbl>, simetría_error_estándar <dbl>, …
# 3. Cambiar nombre de variables
traducciones = {
    "radius_mean": "radio_media",
    "texture_mean": "textura_media",
    "perimeter_mean": "perimetro_media",
    "area_mean": "area_media",
    "smoothness_mean": "suavidad_media",
    "compactness_mean": "compacidad_media",
    "concavity_mean": "concavidad_media",
    "concave points_mean": "puntos_concavos_media",
    "symmetry_mean": "simetria_media",
    "fractal_dimension_mean": "dimension_fractal_media"
}

traducciones_se = {
    "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 = {
    "radius_worst": "radio_maximo",
    "texture_worst": "textura_maxima",
    "perimeter_worst": "perimetro_maximo",
    "area_worst": "area_maxima",
    "smoothness_worst": "suavidad_minima",
    "compactness_worst": "compacidad_maxima",
    "concavity_worst": "concavidad_maxima",
    "concave points_worst": "puntos_concavos_maximos",
    "symmetry_worst": "simetria_minima",
    "fractal_dimension_worst": "dimension_fractal_maxima"
}

# Combinar todas las traducciones
traducciones_completas = {**traducciones, **traducciones_se, **traducciones_worst}

# Renombrar columnas (excepto diagnosis)
data_r = data_r.rename(columns={
    col: traducciones_completas[col] 
    for col in data_r.columns 
    if col in traducciones_completas
})

print(data_r.head(3))
  diagnosis  radio_media  ...  simetria_minima  dimension_fractal_maxima
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 rows x 31 columns]

4. Análisis Exploratorio (EDA)

Entender correlaciones entre variables para justificar el uso de PCA.

matriz de correlación

#mapa de calor
library(corrplot)
corrplot 0.92 loaded
corr_matrix <- cor(select(data_r, -diagnosis))
corrplot(corr_matrix, method = "color", tl.cex = 0.6)

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 filas
summary(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éricas
r_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ón
cor_matrix <- cor(r_data_scaled)

# Crear una máscara para mostrar solo correlaciones |r| > 0.7
masked_matrix <- cor_matrix
masked_matrix[abs(masked_matrix) < 0.7] <- NA  # Ocultar valores bajos

# Visualización
corrplot(masked_matrix,
         method = "color",         # Usar colores
         type = "upper",          # Mostrar solo triángulo superior
         tl.col = "black",        # Color de las etiquetas
         tl.cex = 0.6,            # Tamaño de letra ajustado
         tl.srt = 45,             # Rotar etiquetas 45°
         addCoef.col = "black",   # Color de los coeficientes
         number.cex = 0.6,        # Tamaño de los números
         na.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ón
import matplotlib.pyplot as plt
import seaborn as sns

# Matriz de correlación
corr_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 PCA
from sklearn.preprocessing import StandardScaler

# Seleccionar solo variables numéricas y escalar
numeric_data = data_r.select_dtypes(include=[np.number])
scaler = StandardScaler()
data_scaled = scaler.fit_transform(numeric_data)

# Resumen de datos escalados
print(pd.DataFrame(data_scaled).describe())
                 0             1   ...            28            29
count  5.690000e+02  5.690000e+02  ...  5.690000e+02  5.690000e+02
mean  -1.373633e-16  6.868164e-17  ...  2.622390e-16 -5.744282e-16
std    1.000880e+00  1.000880e+00  ...  1.000880e+00  1.000880e+00
min   -2.029648e+00 -2.229249e+00  ... -2.160960e+00 -1.601839e+00
25%   -6.893853e-01 -7.259631e-01  ... -6.418637e-01 -6.919118e-01
50%   -2.150816e-01 -1.046362e-01  ... -1.274095e-01 -2.164441e-01
75%    4.693926e-01  5.841756e-01  ...  4.501382e-01  4.507624e-01
max    3.971288e+00  4.651889e+00  ...  6.046041e+00  6.846856e+00

[8 rows x 30 columns]
# Matriz de correlación solo para correlaciones altas
cor_matrix = pd.DataFrame(data_scaled, columns=numeric_data.columns).corr()

# Crear máscara para |r| > 0.7
masked_matrix = cor_matrix.copy()
masked_matrix[np.abs(masked_matrix) < 0.7] = np.nan

plt.figure(figsize=(12, 10))
sns.heatmap(masked_matrix, cmap='coolwarm', annot=True, fmt=".2f", 
            annot_kws={"size": 8}, linewidths=0.5, 
            mask=np.isnan(masked_matrix))
plt.title("Correlaciones Altas (|r| > 0.7)")
plt.xticks(rotation=45)
(array([ 0.5,  1.5,  2.5,  3.5,  4.5,  5.5,  6.5,  7.5,  8.5,  9.5, 10.5,
       11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5, 21.5,
       22.5, 23.5, 24.5, 25.5, 26.5, 27.5, 28.5, 29.5]), [Text(0.5, 0, 'radio_media'), Text(1.5, 0, 'textura_media'), Text(2.5, 0, 'perimetro_media'), Text(3.5, 0, 'area_media'), Text(4.5, 0, 'suavidad_media'), Text(5.5, 0, 'compacidad_media'), Text(6.5, 0, 'concavidad_media'), Text(7.5, 0, 'puntos_concavos_media'), Text(8.5, 0, 'simetria_media'), Text(9.5, 0, 'dimension_fractal_media'), Text(10.5, 0, 'radio_error_estándar'), Text(11.5, 0, 'textura_error_estándar'), Text(12.5, 0, 'perímetro_error_estándar'), Text(13.5, 0, 'área_error_estándar'), Text(14.5, 0, 'suavidad_error_estándar'), Text(15.5, 0, 'compacidad_error_estándar'), Text(16.5, 0, 'concavidad_error_estándar'), Text(17.5, 0, 'puntos_cóncavos_error_estándar'), Text(18.5, 0, 'simetría_error_estándar'), Text(19.5, 0, 'dimensión_fractal_error_estándar'), Text(20.5, 0, 'radio_maximo'), Text(21.5, 0, 'textura_maxima'), Text(22.5, 0, 'perimetro_maximo'), Text(23.5, 0, 'area_maxima'), Text(24.5, 0, 'suavidad_minima'), Text(25.5, 0, 'compacidad_maxima'), Text(26.5, 0, 'concavidad_maxima'), Text(27.5, 0, 'puntos_concavos_maximos'), Text(28.5, 0, 'simetria_minima'), Text(29.5, 0, 'dimension_fractal_maxima')])
plt.yticks(rotation=0)
(array([ 0.5,  1.5,  2.5,  3.5,  4.5,  5.5,  6.5,  7.5,  8.5,  9.5, 10.5,
       11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5, 21.5,
       22.5, 23.5, 24.5, 25.5, 26.5, 27.5, 28.5, 29.5]), [Text(0, 0.5, 'radio_media'), Text(0, 1.5, 'textura_media'), Text(0, 2.5, 'perimetro_media'), Text(0, 3.5, 'area_media'), Text(0, 4.5, 'suavidad_media'), Text(0, 5.5, 'compacidad_media'), Text(0, 6.5, 'concavidad_media'), Text(0, 7.5, 'puntos_concavos_media'), Text(0, 8.5, 'simetria_media'), Text(0, 9.5, 'dimension_fractal_media'), Text(0, 10.5, 'radio_error_estándar'), Text(0, 11.5, 'textura_error_estándar'), Text(0, 12.5, 'perímetro_error_estándar'), Text(0, 13.5, 'área_error_estándar'), Text(0, 14.5, 'suavidad_error_estándar'), Text(0, 15.5, 'compacidad_error_estándar'), Text(0, 16.5, 'concavidad_error_estándar'), Text(0, 17.5, 'puntos_cóncavos_error_estándar'), Text(0, 18.5, 'simetría_error_estándar'), Text(0, 19.5, 'dimensión_fractal_error_estándar'), Text(0, 20.5, 'radio_maximo'), Text(0, 21.5, 'textura_maxima'), Text(0, 22.5, 'perimetro_maximo'), Text(0, 23.5, 'area_maxima'), Text(0, 24.5, 'suavidad_minima'), Text(0, 25.5, 'compacidad_maxima'), Text(0, 26.5, 'concavidad_maxima'), Text(0, 27.5, 'puntos_concavos_maximos'), Text(0, 28.5, 'simetria_minima'), Text(0, 29.5, 'dimension_fractal_maxima')])
plt.tight_layout()
plt.show()

5 Realizar el PCA

 pca_result <- prcomp(r_data_scaled, scale. = TRUE)  # PCA
summary(pca_result)  # Resumen (importante para ver varianza explicada)
Importance of components:
                          PC1    PC2     PC3     PC4     PC5    PC6     PC7
Standard deviation     3.6430 2.3887 1.67894 1.40544 1.28662 1.0982 0.81949
Proportion of Variance 0.4424 0.1902 0.09396 0.06584 0.05518 0.0402 0.02239
Cumulative Proportion  0.4424 0.6326 0.72653 0.79237 0.84755 0.8878 0.91013
                           PC8     PC9    PC10    PC11    PC12    PC13    PC14
Standard deviation     0.68973 0.64618 0.59266 0.54282 0.51175 0.49126 0.39418
Proportion of Variance 0.01586 0.01392 0.01171 0.00982 0.00873 0.00804 0.00518
Cumulative Proportion  0.92599 0.93991 0.95162 0.96144 0.97017 0.97821 0.98339
                          PC15    PC16    PC17    PC18    PC19    PC20   PC21
Standard deviation     0.30696 0.28022 0.24367 0.22980 0.22256 0.17656 0.1729
Proportion of Variance 0.00314 0.00262 0.00198 0.00176 0.00165 0.00104 0.0010
Cumulative Proportion  0.98653 0.98915 0.99113 0.99289 0.99454 0.99558 0.9966
                          PC22    PC23   PC24    PC25    PC26    PC27    PC28
Standard deviation     0.16547 0.15629 0.1344 0.12458 0.08929 0.08295 0.03993
Proportion of Variance 0.00091 0.00081 0.0006 0.00052 0.00027 0.00023 0.00005
Cumulative Proportion  0.99749 0.99830 0.9989 0.99942 0.99969 0.99992 0.99997
                          PC29    PC30
Standard deviation     0.02728 0.01153
Proportion of Variance 0.00002 0.00000
Cumulative Proportion  1.00000 1.00000
  • 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 PCA
from sklearn.decomposition import PCA

pca = PCA()
pca_result = pca.fit_transform(data_scaled)

# Resumen de varianza explicada
print("Varianza explicada por cada componente:")
Varianza explicada por cada componente:
print(pca.explained_variance_ratio_)
[4.42720256e-01 1.89711820e-01 9.39316326e-02 6.60213492e-02
 5.49576849e-02 4.02452204e-02 2.25073371e-02 1.58872380e-02
 1.38964937e-02 1.16897819e-02 9.79718988e-03 8.70537901e-03
 8.04524987e-03 5.23365745e-03 3.13783217e-03 2.66209337e-03
 1.97996793e-03 1.75395945e-03 1.64925306e-03 1.03864675e-03
 9.99096464e-04 9.14646751e-04 8.11361259e-04 6.01833567e-04
 5.16042379e-04 2.72587995e-04 2.30015463e-04 5.29779290e-05
 2.49601032e-05 4.43482743e-06]
print("\nVarianza acumulada:")

Varianza acumulada:
print(np.cumsum(pca.explained_variance_ratio_))
[0.44272026 0.63243208 0.72636371 0.79238506 0.84734274 0.88758796
 0.9100953  0.92598254 0.93987903 0.95156881 0.961366   0.97007138
 0.97811663 0.98335029 0.98648812 0.98915022 0.99113018 0.99288414
 0.9945334  0.99557204 0.99657114 0.99748579 0.99829715 0.99889898
 0.99941502 0.99968761 0.99991763 0.99997061 0.99999557 1.        ]

6 Determinar el número de componentes principales

a) Scree Plot (gráfico de sedimentación)
# | label: pca-r
library(FactoMineR)
pca_r <- PCA(scale(select(data_r, -diagnosis)), graph = FALSE)

# Scree plot
library(factoextra)
fviz_eig(pca_r, addlabels = TRUE, 
         barfill = "#4E84C4", 
         ggtheme = theme_minimal())

  • 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 PC
n_kaiser <- sum(autovalores > 1)  # Componentes con autovalor > 1
cat("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) * 100
df_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 Kaiser
  labs(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 Plot
plt.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] + 1
print(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 PCs
cargas$Variable <- rownames(cargas)  # Añadir nombres de variables originales
cargas
                                         PC1          PC2          PC3
radio_media                      -0.21881792  0.234239054 -0.007631417
textura_media                    -0.10516984  0.059204514  0.060139514
perimetro_media                  -0.22749134  0.215517827 -0.008474256
area_media                       -0.22097286  0.231043649  0.029195638
suavidad_media                   -0.14179517 -0.187425036 -0.103127483
compacidad_media                 -0.23922926 -0.152128477 -0.074383750
concavidad_media                 -0.25845813 -0.060413846  0.002588374
puntos_concavos_media            -0.26092758  0.034483570 -0.025580609
simetria_media                   -0.13791630 -0.190397070 -0.040703541
dimension_fractal_media          -0.06397614 -0.366276130 -0.022587094
radio_error_estándar             -0.20647288  0.104938875  0.267523939
textura_error_estándar           -0.01784321 -0.090070005  0.372448884
perímetro_error_estándar         -0.21176806  0.088889906  0.265765872
área_error_estándar              -0.20311177  0.151752513  0.215546851
suavidad_error_estándar          -0.01456053 -0.204320527  0.308569303
compacidad_error_estándar        -0.17007324 -0.232655313  0.155504444
concavidad_error_estándar        -0.15325769 -0.197100361  0.177575326
puntos_cóncavos_error_estándar   -0.18300683 -0.130503020  0.227226864
simetría_error_estándar          -0.04316345 -0.183948547  0.287379772
dimensión_fractal_error_estándar -0.10243919 -0.279754331  0.211854637
radio_maximo                     -0.22798701  0.219842246 -0.047385014
textura_maxima                   -0.10548434  0.044996460 -0.046664372
perimetro_maximo                 -0.23665530  0.199845857 -0.048459160
area_maxima                      -0.22492615  0.219090225 -0.012030438
suavidad_minima                  -0.12721259 -0.172738623 -0.260332401
compacidad_maxima                -0.20992016 -0.143718586 -0.236879375
concavidad_maxima                -0.22865404 -0.098113058 -0.173491141
puntos_concavos_maximos          -0.25087269  0.008125428 -0.170441978
simetria_minima                  -0.12311738 -0.141954940 -0.272969241
dimension_fractal_maxima         -0.13149178 -0.275204637 -0.233520028
                                          PC4          PC5           PC6
radio_media                       0.040090513 -0.037815260  2.015011e-02
textura_media                    -0.602609820  0.054570943 -2.885626e-02
perimetro_media                   0.040816853 -0.037452684  1.854644e-02
area_media                        0.052977265 -0.010303922 -1.783797e-03
suavidad_media                    0.158911550  0.368500985 -2.819897e-01
compacidad_media                  0.033426349 -0.012533967 -1.550206e-02
concavidad_media                  0.019595004 -0.086603278 -1.104075e-02
puntos_concavos_media             0.066459107  0.043582261 -5.247323e-02
simetria_media                    0.071338132  0.301802723  3.604197e-01
dimension_fractal_media           0.049355816  0.044000935 -1.207142e-01
radio_error_estándar              0.099487741  0.154246070 -2.814973e-02
textura_error_estándar           -0.362830631  0.195931376 -2.101436e-02
perímetro_error_estándar          0.090329043  0.120679451 -7.622993e-04
área_error_estándar               0.109202805  0.127398593 -4.523055e-02
suavidad_error_estándar           0.042442469  0.234124844 -3.404089e-01
compacidad_error_estándar        -0.030521661 -0.279879246  6.788056e-02
concavidad_error_estándar        -0.002611836 -0.353510832  5.444491e-02
puntos_cóncavos_error_estándar    0.069039906 -0.195224279 -2.984714e-02
simetría_error_estándar           0.047477112  0.249262056  4.925274e-01
dimensión_fractal_error_estándar  0.012516610 -0.262247823 -5.652298e-02
radio_maximo                      0.015617823  0.004352412 -1.693511e-05
textura_maxima                   -0.631765192  0.097863254 -4.501373e-02
perimetro_maximo                  0.014077494 -0.007620065  8.584123e-03
area_maxima                       0.026622033  0.027405636 -2.583405e-02
suavidad_minima                   0.018780680  0.326045176 -3.663533e-01
compacidad_maxima                -0.089552344 -0.122819321  4.623765e-02
concavidad_maxima                -0.073445239 -0.189049889  2.673057e-02
puntos_concavos_maximos           0.006613256 -0.043935341 -3.076074e-02
simetria_minima                  -0.028505563  0.239038186  5.002492e-01
dimension_fractal_maxima         -0.075093596 -0.094858599 -8.292372e-02
                                                         Variable
radio_media                                           radio_media
textura_media                                       textura_media
perimetro_media                                   perimetro_media
area_media                                             area_media
suavidad_media                                     suavidad_media
compacidad_media                                 compacidad_media
concavidad_media                                 concavidad_media
puntos_concavos_media                       puntos_concavos_media
simetria_media                                     simetria_media
dimension_fractal_media                   dimension_fractal_media
radio_error_estándar                         radio_error_estándar
textura_error_estándar                     textura_error_estándar
perímetro_error_estándar                 perímetro_error_estándar
área_error_estándar                           área_error_estándar
suavidad_error_estándar                   suavidad_error_estándar
compacidad_error_estándar               compacidad_error_estándar
concavidad_error_estándar               concavidad_error_estándar
puntos_cóncavos_error_estándar     puntos_cóncavos_error_estándar
simetría_error_estándar                   simetría_error_estándar
dimensión_fractal_error_estándar dimensión_fractal_error_estándar
radio_maximo                                         radio_maximo
textura_maxima                                     textura_maxima
perimetro_maximo                                 perimetro_maximo
area_maxima                                           area_maxima
suavidad_minima                                   suavidad_minima
compacidad_maxima                               compacidad_maxima
concavidad_maxima                               concavidad_maxima
puntos_concavos_maximos                   puntos_concavos_maximos
simetria_minima                                   simetria_minima
dimension_fractal_maxima                 dimension_fractal_maxima

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.

# 7. Seleccionar 6 componentes y extraer cargas factoriales
n_components = 6
pca = PCA(n_components=n_components)
pca_result = pca.fit_transform(data_scaled)

# Cargas factoriales (loadings)
loadings = pd.DataFrame(
    pca.components_.T,
    columns=[f'PC{i+1}' for i in range(n_components)],
    index=numeric_data.columns
)
print(loadings)
                                       PC1       PC2  ...       PC5       PC6
radio_media                       0.218902 -0.233857  ... -0.037786  0.018741
textura_media                     0.103725 -0.059706  ...  0.049469 -0.032179
perimetro_media                   0.227537 -0.215181  ... -0.037375  0.017308
area_media                        0.220995 -0.231077  ... -0.010331 -0.001888
suavidad_media                    0.142590  0.186113  ...  0.365089 -0.286374
compacidad_media                  0.239285  0.151892  ... -0.011704 -0.014131
concavidad_media                  0.258400  0.060165  ... -0.086375 -0.009344
puntos_concavos_media             0.260854 -0.034768  ...  0.043861 -0.052050
simetria_media                    0.138167  0.190349  ...  0.305941  0.356458
dimension_fractal_media           0.064363  0.366575  ...  0.044424 -0.119431
radio_error_estándar              0.205979 -0.105552  ...  0.154456 -0.025603
textura_error_estándar            0.017428  0.089980  ...  0.191651 -0.028747
perímetro_error_estándar          0.211326 -0.089457  ...  0.120990  0.001811
área_error_estándar               0.202870 -0.152293  ...  0.127574 -0.042864
suavidad_error_estándar           0.014531  0.204430  ...  0.232066 -0.342917
compacidad_error_estándar         0.170393  0.232716  ... -0.279968  0.069198
concavidad_error_estándar         0.153590  0.197207  ... -0.353982  0.056343
puntos_cóncavos_error_estándar    0.183417  0.130322  ... -0.195548 -0.031224
simetría_error_estándar           0.042498  0.183848  ...  0.252869  0.490246
dimensión_fractal_error_estándar  0.102568  0.280092  ... -0.263297 -0.053195
radio_maximo                      0.227997 -0.219866  ...  0.004407 -0.000291
textura_maxima                    0.104469 -0.045467  ...  0.092883 -0.050008
perimetro_maximo                  0.236640 -0.199878  ... -0.007454  0.008501
area_maxima                       0.224871 -0.219352  ...  0.027391 -0.025164
suavidad_minima                   0.127953  0.172304  ...  0.324435 -0.369255
compacidad_maxima                 0.210096  0.143593  ... -0.121804  0.047706
concavidad_maxima                 0.228768  0.097964  ... -0.188519  0.028379
puntos_concavos_maximos           0.250886 -0.008257  ... -0.043332 -0.030873
simetria_minima                   0.122905  0.141883  ...  0.244559  0.498927
dimension_fractal_maxima          0.131784  0.275339  ... -0.094423 -0.080224

[30 rows x 6 columns]

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_var
graficar_par_fviz <- function(par) {
  fviz_pca_var(
    pca_result,
    axes = par,             # Par de componentes, ej. c(1, 2)
    col.var = "blue",       # Color de vectores
    repel = TRUE            # Evita que se sobrepongan los textos
  ) +
    ggtitle(paste0("Cargas: PC", par[1], " vs PC", par[2]))
}

# Visualizar individualmente los gráficos
for (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 principales
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np

# Realizar PCA con 6 componentes
pca = PCA(n_components=6)
pca_result = pca.fit_transform(data_scaled)

# Obtener las cargas de las variables
loadings = pca.components_.T * np.sqrt(pca.explained_variance_)

# Crear gráficos para cada par de componentes
fig, axes = plt.subplots(nrows=5, ncols=3, figsize=(20, 25))
axes = axes.flatten()

for i, (ax, (pc1, pc2)) in enumerate(zip(axes, [(x, y) for x in range(6) for y in range(x+1, 6)])):
    # Graficar las cargas
    ax.scatter(loadings[:, pc1], loadings[:, pc2], alpha=0)
    
    # Añadir etiquetas para cada variable
    for j, var in enumerate(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 PC6
cargas_pc1_6 <- cargas %>% select(Variable, starts_with("PC")) %>% select(1:7)

# Obtener todas las combinaciones de 2 componentes entre PC1 y PC6
combinaciones <- combn(paste0("PC", 1:6), 2, simplify = FALSE)

# Función para extraer top 3 variables por cada par
tabla_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 resultado
tabla_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 variable
asignacion_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 resultado
print(asignacion_pc, n = Inf)  # Muestra todas las variables
# A tibble: 30 × 3
   Variable                         PC     Carga
   <chr>                            <chr>  <dbl>
 1 puntos_concavos_media            PC1   -0.261
 2 concavidad_media                 PC1   -0.258
 3 puntos_concavos_maximos          PC1   -0.251
 4 compacidad_media                 PC1   -0.239
 5 perimetro_maximo                 PC1   -0.237
 6 concavidad_maxima                PC1   -0.229
 7 radio_maximo                     PC1   -0.228
 8 perimetro_media                  PC1   -0.227
 9 area_maxima                      PC1   -0.225
10 dimension_fractal_media          PC2   -0.366
11 dimensión_fractal_error_estándar PC2   -0.280
12 dimension_fractal_maxima         PC2   -0.275
13 radio_media                      PC2    0.234
14 area_media                       PC2    0.231
15 textura_error_estándar           PC3    0.372
16 radio_error_estándar             PC3    0.268
17 perímetro_error_estándar         PC3    0.266
18 compacidad_maxima                PC3   -0.237
19 puntos_cóncavos_error_estándar   PC3    0.227
20 área_error_estándar              PC3    0.216
21 textura_maxima                   PC4   -0.632
22 textura_media                    PC4   -0.603
23 suavidad_media                   PC5    0.369
24 concavidad_error_estándar        PC5   -0.354
25 compacidad_error_estándar        PC5   -0.280
26 simetria_minima                  PC6    0.500
27 simetría_error_estándar          PC6    0.493
28 suavidad_minima                  PC6   -0.366
29 simetria_media                   PC6    0.360
30 suavidad_error_estándar          PC6   -0.340
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 cargas
loadings_df = pd.DataFrame(
    loadings,
    columns=[f'PC{i+1}' for i in range(n_components)],
    index=numeric_data.columns
)

# Identificar la PC con mayor carga absoluta para cada variable
asignacion_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 in zip(asignacion_pc['Variable'], asignacion_pc['PC'])]

# Ordenar por PC y luego por carga absoluta
asignacion_pc = asignacion_pc.sort_values(['PC', 'Carga'], key=lambda x: np.abs(x) if x.name == 'Carga' else x)

print(asignacion_pc)
                            Variable   PC     Carga
24                   suavidad_minima  PC1  0.466720
8                     simetria_media  PC1  0.503978
4                     suavidad_media  PC1  0.520110
16         concavidad_error_estándar  PC1  0.560234
15         compacidad_error_estándar  PC1  0.621527
17    puntos_cóncavos_error_estándar  PC1  0.669033
13               área_error_estándar  PC1  0.739987
10              radio_error_estándar  PC1  0.751328
25                 compacidad_maxima  PC1  0.766346
12          perímetro_error_estándar  PC1  0.770833
0                        radio_media  PC1  0.798469
3                         area_media  PC1  0.806101
23                       area_maxima  PC1  0.820238
2                    perimetro_media  PC1  0.829965
20                      radio_maximo  PC1  0.831641
26                 concavidad_maxima  PC1  0.834453
22                  perimetro_maximo  PC1  0.863167
5                   compacidad_media  PC1  0.872817
27           puntos_concavos_maximos  PC1  0.915132
6                   concavidad_media  PC1  0.942542
7              puntos_concavos_media  PC1  0.951490
29          dimension_fractal_maxima  PC2  0.657443
19  dimensión_fractal_error_estándar  PC2  0.668791
9            dimension_fractal_media  PC2  0.875292
14           suavidad_error_estándar  PC3  0.518896
11            textura_error_estándar  PC3  0.629441
1                      textura_media  PC4  0.849451
21                    textura_maxima  PC4  0.891367
18           simetría_error_estándar  PC6  0.539155
28                   simetria_minima  PC6  0.548702

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 PCs
plt.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ática
temas <- 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 clave
asignar_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" else paste(tema, collapse = "_")
}

# Generar nombres temáticos por componente
nombres_pc <- asignacion_completa %>%
  group_by(PC) %>%
  summarise(Variables = list(Variable)) %>%
  mutate(
    Tema = sapply(Variables, asignar_tema),
    Nombre_PC = paste0(PC, "_", Tema)
  )

# Ver resultados
nombres_pc
# A tibble: 6 × 4
  PC    Variables Tema                  Nombre_PC                
  <chr> <list>    <chr>                 <chr>                    
1 PC1   <chr [9]> Tamaño_Irregularidad  PC1_Tamaño_Irregularidad 
2 PC2   <chr [5]> Tamaño_Fractal        PC2_Tamaño_Fractal       
3 PC3   <chr [6]> Tamaño_Textura        PC3_Tamaño_Textura       
4 PC4   <chr [2]> Textura               PC4_Textura              
5 PC5   <chr [3]> Textura_Irregularidad PC5_Textura_Irregularidad
6 PC6   <chr [5]> Textura_Simetría      PC6_Textura_Simetría     

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ática
temas = {
    'Tamaño': ['radio', 'area', 'perimetro'],
    'Textura': ['textura', 'suavidad'],
    'Irregularidad': ['concavidad', 'puntos_concavos'],
    'Simetría': ['simetria'],
    'Fractal': ['dimension_fractal'],
    'Misceláneo': []
}

# Función para asignar tema
def asignar_tema(variables):
    temas_encontrados = []
    for tema, palabras in temas.items():
        if any(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 componente
nombres_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 componentes
asignacion <- asignacion_completa %>%
  mutate(PC_Nombre = nombres_personalizados[PC])
asignacion
# A tibble: 30 × 4
   Variable                PC     Carga PC_Nombre           
   <chr>                   <chr>  <dbl> <chr>               
 1 puntos_concavos_media   PC1   -0.261 PC1_Tamaño_Global   
 2 concavidad_media        PC1   -0.258 PC1_Tamaño_Global   
 3 puntos_concavos_maximos PC1   -0.251 PC1_Tamaño_Global   
 4 compacidad_media        PC1   -0.239 PC1_Tamaño_Global   
 5 perimetro_maximo        PC1   -0.237 PC1_Tamaño_Global   
 6 concavidad_maxima       PC1   -0.229 PC1_Tamaño_Global   
 7 radio_maximo            PC1   -0.228 PC1_Tamaño_Global   
 8 perimetro_media         PC1   -0.227 PC1_Tamaño_Global   
 9 area_maxima             PC1   -0.225 PC1_Tamaño_Global   
10 dimension_fractal_media PC2   -0.366 PC2_Textura_Compleja
# ℹ 20 more rows

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 personalizados
nombres_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 final
plt.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 in range(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.

# 13. Exportar resultados
# Guardar asignación completa
asignacion_completa.to_csv('asignacion_componentes_principales.csv', index=False)

# Guardar loadings
loadings_df.to_csv('cargas_factoriales.csv')

# Guardar resultados PCA
pca_df = pd.DataFrame(pca_result, columns=[f'PC{i+1}' for i in range(n_components)])
pca_df.to_csv('resultados_pca.csv', index=False)