————— CLUSTERING —————

Paso n°01:

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

Paso n°02

(selecciona data )

distritos1 = distritos

Paso n°03

Seleccionamos data netamente numéricas para poder realizar el sacale.

distritos_num = distritos1[,2:8]

Paso n°04

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]))

Paso n°05

(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
}

Paso n°06

(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")

Paso n°07

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")

Paso n°08

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)

Paso n°09

Comparando los grupos formados

table(grupos2$cluster)
## 
##  1  2 
## 12 22
table(grupos3$cluster)
## 
##  1  2  3 
##  8 17  9

Paso n°10

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

Paso n°11

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"

Paso n°12

Diagrama de dispersión por cluster

plot(distritos$sinelect, distritos$sinagua, col = grupos3$cluster)

Paso n°13

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)

Paso n°13

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 —————

Paso n°01:

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,]

Paso n°02:

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.

Paso n°03:

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}"

Paso n°03:

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)

Paso n°04:

Visualizamos el soporte de los items (p. ej.de los 20 ítems con mayor soporte)

itemFrequencyPlot(dist_1, topN = 20)

Paso n°05:

Visualizamos la matriz de transacciones (p. ej. para las 5 primeras transacciones)

image(dist_1[1:5])

Paso n°05:

Visualizamos la matriz de transacciones (p. ej. para las 20 primeras transacciones)

image(sample(dist_1, 20)) 

#Entrenar el modelo con los datos

Paso n°06:

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

Paso n°06:

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.