Preprocesamiento de los Datos
Generalmente, cuando recibimos un conjunto de datos, además de encontrar valores numéricos, en la mayoría de las ocasiones debemos trabajar con datos no estructurados, que son aquellos datos que no se rigen por un esquema determinado, como pueden ser los textos, imágenes, vídeos, etc.
El realizar un preprocesamiento de los datos es importante para poder sacar el mejor provecho a los datos provenientes de los clientes, de los productos financieros, los canales de distribución y las jurisdicciones que son susceptibles de análisis; pues la realidad es que muchas veces la información de estos se ve afectada por factores negativos como: ruidos, valores perdidos, inconsistencias, datos superfluos y/o un tamaño muy grande de datos en cualquier dimensión (número de variables en registros).
Inicialmente se va a reducir el numero de columnas usando ACP. Se va a trabajar con todas las variables excepto la variable "Calificación" que es la variable sobre la cual se basa el estudio.
ACP
El análisis de componentes principales es una técnica utilizada para describir un conjunto de datos en términos de nuevas variables («componentes») no correlacionadas. Los componentes se ordenan por la cantidad de varianza original que describen, por lo que la técnica es útil para reducir la dimensionalidad de un conjunto de datos. El ACP se emplea sobre todo en análisis exploratorio de datos y para construir modelos predictivos. El ACP comporta el cálculo de la descomposición en autovalores de la matriz de covarianza, normalmente tras centrar los datos en la media de cada atributo. Entonces con el siguiente código se va a visualizar parte de la matriz de datos:
library(readxl)
data<-read_excel("A.xlsx")
head(data,5)## # A tibble: 5 x 17
## `Invoice ID` Branch City `Customer type` Gender `Product line` `Unit price`
## <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 750-67-8428 A Yang~ Member Female Health and be~ 74.69
## 2 226-31-3081 C Nayp~ Normal Female Electronic ac~ 15.28
## 3 631-41-3108 A Yang~ Normal Male Home and life~ 46.33
## 4 123-19-1176 A Yang~ Member Male Health and be~ 58.22
## 5 373-73-7910 A Yang~ Normal Male Sports and tr~ 86.31
## # ... with 10 more variables: Quantity <dbl>, `Tax 5%` <chr>, Total <chr>,
## # Date <chr>, Time <dttm>, Payment <chr>, cogs <chr>, `gross margin
## # percentage` <dbl>, `gross income` <chr>, Rating <chr>
A continuación vamos a ver los "NA" que hay en la data:
library(Rcpp)
library(readxl)
library(Amelia)## ##
## ## Amelia II: Multiple Imputation
## ## (Version 1.7.6, built: 2019-11-24)
## ## Copyright (C) 2005-2020 James Honaker, Gary King and Matthew Blackwell
## ## Refer to http://gking.harvard.edu/amelia/ for more information
## ##
data<-read_excel("A.xlsx")
View(data)
missing(data)## [1] FALSE
Con lo cual no existen "NA" en los datos, lo cual era esperable, ya que se la saco del Kaggle.
Exclusion de la variable en estudio
Entonces se va a quitar la variable "calificación":
library(readxl)
library(Amelia)
data<-read_excel("A.xlsx")
data<-data[,-17]
colnames(data)## [1] "Invoice ID" "Branch"
## [3] "City" "Customer type"
## [5] "Gender" "Product line"
## [7] "Unit price" "Quantity"
## [9] "Tax 5%" "Total"
## [11] "Date" "Time"
## [13] "Payment" "cogs"
## [15] "gross margin percentage" "gross income"
Correlación entre variable:
Ahora para realizar la correlación se tomaron las variables numéricas:
library(readxl)
library(Amelia)
data<-read_excel("A.xlsx")
data<-data[,c(-1,-2,-3,-4,-5,-6,-12,-11,-12,-13,-15,-17)]
View(data)
data<-cbind(as.numeric(data$`Unit price`),
as.numeric(data$Quantity),
as.numeric(data$`Tax 5%`),
as.numeric(data$Total),
as.numeric(data$cogs),
as.numeric(data$`gross income`)
)
library(corrplot)## corrplot 0.84 loaded
corrplot(cor(data))Con lo cual la tercera, la cuarta y la sexta variable están altamente correlacionadas.
Matriz de Covarianzas
Entonces la matriz de covarianzas viene definida como:
library(readxl)
library(Amelia)
data<-read_excel("A.xlsx")
data<-data[,c(-1,-2,-3,-4,-5,-6,-11,-12,-13,-15,-17)]
data<-cbind(as.numeric(data$`Unit price`),
as.numeric(data$Quantity),
as.numeric(data$`Tax 5%`),
as.numeric(data$Total),
as.numeric(data$cogs),
as.numeric(data$`gross income`)
)
cov(data)## [,1] [,2] [,3] [,4] [,5]
## [1,] 7.019653e+02 8.347785e-01 5.112948e+05 1.069345e+07 3.933367e+03
## [2,] 8.347785e-01 8.546446e+00 5.024463e+04 1.050144e+06 4.829914e+02
## [3,] 5.112948e+05 5.024463e+04 5.893190e+09 1.237111e+11 6.200922e+06
## [4,] 1.069345e+07 1.050144e+06 1.237111e+11 2.597137e+12 1.298967e+08
## [5,] 3.933367e+03 4.829914e+02 6.200922e+06 1.298967e+08 5.483864e+04
## [6,] 5.112948e+05 5.024463e+04 5.893190e+09 1.237111e+11 6.200922e+06
## [,6]
## [1,] 5.112948e+05
## [2,] 5.024463e+04
## [3,] 5.893190e+09
## [4,] 1.237111e+11
## [5,] 6.200922e+06
## [6,] 5.893190e+09
Valores y Vectores Propios
Con lo cual se va a calcular los valores y vectores propios:
library(readxl)
library(Amelia)
data<-read_excel("A.xlsx")
data<-data[,c(-1,-2,-3,-4,-5,-6,-12,-11,-12,-13,-15,-17)]
View(data)
data<-cbind(as.numeric(data$`Unit price`),
as.numeric(data$Quantity),
as.numeric(data$`Tax 5%`),
as.numeric(data$Total),
as.numeric(data$cogs),
as.numeric(data$`gross income`)
)
eigen(cor(data))## eigen() decomposition
## $values
## [1] 3.460439e+00 1.496630e+00 9.861383e-01 5.675246e-02 3.975352e-05
## [6] 5.186213e-17
##
## $vectors
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] -0.2442146 0.3723866 0.76266117 -0.469067791 0.003282690 0.000000e+00
## [2,] -0.2372746 0.5040208 -0.64432683 -0.523921540 0.003596035 1.407232e-16
## [3,] -0.5054313 -0.2774334 -0.02830660 -0.005985389 -0.408329285 -7.071068e-01
## [4,] -0.5052196 -0.2782949 -0.02841004 0.001623252 0.816391627 3.834746e-13
## [5,] -0.3433533 0.6131106 0.02795018 0.710920067 -0.003923625 6.695416e-16
## [6,] -0.5054313 -0.2774334 -0.02830660 -0.005985389 -0.408329285 7.071068e-01
Grafico de Sedimentación
El gráfico de sedimentación se obtiene al representar en las ordenadas las raíces características y en abscisas los números de las componentes principales correspondientes a cada raíz característica en orden decreciente.
library(readxl)
library(Amelia)
data<-read_excel("A.xlsx")
data<-data[,c(-1,-2,-3,-4,-5,-6,-12,-11,-12,-13,-15,-17)]
d<-as.numeric(data$`Unit price`)
data<-cbind(as.numeric(data$`Unit price`),
as.numeric(data$Quantity),
as.numeric(data$`Tax 5%`),
as.numeric(data$Total),
as.numeric(data$cogs),
as.numeric(data$`gross income`)
)
library(psych)
#data<-matrix(1,34,34)
#scree((data),main ="Grafico_de_Sedimentacion")
fa.parallel(data,fa="pc")## Warning in cor.smooth(R): Matrix was not positive definite, smoothing was done
## Warning in cor.smooth(R): Matrix was not positive definite, smoothing was done
## Warning in cor.smooth(R): Matrix was not positive definite, smoothing was done
## Warning in cor.smooth(r): Matrix was not positive definite, smoothing was done
## Warning in cor.smooth(r): Matrix was not positive definite, smoothing was done
## Parallel analysis suggests that the number of factors = NA and the number of components = 2
Entonces la mejor opción es tomar 2 componentes, puesto que este valor se encuentra por encima de la línea aceptable de la grafica .
Realización de las Componentes
Se usa la función “prcomp” la cual realiza un análisis de componentes principales en la matriz de datos y devuelve los resultados como un objeto:
library(readxl)
library(Amelia)
data<-read_excel("A.xlsx")
data<-data[,c(-1,-2,-3,-4,-5,-6,-12,-11,-12,-13,-15,-17)]
d<-as.numeric(data$`Unit price`)
data<-cbind(as.numeric(data$`Unit price`),
as.numeric(data$Quantity),
as.numeric(data$`Tax 5%`),
as.numeric(data$Total),
as.numeric(data$cogs),
as.numeric(data$`gross income`)
)
summary(prcomp(data, scale=TRUE,center = TRUE))## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6
## Standard deviation 1.8602 1.2234 0.9930 0.23823 0.006305 5.895e-16
## Proportion of Variance 0.5767 0.2494 0.1644 0.00946 0.000010 0.000e+00
## Cumulative Proportion 0.5767 0.8262 0.9905 0.99999 1.000000 1.000e+00
De esta manera se tiene que las dos primeras componentes muestran el 0.8262 del porcentaje de la varianza, note se que tomando la tercera componente tenemos el 0.9905, por lo cual consideramos también la tercera componente.
Gráfico de la data en cada componente
Se analiza el porcentaje de la data que existe en cada variable:
library(readxl)
library(Amelia)
data<-read_excel("A.xlsx")
data<-data[,c(-1,-2,-3,-4,-5,-6,-12,-11,-12,-13,-15,-17)]
d<-as.numeric(data$`Unit price`)
data<-cbind(as.numeric(data$`Unit price`),
as.numeric(data$Quantity),
as.numeric(data$`Tax 5%`),
as.numeric(data$Total),
as.numeric(data$cogs),
as.numeric(data$`gross income`)
)
componentes_cli<-prcomp(data, scale=TRUE,center = TRUE)
plot(componentes_cli)Se tiene que en las tres primeras variables se concentra una gran cantidad de data.
Gráfica de las Componentes
library(readxl)
library(Amelia)
data<-read_excel("A.xlsx")
data<-data[,c(-1,-2,-3,-4,-5,-6,-12,-11,-12,-13,-15,-17)]
d<-as.numeric(data$`Unit price`)
data<-cbind(as.numeric(data$`Unit price`),
as.numeric(data$Quantity),
as.numeric(data$`Tax 5%`),
as.numeric(data$Total),
as.numeric(data$cogs),
as.numeric(data$`gross income`)
)
componentes_cli<-prcomp(data, scale=TRUE,center = TRUE)
biplot(componentes_cli, scale=0.5)Extracción de las Componentes:
library(readxl)
library(Amelia)
data<-read_excel("A.xlsx")
data<-data[,c(-1,-2,-3,-4,-5,-6,-12,-11,-12,-13,-15,-17)]
data<-cbind(as.numeric(data$`Unit price`),
as.numeric(data$Quantity),
as.numeric(data$`Tax 5%`),
as.numeric(data$Total),
as.numeric(data$cogs),
as.numeric(data$`gross income`)
)
View(data)
componentes_cli<-prcomp(data, scale=TRUE,center = TRUE)
componentes_principales<-componentes_cli$x
componentes_principales<-data[,1:3]
head(componentes_principales,5)## [,1] [,2] [,3]
## [1,] 74.69 7 261415.00
## [2,] 15.28 5 3.82
## [3,] 46.33 7 162155.00
## [4,] 58.22 8 23288.00
## [5,] 86.31 7 302085.00
Obtenemos como resultado de la aplicación de ACP las tres componentes que corresponden a Unit Price, Quantity y Tax 5%.
Conclusiones
El Análisis de Componentes Principales (ACP) nos ayuda a reducir la dimensión de la data, es decir el número de variables en los datos, siempre que se trabaje con variables no incorreladas, pues las componentes que se generan tienen la misma dimensión que en el caso de que se trabajara con variables numéricas, y de mayor dimensión que las variables originales si trabajáramos con variables del tipo categóricas.