PCA es un algoritmo de aprendizaje automático no supervisado que intenta reducir la dimensionalidad (número de características) dentro de un conjunto de datos mientras retiene toda la información posible. Esto se realiza buscando un nuevo conjunto de características denominado componentes, que son los compuestos de las características originales que no son correlativas entre sí. También están limitadas, por lo que el primer componente implica la máxima variabilidad posible en los datos y el segundo componente la segunda variabilidad máxima y así sucesivamente.
PCA opera de dos modos, según el escenario:
normal: para conjuntos de datos con datos dispersos y un número moderado de observaciones y características.
aleatorio: para conjuntos de datos con un gran número de observaciones y características. Este modo utiliza un algoritmo de aproximación.
Las filas representan las observaciones que desea incrustar en un espacio dimensional inferior. Las columnas representan las características para las que desea buscar una aproximación reducida. El algoritmo calcula la matriz de covarianza (o una aproximación de la misma de manera distribuida) y, a continuación, realiza la descomposición del valor singular en este resumen para producir los componentes principales.
En el análisis de componentes principales se dispone de una muestra de tamaño n acerca de p variables X1,X2…..,XP (tipificadas o expresadas en desviaciones respecto a lamedia) inicialmente correlacionadas, para posteriormente obtener a partir de ellas unnúmero k<= p de variables incorrelacionadas Z1,Z2…ZN que sean combinación linealde las variables iniciales y que expliquen la mayor parte de su variabilidad.
Ecuacion
La primera componente principal, al igual que las restantes, se expresa comocombinación lineal de las variables originales:
Para el conjunto de las n observaciones muestrales, la ecuación puede expresarsematricialmente:
El gráfico de sedimentación se obtiene al representar en ordenadas las raícescaracterísticas y en abscisas los números de las componentes principales correspondientesa cada raíz característica en orden decreciente.Uniendo todos los puntos se obtiene una Figura que, en general, se parece al perfil de unamontaña con una fuerte pendiente hasta llegar a la base, formada por una meseta con unaligera inclinación.En este símil establecido de la montaña, en la meseta es donde se acumulan los guijarroscaídos desde la cumbre, es decir, donde se sedimentan. Este es el motivo por lo que algráfico se le conoce con el nombre de gráfico de sedimentación, su denominación en ingléses scree plot. De acuerdo con el criterio gráfico se retienen todas aquellas componentes previas a la zonade sedimentación.
Si se retiene un número determinado de componentes, ¿qué hacer si alguna variable estácorrelacionada muy débilmente con cada una de las componentes retenidas?.Si se plantea un caso de este tipo, sería conveniente suprimir dicha variable del conjunto devariables originales, ya que no estaría representada por las componentes retenidas. Ahorabien, si se considera que la variable a suprimir juega un papel esencial en la investigación,entonces se deberían retener componentes adicionales en el caso de que algunas de ellasestuvieran correlacionadas de forma importante con la variable a suprimir.
Una vez calculado el valor del coeficiente de correlación interesa determinar si tal valor obtenido muestra que las variables X e Y están relacionadas en realidad o tan solo presentan dicha relación como consecuencia del azar. En otras palabras, nos preguntamos por la significación de dicho coeficiente de correlación. Un coeficiente de correlación se dice que es significativo si se puede afirmar, con una cierta probabilidad, que es diferente de cero. Más estrictamente, en términos estadísticos, preguntarse por la significación de un cierto coeficiente de correlación no es otra cosa que preguntarse por la probabilidad de que tal coeficiente proceda de una población cuyo valor sea de cero. A este respecto, como siempre, tendremos dos hipótesis posibles: H0: = 0-> r El coeficiente de correlación obtenido procede de una población cuya correlación es cero (p = 0 ). H1 : = 0-> xy r El coeficiente de correlación obtenido procede de una población cuyo coeficiente de correlación es distinto de cero (p=/0 ).
Se utiliza para probar la Hipótesis Nula que afirma que las variables no están correlacionadas en la población. Es decir, comprueba si la matriz de correlaciones es una matriz de identidad. Se puede dar como válidos aquellos resultados que nos presenten un valor elevado del test y cuya fiabilidad sea menor a 0.05. En este caso se rechaza la Hipótesis Nula y se continúa con el Análisis.
Prueba de esfericidad de Bartlett:
Si Sig. (p-valor) < 0.05 aceptamos H0 (hipótesis nula) > se puede aplicar el análisis factorial.
Si Sig. (p-valor) > 0.05 rechazamos H0 > no se puede aplicar el análisis factorial.
El test KMO (Kaiser, Meyer y Olkin) relaciona los coeficientes de correlación, rjh, observados entre las variables Xj y Xh, y ajh son los coeficientes de correlación parcial entre las variables Xj y Xh. Cuanto más cerca de 1 tenga el valor obtenido del test KMO, implica que la relación entres las variables es alta. Si KMO ≥ 0.9, el test es muy bueno; notable para KMO ≥ 0.8; mediano para KMO ≥ 0.7; bajo para KMO ≥ 0.6; y muy bajo para KMO < 0.5.
La prueba de evalúa la aplicabilidad del análisis factorial de las variables estudiadas. El modelo es significativo (aceptamos la hipótesis nula, H0) cuando se puede aplicar el análisis factorial
Cargamos la data cliente
cliente=read.csv("https://raw.githubusercontent.com/VictorGuevaraP/Mineria-de-datos-2019-2/master/clientes.csv", sep = ";")
Con el comando “head” podemos ver las primas filas de el dataframe
head(cliente)
## ID_cliente edad educacion años_empleo Ingreso Tarjeta_credito
## 1 1 41 2 6 19 0.124
## 2 2 47 1 26 100 4.582
## 3 3 33 2 10 57 6.111
## 4 4 29 2 4 19 0.681
## 5 5 47 1 31 253 9.308
## 6 6 40 1 23 81 0.998
## otra_tarjeta Direccion Ratio.ingreso.deuda
## 1 1.073 NBA001 6.3
## 2 8.218 NBA021 12.8
## 3 5.802 NBA013 20.9
## 4 0.516 NBA009 6.3
## 5 8.908 NBA008 7.2
## 6 7.831 NBA016 10.9
Con el comando “str” podemos tener los tipos de variables del data frame
str(cliente)
## 'data.frame': 850 obs. of 9 variables:
## $ ID_cliente : int 1 2 3 4 5 6 7 8 9 10 ...
## $ edad : int 41 47 33 29 47 40 38 42 26 47 ...
## $ educacion : int 2 1 2 2 1 1 2 3 1 3 ...
## $ años_empleo : int 6 26 10 4 31 23 4 0 5 23 ...
## $ Ingreso : int 19 100 57 19 253 81 56 64 18 115 ...
## $ Tarjeta_credito : num 0.124 4.582 6.111 0.681 9.308 ...
## $ otra_tarjeta : num 1.073 8.218 5.802 0.516 8.908 ...
## $ Direccion : Factor w/ 32 levels "NBA000","NBA001",..: 2 22 14 10 9 17 14 10 7 12 ...
## $ Ratio.ingreso.deuda: num 6.3 12.8 20.9 6.3 7.2 10.9 1.6 6.6 15.5 4 ...
En este dataframe clientes tenemos 9 variables y 850 observaciones cuenta con : 5 datos tipo int ,3 datos tipo num y 1 dato tipo factor
library(Amelia)
## Loading required package: Rcpp
## ##
## ## Amelia II: Multiple Imputation
## ## (Version 1.7.5, built: 2018-05-07)
## ## Copyright (C) 2005-2019 James Honaker, Gary King and Matthew Blackwell
## ## Refer to http://gking.harvard.edu/amelia/ for more information
## ##
con el comando “missing” de la libreria de Amelia podemos ver si el dataframe cuenta con valores NA + False = No existe datos NA + True = Existen datos NA
missing(cliente)
## [1] FALSE
Podemos observar que no exiten datos NA en el data frame por ende se deja la data como esta
cliente_correlaciones=cliente[c(2:7,9)]
Se seleccionaran las variables edad , educacacion , años_empleo , Ingreso , Tarjeta_credito , otra_tarjeta , ratio.ingreso.deuda
cor(cliente_correlaciones)
## edad educacion años_empleo Ingreso
## edad 1.000000000 0.012982860 0.55424133 0.47621808
## educacion 0.012982860 1.000000000 -0.15111705 0.21821936
## años_empleo 0.554241333 -0.151117051 1.00000000 0.62509257
## Ingreso 0.476218084 0.218219356 0.62509257 1.00000000
## Tarjeta_credito 0.278911779 0.099080615 0.38174363 0.55151036
## otra_tarjeta 0.337839059 0.140937875 0.41442984 0.60335568
## Ratio.ingreso.deuda 0.008240009 0.008053386 -0.03362502 -0.03558488
## Tarjeta_credito otra_tarjeta Ratio.ingreso.deuda
## edad 0.27891178 0.3378391 0.008240009
## educacion 0.09908061 0.1409379 0.008053386
## años_empleo 0.38174363 0.4144298 -0.033625023
## Ingreso 0.55151036 0.6033557 -0.035584878
## Tarjeta_credito 1.00000000 0.6449553 0.514970534
## otra_tarjeta 0.64495531 1.0000000 0.572545041
## Ratio.ingreso.deuda 0.51497053 0.5725450 1.000000000
Con la funcion podemos observar la correlacion que existen en las variables de el data frame
Con la funcion “corrplot” podemos tener un grafico que nos indica atravez de color la correlacion que existe siendo : azul = correlacion positiva rojo = correlacion negativa
library(corrplot)
## corrplot 0.84 loaded
corrplot(cor(cliente_correlaciones))
library(PerformanceAnalytics)
## Loading required package: xts
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Registered S3 method overwritten by 'xts':
## method from
## as.zoo.xts zoo
##
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
##
## legend
Con el comando “chart.Correlation” podemos tener graficas de dispersion y calcular las correlaciones entre las variables añadiendo a estos graficos independientes entre cada variable
chart.Correlation(cliente_correlaciones,histogram = F ,pch = 19)
library(psych)
library(rela)
Con el comando “cortest” podemos aplicar el test en la data seleccionada Se plantea H0 = 0 H1 !=0
cortest(cor(cliente_correlaciones))
## Warning in cortest(cor(cliente_correlaciones)): n not specified, 100 used
## Tests of correlation matrices
## Call:cortest(R1 = cor(cliente_correlaciones))
## Chi Square value 395 with df = 21 with probability < 1e-70
Como el valor es 1e-70 , entonces se rechaza H0 Por lo cual existe evidencia para afirmar que las correlaciones son distintas de 0
Se Plantea Hp= 1 Ha!=1
Con el comando “cortest.barlett” podemos aplicar el test de barlett para saber el valor de p.value siendo n el numero de observaciones
##PRUEBA DE ESFERICIDAD DE BARLETT
cortest.bartlett(cor(cliente_correlaciones),n=850)
## $chisq
## [1] 2782.794
##
## $p.value
## [1] 0
##
## $df
## [1] 21
Como resultado tenemos p.value = 0 Por lo cual hay evidendia para rechar hp y aceptar Ha
library(psych)
Con el comando “KMO” podemos realizar el testde KMO a la data para lo cual el valor de Overall MSA deveria ser mayor a 0.5 para justificar la realizacion de PCA en la data para valores menoresa 0.5 la realizacion del PCA no seria justificada
KMO(cliente_correlaciones)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = cliente_correlaciones)
## Overall MSA = 0.62
## MSA for each item =
## edad educacion años_empleo
## 0.83 0.33 0.73
## Ingreso Tarjeta_credito otra_tarjeta
## 0.57 0.73 0.65
## Ratio.ingreso.deuda
## 0.37
El valor de MSA = 0.62 , lo cual nos indica que amerita la realizacion de componentes (PCA) ya que su valor es mayor a 0.5
El grafico de Sedimentacion nos muestra la cantidad optimas de componentes a tomar en la data , siendo los valorer por encima de la linea de 1.0 los mas aceptables
library(psych)
scree(cliente_correlaciones,main ="Grafico_de_Sedimentacion")
Según el gráfico de sedimentación, lo optimo seria realizar 3 componentes, puesto que este valor se encuentra por encima de la línea aceptable de la grafica .
Con la funcion “fa.parallel” podemos generar un grafico de apoyo con el cual verificamos los resultados dados por el grafico de sedimentacion
fa.parallel(cliente_correlaciones,fa="pc")
## Parallel analysis suggests that the number of factors = NA and the number of components = 3
Según los resultados del Análisis paralelo, el número de componentes deberá ser 3 .
componentes_cli<-prcomp(cliente_correlaciones, scale=TRUE,center = TRUE)
componentes_cli
## Standard deviations (1, .., p=7):
## [1] 1.7562752 1.2131944 1.0424863 0.7605054 0.5995351 0.5446299 0.3499237
##
## Rotation (n x k) = (7 x 7):
## PC1 PC2 PC3 PC4
## edad -0.3533771 0.3776825 -0.047835841 -0.80710071
## educacion -0.0766529 -0.1560156 0.906566561 -0.18204239
## años_empleo -0.4028106 0.4191734 -0.213041667 0.15006833
## Ingreso -0.4648857 0.2524987 0.250570469 0.37631427
## Tarjeta_credito -0.4537238 -0.2724664 -0.044181438 0.25117597
## otra_tarjeta -0.4810655 -0.2688641 -0.008099897 0.03745223
## Ratio.ingreso.deuda -0.2314834 -0.6686010 -0.256239894 -0.29465919
## PC5 PC6 PC7
## edad 0.19206436 0.20388851 -0.01792971
## educacion -0.02231146 -0.33484680 -0.04648568
## años_empleo -0.20342602 -0.74241210 -0.03965078
## Ingreso -0.05755393 0.38241128 0.60512553
## Tarjeta_credito 0.75947917 -0.03752756 -0.27683652
## otra_tarjeta -0.57265469 0.30399509 -0.52390209
## Ratio.ingreso.deuda -0.11479056 -0.23467350 0.52787940
Creamos una nueva variable en este caso “componentes_cli” el cual tendra los datos escalados para que de esta manera tengan todos el mismo valor y se pasara a centrar los datos para que esten mejor organizados y distribuidos
Ademas Usamos la función “prcomp” la cual realiza un analisis de componentes principales en la matriz de datos dada y devuelve los resultados como un objeto
Se realizara un resumen del nuevo data frame con el comando “summary”
summary(componentes_cli)
## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6
## Standard deviation 1.7563 1.2132 1.0425 0.76051 0.59954 0.54463
## Proportion of Variance 0.4406 0.2103 0.1552 0.08262 0.05135 0.04237
## Cumulative Proportion 0.4406 0.6509 0.8062 0.88878 0.94013 0.98251
## PC7
## Standard deviation 0.34992
## Proportion of Variance 0.01749
## Cumulative Proportion 1.00000
Se observa en el resumen que los 3 primeros muestran un porcentaje de varianza del 0.8061 podriamos tomar el valor de PC4 pero su porcentaje de varianza es muy baja por lo cual se descarta
Se analisa el porcentaje de la data que existe en cada variable
plot(componentes_cli)
Podemos apreciar que en las tres primeras variables (PC1 ,PC2,PC3)se tiene una gran cantidad de data en comparacion de las 4 ultimas
###Grafica de los componentes
biplot(componentes_cli, scale=0.5)
Se emplia la funcion “biplot” para tener un grafico de la data y la catidad de datos que estos toman se puede mejorar mediante el parametro “scale”
###Extraccion de los componentes
Creamos una nueva variable donde asignaremos los componentes guardados en X que estaban en “componentes_cli”
componentes_principales<-componentes_cli$x
Seleccionamos las 3 primeros componentes que serian PC1,PC2,PC3 y las guardamos en “Componentes_principales” para de esta manera solo tener estos 3 componentes en la data
componentes_principales<-componentes_principales[,1:3]
visualizacion de los componentes
head(componentes_principales)
## PC1 PC2 PC3
## [1,] 0.9273626 0.62187776 0.3306240
## [2,] -3.6059744 1.05601155 -1.1418017
## [3,] -1.8672660 -1.85171269 -0.1929300
## [4,] 1.5335134 -0.09274379 0.4546231
## [5,] -6.6619542 2.26445448 -0.1906138
## [6,] -2.0057321 1.09626357 -0.9815219
#Bibliografia
Análisis de Componentes Principales (ACP) https://www.xlstat.com/es/soluciones/funciones/analisis-de-componentes-principales-acp http://www.estadistica.net/Master-Econometria/Componentes_Principales.pdf Explicación de la prueba de varianzas iguales (https://support.minitab.com/es-mx/minitab/18/help-and-how-to/modeling-statistics/anova/supporting-topics/basics/understanding-test-for-equal-variances/) analisis Multivarianteks(http://www.fuenterrebollo.com/Economicas/ECONOMETRIA/MULTIVARIANTE/FACTORIAL/analisis-factorial.pdf)