##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
## BillNo Itemname Quantity Date
## Length:522064 Length:522064 Min. :-9600.00 Length:522064
## Class :character Class :character 1st Qu.: 1.00 Class :character
## Mode :character Mode :character Median : 3.00 Mode :character
## Mean : 10.09
## 3rd Qu.: 10.00
## Max. :80995.00
##
## Hour Price CustomerID Country
## Length:522064 Min. :-11062.060 Min. :12346 Length:522064
## Class :character 1st Qu.: 1.250 1st Qu.:13950 Class :character
## Mode :character Median : 2.080 Median :15265 Mode :character
## Mean : 3.827 Mean :15317
## 3rd Qu.: 4.130 3rd Qu.:16837
## Max. : 13541.330 Max. :18287
## NA's :134041
## Total
## Min. :-11062.06
## 1st Qu.: 3.75
## Median : 9.78
## Mean : 19.69
## 3rd Qu.: 17.40
## Max. :168469.60
##
## 'data.frame': 522064 obs. of 9 variables:
## $ BillNo : chr "536365" "536365" "536365" "536365" ...
## $ Itemname : chr "WHITE HANGING HEART T-LIGHT HOLDER" "WHITE METAL LANTERN" "CREAM CUPID HEARTS COAT HANGER" "KNITTED UNION FLAG HOT WATER BOTTLE" ...
## $ Quantity : int 6 6 8 6 6 2 6 6 6 32 ...
## $ Date : chr "01/12/2010" "01/12/2010" "01/12/2010" "01/12/2010" ...
## $ Hour : chr "08:26:00" "08:26:00" "08:26:00" "08:26:00" ...
## $ Price : num 2.55 3.39 2.75 3.39 3.39 7.65 4.25 1.85 1.85 1.69 ...
## $ CustomerID: int 17850 17850 17850 17850 17850 17850 17850 17850 17850 13047 ...
## $ Country : chr "United Kingdom" "United Kingdom" "United Kingdom" "United Kingdom" ...
## $ Total : num 15.3 20.3 22 20.3 20.3 ...
## [1] 134041
## BillNo Itemname Quantity Date Hour Price CustomerID
## 0 0 0 0 0 0 134041
## Country Total
## 0 0
# Eliminar NA
bd <- na.omit(bd)
# Eliminar Totales negativos
bd <- bd[bd$Total > 0, ]
# Identificar Outliers
boxplot(bd$Total, horizontal = TRUE)# Obtener el total por ticket
ticket_promedio <- aggregate(Total ~ CustomerID + BillNo, data = bd, sum)
ticket_promedio <- aggregate(Total ~ CustomerID, data= ticket_promedio, mean)
colnames(ticket_promedio) <- c("CustomerID", "TicketPromedio")
# Cantidad de visitas por cliente
visitas <- group_by(bd, CustomerID) %>% summarise(Visitas= n_distinct(BillNo))
# Juntar las tablas ticket promedio y visitas
objetos <- merge(ticket_promedio, visitas, by= "CustomerID")
#Llamar a los renglones como Customer ID
rownames(objetos) <- objetos$CustomerID
objetos <- subset(objetos, select = -c(CustomerID))
# Eliminar datos fuera de lo normal
# Los rangos fuera de lo normal están fuera de los siguientes límites
# 1. Límite inferior: Q1 - 1.5*IQR
# 2. Límite superior: Q3 + 1.5*IQR
#IQR = rango intercuartil
# Columna de ticket promedio
IQR_TP <- IQR(objetos$TicketPromedio)
IQR_TP## [1] 248.3318
## TicketPromedio Visitas
## Min. : 3.45 Min. : 1.000
## 1st Qu.: 178.30 1st Qu.: 1.000
## Median : 292.00 Median : 2.000
## Mean : 415.62 Mean : 4.227
## 3rd Qu.: 426.63 3rd Qu.: 5.000
## Max. :84236.25 Max. :209.000
## [1] -194.1977
## [1] 799.1277
objetos <- objetos[objetos$TicketPromedio<=799.13, ]
# Columna visitas
IQR_V <- IQR(objetos$Visitas)
IQR_V## [1] 4
## [1] -5
## [1] 11
## TicketPromedio Visitas
## Min. : 3.45 Min. : 1.000
## 1st Qu.:168.66 1st Qu.: 1.000
## Median :267.12 Median : 2.000
## Mean :293.86 Mean : 2.971
## 3rd Qu.:384.49 3rd Qu.: 4.000
## Max. :797.45 Max. :11.000
# 0. Normalizar variables
objetos <- as.data.frame(scale(objetos))
# 1. Crear base de datos
df <- objetos
# 2. Determinar el número de grupos
grupos <- 4
# 3. Realizar ka clasificación
segmentos <- kmeans(df, grupos)
# 4. Revisar la asignación de grupos
asignación <- cbind(df, cluster= segmentos$cluster)
# 5. Gráficar resultados
library(ggplot2)
library(factoextra)## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
fviz_cluster(segmentos, data=df,
palette=c("red","blue","yellow","green" ),
ellipse.type="euclid",
star.plot= T,
repel= T,
ggtheme = theme())##
## Attaching package: 'data.table'
## The following objects are masked from 'package:dplyr':
##
## between, first, last
set.seed(123)
optimizacion <- clusGap(df, FUN=kmeans, nstart=1, K.max=7)
plot(optimizacion, xlab= "Número de clusters K")Con lo que llevamos de este módulo hemos aprendido acerca del método K vecinos más cercanos, este método es muy útil en la analítica de datos cuando buscamos clasificar diferentes variables en clusters para poder entender más ciertos comportamientos dentro de una base de datos, sobre este método aprendimos que existe una forma manual de clasificar los clusters que a pesar de ser un proceso tardado nos lleva a obtener un modelo optimizado, sin embargo, el software de R nos proporciona una manera más eficiente de obtener los resultados esperados. Para nuestro reto acerca de la educación financiera de la población de Nuevo León va a ser muy interesante usar este código para evaluar diferentes variables y ver como se podrían clasificar a las personas que contestan la encuesta, de tal forma que nos ayude a generar conclusiones acerca de porque existe una deficiencia en la educación financiera en el país.