Análisis K-means de ocupación de aparcamientos en parques nacionales de Estados Unidos

El objetivo de este estudio es determinar la correlación que existe en los niveles de ocupación de los estacionamientos de parques en Estados Unidos respecto a los meses, días y horas de un periodo analizado a partir del desarrollo de un algoritmo K-means. Para ello, utilizaré el lenguaje de programación R y un conjunto de datos de 35.717 registros con datos obtenidos de octubre a diciembre de 2016.
K-Means es un método de agrupación o clustering. El término «k-means» fue utilizado por primera vez por James MacQueen en 1967, aunque la idea se remonta a Hugo Steinhaus en 1957.
El algoritmo estándar fue propuesto por primera vez por Stuart Lloyd en 1957 como técnica para la modulación por impulsos codificados, aunque no se publicó fuera de los Laboratorios Bell hasta 1982.

Análisis K-means: Caso de Estudio
El objetivo general de esta investigación es determinar la correlación que existe en los niveles de ocupación de los estacionamientos de parques en Estados Unidos, respecto a los meses, días y horas del periodo analizado a través del desarrollo de un algoritmo k-means s.
Los objetivos específicos son los siguientes:
- Establecer un análisis exploratorio de los datos mediante cálculos de medias, medianas y otras medidas de tendencia central.
- Desarrollar e implementar el algoritmo K-means.
- Determinar la correlación que existe en los niveles de ocupación con respecto a los meses, días y horas del periodo analizado.
Metodología de Análisis K-means
El clustering es una técnica que permite encontrar y clasificar K grupos de datos (clusters). Así, los elementos que comparten características similares estarán juntos en el mismo grupo, separados de otros grupos con los que no comparten características.
Para averiguar si los datos son similares o diferentes, el algoritmo K-means utiliza la distancia entre los datos. Las observaciones que son similares tendrán una distancia menor entre ellas. En general, se utiliza la distancia euclídea como medida, aunque también se pueden utilizar otras funciones.
Los algoritmos de clustering se consideran algoritmos de aprendizaje no supervisado. Este tipo de algoritmos de aprendizaje no supervisado busca patrones en los datos sin tener una predicción específica como objetivo (no hay variable dependiente). En lugar de tener una salida, los datos sólo tienen una entrada que serían las múltiples variables que describen los datos.
El algoritmo K-means necesita como entrada el número de grupos en los que vamos a segmentar la población. A partir de este número k de grupos, el algoritmo coloca primero k puntos aleatorios (centroides). A continuación, asigna a cualquiera de estos puntos todas las muestras con las distancias más pequeñas. A continuación, el punto se desplaza a la media de las muestras más cercanas.
Esto generará una nueva asignación de muestras, ya que algunas muestras están ahora más cerca de otro centroide. Este proceso se repite iterativamente y los grupos se ajustan hasta que la asignación ya no cambia al mover los puntos. Este resultado final representa el ajuste que maximiza la distancia entre los distintos grupos y minimiza la distancia intragrupo.
Este tipo de algoritmo de aprendizaje no supervisado es útil para explorar, describir y resumir datos de una forma diferente. La agrupación de datos puede ayudarnos a confirmar (o rechazar) algún tipo de clasificación previa. También puede ayudarnos a descubrir patrones y relaciones que desconocíamos.
El conjunto de datos que se va a analizar consta de las siguientes características:
- 35.717 tuplas o filas. Cuatro columnas con los siguientes datos:
- SystemCode: Indica el código asociado al aparcamiento.
- Capacity: Indica el número total de plazas disponibles en el aparcamiento.
- Occupancy: Indica el número de plazas de aparcamiento que están ocupadas en el momento de emitir el informe.
- LastUpdated: Indica la fecha exacta en la que se registraron los datos de la tupla.
Para gestionar los datos de forma más eficiente al aplicar el algoritmo k-means, el campo LastUpdated se dividió en cuatro campos:
- Year: Año del registro de datos de la tupla.
- Month: Mes del registro de datos de la tupla.
- Day: Day of the tuple data record.
- Time: Hora del registro de datos de la tupla. # Análisis exploratorio.
Importemos las bibliotecas cluster y fpc, y creemos el conjunto de datos.
In [48]:
library(cluster) library(fpc) set.seed(500) dataset <- read.csv("../input/dataset/parking-clean-data.csv")
Para cada una de las cinco columnas a analizar se obtiene el valor mínimo, el primer cuartil, la mediana, la media, el tercer cuartil y el valor máximo, y a continuación se generan diagramas de caja con esta información.
Podemos observar que los aparcamientos analizados tienen una capacidad que varía entre 220 plazas y 4675 plazas, con una media de 1398 plazas. Su ocupación varía entre 0 plazas y 4327 plazas, con una media de 642,2 plazas.
En cuanto al periodo analizado, oscila entre el mes 10 y el mes 12 de 2016, con una media de 10,88. En cuanto a los días analizados, se realiza un recorrido completo desde el día 1 al 31, con una media de 15,16. Las horas analizadas van desde las 7:30 hasta las 16:34, con una media de 12:05.
Se observa que los campos Capacidad y Ocupación tienen valores atípicos que pueden afectar la efectividad del proceso de clustering, sin embargo no serán ajustados aún debido a su alta importancia en este proceso de análisis. Tras el proceso de clustering, se eliminarán los valores atípicos en los clusters creados con el fin de generar conclusiones más precisas.
In [49]:
# Pasar a columnas numéricas
dataset$Capacity <- as.numeric(dataset$Capacity)
dataset$Occupancy <- as.numeric(dataset$Occupancy)
dataset$Month <- as.numeric(dataset$Month)
dataset$Day <- as.numeric(dataset$Day)
dataset$Time <- as.numeric(dataset$Time)
In [50]:
# Ignorar valores NA
dataset <- na.omit(dataset,na.action=TRUE)
# Crear un nuevo dataset con las columnas que se utilizarán
mydata <- dataset[,c(2,3,5:7)]
# Obtener un resumen del dataset
summary(mydata)
boxplot(mydata)
Capacity Occupancy Month Day Time Min. : 220 Min. : 0.0 Min. :10.00 Min. : 1.00 Min. : 730 1st Qu.: 500 1st Qu.: 210.0 1st Qu.:10.00 1st Qu.: 8.00 1st Qu.:1000 Median : 849 Median : 446.0 Median :11.00 Median :15.00 Median :1204 Mean :1398 Mean : 642.2 Mean :10.88 Mean :15.16 Mean :1205 3rd Qu.:2009 3rd Qu.: 798.0 3rd Qu.:11.00 3rd Qu.:22.00 3rd Qu.:1429 Max. :4675 Max. :4327.0 Max. :12.00 Max. :31.00 Max. :1634
In [51]:
# Gráfico de capacidad
boxplot(mydata$Capacity,
main = "Capacity",
xlab = "Cars",
ylab = "Stalls",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
In [52]:
# Gráfico de ocupación
boxplot(mydata$Occupancy,
main = "Occupancy",
xlab = "Cars",
ylab = "Stalls",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
In [53]:
# Gráfico de mes
boxplot(mydata$Month,
main = "Month",
xlab = "Time",
ylab = "Months",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
Warning message in bxp(list(stats = structure(c(10, 10, 11, 11, 12), .Dim = c(5L, : “some notches went outside hinges ('box'): maybe set notch=FALSE”
In [54]:
# Gráfico de día
boxplot(mydata$Day,
main = "Day",
xlab = "Time",
ylab = "Days of the month",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
In [55]:
# Gráfico de hora
boxplot(mydata$Time,
main = "Hour",
xlab = "Time",
ylab = "Hours of the day",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
Algoritmo K-means
Las variables del conjunto de datos están a diferentes escalas, por lo que es necesario escalar el conjunto de datos para mantener la uniformidad como paso previo a la ejecución del algoritmo K-means.
Para obtener el número ideal de conglomerados (k), la varianza del conjunto de datos se almacena en una matriz y luego se itera 15 veces sobre la matriz. En cada iteración, se registra la suma de cuadrados del factor de fuerza de unión intracluster (withinss). A continuación, se trazan los resultados y se selecciona el valor de k en el que la pendiente de la curva muestra el mayor cambio.
In [56]:
# Las variables del conjunto de datos están a diferentes escalas.
# Para mantener la uniformidad, las columnas se escalan
scaled_data <- scale(mydata[,1:5])
## Calcular la varianza
wss <- (nrow(scaled_data)-1)*sum(apply(scaled_data,2,var))
# Iterar sobre la matriz wws 15 veces.
# Registrar en cada iteración la suma de cuadrados del factor de fuerza de unión intracluster para cada cluster (withinss)
for(i in 2:15)wss[i]<- sum(fit=kmeans(scaled_data,centers=i,15)$withinss)
## Gráfico de cada iteración
plot(1:15,wss,type="b",main="15 clusters",xlab="# of cluster",ylab="sum of squares")
A partir de este gráfico, podemos observar que la pendiente tiene un cambio más significativo cuando el número de clusters es igual a 3, por lo que se tomará este valor como número de clusters a utilizar.
Tras aplicar la función kmeans, se evalúan las propiedades de los clusters generados:
- Centers: vector que indica la media de cada variable para cada conglomerado.
- Totss (Suma total de cuadrados). Withinss (Suma total de cuadrados intracluster).
- Tot.withinss (Suma total de cuadrados intra-cluster).
- Betweenss (Suma de cuadrados interclúster).
- Size: Número de puntos de cada conglomerado.
In [57]:
# La pendiente varía sobre todo en la tercera iteración,
# por lo que se considera que 3 es el número óptimo de conglomerados.
fit <- kmeans(scaled_data, 3)
fit$centers
fit$totss
fit$withinss
fit$tot.withinss
fit$betweenss
fit$size
Capacity | Occupancy | Month | Day | Time | |
---|---|---|---|---|---|
1 | -0.4041041 | -0.3906482 | -0.679259247 | 0.556198370 | -0.07882166 |
2 | -0.3737569 | -0.3354071 | 0.870854168 | -0.714267704 | -0.04301146 |
3 | 1.6444271 | 1.5418053 | -0.005875559 | 0.007001652 | 0.26551874 |
178580
- 44049.45510661
- 30017.6406344365
- 32196.509518354
106263.605259401
72316.3947405994
- 16187
- 12672
- 6858
Las distancias intracluster son 44049,46, 30017,64 y 32196,51, mientras que la distancia intercluster es de 72316,39.
Mediante la función plotcluster se obtiene un gráfico con el resultado del clustering y posteriormente una matriz con las medias de cada cluster en cada dimensión para evaluar cómo de diferentes son los clusters obtenidos.
El primer cluster tiene un tamaño de 16187 puntos (rojo en el gráfico), el segundo es de 12672 puntos (negro en el gráfico) y el tercero es de 6858 puntos (verde en el gráfico).
Del gráfico obtenido se deduce que existen tres grandes grupos diferenciados en los que se pueden clasificar los datos. Los grupos se explican detalladamente a continuación.
In [58]:
# Interpretar patrones
plotcluster(scaled_data,fit$cluster)
points(fit$centers,col=1:5,pch=16)
# Media de cada variable en cada conglomerado
mean_data <- dataset[,c(2,3,5:7)]mean_data <- data.frame(mean_data,fit$cluster)
mean_ds <- aggregate(mean_data[,1:5],by = list(fit$cluster),FUN = mean)
mean_ds
Group.1 | Capacity | Occupancy | Month | Day | Time |
---|---|---|---|---|---|
<int> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> |
1 | 920.9793 | 385.5916 | 10.37036 | 19.773522 | 1184.315 |
2 | 956.7685 | 421.8825 | 11.53614 | 9.239189 | 1193.640 |
3 | 3336.8672 | 1655.1260 | 10.87679 | 15.219743 | 1273.979 |
Los resultados de la matriz de medias son los siguientes:
- Grupo 1:
- Capacidad: 920.9793
- Ocupación: 385.5916
- Mes: 10.37036
- Día 19.773522
- Hora: 1184.315
- Grupo 2:
- Capacidad: 956.7685
- Ocupación: 421.8825
- Mes: 11.53614
- Día: 9.239189
- Hora: 1193.640
- Grupo 3:
- Capacidad: 3336.8672
- Ocupación: 1655.1260
- Mes: 10.87679
- Día: 15.219743
- Hora: 1273.979
Estos datos pueden sintetizarse del siguiente modo:
- Grupo 1: está compuesto por aparcamientos de baja y media capacidad, principalmente durante el mes de octubre y parte del mes de noviembre. Consta de 1.6187 entradas (45,32%).
- Grupo 2: está compuesto por aparcamientos de baja y media capacidad durante los meses de noviembre y diciembre. Consta de 12672 registros (35,47%).
- Grupo 3: está compuesto por aparcamientos de alta capacidad durante los meses de octubre, noviembre y diciembre. Consta de 6858 registros (19,20%).
In [59]:
# Asignar una variable a cada conglomerado
cluster1 = subset(mean_data, fit.cluster == 1)
cluster2 = subset(mean_data, fit.cluster == 2)
cluster3 = subset(mean_data, fit.cluster == 3)
# resumen de las agrupaciones
summary(cluster1)
Capacity Occupancy Month Day Time Min. : 220 Min. : 0.0 Min. :10.00 Min. : 4.00 Min. : 730 1st Qu.: 485 1st Qu.: 175.0 1st Qu.:10.00 1st Qu.:15.00 1st Qu.: 932 Median : 720 Median : 334.0 Median :10.00 Median :21.00 Median :1200 Mean : 921 Mean : 385.6 Mean :10.37 Mean :19.77 Mean :1184 3rd Qu.:1194 3rd Qu.: 560.0 3rd Qu.:11.00 3rd Qu.:26.00 3rd Qu.:1426 Max. :3883 Max. :1451.0 Max. :11.00 Max. :31.00 Max. :1634 fit.cluster Min. :1 1st Qu.:1 Median :1 Mean :1 3rd Qu.:1 Max. :1
In [60]:
boxplot(cluster1)
In [61]:
summary(cluster2)
Capacity Occupancy Month Day Min. : 220.0 Min. : 0.0 Min. :11.00 Min. : 1.000 1st Qu.: 485.0 1st Qu.: 187.0 1st Qu.:11.00 1st Qu.: 5.000 Median : 720.0 Median : 364.5 Median :12.00 Median : 9.000 Mean : 956.8 Mean : 421.9 Mean :11.54 Mean : 9.239 3rd Qu.:1200.0 3rd Qu.: 605.0 3rd Qu.:12.00 3rd Qu.:13.000 Max. :3103.0 Max. :1618.0 Max. :12.00 Max. :19.000 Time fit.cluster Min. : 732 Min. :2 1st Qu.: 956 1st Qu.:2 Median :1200 Median :2 Mean :1194 Mean :2 3rd Qu.:1426 3rd Qu.:2 Max. :1634 Max. :2
In [62]:
boxplot(cluster2)
Con el fin de facilitar el proceso de análisis, se eliminarán los valores atípicos en la dimensión Capacidad para los clusters 1 y 2. Por lo tanto, sólo se conservarán las tuplas cuya columna Capacidad sea inferior a 2000 posiciones. De este modo, se eliminan 1372 registros del cluster 1 y 1263 registros del cluster 2, lo que supone un total de 2635 registros (7,37% de los datos totales).
A continuación se presentan los resultados del ajuste:
In [63]:
# Determinar el número de valores atípicos en los conglomerados 1 y 2length(cluster1$Capacity[cluster1$Capacity>2000]) # 1372
length(cluster2$Capacity[cluster2$Capacity>2000]) # 1263
# Eliminar los valores atípicos de los grupos 1 y 2
cluster1 = subset(cluster1, Capacity<2000)
cluster2 = subset(cluster2, Capacity<2000)
1372
1263
In [64]:
summary(cluster1) summary(cluster2) summary(cluster3)
Capacity Occupancy Month Day Min. : 220.0 Min. : 0.0 Min. :10.00 Min. : 4.00 1st Qu.: 480.0 1st Qu.: 166.0 1st Qu.:10.00 1st Qu.:15.00 Median : 690.0 Median : 310.0 Median :10.00 Median :20.00 Mean : 759.6 Mean : 363.5 Mean :10.38 Mean :19.66 3rd Qu.:1010.0 3rd Qu.: 532.0 3rd Qu.:11.00 3rd Qu.:26.00 Max. :1920.0 Max. :1412.0 Max. :11.00 Max. :31.00 Time fit.cluster Min. : 730 Min. :1 1st Qu.: 959 1st Qu.:1 Median :1203 Median :1 Mean :1199 Mean :1 3rd Qu.:1429 3rd Qu.:1 Max. :1634 Max. :1
Capacity Occupancy Month Day Min. : 220.0 Min. : 0.0 Min. :11.00 Min. : 1.000 1st Qu.: 485.0 1st Qu.: 175.0 1st Qu.:11.00 1st Qu.: 5.000 Median : 690.0 Median : 332.0 Median :12.00 Median : 9.000 Mean : 770.5 Mean : 392.9 Mean :11.53 Mean : 9.335 3rd Qu.:1010.0 3rd Qu.: 568.0 3rd Qu.:12.00 3rd Qu.:13.000 Max. :1920.0 Max. :1586.0 Max. :12.00 Max. :19.000 Time fit.cluster Min. : 732 Min. :2 1st Qu.:1000 1st Qu.:2 Median :1225 Median :2 Mean :1207 Mean :2 3rd Qu.:1429 3rd Qu.:2 Max. :1634 Max. :2
Capacity Occupancy Month Day Time Min. :1920 Min. : 385 Min. :10.00 Min. : 1.00 Min. : 755 1st Qu.:2937 1st Qu.:1102 1st Qu.:10.00 1st Qu.: 9.00 1st Qu.:1101 Median :3103 Median :1363 Median :11.00 Median :15.00 Median :1303 Mean :3337 Mean :1655 Mean :10.88 Mean :15.22 Mean :1274 3rd Qu.:3883 3rd Qu.:2194 3rd Qu.:11.00 3rd Qu.:22.00 3rd Qu.:1459 Max. :4675 Max. :4327 Max. :12.00 Max. :31.00 Max. :1634 fit.cluster Min. :3 1st Qu.:3 Median :3 Mean :3 3rd Qu.:3 Max. :3
In [65]:
# cluster 1
# Gráfico de Capacidad
boxplot(cluster1$Capacity,
main = "Capacity",
xlab = "Cars",
ylab = "Stalls",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Gráfico de Ocupación
boxplot(cluster1$Occupancy,
main = "Occupancy",
xlab = "Cars",
ylab = "Stalls",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Gráfico de Mes
boxplot(cluster1$Month,
main = "Month",
xlab = "Time",
ylab = "Months",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Gráfico de Día
boxplot(cluster1$Day,
main = "Day",
xlab = "Time",
ylab = "Days of month",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Gráfico de Hora
boxplot(cluster1$Time,
main = "Hour",
xlab = "Time",
ylab = "Hours of Day",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
Warning message in bxp(list(stats = structure(c(10, 10, 10, 11, 11), .Dim = c(5L, : “some notches went outside hinges ('box'): maybe set notch=FALSE”
In [66]:
# cluster 2
# Gráfico de Capacidad
boxplot(cluster2$Capacity,
main = "Capacity",
xlab = "Cars",
ylab = "Stalls",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Gráfico de Ocupación
boxplot(cluster2$Occupancy,
main = "Occupancy",
xlab = "Cars",
ylab = "Stalls",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Gráfico de Mes
boxplot(cluster2$Month,
main = "Month",
xlab = "Time",
ylab = "Months",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Gráfico de Día
boxplot(cluster2$Day,
main = "Day",
xlab = "Time",
ylab = "Days of month",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Gráfico de Hora
boxplot(cluster2$Time,
main = "Hour",
xlab = "Time",
ylab = "Hours of Day",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
Warning message in bxp(list(stats = structure(c(11, 11, 12, 12, 12), .Dim = c(5L, : “some notches went outside hinges ('box'): maybe set notch=FALSE”
In [67]:
# cluster 3
# Gráfico de Capacidad
boxplot(cluster3$Capacity,
main = "Capacity",
xlab = "Cars",
ylab = "Stalls",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Gráfico de Ocupación
boxplot(cluster3$Occupancy,
main = "Occupancy",
xlab = "Cars",
ylab = "Stalls",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Gráfico de Mes
boxplot(cluster3$Month,
main = "Month",
xlab = "Time",
ylab = "Months",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Gráfico de Día
boxplot(cluster3$Day,
main = "Day",
xlab = "Time",
ylab = "Days of month",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Gráfico de Hora
boxplot(cluster3$Time,
main = "Hour",
xlab = "Time",
ylab = "Hours of Day",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
Warning message in bxp(list(stats = structure(c(10, 10, 11, 11, 12), .Dim = c(5L, : “some notches went outside hinges ('box'): maybe set notch=FALSE”
Resultados y concluciones del Análisis K-means
A partir del resumen de los conglomerados y de los gráficos de caja obtenidos, pueden extraerse las siguientes conclusiones.
Análisis general de los Clusters
Aquellos aparcamientos de capacidad baja y media (entre 220 y 1920 plazas, con una media de 759,6) tendrán una ocupación media de 363,5 plazas durante el mes de octubre, lo que supone una ocupación del 47,85% de la capacidad media. Esta ocupación aumenta durante los meses de noviembre y diciembre hasta 392,9 plazas sobre una capacidad media de 770,5, lo que constituye una ocupación del 51%.
Los aparcamientos de alta capacidad (entre 1920 y 4675 plazas, con una media de 3337) tendrán una ocupación media de 1655, lo que representa el 49,6%.
Análisis de Clusters
Cluster 1
Los aparcamientos con ocupación alta (valor superior al tercer cuartil, que es de 532 plazas) tienen una ocupación similar durante los días del periodo analizado.
Los aparcamientos con ocupación intermedia (valor superior al primer cuartil, que es de 166 plazas e inferior al tercer cuartil, que es de 532 plazas) tienen una ocupación similar durante los días del periodo analizado.
Los aparcamientos con baja ocupación (valor inferior al primer cuartil que es 166) durante los días de octubre y noviembre se distribuyen uniformemente.
Durante las primeras horas del día (valor inferior al primer cuartil que es 9:59) existe una ocupación baja, con una media de 227,5 plazas, y en la que el 75% de los registros (hasta el tercer cuartil) alcanzan un máximo de 329 plazas, valor inferior a la media de este cluster (353,5 plazas).
En las horas intermedias del día (valor superior al primer cuartil 9:59 e inferior al tercer cuartil 14:29) se registra una alta ocupación, con una media de 411,7 puestos, y en la que el 75% de los registros (hasta el tercer cuartil) alcanzan un máximo de 598 puestos.
Durante las últimas horas del día (valor por encima del tercer cuartil que son las 14:29) se registra una ocupación intermedia, con una media de 405,2 puestos, y en la que el 75% de los registros (hasta el tercer cuartil) alcanzan un máximo de 567 puestos.
In [68]:
#DIAS
# Días de alta ocupación
test = subset(cluster1, Occupancy > 532)
summary(test)
boxplot(test$Day,
main = "High Occupancy",
xlab = "Time",
ylab = "Days of the month",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Días de ocupación intermedia
test = subset(cluster1, Occupancy < 532 & Occupancy > 166)
summary(test)
boxplot(test$Day,
main = "Intermediate Occupancy",
xlab = "Time",
ylab = "Days of the month",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Días de baja ocupación
test = subset(cluster1, Occupancy < 166)
summary(test)
boxplot(test$Day,
main = "Low Occupancy",
xlab = "Time",
ylab = "Days of the month",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Horas
# Horas tempranas
test = subset(cluster1, Time < 959)
summary(test)
boxplot(test$Occupancy,
main = "Occupancy in the early hours",
xlab = "Cars",
ylab = "Stalls",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Horas intermedias
test = subset(cluster1, Time > 959 & Time < 1429)
summary(test)
boxplot(test$Occupancy,
main = "Ocupping at intermediate times",
xlab = "Cars",
ylab = "Stalls",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Últimas Horas
test = subset(cluster1, Time > 1429)
summary(test)
boxplot(test$Occupancy,
main = "Occupancy in the last hours",
xlab = "Cars",
ylab = "Stalls",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
Capacity Occupancy Month Day Time Min. : 577 Min. : 533.0 Min. :10.00 Min. : 4.00 Min. : 755 1st Qu.: 720 1st Qu.: 597.0 1st Qu.:10.00 1st Qu.:15.00 1st Qu.:1130 Median :1010 Median : 673.0 Median :10.00 Median :21.00 Median :1304 Mean :1066 Mean : 722.4 Mean :10.41 Mean :19.98 Mean :1289 3rd Qu.:1268 3rd Qu.: 796.0 3rd Qu.:11.00 3rd Qu.:26.00 3rd Qu.:1434 Max. :1920 Max. :1412.0 Max. :11.00 Max. :31.00 Max. :1634 fit.cluster Min. :1 1st Qu.:1 Median :1 Mean :1 3rd Qu.:1 Max. :1
Capacity Occupancy Month Day Min. : 220.0 Min. :167.0 Min. :10.00 Min. : 4.00 1st Qu.: 485.0 1st Qu.:224.0 1st Qu.:10.00 1st Qu.:14.00 Median : 600.0 Median :311.0 Median :10.00 Median :20.00 Mean : 697.6 Mean :320.5 Mean :10.37 Mean :19.42 3rd Qu.: 849.0 3rd Qu.:405.0 3rd Qu.:11.00 3rd Qu.:26.00 Max. :1920.0 Max. :531.0 Max. :11.00 Max. :31.00 Time fit.cluster Min. : 732 Min. :1 1st Qu.:1001 1st Qu.:1 Median :1226 Median :1 Mean :1212 Mean :1 3rd Qu.:1430 3rd Qu.:1 Max. :1634 Max. :1

Capacity Occupancy Month Day Min. : 220.0 Min. : 0.00 Min. :10.00 Min. : 4.00 1st Qu.: 387.0 1st Qu.: 57.00 1st Qu.:10.00 1st Qu.:15.00 Median : 470.0 Median : 93.00 Median :10.00 Median :20.00 Mean : 578.5 Mean : 91.86 Mean :10.36 Mean :19.84 3rd Qu.: 788.0 3rd Qu.:130.00 3rd Qu.:11.00 3rd Qu.:26.00 Max. :1268.0 Max. :165.00 Max. :11.00 Max. :31.00 Time fit.cluster Min. : 730 Min. :1 1st Qu.: 831 1st Qu.:1 Median :1001 Median :1 Mean :1082 Mean :1 3rd Qu.:1304 3rd Qu.:1 Max. :1634 Max. :1
Capacity Occupancy Month Day Min. : 220.0 Min. : 0.0 Min. :10.00 Min. : 4.00 1st Qu.: 480.0 1st Qu.: 78.0 1st Qu.:10.00 1st Qu.:15.00 Median : 690.0 Median : 180.0 Median :10.00 Median :20.00 Mean : 778.8 Mean : 227.5 Mean :10.38 Mean :19.54 3rd Qu.:1010.0 3rd Qu.: 329.0 3rd Qu.:11.00 3rd Qu.:26.00 Max. :1920.0 Max. :1262.0 Max. :11.00 Max. :31.00 Time fit.cluster Min. :730.0 Min. :1 1st Qu.:804.0 1st Qu.:1 Median :856.0 Median :1 Mean :858.8 Mean :1 3rd Qu.:926.0 3rd Qu.:1 Max. :958.0 Max. :1

Capacity Occupancy Month Day Min. : 220.0 Min. : 0.0 Min. :10.00 Min. : 4.00 1st Qu.: 470.0 1st Qu.: 203.0 1st Qu.:10.00 1st Qu.:15.00 Median : 690.0 Median : 358.0 Median :10.00 Median :20.00 Mean : 753.7 Mean : 411.7 Mean :10.39 Mean :19.82 3rd Qu.:1010.0 3rd Qu.: 598.0 3rd Qu.:11.00 3rd Qu.:26.00 Max. :1920.0 Max. :1412.0 Max. :11.00 Max. :31.00 Time fit.cluster Min. :1000 Min. :1 1st Qu.:1101 1st Qu.:1 Median :1204 Median :1 Mean :1200 Mean :1 3rd Qu.:1326 3rd Qu.:1 Max. :1428 Max. :1
Capacity Occupancy Month Day Min. : 220.0 Min. : 0.0 Min. :10.00 Min. : 4.00 1st Qu.: 470.0 1st Qu.: 197.0 1st Qu.:10.00 1st Qu.:14.00 Median : 690.0 Median : 368.0 Median :10.00 Median :20.00 Mean : 750.7 Mean : 405.2 Mean :10.38 Mean :19.34 3rd Qu.:1010.0 3rd Qu.: 567.0 3rd Qu.:11.00 3rd Qu.:26.00 Max. :1920.0 Max. :1263.0 Max. :11.00 Max. :31.00 Time fit.cluster Min. :1430 Min. :1 1st Qu.:1501 1st Qu.:1 Median :1531 Median :1 Mean :1539 Mean :1 3rd Qu.:1604 3rd Qu.:1 Max. :1634 Max. :1
Cluster 2
- Los aparcamientos con ocupación alta (valor superior al tercer cuartil, que es de 568 plazas) presentan una ocupación similar durante los días del periodo analizado.
- Los aparcamientos con ocupación intermedia (valor superior al primer cuartil, que es de 175 plazas e inferior al tercer cuartil, que es de 568 plazas) presentan una ocupación similar durante los días del periodo analizado.
- Los aparcamientos con baja ocupación (valor inferior al primer cuartil que es de 175 plazas) presentan una ocupación similar durante los días del periodo analizado.
- Durante las primeras horas del día (valor inferior al primer cuartil que son las 10:00) existe una ocupación baja, con una media de 245,6 plazas, y en la que el 75% de los registros (hasta el tercer cuartil) alcanzan un máximo de 359,8 plazas, valor inferior a la media de este cluster (392,9 plazas).
- En las horas intermedias del día (valor superior al primer cuartil 10:00 e inferior al tercer cuartil 14:29) se produce una ocupación alta, con una media de 451,2 puestos, y en la que el 75% de los registros (hasta el tercer cuartil) alcanzan un máximo de 647 puestos.
- Durante las últimas horas del día (valor por encima del tercer cuartil que son las 14:29) hay una ocupación intermedia, con una media de 430 puestos, y en la que el 75% de los registros (hasta el tercer cuartil) alcanzan un máximo de 602 puestos.
In [69]:
# Días
# Días de Alta Ocupación
test = subset(cluster2, Occupancy > 568)
summary(test)
boxplot(test$Day,
main = "High Occupancy",
xlab = "Time",
ylab = "Days of the Month",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Días de ocupación intermedia
test = subset(cluster2, Occupancy > 175 & Occupancy < 568)
summary(test)
boxplot(test$Day,
main = "Intermediate Occupancy",
xlab = "Time",
ylab = "Days of the Month",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Días de Baja Ocupación
test = subset(cluster2, Occupancy < 175)
summary(test)
boxplot(test$Day,
main = "Low Occupancy",
xlab = "Time",
ylab = "Days of the Month",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Horas
# Primeras Horas
test = subset(cluster2, Time < 1000)
summary(test)
boxplot(test$Occupancy,
main = "Occupancy in the early hours",
xlab = "Cars",
ylab = "Stalls",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Horas Intermedias
test = subset(cluster2, Time > 1000 & Time < 1429)
summary(test)
boxplot(test$Occupancy,
main = "Occupancy in the intermediate hours",
xlab = "Cars",
ylab = "Stalls",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Últimas horas
test = subset(cluster2, Time > 1429)
summary(test)
boxplot(test$Occupancy,
main = "Occupancy at last hours",
xlab = "Cars",
ylab = "Stalls",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
Capacity Occupancy Month Day Time Min. : 600 Min. : 569.0 Min. :11.0 Min. : 1.000 Min. : 756 1st Qu.: 863 1st Qu.: 641.0 1st Qu.:11.0 1st Qu.: 5.000 1st Qu.:1130 Median :1010 Median : 728.0 Median :12.0 Median : 9.000 Median :1303 Mean :1113 Mean : 787.7 Mean :11.6 Mean : 9.244 Mean :1294 3rd Qu.:1322 3rd Qu.: 860.0 3rd Qu.:12.0 3rd Qu.:14.000 3rd Qu.:1456 Max. :1920 Max. :1586.0 Max. :12.0 Max. :19.000 Max. :1634 fit.cluster Min. :2 1st Qu.:2 Median :2 Mean :2 3rd Qu.:2 Max. :2
Capacity Occupancy Month Day Time Min. : 220 Min. :176.0 Min. :11.00 Min. : 1.000 Min. : 740 1st Qu.: 485 1st Qu.:238.0 1st Qu.:11.00 1st Qu.: 5.000 1st Qu.:1000 Median : 600 Median :333.0 Median :12.00 Median : 9.000 Median :1226 Mean : 695 Mean :342.1 Mean :11.52 Mean : 9.249 Mean :1218 3rd Qu.: 849 3rd Qu.:434.0 3rd Qu.:12.00 3rd Qu.:13.000 3rd Qu.:1430 Max. :1920 Max. :567.0 Max. :12.00 Max. :19.000 Max. :1634 fit.cluster Min. :2 1st Qu.:2 Median :2 Mean :2 3rd Qu.:2 Max. :2
Capacity Occupancy Month Day Min. : 220.0 Min. : 0.0 Min. :11.00 Min. : 1.000 1st Qu.: 317.0 1st Qu.: 62.0 1st Qu.:11.00 1st Qu.: 6.000 Median : 470.0 Median :103.0 Median :11.00 Median :10.000 Mean : 580.5 Mean :100.4 Mean :11.48 Mean : 9.572 3rd Qu.: 788.0 3rd Qu.:143.0 3rd Qu.:12.00 3rd Qu.:13.000 Max. :1268.0 Max. :174.0 Max. :12.00 Max. :19.000 Time fit.cluster Min. : 732 Min. :2 1st Qu.: 850 1st Qu.:2 Median :1026 Median :2 Mean :1099 Mean :2 3rd Qu.:1327 3rd Qu.:2 Max. :1634 Max. :2
Capacity Occupancy Month Day Min. : 220 Min. : 2.0 Min. :11.00 Min. : 1.000 1st Qu.: 485 1st Qu.: 84.0 1st Qu.:11.00 1st Qu.: 5.000 Median : 690 Median : 188.0 Median :12.00 Median : 9.000 Mean : 785 Mean : 245.6 Mean :11.56 Mean : 9.312 3rd Qu.:1010 3rd Qu.: 359.8 3rd Qu.:12.00 3rd Qu.:13.000 Max. :1920 Max. :1329.0 Max. :12.00 Max. :19.000 Time fit.cluster Min. :732.0 Min. :2 1st Qu.:826.0 1st Qu.:2 Median :859.0 Median :2 Mean :867.2 Mean :2 3rd Qu.:927.0 3rd Qu.:2 Max. :959.0 Max. :2
Capacity Occupancy Month Day Min. : 220.0 Min. : 1.0 Min. :11.00 Min. : 1.000 1st Qu.: 485.0 1st Qu.: 215.0 1st Qu.:11.00 1st Qu.: 5.000 Median : 690.0 Median : 396.0 Median :12.00 Median : 9.000 Mean : 766.1 Mean : 451.2 Mean :11.53 Mean : 9.232 3rd Qu.:1010.0 3rd Qu.: 647.0 3rd Qu.:12.00 3rd Qu.:13.000 Max. :1920.0 Max. :1586.0 Max. :12.00 Max. :19.000 Time fit.cluster Min. :1002 Min. :2 1st Qu.:1109 1st Qu.:2 Median :1226 Median :2 Mean :1215 Mean :2 3rd Qu.:1327 3rd Qu.:2 Max. :1427 Max. :2
Capacity Occupancy Month Day Min. : 220.0 Min. : 0 Min. :11.00 Min. : 1.000 1st Qu.: 485.0 1st Qu.: 207 1st Qu.:11.00 1st Qu.: 6.000 Median : 690.0 Median : 386 Median :12.00 Median :10.000 Mean : 763.3 Mean : 430 Mean :11.53 Mean : 9.656 3rd Qu.:1010.0 3rd Qu.: 602 3rd Qu.:12.00 3rd Qu.:14.000 Max. :1920.0 Max. :1488 Max. :12.00 Max. :19.000 Time fit.cluster Min. :1430 Min. :2 1st Qu.:1500 1st Qu.:2 Median :1532 Median :2 Mean :1547 Mean :2 3rd Qu.:1603 3rd Qu.:2 Max. :1634 Max. :2
Cluster 3
- Los aparcamientos con ocupación alta (valor superior al tercer cuartil, que es de 2194 plazas) presentan una ocupación similar durante los días del periodo analizado.
- Los aparcamientos con ocupación intermedia (valor superior al primer cuartil, que es de 1102 plazas e inferior al tercer cuartil, que es de 2194 plazas) presentan una ocupación similar durante los días del periodo analizado.
- Los aparcamientos con baja ocupación (valor inferior al primer cuartil que es de 1102 puestos) presentan una ocupación similar durante los días del periodo analizado.
- Durante las primeras horas del día (valor inferior al primer cuartil que es 11:01) se presenta una ocupación baja, con una media de 1351 puestos, y en la que el 75% de los registros (hasta el tercer cuartil) alcanzan un máximo de 1573 puestos, este es un valor inferior a la media de este cluster (2194 puestos).
- En las horas intermedias del día (valor superior al primer cuartil 11:01 e inferior al tercer cuartil 14:59) se produce una mayor ocupación, con una media de 1819 puestos, y en la que el 75% de los registros (hasta el tercer cuartil) alcanzan un máximo de 2567 puestos.
- Durante las últimas horas del día (valor por encima del tercer cuartil que son las 14:59) hay una ocupación intermedia, con una media de 1308 puestos, y en la que el 75% de los registros (hasta el tercer cuartil) alcanzan un máximo de 2182 puestos.
In [70]:
# Días
# Días de Alta Ocupación
test = subset(cluster3, Occupancy > 2194)
summary(test)
boxplot(test$Day,
main = "High Occupancy",
xlab = "Time",
ylab = "Days of the Month",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Días de ocupación intermedia
test = subset(cluster3, Occupancy > 1102 & Occupancy < 2194)
summary(test)
boxplot(test$Day,
main = "Intermediate Occupancy",
xlab = "Time",
ylab = "Days of the Month",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Días de baja ocupación
test = subset(cluster3, Occupancy < 1102)
summary(test)
boxplot(test$Day,
main = "Low Occupancy",
xlab = "Time",
ylab = "Days of the Month",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Horas
# Primeras Horas
test = subset(cluster3, Time < 1101)
summary(test)
boxplot(test$Occupancy,
main = "Occupancy in the early hours",
xlab = "Cars",
ylab = "Stalls",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Horas Intermedias
test = subset(cluster3, Time > 1101 & Time < 1459)
summary(test)
boxplot(test$Occupancy,
main = "Occupancy at intermediate hours",
xlab = "Cars",
ylab = "Stalls",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
# Últimas Horas
test = subset(cluster3, Time > 1459)
summary(test)
boxplot(test$Occupancy,
main = "Occupancy in the last hours",
xlab = "Cars",
ylab = "Stalls",
col = "orange",
border = "brown",
horizontal = FALSE,
notch = TRUE)
Capacity Occupancy Month Day Time Min. :3053 Min. :2195 Min. :10 Min. : 1.00 Min. : 856 1st Qu.:3883 1st Qu.:2556 1st Qu.:10 1st Qu.: 8.00 1st Qu.:1200 Median :3883 Median :2834 Median :11 Median :15.00 Median :1328 Mean :4105 Mean :2882 Mean :11 Mean :15.28 Mean :1318 3rd Qu.:4675 3rd Qu.:3185 3rd Qu.:12 3rd Qu.:22.00 3rd Qu.:1459 Max. :4675 Max. :4327 Max. :12 Max. :31.00 Max. :1634 fit.cluster Min. :3 1st Qu.:3 Median :3 Mean :3 3rd Qu.:3 Max. :3
Capacity Occupancy Month Day Time Min. :1920 Min. :1103 Min. :10.00 Min. : 1.00 Min. : 755 1st Qu.:2009 1st Qu.:1229 1st Qu.:10.00 1st Qu.: 9.00 1st Qu.:1127 Median :3053 Median :1363 Median :11.00 Median :15.00 Median :1304 Mean :2979 Mean :1436 Mean :10.86 Mean :15.38 Mean :1288 3rd Qu.:3103 3rd Qu.:1551 3rd Qu.:11.00 3rd Qu.:22.00 3rd Qu.:1457 Max. :4675 Max. :2193 Max. :12.00 Max. :31.00 Max. :1634 fit.cluster Min. :3 1st Qu.:3 Median :3 Mean :3 3rd Qu.:3 Max. :3
Capacity Occupancy Month Day Time Min. :1920 Min. : 385.0 Min. :10.00 Min. : 1.00 Min. : 755 1st Qu.:2937 1st Qu.: 727.0 1st Qu.:10.00 1st Qu.: 9.00 1st Qu.: 930 Median :3103 Median : 904.0 Median :11.00 Median :14.00 Median :1159 Mean :3284 Mean : 865.7 Mean :10.79 Mean :14.83 Mean :1202 3rd Qu.:3103 3rd Qu.:1016.0 3rd Qu.:11.00 3rd Qu.:20.00 3rd Qu.:1501 Max. :4675 Max. :1101.0 Max. :12.00 Max. :31.00 Max. :1634 fit.cluster Min. :3 1st Qu.:3 Median :3 Mean :3 3rd Qu.:3 Max. :3
Capacity Occupancy Month Day Time Min. :1920 Min. : 467 Min. :10.00 Min. : 1.00 Min. : 755.0 1st Qu.:3053 1st Qu.: 902 1st Qu.:10.00 1st Qu.: 8.00 1st Qu.: 900.0 Median :3883 Median :1140 Median :11.00 Median :14.00 Median : 957.0 Mean :3687 Mean :1351 Mean :10.86 Mean :14.83 Mean : 949.2 3rd Qu.:4675 3rd Qu.:1573 3rd Qu.:11.00 3rd Qu.:21.00 3rd Qu.:1029.0 Max. :4675 Max. :3384 Max. :12.00 Max. :31.00 Max. :1100.0 fit.cluster Min. :3 1st Qu.:3 Median :3 Mean :3 3rd Qu.:3 Max. :3
Capacity Occupancy Month Day Time Min. :1920 Min. : 474 Min. :10.00 Min. : 1.00 Min. :1102 1st Qu.:2937 1st Qu.:1225 1st Qu.:10.00 1st Qu.: 9.00 1st Qu.:1203 Median :3053 Median :1444 Median :11.00 Median :15.00 Median :1303 Mean :3227 Mean :1819 Mean :10.89 Mean :15.19 Mean :1289 3rd Qu.:3883 3rd Qu.:2567 3rd Qu.:11.00 3rd Qu.:21.00 3rd Qu.:1400 Max. :4675 Max. :4270 Max. :12.00 Max. :31.00 Max. :1458 fit.cluster Min. :3 1st Qu.:3 Median :3 Mean :3 3rd Qu.:3 Max. :3
Capacity Occupancy Month Day Time Min. :1920 Min. : 385 Min. :10.00 Min. : 1.00 Min. :1500 1st Qu.:2937 1st Qu.:1076 1st Qu.:10.00 1st Qu.: 9.00 1st Qu.:1527 Median :3053 Median :1308 Median :11.00 Median :15.00 Median :1557 Mean :3211 Mean :1617 Mean :10.87 Mean :15.35 Mean :1566 3rd Qu.:3883 3rd Qu.:2182 3rd Qu.:11.00 3rd Qu.:22.00 3rd Qu.:1625 Max. :4675 Max. :4327 Max. :12.00 Max. :31.00 Max. :1634 fit.cluster Min. :3 1st Qu.:3 Median :3 Mean :3 3rd Qu.:3 Max. :3
Conclusiones generales
No existe una correlación directa entre el nivel de ocupación y el día del mes, pero sí entre el nivel de ocupación y la hora del día.
Los valores de ocupación más altos se dan en las horas intermedias (entre las 10:00 y las 14:59 aproximadamente), mientras que los valores de ocupación más bajos se registran en las primeras horas del día (antes de las 10:00).
También se observa un ligero aumento de los niveles de ocupación de la segunda quincena de noviembre a diciembre en comparación con el periodo comprendido entre octubre y la primera quincena de noviembre.
Referencias
- K-Means Clustering: Agrupamiento con Minería de datos (s.f.). En estrategiastrading. Recuperado el 30 de junio de 2020 de https://estrategiastrading.com/k-means/