# Importar la base de datos con la cual se va a trabajar
library(readr)
iris <- read_csv("C:/Users/MINEDUCYT/Desktop/CICLOI_2025/SeminarioI/iris.csv")
## Rows: 150 Columns: 6
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): Species
## dbl (5): Id, SepalLengthCm, SepalWidthCm, PetalLengthCm, PetalWidthCm
##
## ℹ 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.
head(iris,10)
## # A tibble: 10 Ă— 6
## Id SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm Species
## <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 1 5.1 3.5 1.4 0.2 Iris-setosa
## 2 2 4.9 3 1.4 0.2 Iris-setosa
## 3 3 4.7 3.2 1.3 0.2 Iris-setosa
## 4 4 4.6 3.1 1.5 0.2 Iris-setosa
## 5 5 5 3.6 1.4 0.2 Iris-setosa
## 6 6 5.4 3.9 1.7 0.4 Iris-setosa
## 7 7 4.6 3.4 1.4 0.3 Iris-setosa
## 8 8 5 3.4 1.5 0.2 Iris-setosa
## 9 9 4.4 2.9 1.4 0.2 Iris-setosa
## 10 10 4.9 3.1 1.5 0.1 Iris-setosa
head(iris)
## # A tibble: 6 Ă— 6
## Id SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm Species
## <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 1 5.1 3.5 1.4 0.2 Iris-setosa
## 2 2 4.9 3 1.4 0.2 Iris-setosa
## 3 3 4.7 3.2 1.3 0.2 Iris-setosa
## 4 4 4.6 3.1 1.5 0.2 Iris-setosa
## 5 5 5 3.6 1.4 0.2 Iris-setosa
## 6 6 5.4 3.9 1.7 0.4 Iris-setosa
#Explorar datos
str(iris)
## spc_tbl_ [150 Ă— 6] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ Id : num [1:150] 1 2 3 4 5 6 7 8 9 10 ...
## $ SepalLengthCm: num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ SepalWidthCm : num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ PetalLengthCm: num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ PetalWidthCm : num [1:150] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : chr [1:150] "Iris-setosa" "Iris-setosa" "Iris-setosa" "Iris-setosa" ...
## - attr(*, "spec")=
## .. cols(
## .. Id = col_double(),
## .. SepalLengthCm = col_double(),
## .. SepalWidthCm = col_double(),
## .. PetalLengthCm = col_double(),
## .. PetalWidthCm = col_double(),
## .. Species = col_character()
## .. )
## - attr(*, "problems")=<externalptr>
Observamos que existen 5 varibles de tipo numericas y una de tipo texto donde cotiene las clases de iris
irisnum <- iris[, c("SepalLengthCm", "SepalWidthCm", "PetalLengthCm", "PetalWidthCm")]
head(irisnum)
## # A tibble: 6 Ă— 4
## SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm
## <dbl> <dbl> <dbl> <dbl>
## 1 5.1 3.5 1.4 0.2
## 2 4.9 3 1.4 0.2
## 3 4.7 3.2 1.3 0.2
## 4 4.6 3.1 1.5 0.2
## 5 5 3.6 1.4 0.2
## 6 5.4 3.9 1.7 0.4
library(ggcorrplot)
## Warning: package 'ggcorrplot' was built under R version 4.3.3
## Loading required package: ggplot2
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.3.2
## corrplot 0.92 loaded
library(factoextra)
## 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
library(FactoMineR)
## Warning: package 'FactoMineR' was built under R version 4.3.3
ggcorrplot(cor(irisnum),hc.order = T,type="lower")
# Matriz de correlaciĂ³n
cor(irisnum)
## SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm
## SepalLengthCm 1.0000000 -0.1093692 0.8717542 0.8179536
## SepalWidthCm -0.1093692 1.0000000 -0.4205161 -0.3565441
## PetalLengthCm 0.8717542 -0.4205161 1.0000000 0.9627571
## PetalWidthCm 0.8179536 -0.3565441 0.9627571 1.0000000
library(ggcorrplot)
matriz_cor <- cor(irisnum)
ggcorrplot(matriz_cor, lab = TRUE, colors = c("blue", "white", "red"))
Este grafic exlplica lo que es la matriz de correlaciĂ³n que se visualiza en forma de mapa de calor para poder ver como se relacionan las variables numericas entre sĂ.
PetalLengthCm y PetalWidthCm tienen una correlaciĂ³n muy fuerte y positiva. Por lo tanto decimos que a mayor largo del pĂ©talo mayor es el ancho de el.
SepalLengthCm y PetalLengthCm esta tambien presenta una correlaciĂ³n positiva moderada a fuerte ya que estĂ¡ en color rojo claro
SepalWidthCm con las demas variables tiene una correlacion negativa osea muy baja con SepalLengthCm lo que cuando una aumenta la otra disminue.
Decimos que las dimensiones del sépalo no se correlacionan tan fuertemente con las demas.
#objeto con toda los resultados de PCA
PCA(irisnum,graph = F)->pca_irisnum
# Resultados del PCA en variables
get_pca_var(pca_irisnum)->var_irisnum
# Resultadeos del PCA en individuos
get_pca_ind(pca_irisnum)->ind_irisnum
pca_irisnum$eig
## eigenvalue percentage of variance cumulative percentage of variance
## comp 1 2.91081808 72.7704521 72.77045
## comp 2 0.92122093 23.0305233 95.80098
## comp 3 0.14735328 3.6838320 99.48481
## comp 4 0.02060771 0.5151927 100.00000
Para la primera componente principal nos explica el 72.77% de la varianza total de nuestro conjutno de datos, este es el componente mas importante ya que en ella se concentra la mayor parte de la informaciĂ³n.
Para la segunda componente principal nos explica el 23.03% de la varianza adicional. Juntando la componente 1 (segunda componente) ellas dos (72.77% + 23.03%) explican un 95.80% de la varianza total.
Para la tercera y cuarta componente, PC3 explica solamente el 3.68% y PC4 explica un 0.52% de la varianza esta contribucion es muy baja por lo que es recomendable no tomarlas en cuenta, en otras palabras no conservarlas ya que nuestro objetivo es reducir la dimensionalidad.
#Tabla de contribuciones
var_irisnum$contrib
## Dim.1 Dim.2 Dim.3 Dim.4
## SepalLengthCm 27.287211 13.86209637 51.986524 6.864169
## SepalWidthCm 6.935581 85.66548239 5.857991 1.540945
## PetalLengthCm 33.785622 0.04449896 1.985063 64.184816
## PetalWidthCm 31.991586 0.42792228 40.170422 27.410070
PC1: PetalLengthCm (33.78%) y PetalWidthCm (31.99%) son las variables que mas contribuyen al igual que SepalLengthCm (27.28%); esto quiere decir que para la PC1 esta muy influenciado por lo que son las dimensiones del petalo y un poco del sepalo largo
PC2: Esta componente que dominado por SepalWidthCm (85.66%)
PC3: La mas destacada o la mas fuerte es SepalLengthCm (51.98%) y PetalWidthCm (40.17%)
PC4: Esta componente esta mas relacionada con PetalLengthCm (64.18%) y PetalWidthCm (27.41%)
library(corrplot)
corrplot(var_irisnum$cos2,
is.corr = FALSE, # Indica que no es una matriz de correlaciones
col = colorRampPalette(c("deeppink", "deeppink2", "deeppink3"))(200),
tl.col = "black", # Color de las etiquetas
tl.cex = 0.8, # Tamaño del texto
cl.cex = 0.8, # Tamaño de la leyenda
title = "Cos² de variables sobre los componentes",
mar = c(0,0,2,0))
## Warning in ind1:ind2: numerical expression has 4 elements: only the first used
Este grafico es la demostracion grafica de lo que vimos anteriormente por lo que se observa que para PC1 las que mas aportan son SepalLengthCm, PetalLengthCm y PetalWidthCm
PC2 las que mas aporta es SepalWidthCm y un poco SepalLengthCm
PC3 las que mas aportan aunque es muy poco son SepalLengthCm y PetalLengthCm
PC4 las que mas aportan aunque es muy poco es PetalLengthCm
#grĂ¡fico de sedimentaciĂ³n
fviz_screeplot(pca_irisnum,addlabels=T,ylim=c(0,100))
En este grafico observamos que las primeras dos componentes explican el 95.8% (72.8% + 23%) de lo que es la variaza de los datos, podemos ver que la tercecra y cuarta componente presentan una correlaciĂ³n casi nula con las variables por lo que lo conveniente es tomar dos componentes ya que solo 2 aportan, aunque realmente la segunda componente no aporta mucho pero la tomaremos para nuestro analisis PCA.
fviz_contrib(pca_irisnum,choice = "var",axes = 1)
PetalLengthCm y PetalWidthCm son las variables que mas contribuyen a la dimension 1 o PC1 ya que esta por encima del 30%, SepalLengthCm tambien contribuye ya que esta por encima del promedio del 27% y SepalWidthCm es la variable que menos contribuye, ya que esta por debajo del umbral promedio. Por lo tanto la dimension1 esta muy influenciada por las medidas del petalo, especialmente por la longitud y ancho del petalo, por lo que estas dos variables explican mejor la variabilidad de esta dimension
fviz_contrib(pca_irisnum,choice = "var",axes = 2)
Para la dimension2 la variable que mas contribuye es SepalWidthCm ya que estĂ¡ por encima del 75%, las demas variables estan por debajo del umbral promedio.
Por lo tanto la contribucion de dos componentes es suficiente
fviz_pca_var(pca_irisnum,col.var="contrib",
gradient.col="npg",repel = T)+ggtitle("GrĂ¡fico de variables")+theme_minimal()
Este grafico muestra la correlacion que existe entre ellas y la contribucion de las componentes
Para Dim1 representa principalmete lo que es la informacion relacionada con los petalos ya que PetalLengthCm y PetalWidthCm tienen gran influencia
Para Dim2 explica sobre todo la variabilidad explicada por SepalWidthCm
fviz_pca_ind(pca_irisnum,geom.ind = "point",
col.ind="cos2",gradient.col="jco"
)+ggtitle("Grafico de los individuos")
Este grafico se observa que existe cierta agrupacion de los datos. Tenemos tres tipos de especies de iris que con virginica, versicolor y setota por lo que se coloreo por contribucion
fviz_pca_ind(pca_irisnum,geom.ind = "point",
col.ind=iris$Species,
palette ="jco",
addEllipses=T)+
ggtitle("Grafico de los individuos")
Para este grafico tomamos encuenta el grafico anterior, ya que ahora se han agrupado por especies, este grafico es muy util ya que en el grafico anterior es muy dificil ver cada dato a que categoria o especie pertenece, asi que decimo que para el color azul eso datos representan o son de la especie Iris_setota, el color naranja para la especie Iris_versicolor y para el color morado para la especie Iris_virginica.
EL biplot es un grĂ¡fico que reĂºne tanto las variables, asĂ como los individuos, todo en el mismo plano con las primeras dos componentes. Si la cantidad de individuos es pequeña se pueden colocar los nombres de los individuos, en nuestro caso no es recomendable.
fviz_pca_biplot(pca_irisnum,geom.ind="point",
col.ind = iris$Species,
addEllipses = T,
palette = "uchicago")+ggtitle("Variables e individuos")
Este grafico contiene los dos ultimos graficos, por que podemos observar los individuos (flores), a que categoria o especie pertenece cada dato o flor y a que componente contribuyen PetalLengthCm, PetalWidthCm, SepalLengthCm y SepalWidthCm
Iris_setota esta bien separada de las otras especies en el eje de la Dim1, lo que nos indica que la longitud y el ancho de los petalos son muy efectivas para distingir lo que es la especie.
Iris-versicolor e Iris-virginica muestran cierta separacion especificamente en la direccion del PetalLengthCm
Las variables PetalLengthCm y PetalWidthCm son las que mas ayudan a distinguir entre las especies
La variable SepalWidthCm aunque contribuye a Dim1, ayuda un poquito en Dim2 para diferenciar a setosa.
import pandas as pd
# Cargar el archivo CSV
irispy = pd.read_csv("C:/Users/MINEDUCYT/Desktop/CICLOI_2025/SeminarioI/iris.csv")
# Mostrar las primeras 10 filas
print(irispy.head(10))
## Id SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm Species
## 0 1 5.1 3.5 1.4 0.2 Iris-setosa
## 1 2 4.9 3.0 1.4 0.2 Iris-setosa
## 2 3 4.7 3.2 1.3 0.2 Iris-setosa
## 3 4 4.6 3.1 1.5 0.2 Iris-setosa
## 4 5 5.0 3.6 1.4 0.2 Iris-setosa
## 5 6 5.4 3.9 1.7 0.4 Iris-setosa
## 6 7 4.6 3.4 1.4 0.3 Iris-setosa
## 7 8 5.0 3.4 1.5 0.2 Iris-setosa
## 8 9 4.4 2.9 1.4 0.2 Iris-setosa
## 9 10 4.9 3.1 1.5 0.1 Iris-setosa
print(irispy.head())
## Id SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm Species
## 0 1 5.1 3.5 1.4 0.2 Iris-setosa
## 1 2 4.9 3.0 1.4 0.2 Iris-setosa
## 2 3 4.7 3.2 1.3 0.2 Iris-setosa
## 3 4 4.6 3.1 1.5 0.2 Iris-setosa
## 4 5 5.0 3.6 1.4 0.2 Iris-setosa
#Explorar datos
irispy.info()
## <class 'pandas.core.frame.DataFrame'>
## RangeIndex: 150 entries, 0 to 149
## Data columns (total 6 columns):
## # Column Non-Null Count Dtype
## --- ------ -------------- -----
## 0 Id 150 non-null int64
## 1 SepalLengthCm 150 non-null float64
## 2 SepalWidthCm 150 non-null float64
## 3 PetalLengthCm 150 non-null float64
## 4 PetalWidthCm 150 non-null float64
## 5 Species 150 non-null object
## dtypes: float64(4), int64(1), object(1)
## memory usage: 7.2+ KB
import pandas as pd
# Seleccionar las columnas especĂficas
irisnumpy = irispy[["SepalLengthCm", "SepalWidthCm", "PetalLengthCm", "PetalWidthCm"]]
# Mostrar las primeras filas
print(irisnumpy.head())
## SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm
## 0 5.1 3.5 1.4 0.2
## 1 4.9 3.0 1.4 0.2
## 2 4.7 3.2 1.3 0.2
## 3 4.6 3.1 1.5 0.2
## 4 5.0 3.6 1.4 0.2
# Calcular la matriz de correlaciĂ³n
corr = irisnumpy.corr()
print(corr)
## SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm
## SepalLengthCm 1.000000 -0.109369 0.871754 0.817954
## SepalWidthCm -0.109369 1.000000 -0.420516 -0.356544
## PetalLengthCm 0.871754 -0.420516 1.000000 0.962757
## PetalWidthCm 0.817954 -0.356544 0.962757 1.000000
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# Crear un grĂ¡fico de correlaciĂ³n usando seaborn
plt.figure(figsize=(8, 6))
sns.heatmap(corr, annot=True, cmap='coolwarm', fmt=".2f", cbar=True, square=True,
annot_kws={'size': 10}, linewidths=0.5, vmin=-1, vmax=1,
mask=None, xticklabels=True, yticklabels=True)
# Mostrar el grĂ¡fico
plt.title("Matriz de CorrelaciĂ³n de Iris", fontsize=16)
plt.show()
import pandas as pd
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import seaborn as sns
# EstĂ¡ndarizar los datos antes de aplicar PCA
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
irisnumpy_scaled = scaler.fit_transform(irisnumpy)
# Realizar el PCA
pca = PCA()
pca.fit(irisnumpy_scaled)
PCA()In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
PCA()
# Resultados del PCA en variables (componentes)
pca_components = pca.components_
print("Componentes principales (Variables):")
## Componentes principales (Variables):
print(pca_components)
## [[ 0.52237162 -0.26335492 0.58125401 0.56561105]
## [ 0.37231836 0.92555649 0.02109478 0.06541577]
## [ 0.72101681 -0.24203288 -0.14089226 -0.6338014 ]
## [-0.26199559 0.12413481 0.80115427 -0.52354627]]
# Resultados del PCA en individuos (proyecciĂ³n de los datos en los componentes)
pca_scores = pca.transform(irisnumpy_scaled)
print("\nProyecciĂ³n de los individuos (Scores):")
##
## ProyecciĂ³n de los individuos (Scores):
print(pca_scores[:20])
## [[-2.26454173e+00 5.05703903e-01 1.21943348e-01 -2.30733235e-02]
## [-2.08642550e+00 -6.55404729e-01 2.27250832e-01 -1.03208244e-01]
## [-2.36795045e+00 -3.18477311e-01 -5.14796236e-02 -2.78252250e-02]
## [-2.30419716e+00 -5.75367713e-01 -9.88604444e-02 6.63114622e-02]
## [-2.38877749e+00 6.74767397e-01 -2.14278490e-02 3.73972870e-02]
## [-2.07053681e+00 1.51854856e+00 -3.06842583e-02 -4.39877494e-03]
## [-2.44571134e+00 7.45626750e-02 -3.42197636e-01 3.80965668e-02]
## [-2.23384186e+00 2.47613932e-01 8.25744645e-02 2.55051623e-02]
## [-2.34195768e+00 -1.09514636e+00 -1.53562399e-01 2.67938291e-02]
## [-2.18867576e+00 -4.48629048e-01 2.46559522e-01 3.99073035e-02]
## [-2.16348656e+00 1.07059558e+00 2.64009373e-01 -1.53011377e-02]
## [-2.32737775e+00 1.58587455e-01 -1.00165616e-01 1.34554258e-01]
## [-2.22408272e+00 -7.09118158e-01 2.23214514e-01 -2.63061382e-03]
## [-2.63971626e+00 -9.38281982e-01 -1.89570030e-01 1.94220183e-02]
## [-2.19229151e+00 1.88997851e+00 4.69480095e-01 -1.92782042e-01]
## [-2.25146521e+00 2.72237108e+00 -3.26037967e-02 -4.71257043e-02]
## [-2.20275048e+00 1.51375028e+00 1.36349158e-03 -1.86631581e-01]
## [-2.19017916e+00 5.14304308e-01 3.86155949e-02 -9.19055067e-02]
## [-1.89407429e+00 1.43111071e+00 3.70742834e-01 -5.95280968e-02]
## [-2.33994907e+00 1.15803343e+00 -1.37417719e-01 3.98281842e-02]]
# Eigenvalores (varianza explicada por cada componente)
# Eigenvalores (varianza explicada por cada componente)
eigenvalues = pca.explained_variance_
print(eigenvalues)
## [2.93035378 0.92740362 0.14834223 0.02074601]
# Variancia explicada por cada componente
explained_variance_ratio = pca.explained_variance_ratio_
print("\nProporciĂ³n de la varianza explicada por cada componente:")
##
## ProporciĂ³n de la varianza explicada por cada componente:
print(explained_variance_ratio)
## [0.72770452 0.23030523 0.03683832 0.00515193]
# GrĂ¡fico de la varianza explicada acumulada
plt.figure(figsize=(8, 6))
plt.plot(range(1, len(explained_variance_ratio) + 1), explained_variance_ratio.cumsum(), marker='o')
plt.xlabel('NĂºmero de Componentes')
plt.ylabel('Varianza Explicada Acumulada')
plt.title('Varianza Explicada Acumulada por los Componentes Principales')
plt.show()
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
# Calcular contribuciones (%): (cos²) * 100
# Los componentes principales (ejes): cada fila representa un componente, cada columna una variable
loadings = pca.components_.T # transponer para tener variables en filas
explained_var = pca.explained_variance_
# ContribuciĂ³n de cada variable a cada componente (en %)
contrib = (loadings**2) * 100
# Convertir en DataFrame
contrib_df = pd.DataFrame(contrib,
columns=[f'PC{i+1}' for i in range(len(explained_var))],
index=irisnumpy.columns)
print("\nTabla de contribuciones de las variables a los componentes principales:")
##
## Tabla de contribuciones de las variables a los componentes principales:
print(contrib_df)
## PC1 PC2 PC3 PC4
## SepalLengthCm 27.287211 13.862096 51.986524 6.864169
## SepalWidthCm 6.935581 85.665482 5.857991 1.540945
## PetalLengthCm 33.785622 0.044499 1.985063 64.184816
## PetalWidthCm 31.991586 0.427922 40.170422 27.410070
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
# PCA
pca = PCA()
pca.fit(irisnumpy_scaled)
PCA()In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
PCA()
loadings = pca.components_.T
# Cos²: el cuadrado de los loadings (correlaciĂ³n variable-componente)
cos2 = loadings**2
cos2_df = pd.DataFrame(cos2,
index=irisnumpy.columns,
columns=[f'PC{i+1}' for i in range(loadings.shape[1])])
# Plot estilo 'corrplot' para cos²
plt.figure(figsize=(8, 5))
sns.heatmap(cos2_df,
cmap=sns.color_palette("pink_r", as_cmap=True),
annot=True, fmt=".2f",
cbar_kws={'label': 'Cos²'},
linewidths=0.5,
square=True)
plt.title("Cos² de variables sobre los componentes", fontsize=14, pad=20)
plt.xticks(rotation=0)
## (array([0.5, 1.5, 2.5, 3.5]), [Text(0.5, 0, 'PC1'), Text(1.5, 0, 'PC2'), Text(2.5, 0, 'PC3'), Text(3.5, 0, 'PC4')])
plt.yticks(rotation=0)
## (array([0.5, 1.5, 2.5, 3.5]), [Text(0, 0.5, 'SepalLengthCm'), Text(0, 1.5, 'SepalWidthCm'), Text(0, 2.5, 'PetalLengthCm'), Text(0, 3.5, 'PetalWidthCm')])
plt.tight_layout()
plt.show()
#Grafico de sedimentacion
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
# Varianza explicada en porcentaje
explained_var_ratio = pca.explained_variance_ratio_ * 100
# Scree plot (grĂ¡fico de sedimentaciĂ³n)
plt.figure(figsize=(8, 5))
plt.plot(range(1, len(explained_var_ratio)+1), explained_var_ratio, marker='o', linestyle='-')
plt.title("GrĂ¡fico de sedimentaciĂ³n (Scree plot)", fontsize=14)
plt.xlabel("Componentes Principales")
plt.ylabel("Varianza Explicada (%)")
plt.ylim(0, 100)
## (0.0, 100.0)
plt.grid(True)
# Añadir etiquetas encima de cada punto
for i, v in enumerate(explained_var_ratio):
plt.text(i+1, v + 1, f"{v:.1f}%", ha='center', fontsize=9)
plt.tight_layout()
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
# ContribuciĂ³n al PC1
loadings = pca.components_.T
pc1_loadings = loadings[:, 0]
pc1_contrib = (pc1_loadings**2) * 100
# DataFrame
contrib_df = pd.DataFrame({
'Variable': irisnumpy.columns,
'ContribuciĂ³n (%)': pc1_contrib
}).sort_values("ContribuciĂ³n (%)", ascending=False)
# GrĂ¡fico de barras
plt.figure(figsize=(8, 5))
bars = plt.bar(contrib_df['Variable'], contrib_df['ContribuciĂ³n (%)'], color='deeppink')
plt.title("ContribuciĂ³n de las variables al PC1", fontsize=14)
plt.ylabel("ContribuciĂ³n (%)")
plt.xlabel("Variables")
# Etiquetas encima de cada barra
for bar in bars:
yval = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2.0, yval + 0.5, f'{yval:.1f}%', ha='center', va='bottom', fontsize=9)
plt.ylim(0, max(pc1_contrib) + 10)
## (0.0, 43.78562190233107)
plt.tight_layout()
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
# ContribuciĂ³n al PC2
loadings = pca.components_.T
pc2_loadings = loadings[:, 1] # Ăndice 1 = PC2
pc2_contrib = (pc2_loadings**2) * 100
# Crear DataFrame para graficar
contrib_df = pd.DataFrame({
'Variable': irisnumpy.columns,
'ContribuciĂ³n (%)': pc2_contrib
}).sort_values("ContribuciĂ³n (%)", ascending=False)
# GrĂ¡fico de barras
plt.figure(figsize=(8, 5))
bars = plt.bar(contrib_df['Variable'], contrib_df['ContribuciĂ³n (%)'], color='darkviolet')
plt.title("ContribuciĂ³n de las variables al PC2", fontsize=14)
plt.ylabel("ContribuciĂ³n (%)")
plt.xlabel("Variables")
# Añadir etiquetas encima de las barras
for bar in bars:
yval = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2.0, yval + 0.5, f'{yval:.1f}%', ha='center', va='bottom', fontsize=9)
plt.ylim(0, max(pc2_contrib) + 10)
## (0.0, 95.66548238582315)
plt.tight_layout()
plt.show()
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from adjustText import adjust_text
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
# Cargas (loadings)
loadings = pca.components_.T
# ContribuciĂ³n (%)
contrib = (loadings**2) * 100
contrib_pc1_pc2 = np.sum(contrib[:, :2], axis=1)
# Coordenadas para flechas
x = loadings[:, 0]
y = loadings[:, 1]
# Paleta personalizada basada en contribuciĂ³n
norm = plt.Normalize(contrib_pc1_pc2.min(), contrib_pc1_pc2.max())
colors = plt.cm.magma(norm(contrib_pc1_pc2)) # Puedes usar otras: 'viridis', 'plasma', 'npg'
# GrĂ¡fico
plt.figure(figsize=(8, 6))
plt.axhline(0, color='gray', linewidth=0.5)
plt.axvline(0, color='gray', linewidth=0.5)
# Dibujar vectores
for i in range(len(x)):
plt.arrow(0, 0, x[i], y[i],
color=colors[i],
alpha=0.8,
head_width=0.03,
length_includes_head=True)
# Etiquetas con repel
texts = []
for i, var in enumerate(irisnumpy.columns):
texts.append(plt.text(x[i]*1.1, y[i]*1.1, var, fontsize=10, color='black'))
adjust_text(texts)
## ([Text(0.5306385305515569, 0.42939426036777595, 'SepalLengthCm'), Text(-0.20978965441591468, 0.9564250329872218, 'SepalWidthCm'), Text(0.5443465327309873, 0.01879446326252482, 'PetalLengthCm'), Text(0.5498860678582913, 0.0918014066696308, 'PetalWidthCm')], [])
# EstĂ©tica del grĂ¡fico
plt.xlabel(f"PC1 ({pca.explained_variance_ratio_[0]*100:.1f}%)")
plt.ylabel(f"PC2 ({pca.explained_variance_ratio_[1]*100:.1f}%)")
plt.title("GrĂ¡fico de variables (ContribuciĂ³n)", fontsize=14)
plt.grid(True)
plt.gca().set_facecolor('white')
plt.tight_layout()
plt.show()
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from adjustText import adjust_text
from matplotlib.patches import Ellipse
species = irispy["Species"]
# PCA
pca = PCA(n_components=2)
pca_scores = pca.fit_transform(irisnumpy_scaled)
loadings = pca.components_.T
# Crear DataFrame con los scores
pca_df = pd.DataFrame(data=pca_scores, columns=["PC1", "PC2"])
pca_df["Species"] = species
# Paleta tipo 'uchicago'
palette = sns.color_palette("Set1", n_colors=3)
# Crear grĂ¡fico
plt.figure(figsize=(10, 7))
sns.scatterplot(data=pca_df, x="PC1", y="PC2", hue="Species", palette=palette, s=50, edgecolor='black', alpha=0.8)
# Añadir vectores de variables
for i, var in enumerate(irisnumpy.columns):
plt.arrow(0, 0,
loadings[i, 0]*3, loadings[i, 1]*3, # Escalado para mejor visualizaciĂ³n
color='black', alpha=0.6, head_width=0.1, length_includes_head=True)
plt.text(loadings[i, 0]*3.2, loadings[i, 1]*3.2, var, fontsize=9, color='black')
# Añadir elipses por grupo
for group in pca_df["Species"].unique():
subset = pca_df[pca_df["Species"] == group]
cov = np.cov(subset[["PC1", "PC2"]].T)
mean = subset[["PC1", "PC2"]].mean().values
vals, vecs = np.linalg.eigh(cov)
order = vals.argsort()[::-1]
vals = vals[order]
vecs = vecs[:, order]
theta = np.degrees(np.arctan2(*vecs[:,0][::-1]))
width, height = 2 * np.sqrt(vals)
ellipse = Ellipse(xy=mean, width=width, height=height, angle=theta,
edgecolor='gray', fc='none', lw=1.5, linestyle='--')
plt.gca().add_patch(ellipse)
# Etiquetas y estilo
plt.title("Variables e individuos", fontsize=16)
plt.xlabel(f"PC1 ({pca.explained_variance_ratio_[0]*100:.1f}%)")
plt.ylabel(f"PC2 ({pca.explained_variance_ratio_[1]*100:.1f}%)")
plt.axhline(0, color='grey', lw=0.5)
plt.axvline(0, color='grey', lw=0.5)
plt.legend(title='Species')
plt.grid(True)
plt.tight_layout()
plt.show()