————— CLUSTERING —————
Importando la data
distritos=read.csv("https://raw.githubusercontent.com/VictorGuevaraP/BI/master/Distritos.csv",sep = ";")
Visualizamos la data
head(distritos)
## X ocu_vivi pobpjov sinelect sinagua pea1619
## 1 Ate 1.15 5.3 27.60 51.10 3.9
## 2 Barranco 1.09 4.5 1.59 8.32 0.8
## 3 Breña 1.08 4.4 2.20 23.15 0.9
## 4 Carabayllo 1.10 5.1 30.13 38.09 4.5
## 5 Comas 1.20 5.9 10.92 24.27 3.8
## 6 Chorrillos 1.15 5.5 16.77 37.11 3.2
## pocprin peam15
## 1 1.1 63.48
## 2 3.9 33.48
## 3 4.0 37.89
## 4 12.6 63.65
## 5 9.4 60.37
## 6 10.6 18.78
(selecciona data )
distritos1 = distritos
Seleccionamos data netamente numéricas para poder realizar el sacale.
distritos_num = distritos1[,2:8]
Se realiza esta función genérica para centrar o escalarlas columnas de una matriz numérica.
distritos.scale<- as.data.frame(scale(distritos_num[,1:7]))
(Esta cosa tenía un significado xD)
wss=as.numeric()
for(k in 2:10){ #depende de la cantidad de cluster a armar, k=numero optimo de cluster
set.seed(111) #Estableciendo la semilla para determinar los centroides
grupos = kmeans(distritos[,2:8],k) #distritos[filas,columnas], kmeans(data, #de cluster, método)
wss[k-1]=grupos$tot.withinss #$tot.withinss -> totalidad de lo grupos
}
(Nos ayuda a seleccionar la cantidad de grupos que realizaremos, donde veamos el punto de quiebre, en este caso es de 3, como se muestra en el gráfico)
plot(2:10,wss,type="b")
Generando el mismo gráfico de codo con la libreria factor extra, para obtener de manera más específica los grupos que se deben realizar
library(factoextra)
## Loading required package: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
fviz_nbclust(distritos[,2:8], kmeans, method = "wss")
Según los gráficos se debería generar 2 grupos aunque tambien sugiere un tercer grupo, se construira con 2 y 3 grupos para comparar resultados.
grupos2 = kmeans(distritos[,2:8],2)
grupos3 = kmeans(distritos[,2:8],3)
Comparando los grupos formados
table(grupos2$cluster)
##
## 1 2
## 12 22
table(grupos3$cluster)
##
## 1 2 3
## 8 17 9
Con porcentajes
prop.table(table(grupos2$cluster))
##
## 1 2
## 0.3529412 0.6470588
prop.table(table(grupos3$cluster))
##
## 1 2 3
## 0.2352941 0.5000000 0.2647059
A partir de la comparativa se opta por generar 3 grupos, por que los grupos son mas homogeneos
Gráficamos los cluster optimos
library(cluster)
clusplot(distritos[,2:8], grupos3$cluster)
Del grupos3 sacamos las medias, de ello se va a poder determinar las variables en los que exista una diferencia notoria entre los cluster.
grupos3
## K-means clustering with 3 clusters of sizes 8, 17, 9
##
## Cluster means:
## ocu_vivi pobpjov sinelect sinagua pea1619 pocprin peam15
## 1 1.126250 5.262500 25.633750 46.60250 4.0375000 10.137500 60.12500
## 2 1.082353 4.658824 2.861176 15.29941 0.9529412 5.023529 28.54706
## 3 1.168889 5.500000 8.404444 24.75778 2.7800000 8.477778 55.27111
##
## Clustering vector:
## [1] 1 2 2 1 3 2 1 3 2 3 3 2 1 1 2 2 2 3 2 2 1 1 2 3 2 3 2 2 1 2 3 3 2 2
##
## Within cluster sum of squares by cluster:
## [1] 1072.268 2270.733 1086.588
## (between_SS / total_SS = 77.9 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
Diagrama de dispersión por cluster
plot(distritos$sinelect, distritos$sinagua, col = grupos3$cluster)
Para identificar los elementos en cada cluster
plot(distritos$sinelect, distritos$sinagua, col = grupos3$cluster)
identify(x=distritos$sinelect,
y=distritos$sinagua,
distritos$X)
## integer(0)
Para graficarlo en 3d, para ello se debe tomar en cuenta una variable mas para el eje Z
# library(rgl)
# open3d()
# plot3D(x=distritos$sinelect,
# y=distritos$sinagua,
# z=distritos$pea1619,
# col=grupos3$cluster, size=20)
# movie3d(spin3d(), duration = 50)
————— REGLAS DE ASOCIACIÓN —————
Importando la data *Instalamos el paquete arules el cual permitirá ver transacciones
# install.packages("arules")
library(arules)
## Loading required package: Matrix
##
## Attaching package: 'arules'
## The following objects are masked from 'package:base':
##
## abbreviate, write
dist_ = read.csv("https://raw.githubusercontent.com/VictorGuevaraP/BI/master/Distritos.csv",sep=";")
dist = read.transactions("https://raw.githubusercontent.com/VictorGuevaraP/BI/master/Distritos.csv",sep=";")
head(dist)
## transactions in sparse format with
## 6 transactions (rows) and
## 214 items (columns)
dist_1 = dist[2:35,]
Hacemos summary a dist ya que esta funcion brinda informacion sobre la matriz importada
summary(dist_1)
## transactions as itemMatrix in sparse format with
## 34 rows (elements/itemsets/transactions) and
## 214 columns (items) and a density of 0.03738318
##
## most frequent items:
## 3.9 4.2 1.03 1.1 4.5 (Other)
## 6 6 5 5 5 245
##
## element (itemset/transaction) length distribution:
## sizes
## 8
## 34
##
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 8 8 8 8 8 8
##
## includes extended item information - examples:
## labels
## 1 0.1
## 2 0.2
## 3 0.3
De ello se interpreta lo siguiente:
El valor de densidad de 0.03738318 (3.738 %) se refieere a la proporción de celdas en la matriz que son distintas de cero. Dado que hay 35 * 214 = 7490 celdas en la matriz, es posible calcular el número total 7490 * 0.03738318 = 280 de ítems. ———————————————————————————– En el siguiente bloque de la salidad de summary() se muestran los items más frecuentes encontrados en la base de datos de transacciones. 1) Dado que 6/35 = 0.1714286, podemos determinar que epresenta un 17,14% del total de registros, ———————————————————————————– Finalmente, se presentan un conjunto de estadísticas sobre el tamaño de los registros, Un total de 34 registros contienen 8 items.
Mostramos los registro realizados
labels(dist_1)
## [1] "{1.1,1.15,27.6,3.9,5.3,51.1,63.48,Ate}"
## [2] "{0.8,1.09,1.59,3.9,33.48,4.5,8.32,Barranco}"
## [3] "{0.9,1.08,2.2,23.15,37.89,4,4.4,Breña}"
## [4] "{1.1,12.6,30.13,38.09,4.5,5.1,63.65,Carabayllo}"
## [5] "{1.2,10.92,24.27,3.8,5.9,60.37,9.4,Comas}"
## [6] "{1.15,10.6,16.77,18.78,3.2,37.11,5.5,Chorrillos}"
## [7] "{1.22,13.5,16.42,4.5,41.16,55.84,6,Agustino}"
## [8] "{1.19,10.5,21.58,4,5.9,60.16,9.61,Independencia}"
## [9] "{0.3,0.57,1.03,14.78,23.52,3.1,4.2,Jesús María}"
## [10] "{1.06,1.7,25.79,3.09,4.7,49.21,7.8,La Victoria}"
## [11] "{1.1,1.7,26,4.55,4.6,46.66,6.6,Lima}"
## [12] "{0.5,1.03,1.14,20.22,29.42,3.6,4.1,Lince}"
## [13] "{1.11,2,30.25,46.18,5.1,52.8,6.7,Los Olivos}"
## [14] "{1.1,14.4,32.93,5.2,5.4,60.66,65.76,Lurigancho-Chosica}"
## [15] "{0.7,1.08,1.41,15.16,28.99,4.1,4.5,Magdalena del Mar}"
## [16] "{0.5,1.09,1.24,13.02,26.71,3.9,4.7,Pueblo Libre}"
## [17] "{0.2,0.67,1.03,14.75,22.45,3.7,4,Miraflores}"
## [18] "{0.2,1.12,25.6,48.75,5,6.9,7,Rímac}"
## [19] "{0.4,1.06,1.77,18.67,4.2,4.8,8.26,San Borja}"
## [20] "{0.1,0.46,1.03,13.94,16.29,3.9,4.9,San Isidro}"
## [21] "{1.12,10.3,23.49,3.6,5.2,50,61.83,San Juan de Lurigancho}"
## [22] "{1.15,10.8,20.14,4.2,41.8,5.4,57.9,San Juan de Miraflores}"
## [23] "{1.1,1.7,12.36,3.94,38.61,5.5,7,San Luis}"
## [24] "{1.18,2.5,24.04,49.33,5.5,6,9.62,San Martin de Porres}"
## [25] "{0.9,1.11,15.04,32.34,4.16,4.2,5.1,San Miguel}"
## [26] "{1.2,11.8,12.14,3.9,35.3,6.1,65.11,Santa Anita}"
## [27] "{0.9,1.03,15.95,27.16,4.5,4.9,5.44,Surco}"
## [28] "{1.09,1.2,21.87,3.15,38.54,4.7,5.5,Surquillo}"
## [29] "{1.06,11.7,24.11,38.73,4.2,4.8,64.84,Villa el Salvador}"
## [30] "{1.18,1.79,2.2,38.72,4.6,5.6,9.3,Villa María del Triunfo}"
## [31] "{1.14,15.98,3.2,33.22,5.3,56.88,8.6,Callao}"
## [32] "{1.33,2.73,4.02,6.5,60.97,7.02,8.7,Carmen de la Legua}"
## [33] "{1.17,1.5,1.99,3.9,38.1,5.3,9.12,La Perla}"
## [34] "{0.2,0.35,1.05,15.63,4.2,7.74,9,La Punta}"
Visualizamos el soporte de los items (p. ej. de aquellos items con una proporción mayor a 0.10)
itemFrequencyPlot(dist_1, support = 0.1)
Visualizamos el soporte de los items (p. ej.de los 20 ítems con mayor soporte)
itemFrequencyPlot(dist_1, topN = 20)
Visualizamos la matriz de transacciones (p. ej. para las 5 primeras transacciones)
image(dist_1[1:5])
Visualizamos la matriz de transacciones (p. ej. para las 20 primeras transacciones)
image(sample(dist_1, 20))
#Entrenar el modelo con los datos
Usar la funcion apriore permite establecer la confianza y definir el minimo de elementos para cada regla)
help(apriori)
## starting httpd help server ... done
apriori(dist_1)
## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.8 0.1 1 none FALSE TRUE 5 0.1 1
## maxlen target ext
## 10 rules FALSE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 3
##
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[207 item(s), 34 transaction(s)] done [0.00s].
## sorting and recoding items ... [6 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 done [0.00s].
## writing ... [0 rule(s)] done [0.00s].
## creating S4 object ... done [0.00s].
## set of 0 rules
Definiendo soporte, confiaza y minimo de elementos para obtener las reglas
distrules <- apriori(dist_1, parameter = list(support =0.1,confidence = 0.8, minlen = 1))
## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.8 0.1 1 none FALSE TRUE 5 0.1 1
## maxlen target ext
## 10 rules FALSE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 3
##
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[207 item(s), 34 transaction(s)] done [0.00s].
## sorting and recoding items ... [6 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 done [0.00s].
## writing ... [0 rule(s)] done [0.00s].
## creating S4 object ... done [0.00s].
distrules
## set of 0 rules
summary(distrules)
## set of 0 rules
No he obtenido ninguna regla.