PCA en Minería de Datos: Guía Práctica
PCA en Minería de Datos: Guía Práctica
Sesión 07
Análisis de Componentes Principales, PCA
1 Introducción 3
1.1 Dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Carga de los datos y EDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 PCA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Referencias 14
En clases se vió la utilidad que tiene el implementar técnicas de reducción de dimensión para visualizar
y manejar grandes volúmenes de datos. Este apunte (y el cuaderno jupyter asociado) muestra cómo se
puede utilizar la técnica de Análisis de Componentes Principales (PCA) para disminuir la cantidad de
características, sin perder una parte importante de la estructura de los datos.
1.1. Dataset
Debido a que los atributos son muchos (~80), es más fácil graficar la cantidad de valores nulos que
existen en cada atributo.
200
150
100
50
0
0 10 20 30 40 50 60 70 80
Con la información anterior, se observa que hay un par de atributos que tienen muchísimos datos
faltantes. Dichos atributos serán eliminados, y se observará nuevamente los datos faltantes.
remove_list = [Link]().sum()[[Link]().sum()>20]
[Link](dataset[remove_list.keys()],axis = 1, inplace=True)
#Se elimina también el ID, pues no es relevante
[Link]('MouseID',axis = 1, inplace=True)
[Link]([i for i in range(len([Link]))],[Link]().sum());
[Link]()
15.0
12.5
10.0
7.5
5.0
2.5
0.0
0 10 20 30 40 50 60 70
Si se observa, la cantidad de datos faltantes es aproximadamente un 16 % del total, por lo tanto, serán
reemplazados por cero.
#Imputar datos
[Link](0, inplace=True)
Debido a que hay variables numéricas y categóricas, se creará un subconjunto de datos, donde sólo se
considerarán los atributos de tipo numéricos
1.2.1. Gráficos
nrows = 3
ncols = 3
xpos = [(i+1) for i in range(8)]
8 6 3.0
5 2.5
6
4 2.0
4 3 1.5
2 1.0
2
1 0.5
0 0 0.0
_N
1_N
pB N
_N
_N
T_N
N
ITS _N
F_N
pN N
_N
CA N
BD N
_N
_N
pE N
_N
II_N
_N
_N
pR N
_
K_
K_
_
_
B_
A_
B_
_
NF
KT
LK
RK
EK
R1
A
AF
N1
2A
KII
SK
EB
CA
AB
AK
RA
MK
NR
pJN
EL
K1
RE
R2
R2
pA
BR
AM
pM
NR
CR
PK
pE
3.5
KC
R
pC
pN
pN
DY
pP
pC
5 1.75
3.0
4 1.50
2.5
1.25
3 2.0
1.00
0.75 1.5
2
0.50 1.0
1 0.5
0.25
0 0.00 0.0
N
_N
P_N
pP _N
P7 N
_N
NR N
N
MT N
_N
pM N
DS _N
AM _N
pN _N
NU _N
pG _N
pP _N
_N
TIA _N
CD N
_N
K_
K_
B_
_
A_
B_
K_
8_
G_
JNK
M1
MB
KA
D1
OR
R
1
2B
S6
6
3B
K5
R
nin
AP
P3
CR
0S
ER
ME
RS
PK
UM
K3
TO
TO
KC
3.0
70
TR
SK
SO
ate
GS
2.5
RA
Bc
2.0
2.5
2.0
2.0 1.5
1.5
1.5
1.0 1.0
1.0
0.5 0.5
0.5
0.0
0.0 0.0
_N
N
nN N
N
Ac B1_N
_N
AD N
_N
5_N
PS _N
5_N
N
6_N
P_N
Glu N
_N
SH 6_N
_N
_N
_N
_N
RR 9_N
X_
4_
B_
_
C_
H_
_
P1
Tau
S6
OS
P9
AP
CA
NA
R3
R4
itin
SY
BB
52
D9
pS
r21
AR
K
BA
IL1
GF
AS
AR
lH3
Glu
SN
Ca
iqu
P3
ER
_Ty
pC
ety
Ub
3B
SK
pG
Como se puede observar, la variabilidad de los datos es muy grande. Para poder aplicar PCA deben
estandarizarse los datos.
nrows = 3
ncols = 3
xpos = [(i+1) for i in range(8)]
fig,ax = [Link](nrows,ncols, figsize=(15,12))
for k in range(nrows*ncols-1):
init = 8*k
end = init+8
[Link][:,init:end].boxplot(ax=ax[k//3,k %3])
ax[k//3,k %3].set_xticks(xpos)
ax[k//3,k %3].set_xticklabels(labels=numeric[init:end],rotation=45)
[Link][:,64:].boxplot(ax=ax[2,2])
ax[2,2].set_xticks(xpos[:-1])
ax[2,2].set_xticklabels(labels=numeric[64:],rotation=45)
[Link]()
pB N
_N
_N
pN N
_N
T_N
N
ITS _N
F_N
CA N
BD N
_N
_N
pE N
_N
II_N
_N
_N
pR N
_
K_
K_
_
_
B_
A_
B_
_
NF
KT
LK
RK
EK
R1
A
AF
N1
2A
KII
SK
EB
CA
AB
AK
RA
MK
NR
pJN
EL
K1
RE
R2
R2
15.0
pA
BR
AM
pM
NR
CR
PK
pE
KC
6
R
pC
pN
pN
DY
pP
pC
4 12.5
4
10.0
2 2 7.5
0 0 5.0
2 2.5
2
0.0
4 4 2.5
6 6 5.0
N
_N
P_N
pP _N
P7 N
_N
NR N
N
MT N
_N
pM N
DS _N
AM _N
pN _N
NU _N
pG _N
pP _N
_N
TIA _N
CD N
_N
K_
K_
B_
_
A_
B_
K_
8_
G_
JNK
M1
MB
KA
D1
OR
R
1
2B
S6
6
3B
K5
R
nin
AP
P3
CR
0S
ER
ME
RS
PK
UM
K3
TO
TO
KC
15
70
TR
SK
SO
ate
GS
P
15.0
RA
Bc
4
10 12.5
10.0
2
5 7.5
5.0 0
0 2.5
0.0 2
5 2.5
5.0 4
_N
N
nN N
Ac B1_N
_N
N
AD N
_N
5_N
PS _N
5_N
_N
N
6_N
P_N
Glu N
SH 6_N
_N
_N
_N
_N
RR 9_N
X_
4_
B_
_
C_
H_
_
P1
Tau
S6
OS
P9
AP
CA
NA
R3
R4
itin
SY
BB
52
D9
pS
r21
AR
K
BA
IL1
GF
AS
AR
lH3
Glu
SN
Ca
iqu
P3
ER
_Ty
pC
ety
Ub
3B
SK
pG
Se observa que ahora los datos tienen, en general, media cero. Es posible usar PCA y disminuir la
cantidad de dimensiones.
1.3. PCA
1
Vea la documentación disponible en [Link]
analysis-pca
total_explained_variance = [Link](len(numeric)-1)
for i in range(1,len(numeric)):
pca = PCA(n_components=i);
[Link]([Link](df));
total_explained_variance[i-1] =
,→ [Link](pca.explained_variance_ratio_)[-1];
Para poder seleccionar la cantidad de componentes óptimas para reducir los datos, se usarán como
criterios:
axs[0].plot(total_explained_variance, lw=3,zorder=2)
axs[0].set_xlabel('# of PC')
axs[0].set_ylabel('Cum sum')
axs[0].axhline(0.8,ls='--', lw=1, color='grey',zorder=-1)
axs[0].axvline(7.9, ls='--',lw=1, color='grey',zorder=-1)
axs[0].set_ylim(0.25,1.05);
axs[0].plot(7.8,.801,'k.', ms=12)
axs[1].plot([Link](total_explained_variance), color='C3',lw=3)
axs[1].set_xlabel('# of PC')
axs[1].set_ylabel('Difference')
axs[1].axhline(0.02,ls='--', lw=1, color='grey',zorder=-1)
axs[1].axvline(7.9, ls='--',lw=1, color='grey',zorder=-1)
[Link]()
Difference
Cum sum
0.08
0.6
0.06
0.5
0.04
0.4 0.02
0.3 0.00
0 20 40 60 0 20 40 60
# of PC # of PC
pca = PCA(n_components=4)
x_transformed = pca.fit_transform(df)
0 0.0
0 0
5 2.5
10 5 5.0
10
0 20 0 20 0 20 0 20
15 7.5
30 10
10 5.0
20 5
5 2.5
10
PC2
0 0.0
0 0
5 2.5
10 5 5.0
10
0 10 0 10 0 10 0 10
15 7.5
30 10
10 5.0
20 5
5 2.5
10
PC3
0 0.0
0 0
5 2.5
10 5 5.0
10
10 0 10 10 0 10 10 0 10 10 0 10
15 7.5
30 10
10 5.0
20 5
5 2.5
10
PC4
0 0.0
0 0
5 2.5
10 5 5.0
10
5 0 5 5 0 5 5 0 5 5 0 5
PC1 PC2 PC3 PC4
Resumen
Se observa que para este conjunto de datos, fue posible reducir la dimensión de 72 atributos a
8. Esto permite trabajar de forma mucho más cómoda y acelerar los modelos y los procesos de
análisis.
(A − λI)x = 0
donde λ corresponde a los valores propios y x a los vectores propios que deben calcular-
se. Sin embargo, cuando no hay matrices cuadradas, como ocurre en este ejemplo, esta
ecuación no es válida. Investigue sobre el singular value decomposition. ¿Qué significa
que M = U ΣV ∗ ?
Fujiwara, Takanori, Oh-Hyun Kwon, y Kwan-Liu Ma. 2019. «Supporting analysis of dimensionality re-
duction results with contrastive learning». IEEE transactions on visualization and computer graphics
26 (1): 45-55.
Higuera, Clara, Katheleen J Gardiner, y Krzysztof J Cios. 2015. «Self-organizing feature maps identify
proteins critical to learning in a mouse model of down syndrome». PloS one 10 (6): e0129126.
Rogawski, Michael A, y Gary L Wenk. 2003. «The neuropharmacological basis for the use of memantine
in the treatment of Alzheimer’s disease». CNS drug reviews 9 (3): 275-308.