Se inicia con un análisis exploratorio y descriptivo de la base de datos con la finalidad de identificar el tipo de atributos y su comportamiento.
## 'data.frame': 8322 obs. of 13 variables:
## $ id : num 1147 1169 1350 5992 1212 ...
## $ zona : chr "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
## $ piso : chr NA NA NA "02" ...
## $ estrato : num 3 3 3 4 5 5 4 5 5 5 ...
## $ preciom : num 250 320 350 400 260 240 220 310 320 780 ...
## $ areaconst : num 70 120 220 280 90 87 52 137 150 380 ...
## $ parqueaderos: num 1 1 2 3 1 1 2 2 2 2 ...
## $ banios : num 3 2 2 5 2 3 2 3 4 3 ...
## $ habitaciones: num 6 3 4 3 3 3 3 4 6 3 ...
## $ tipo : chr "Casa" "Casa" "Casa" "Casa" ...
## $ barrio : chr "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
## $ longitud : num -76.5 -76.5 -76.5 -76.5 -76.5 ...
## $ latitud : num 3.43 3.43 3.44 3.44 3.46 ...
## id zona piso estrato
## Min. : 1 Length:8322 Length:8322 Min. :3.000
## 1st Qu.:2080 Class :character Class :character 1st Qu.:4.000
## Median :4160 Mode :character Mode :character Median :5.000
## Mean :4160 Mean :4.634
## 3rd Qu.:6240 3rd Qu.:5.000
## Max. :8319 Max. :6.000
## NA's :3 NA's :3
## preciom areaconst parqueaderos banios
## Min. : 58.0 Min. : 30.0 Min. : 1.000 Min. : 0.000
## 1st Qu.: 220.0 1st Qu.: 80.0 1st Qu.: 1.000 1st Qu.: 2.000
## Median : 330.0 Median : 123.0 Median : 2.000 Median : 3.000
## Mean : 433.9 Mean : 174.9 Mean : 1.835 Mean : 3.111
## 3rd Qu.: 540.0 3rd Qu.: 229.0 3rd Qu.: 2.000 3rd Qu.: 4.000
## Max. :1999.0 Max. :1745.0 Max. :10.000 Max. :10.000
## NA's :2 NA's :3 NA's :1605 NA's :3
## habitaciones tipo barrio longitud
## Min. : 0.000 Length:8322 Length:8322 Min. :-76.59
## 1st Qu.: 3.000 Class :character Class :character 1st Qu.:-76.54
## Median : 3.000 Mode :character Mode :character Median :-76.53
## Mean : 3.605 Mean :-76.53
## 3rd Qu.: 4.000 3rd Qu.:-76.52
## Max. :10.000 Max. :-76.46
## NA's :3 NA's :3
## latitud
## Min. :3.333
## 1st Qu.:3.381
## Median :3.416
## Mean :3.418
## 3rd Qu.:3.452
## Max. :3.498
## NA's :3
Del anterior análisis exploratorio y descriptivo se identifica lo siguiente:
-La base de datos está compuesta de 13 variables y 8322 registros, donde 4 variables son de tipo texto y el resto numéricas.
-Se identifica una variable que se descarta para el análisis la cual es ID, ya que solo funciona como identificador del predio y no aporta informacion relevante para el desarrollo del trabajo.
-La variable piso es de tipo texto cuando, debería ser numérica, en la limpieza de datos se debe identificar que registro está convirtiendo esta variable en tipo texto y eliminarlo.
Posteriormente se procede a identificar si hay faltantes en la base de datos.
Debido a la gran cantidad de faltantes en parqueadero y piso se procede a realizar una tabla donde se pueda evidenciar si existen faltantes para las otras variables, ya que la escala del grafico no permite visualizarlo.
## .
## id 3
## zona 3
## piso 2638
## estrato 3
## preciom 2
## areaconst 3
## parqueaderos 1605
## banios 3
## habitaciones 3
## tipo 3
## barrio 3
## longitud 3
## latitud 3
De los anteriores resultados se identifica lo siguiente:
-La variable ID tiene 3 registros faltantes que se asocian a los mismos 3 registros faltantes de las otras variables. Estos registros deben ser identificados y eliminados en la limpieza, pues no son significativos para el análisis.
-La variable piso y parqueaderos son las variables con mayor cantidad de datos faltantes, se les debe dar un tratamiento, pues representan un alto porcentaje de la data.
Para iniciar la limpieza de datos se procede a identificar y eliminar los 3 datos faltantes en la variable ID
## [1] 8320 8321 8322
Del anterior resultado, se identifican que los registros 8320,8321 y 8322 tienen datos faltantes en la BD. Por lo tanto, se procede a eliminarlos. Por lo tanto, queda un dataset de 13 variables y 8319 registros. A continuación, se muestran los resultados.
## 'data.frame': 8319 obs. of 13 variables:
## $ id : num 1147 1169 1350 5992 1212 ...
## $ zona : chr "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
## $ piso : chr NA NA NA "02" ...
## $ estrato : num 3 3 3 4 5 5 4 5 5 5 ...
## $ preciom : num 250 320 350 400 260 240 220 310 320 780 ...
## $ areaconst : num 70 120 220 280 90 87 52 137 150 380 ...
## $ parqueaderos: num 1 1 2 3 1 1 2 2 2 2 ...
## $ banios : num 3 2 2 5 2 3 2 3 4 3 ...
## $ habitaciones: num 6 3 4 3 3 3 3 4 6 3 ...
## $ tipo : chr "Casa" "Casa" "Casa" "Casa" ...
## $ barrio : chr "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
## $ longitud : num -76.5 -76.5 -76.5 -76.5 -76.5 ...
## $ latitud : num 3.43 3.43 3.44 3.44 3.46 ...
Por otra parte, se procede a identificar si existe un valor atípico o mal tipificado en la variable piso que convierta la variable a tipo texto.
##
## 01 02 03 04 05 06 07 08 09 10 11 12
## 860 1450 1097 607 567 245 204 211 146 130 84 83
Como se puede observar en la anterior tabla de frecuencia, R está reconociendo los pisos como variable texto, por lo tanto, se procede a realizar el cambio a tipo numérico.
## 'data.frame': 8319 obs. of 13 variables:
## $ id : num 1147 1169 1350 5992 1212 ...
## $ zona : chr "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
## $ piso : num NA NA NA 2 1 1 1 1 2 2 ...
## $ estrato : num 3 3 3 4 5 5 4 5 5 5 ...
## $ preciom : num 250 320 350 400 260 240 220 310 320 780 ...
## $ areaconst : num 70 120 220 280 90 87 52 137 150 380 ...
## $ parqueaderos: num 1 1 2 3 1 1 2 2 2 2 ...
## $ banios : num 3 2 2 5 2 3 2 3 4 3 ...
## $ habitaciones: num 6 3 4 3 3 3 3 4 6 3 ...
## $ tipo : chr "Casa" "Casa" "Casa" "Casa" ...
## $ barrio : chr "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
## $ longitud : num -76.5 -76.5 -76.5 -76.5 -76.5 ...
## $ latitud : num 3.43 3.43 3.44 3.44 3.46 ...
Los anteriores resultados confirman el cambio de texto a número para la variable piso.
Por otra parte, se revisan nuevamente los datos faltantes.
## .
## id 0
## zona 0
## piso 2635
## estrato 0
## preciom 0
## areaconst 0
## parqueaderos 1602
## banios 0
## habitaciones 0
## tipo 0
## barrio 0
## longitud 0
## latitud 0
Como se puede observar, solo existen datos faltantes en las variables piso y parqueadero. Posteriormente, se procede a realizar un análisis de las variables categóricas para identificar si hay errores de tipografía en estas variables.
##
## Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
## 124 1920 1198 351 4726
##
## Apartamento Casa
## 5100 3219
Del anterior análisis descriptivo se identifica que los registros estan bien tipificados en toda la base de datos para las variables zona y tipo. En cuanto a la variable barrio, se decide eliminarla puesto que no será utilizada en el análisis, ya que no aporta informacion valiosa para ello y además es una variable que requiere bastante trabajo de limpieza de datos.
Posterior a la eliminación de la variable barrios, se procede a realizar estadísticas descriptivas para datos agrupados por zona y tipo con la finalidad de obtener medidas de centralidad y dispersión para las variables piso y parqueadero para completar los datos faltantes mediante imputación por la moda y la mediana respectivamente.
## # A tibble: 10 × 8
## # Groups: zona [5]
## zona tipo Promedio_piso Mediana_piso moda Max_piso Min_piso
## <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Zona Centro Apartamento 5 4 5 11 1
## 2 Zona Centro Casa 2 1 1 4 1
## 3 Zona Norte Apartamento 5 4 3 12 1
## 4 Zona Norte Casa 2 2 2 7 1
## 5 Zona Oeste Apartamento 5 5 3 12 1
## 6 Zona Oeste Casa 3 2 2 7 1
## 7 Zona Oriente Apartamento 3 2 1 5 1
## 8 Zona Oriente Casa 2 2 1 10 1
## 9 Zona Sur Apartamento 4 4 5 12 1
## 10 Zona Sur Casa 2 2 2 10 1
## # ℹ 1 more variable: Desviacion_Estandar_piso <dbl>
## # A tibble: 10 × 7
## # Groups: zona [5]
## zona tipo Promedio_parqueaderos Mediana_parqueaderos Max_parqueaderos
## <chr> <chr> <dbl> <dbl> <dbl>
## 1 Zona Centro Apar… 1 1 1
## 2 Zona Centro Casa 1 1 6
## 3 Zona Norte Apar… 1 1 4
## 4 Zona Norte Casa 2 2 10
## 5 Zona Oeste Apar… 2 2 7
## 6 Zona Oeste Casa 2 2 7
## 7 Zona Orien… Apar… 1 1 3
## 8 Zona Orien… Casa 1 1 6
## 9 Zona Sur Apar… 1 1 10
## 10 Zona Sur Casa 2 2 10
## # ℹ 2 more variables: Min_parqueaderos <dbl>,
## # Desviacion_Estandar_parqueaderos <dbl>
De los anteriores resultados, se puede observar:
Luego, se realiza la imputación de los faltantes para piso y parqueaderos, donde el piso es imputado por la moda y el parqueadero por la mediana.
Para este trabajo las casas solo podrán ir hasta un 4 piso. Por lo tanto, se va a reemplazar el tipo de vivienda por apartamento para aquellas casas que estén ubicadas en un piso mayor a el 4 piso.
Nuevamente se realiza el cálculo de estadísticos de centralidad y dispersión para observar si hubo algún cambio significativo.
## # A tibble: 10 × 8
## # Groups: zona [5]
## zona tipo Promedio_piso Mediana_piso moda Max_piso Min_piso
## <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Zona Centro Apartamento 5 5 5 11 1
## 2 Zona Centro Casa 1 1 1 4 1
## 3 Zona Norte Apartamento 4 3 3 12 1
## 4 Zona Norte Casa 2 2 2 4 1
## 5 Zona Oeste Apartamento 4 3 3 12 1
## 6 Zona Oeste Casa 2 2 2 4 1
## 7 Zona Oriente Apartamento 2 2 1 10 1
## 8 Zona Oriente Casa 2 1 1 4 1
## 9 Zona Sur Apartamento 5 5 5 12 1
## 10 Zona Sur Casa 2 2 2 4 1
## # ℹ 1 more variable: Desviacion_Estandar_piso <dbl>
## # A tibble: 10 × 7
## # Groups: zona [5]
## zona tipo Promedio_parqueaderos Mediana_parqueaderos Max_parqueaderos
## <chr> <chr> <dbl> <dbl> <dbl>
## 1 Zona Centro Apar… 1 1 1
## 2 Zona Centro Casa 1 1 6
## 3 Zona Norte Apar… 1 1 4
## 4 Zona Norte Casa 2 2 10
## 5 Zona Oeste Apar… 2 2 7
## 6 Zona Oeste Casa 2 2 7
## 7 Zona Orien… Apar… 1 1 3
## 8 Zona Orien… Casa 1 1 6
## 9 Zona Sur Apar… 1 1 10
## 10 Zona Sur Casa 2 2 10
## # ℹ 2 more variables: Min_parqueaderos <dbl>,
## # Desviacion_Estandar_parqueaderos <dbl>
Como se puede observar ya no existen casas ubicadas en un nivel superior al 4 piso y no hubo un cambio significativo en las medidas de centralidad y dispersión. Por otra parte, se procede a consultar nuevamente los faltantes para verificar si existe alguna variable con datos ausentes.
## .
## id 0
## zona 0
## piso 0
## estrato 0
## preciom 0
## areaconst 0
## parqueaderos 0
## banios 0
## habitaciones 0
## tipo 0
## longitud 0
## latitud 0
Finalmente, se logra ver que ya no existen datos faltantes en el Dataset.
Para iniciar con el método de PCA se deben normalizar los datos. Cabe destacar que esta metodología solo se puede aplicar a variables de tipo numéricas. Por lo tanto, se seleccionaron las variables precio, area, parqueaderos, banios y habitaciones. A continuación, se muestran los datos normalizados.
## preciom areaconst parqueaderos banios habitaciones
## 1 -0.5595498 -0.7339949 -0.7120692 -0.07793773 1.6406840
## 2 -0.3465670 -0.3842568 -0.7120692 -0.77811479 -0.4147626
## 3 -0.2552886 0.3152194 0.2415212 -0.77811479 0.2703863
## 4 -0.1031580 0.7349051 1.1951116 1.32241640 -0.4147626
## 5 -0.5291236 -0.5940997 -0.7120692 -0.77811479 -0.4147626
## 6 -0.5899759 -0.6150839 -0.7120692 -0.07793773 -0.4147626
Posterior a ello se aplica PCA a los datos normalizados y se obtienen n componentes como n variables utilizadas en este método, como se puede observar en la siguiente tabla:
## Standard deviations (1, .., p=5):
## [1] 1.7902709 0.9355834 0.6196102 0.5856678 0.4389648
##
## Rotation (n x k) = (5 x 5):
## PC1 PC2 PC3 PC4 PC5
## preciom 0.4719599 0.39550662 0.33917430 -0.2238936 0.6750265
## areaconst 0.4823039 -0.03931911 0.50690960 0.6124692 -0.3657337
## parqueaderos 0.4306228 0.44569125 -0.74028202 0.2351713 -0.1122512
## banios 0.4859816 -0.17504067 0.02669928 -0.7054197 -0.4846162
## habitaciones 0.3507459 -0.78278259 -0.28155485 0.1477521 0.4038873
Despues, se realiza el grafico de la varianza explicada por cada uno de los componentes calculados, esto ayuda a definir que componentes son las que se van a elegir para remplazar y reducir la cantidad de variables en un modelo (reducción de la dimensionalidad).
A continuación, se muestra la matriz de vectores propios, la cual tiene las coordenadas de cada uno de los vectores que sirven para calcular las coordenadas de los componentes principales mediante una multiplicación matricial de las variables por el valor de los vectores propios.
## PC1 PC2 PC3 PC4 PC5
## preciom 0.4719599 0.39550662 0.33917430 -0.2238936 0.6750265
## areaconst 0.4823039 -0.03931911 0.50690960 0.6124692 -0.3657337
## parqueaderos 0.4306228 0.44569125 -0.74028202 0.2351713 -0.1122512
## banios 0.4859816 -0.17504067 0.02669928 -0.7054197 -0.4846162
## habitaciones 0.3507459 -0.78278259 -0.28155485 0.1477521 0.4038873
Finalmente, se muestran las coordenadas de los datos originales transformadas mediante la metodología PCA (componentes).
## PC1 PC2 PC3 PC4 PC5
## [1,] -0.3871400 -1.78046524 -0.4987454 -0.19433454 0.6710876
## [2,] -1.1791532 0.02154676 0.3108052 0.16240592 0.1960941
## [3,] -0.1477625 -0.08117055 -0.2024971 0.89586612 0.1715686
## [4,] 1.3175972 0.55614752 -0.3950917 -0.23988158 -1.2809483
## [5,] -1.3665207 -0.04240479 0.1425153 0.07475691 0.1496101
## [6,] -1.0650881 -0.18820663 0.1299329 -0.41838958 -0.2231093
Es importante revisar la contribución de cada una de las variables a cada componente. A continuación se muestra la contribución de cada variable a cada componente.
Como se puede observar en la anterior imagen, las componentes 1 y 2 son las que mayor cantidad de contribución por variables tienen, principalmente la componente 1, lo que puede estar estrechamente relacionado con la varianza explicada vista anteriormente.
Para complementar el análisis, se realiza el circulo de correlación de las variables el cual explica la correlación entre variables y el aporte a las componentes a través de vectores.
El anterior grafico nos muestra que:
-Las variables precio, area construida, banios y parqueaderos tienen un mayor aporte a la componente 1. Sin embargo, las variables parqueadero y precio crecen simultaneamente en ambas componentes, mientras que area construida y banios a medida que crece en la componente 1 decrece en la componente 2, es decir son inversas.
-La variable habitacion tiene un mayor aporte en la componente 2 y es la variable con mayor contribución, adicional, es inversa a la contribucion de la componente 1.
-Las variables parqueadero y precio tienen poca relacion con el numero de habitaciones, esto puede ser un indicio de que su correlacion no es lineal. Por otra parte, las variables area construida y banios tienen mas relacion con la variable habitaciones.
-Las variables area construida y banios tienen una alta relacion, al igual que las variables parqueaderos y precio, lo que indica que puede existir una correlacion lienal entre estos pares de variables.
Finalmente se realiza la nube de individuos, para observar la relacion de los individuos en el plano.
La anterior grafica nos muestra la relacion entre los individuos, lo que
indica una similitud entre las variables estudiadas, por ejemplo el
individuo 5955 y 6073 tienen variables similares. para comprobar lo
dicho anteriormente, se observan los registros en la data orginal.
## # A tibble: 2 × 12
## # Groups: zona, tipo [2]
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 6766 Zona S… 2 5 1000 900 5 10 10
## 2 4564 Zona N… 2 5 1940 734 3 8 10
## # ℹ 3 more variables: tipo <chr>, longitud <dbl>, latitud <dbl>
Finalmente, se realiza un biplot para observar el comportamiento de los individuos en relacion con las variables.
esta grafica se calculo mediante el siguiente código, por efectos de velocidad de computo se ejecutó el código una unica vez y se guadro la imagen en local.
g8<-fviz_pca_biplot(componentes,
repel=TRUE,
habillage=vivienda$zona,
col.var="#6429DB",
col.ind=c("#C0C1C3","#F48020")
)
g8
En la gráfica se pueden observar grupos de colores por zona, adicionalmente la zona norte, oeste y sur son las que zonas que más aportan a las variables observadas en la gráfica.
Para concluir sobre esta metodología, es importante conocer su razon de ser, la cual esta enfocada principalmente en la reducción de la dimensionalidad (reducción de variables). Pese a que se pierde interpretabilidad en los datos al trabajar con coordenadas de componentes, es una metodología bastante utilizada y con buenos resultados al tratar de reducir dimensionalidad de los datos en la utilización de estos en un algoritmo de aprendizaje automático Machinne Learning (ML).
Como pasos posteriores, si se quisiera utilizar la informacion, se deben eliminar las variables estudiadas del data set y reemplazar esas variables por los datos de las dos primeras componentes que logran explicar el 81,6% de la variabilidad de la data original y introducir la data al modelo deseado.
El análisis de conglomerados, también conocido como agrupamiento (clustering), es un método estadístico usado para agrupar objetos similares en función de sus características. Mediante este análisis se logra identificar grupos muy parecidos (homogéneos) de objetos o individuos.
En este caso, se identifican las variables a utilizar en el método, las cuales son:
-Variables categóricas o cualitativas
-zona (nominal) -tipo (nominal) -estrato (ordinal) -piso (ordinal)
-Variables numéricas o cuantitativas
-Precio -Area construida -# de Habitaciones -# de Parqueaderos -# de Baños
Para el desarrollo de este método se debe hacer un preprocesamiento de los datos que implica:
-Aplicar One-Hot encoding a las variables Categóricas nominales. -Normalizar las variables numéricas
One-Hot encoding consiste en convertir cada categoria de una variable categorica en una variable independiente binaria.
Se procede entonces a realizar dicha transformación de la data.
Posteriormente, se debe determinar el número de clústeres o grupos óptimos para aplicar el método, para determinar el número de clústeres optimo (k) se utilizó el siguiente código:
fviz_nbclust(vivienda2z, pam, method = "silhouette")** # Determinar el número óptimo de clusters
Nota: por efectos de rendimiento el código se ejecutó una única vez y se guardó el resultado como una imagen que se muestra a continuación.
Posteriormente, se elige la metodología de clustering, para este caso se utilizará la agrupación de K-Prototipos, la cual es una extensión de la agrupación de K-Medias en la que se puede manejar datos tanto numéricos como categóricos. El algoritmo funciona asignando puntos de datos numéricos al centroide más cercano utilizando la distancia euclidiana, y puntos de datos categóricos al modo más cercano utilizando una distancia de coincidencia simple.
## # NAs in variables:
## zona piso estrato preciom areaconst parqueaderos
## 0 0 0 0 0 0
## banios habitaciones tipo
## 0 0 0
## 0 observation(s) with NAs.
##
## Estimated lambda: 39122.06
## # A tibble: 20 × 13
## # Groups: zona, tipo [4]
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <fct> <fct> <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1147 Zona … 1 3 250 70 1 3 6
## 2 1169 Zona … 1 3 320 120 1 2 3
## 3 1350 Zona … 1 3 350 220 2 2 4
## 4 5992 Zona … 2 4 400 280 3 5 3
## 5 1212 Zona … 1 5 260 90 1 2 3
## 6 1724 Zona … 1 5 240 87 1 3 3
## 7 2326 Zona … 1 4 220 52 2 2 3
## 8 4386 Zona … 1 5 310 137 2 3 4
## 9 1209 Zona … 2 5 320 150 2 4 6
## 10 1592 Zona … 2 5 780 380 2 3 3
## 11 4057 Zona … 2 6 750 445 2 7 6
## 12 4460 Zona … 2 4 625 355 3 5 5
## 13 6081 Zona … 2 5 750 237 2 6 6
## 14 7497 Zona … 2 6 520 98 2 2 2
## 15 7824 Zona … 2 4 600 160 1 4 5
## 16 7987 Zona … 2 5 420 200 4 4 5
## 17 3495 Zona … 3 5 490 118 2 4 4
## 18 5424 Zona … 3 4 320 108 2 3 3
## 19 6271 Zona … 3 5 385 103 2 2 3
## 20 6857 Zona … 3 3 100 49 1 1 2
## # ℹ 4 more variables: tipo <fct>, longitud <dbl>, latitud <dbl>, cluster <fct>
Como se puede observar, el método realizó la agrupación de los datos clasificándolos en grupos 1 y 2.
Como se puede observar, el método pareciera que realizo una agrupación por precio, pues el grupo 1 corresponde a precios altos y el 2 a precios bajos, tambien se puede observar que la separación de los individuos en clúster no es perfecta, es decir no hay una linea de corte exacta donde se dividan los dos grupos, esto puede deberse al aporte de las otras Variables utilizadas en el análisis. Por lo tanto, para poder confirmar esta hipótesis es necesario realizar estadística descriptiva teniendo en cuenta la nueva variable generada de clúster.
Por consiguiente, se realiza un análisis descriptivo agrupado por el clúster generado. Inicialmente, se realiza un box plot para las variables precio, area construida, parqueaderos (park), banios y habitaciones.
De acuerdo con los anteriores boxplot, se puede observar a simple vista que algunas variables tienen más cantidad de datos atipicos si se analizan por los grupos o clusters generados. Un claro ejemplo de ello es el precio, los parqueaderos, banios y habitaciones. Mientras que el area presenta gran cantidad de datos atipicos, lo que indica que posiblemente fue una de las variables que menos incidio en la clusterización.
Finalmente, se hace el calculo de las estadisticas descriptivas para cada tipo de variable.
## # A tibble: 2 × 6
## cluster Promedio_precio Mediana_precio Max_precio Min_precio Desviacion_precio
## <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 1004 900 1999 255 324
## 2 2 307 290 730 58 142
Análisis Descriptivo precio:
Promedio (Mean): El precio promedio en este cluster es de 1004, lo que indica que los precios en este grupo son significativamente altos en comparación con el Cluster 2.
Mediana: La mediana de 900 sugiere que el 50% de los precios en este cluster son menores o iguales a 900, lo que indica una distribución con precios más altos.
Máximo (Max): El precio máximo de 1999 es bastante elevado, lo que sugiere la presencia de productos o servicios con precios significativamente altos en este grupo.
Mínimo (Min): El precio mínimo es de 255, lo que muestra que hay elementos con precios relativamente bajos dentro del cluster.
Desviación Estándar (Standard Deviation): La desviación estándar de 324 indica una considerable dispersión de precios, lo que refleja una alta variabilidad entre los precios en este cluster.
Promedio (Mean): El precio promedio en este cluster es de 307, considerablemente más bajo que en el Cluster 1, lo que sugiere que este cluster agrupa elementos con precios más bajos.
Mediana: La mediana de 290 muestra que la mitad de los precios en este cluster son menores o iguales a 290, lo que refuerza la idea de que los precios en este cluster son bajos en general.
Máximo (Max): El precio máximo de 730, aunque significativamente menor que el máximo en el Cluster 1, sigue siendo considerable en el contexto de este cluster.
Mínimo (Min): El precio mínimo es de 58, indicando la presencia de elementos con precios muy bajos.
Desviación Estándar (Standard Deviation): La desviación estándar de 142 indica menos variabilidad en los precios comparado con el Cluster 1, sugiriendo una mayor uniformidad en los precios de este grupo.
## # A tibble: 2 × 6
## cluster Promedio_area Mediana_area Max_area Min_area Desviacion_area
## <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 362 310 1745 100 189
## 2 2 133 104 1365 30 87
Análisis Descriptivo area:
Promedio (Mean): El área promedio de este cluster es de 362. Esto indica que, en general, las áreas en este cluster son mayores en comparación con el Cluster 2.
Mediana: La mediana de 310 nos muestra que el 50% de las áreas en este cluster son menores o iguales a 310, lo que sugiere una distribución sesgada hacia áreas más pequeñas, considerando que la mediana es menor que el promedio.
Máximo (Max): El área máxima en este cluster es de 1745, que es bastante alta, lo que sugiere la presencia de valores atípicos o áreas muy grandes dentro de este grupo.
Mínimo (Min): El área mínima es de 100, lo que indica que hay áreas relativamente pequeñas también.
Desviación Estándar (Standard Deviation): Con una desviación estándar de 189, este cluster muestra una dispersión significativa en los tamaños de las áreas. Esto indica que hay una gran variabilidad en los datos.
Promedio (Mean): El área promedio de 133 es significativamente menor que en el Cluster 1, lo que indica que las áreas en este cluster son más pequeñas en general.
Mediana: La mediana de 104 es nuevamente menor que el promedio, sugiriendo una distribución con una cola larga hacia áreas más grandes.
Máximo (Max): El área máxima es de 1365, lo que, aunque es grande, es menor que el máximo en el Cluster 1.
Mínimo (Min): El área mínima es de 30, indicando que este cluster incluye áreas muy pequeñas.
Desviación Estándar (Standard Deviation): La desviación estándar de 87 indica menos variabilidad en las áreas comparado con el Cluster 1, lo que sugiere que las áreas en este cluster son más uniformes en tamaño.
## # A tibble: 2 × 6
## cluster Promedio_parqueaderos Mediana_parqueaderos Max_parqueaderos
## <fct> <dbl> <dbl> <dbl>
## 1 1 3 3 10
## 2 2 1 1 10
## # ℹ 2 more variables: Min_parqueaderos <dbl>, Desviacion_parqueaderos <dbl>
Análisis Descriptivo parqueaderos:
Promedio (Mean): El promedio de parqueaderos en este cluster es 3, lo que sugiere que, en general, las propiedades o espacios en este grupo tienden a tener una mayor cantidad de parqueaderos disponibles.
Mediana: La mediana de 3 indica que la mitad de las propiedades tienen 3 o menos parqueaderos, lo que coincide con el promedio, sugiriendo una distribución relativamente simétrica.
Máximo (Max): El máximo número de parqueaderos en este cluster es 10, lo que indica que algunas propiedades tienen un número significativamente alto de parqueaderos.
Mínimo (Min): El mínimo número de parqueaderos es 1, lo que sugiere que hay algunas propiedades con muy pocos parqueaderos en este cluster.
Desviación Estándar (Standard Deviation): La desviación estándar de 2 sugiere una moderada dispersión en el número de parqueaderos, indicando que aunque hay propiedades con un número alto de parqueaderos, muchas tienen una cantidad más cercana a la mediana.
Promedio (Mean): El promedio de parqueaderos en este cluster es 1, indicando que en este grupo las propiedades tienden a tener muy pocos parqueaderos disponibles.
Mediana: La mediana de 1 confirma que la mayoría de las propiedades en este cluster tienen solo 1 parqueadero.
Máximo (Max): El máximo número de parqueaderos en este cluster es también 10, similar al Cluster 1, aunque es menos común en este grupo.
Mínimo (Min): El mínimo de 1 sugiere que muchas propiedades en este cluster tienen solo un parqueadero.
Desviación Estándar (Standard Deviation): La desviación estándar de 1 indica poca variabilidad en la cantidad de parqueaderos en este cluster, lo que refuerza la homogeneidad en el número de parqueaderos disponibles en las propiedades de este grupo.
## # A tibble: 2 × 6
## cluster Promedio_banios Mediana_banios Max_banios Min_banios Desviacion_banios
## <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 5 5 10 0 1
## 2 2 3 2 10 0 1
Análisis Descriptivo banios:
Promedio (Mean): El promedio de baños en este cluster es 5, lo que sugiere que, en general, las propiedades en este grupo tienden a tener un número moderado a alto de baños.
Mediana: La mediana de 5 indica que la mitad de las propiedades tienen 5 o menos baños, lo que coincide con el promedio, sugiriendo una distribución simétrica en el número de baños.
Máximo (Max): El número máximo de baños en este cluster es 10, lo que indica la existencia de algunas propiedades con un número considerablemente alto de baños.
Mínimo (Min): El número mínimo de baños es 0, lo que sugiere que hay propiedades en este cluster que no cuentan con baños, lo cual podría corresponder a espacios que no son residenciales o están en construcción.
Desviación Estándar (Standard Deviation): La desviación estándar de 1 indica una variabilidad baja en el número de baños entre las propiedades de este cluster, sugiriendo que la mayoría tienen un número de baños cercano a la mediana de 5.
Promedio (Mean): El promedio de baños en este cluster es 3, lo que indica que las propiedades en este grupo tienden a tener un número menor de baños en comparación con el Cluster 1.
Mediana: La mediana de 2 sugiere que la mitad de las propiedades tienen 2 o menos baños, lo que indica una distribución asimétrica, con una tendencia hacia un menor número de baños.
Máximo (Max): Al igual que en el Cluster 1, el número máximo de baños es 10, indicando la existencia de algunas propiedades con un número alto de baños en este cluster también.
Mínimo (Min): El número mínimo de baños es 0, similar al Cluster 1, lo que sugiere que hay propiedades sin baños en este cluster también.
Desviación Estándar (Standard Deviation): La desviación estándar de 1 indica que hay una baja variabilidad en el número de baños entre las propiedades en este cluster, con la mayoría de las propiedades concentrándose cerca de la mediana de 2.
## # A tibble: 2 × 6
## cluster Promedio_habitaciones Mediana_habitaciones Max_habitaciones
## <fct> <dbl> <dbl> <dbl>
## 1 1 4 4 10
## 2 2 3 3 10
## # ℹ 2 more variables: Min_habitaciones <dbl>, Desviacion_habitaciones <dbl>
Análisis Descriptivo habitaciones:
Promedio (Mean): El promedio de habitaciones en este cluster es 4, lo que sugiere que, en general, las propiedades en este grupo tienden a tener un número moderado de habitaciones.
Mediana: La mediana de 4 indica que la mitad de las propiedades tienen 4 o menos habitaciones, lo que coincide con el promedio, sugiriendo una distribución simétrica en el número de habitaciones.
Máximo (Max): El número máximo de habitaciones en este cluster es 10, lo que indica que hay algunas propiedades con un número considerablemente alto de habitaciones.
Mínimo (Min): El número mínimo de habitaciones es 0, lo que sugiere que hay propiedades en este cluster que no cuentan con habitaciones, lo cual podría corresponder a espacios vacíos, oficinas, o propiedades en construcción.
Promedio (Mean): El promedio de habitaciones en este cluster es 3, lo que indica que las propiedades en este grupo tienden a tener un número menor de habitaciones en comparación con el Cluster 1.
Mediana: La mediana de 3 sugiere que la mitad de las propiedades tienen 3 o menos habitaciones, lo que indica una distribución simétrica en este cluster.
Máximo (Max): El número máximo de habitaciones en este cluster es también 10, similar al Cluster 1, lo que sugiere que hay algunas propiedades con un gran número de habitaciones también en este grupo.
Mínimo (Min): Al igual que en el Cluster 1, el número mínimo de habitaciones es 0, lo que podría indicar la presencia de propiedades sin habitaciones.
Finalmente, se puede concluir que el Cluster 1 tiende a agrupar propiedades grandes y costosas, con una mayor cantidad de parqueaderos y habitaciones. La alta variabilidad en áreas y precios sugiere una gama más amplia de tipos de propiedades dentro de este grupo.
Por otra parte ,el Cluster 2 se caracteriza por propiedades más pequeñas y asequibles, con menos parqueaderos y habitaciones. La menor variabilidad en las características de las propiedades sugiere una mayor uniformidad en este grupo.
Estos perfiles indican que el Cluster 1 probablemente agrupa propiedades de gama alta o lujosas, mientras que el Cluster 2 representa opciones más estándar o económicas. La diferenciación en áreas, precios, parqueaderos y habitaciones refleja claramente los distintos segmentos de mercado representados por cada cluster.
Finalmente, si la data se fuera a utilizar en un algoritmo de ML se podrian eliminar variables como el estrato, el numero de pisos e inclusive la zona puesto que la clusterizacion agrupa bien estas caracteristicas.
El Análisis de Correspondencia es un método estadístico utilizado para representar posibles asociaciones entre variables categóricas, es decir la asociación entre sus categorías, con el fin establecer si existe, patrones o estructuras en los datos
Este método estadístico es de tipo exploratorio y complementario de otros tipos de análisis como los modelos de regresión logística.
Para iniciar con el metodo se escogen las variables categoricas que van a utilizar las cuales son:
-Zona (nominal) -Tipo (nominal) -Estrato (ordinal) -Piso (ordinal)
posteriormente, se realizan tablas de contingencia para todas las posibles combinaciones de estas variables, una tabla de contigencia es una tabla de frecuencia de 2 atributos o variables.
Del mismo modo se realizan 6 pruebas de hipotesis para cada tabla de contingencia en donde se quiere evaluar si los pares de variables son dependientes o no.
Por lo tanto:
H0: X & Y son independientes H1: X & Y son dependientes
Si p-valor <= 0,05 entonces se rechaza h0, por lo tanto el par de variables seria dependiente, lo que quiere decir que tiene una relación y sus datos dependen entre si.
Tabla 1: zona vs tipo
##
## Apartamento Casa
## Zona Centro 24 100
## Zona Norte 1199 721
## Zona Oeste 1035 163
## Zona Oriente 63 288
## Zona Sur 2790 1936
##
## Pearson's Chi-squared test
##
## data: tabla1
## X-squared = 700.17, df = 4, p-value < 2.2e-16
Tabla 2: zona vs estrato
##
## 3 4 5 6
## Zona Centro 105 14 4 1
## Zona Norte 572 407 769 172
## Zona Oeste 54 84 290 770
## Zona Oriente 340 8 2 1
## Zona Sur 382 1616 1685 1043
##
## Pearson's Chi-squared test
##
## data: tabla2
## X-squared = 3830.4, df = 12, p-value < 2.2e-16
tabla 3: zona vs piso
##
## 1 2 3 4 5 6 7 8 9 10 11 12
## Zona Centro 79 16 8 5 14 0 0 0 0 0 2 0
## Zona Norte 177 665 598 129 117 33 33 39 32 27 33 37
## Zona Oeste 86 188 460 99 84 80 57 43 41 28 20 12
## Zona Oriente 217 63 54 8 8 0 0 0 0 1 0 0
## Zona Sur 490 1598 712 366 975 132 114 129 73 74 29 34
##
## Pearson's Chi-squared test
##
## data: tabla3
## X-squared = 2035.2, df = 44, p-value < 2.2e-16
tabla 4: tipo vs estrato
##
## 3 4 5 6
## Apartamento 641 1408 1770 1292
## Casa 812 721 980 695
##
## Pearson's Chi-squared test
##
## data: tabla4
## X-squared = 224.56, df = 3, p-value < 2.2e-16
tabla 5: tipo vs piso
##
## 1 2 3 4 5 6 7 8 9 10 11 12
## Apartamento 445 512 1308 545 1198 245 204 211 146 130 84 83
## Casa 604 2018 524 62 0 0 0 0 0 0 0 0
##
## Pearson's Chi-squared test
##
## data: tabla5
## X-squared = 3699.7, df = 11, p-value < 2.2e-16
tabla 6: piso vs estrato
##
## 1 2 3 4 5 6 7 8 9 10 11 12
## 3 391 438 335 96 177 2 2 7 0 3 2 0
## 4 215 609 418 178 410 56 64 71 44 38 14 12
## 5 277 854 564 209 381 104 86 80 53 58 39 45
## 6 166 629 515 124 230 83 52 53 49 31 29 26
##
## Pearson's Chi-squared test
##
## data: tabla6
## X-squared = 611.36, df = 33, p-value < 2.2e-16
Como se puede observar en los resultados anteriores de las pruebas de hipotesis para cada par de variables, se concluye que cada par de variables entre si son dependientes, es decir todas tienen dependencia entre si.
Posteriormente, se procede a aplicar la metodologia de analisis de correspondencia para cada una de las variables.
## **Results of the Correspondence Analysis (CA)**
## The row variable has 5 categories; the column variable has 4 categories
## The chi square of independence between the two variables is equal to 3830.435 (p-value = 0 ).
## *The results are available in the following objects:
##
## name description
## 1 "$eig" "eigenvalues"
## 2 "$col" "results for the columns"
## 3 "$col$coord" "coord. for the columns"
## 4 "$col$cos2" "cos2 for the columns"
## 5 "$col$contrib" "contributions of the columns"
## 6 "$row" "results for the rows"
## 7 "$row$coord" "coord. for the rows"
## 8 "$row$cos2" "cos2 for the rows"
## 9 "$row$contrib" "contributions of the rows"
## 10 "$call" "summary called parameters"
## 11 "$call$marge.col" "weights of the columns"
## 12 "$call$marge.row" "weights of the rows"
De la anterior grafica se puede interpretar para las variables zona y estrato que:
-La zona sur esta tiene una alta correspondencia con el estrato 6 -La zona Sur y norte están más relacionadas con los estratos 5 y 4 -La zona centro y oriente tiene una relación con el estrato 3
A continuación, se realiza el mismo análisis para las variables zona y piso.
## **Results of the Correspondence Analysis (CA)**
## The row variable has 5 categories; the column variable has 12 categories
## The chi square of independence between the two variables is equal to 2035.171 (p-value = 0 ).
## *The results are available in the following objects:
##
## name description
## 1 "$eig" "eigenvalues"
## 2 "$col" "results for the columns"
## 3 "$col$coord" "coord. for the columns"
## 4 "$col$cos2" "cos2 for the columns"
## 5 "$col$contrib" "contributions of the columns"
## 6 "$row" "results for the rows"
## 7 "$row$coord" "coord. for the rows"
## 8 "$row$cos2" "cos2 for the rows"
## 9 "$row$contrib" "contributions of the rows"
## 10 "$call" "summary called parameters"
## 11 "$call$marge.col" "weights of the columns"
## 12 "$call$marge.row" "weights of the rows"
De la anterior grafica se puede interpretar para las variables zona y estrato que:
-La zona norte y oeste comparten viviendas ubicadas en los pisos más altos, por lo general son apartamentos. -La zona centro y oriente tiene una relación con viviendas ubicadas en el piso 1. -La zona sur tiene una alta correspondencia con viviendas ubicadas en el nivel 5,4,2 y 8.
A continuación, se realiza el mismo análisis para las variables estrato y piso.
## **Results of the Correspondence Analysis (CA)**
## The row variable has 4 categories; the column variable has 12 categories
## The chi square of independence between the two variables is equal to 611.3571 (p-value = 1.187029e-107 ).
## *The results are available in the following objects:
##
## name description
## 1 "$eig" "eigenvalues"
## 2 "$col" "results for the columns"
## 3 "$col$coord" "coord. for the columns"
## 4 "$col$cos2" "cos2 for the columns"
## 5 "$col$contrib" "contributions of the columns"
## 6 "$row" "results for the rows"
## 7 "$row$coord" "coord. for the rows"
## 8 "$row$cos2" "cos2 for the rows"
## 9 "$row$contrib" "contributions of the rows"
## 10 "$call" "summary called parameters"
## 11 "$call$marge.col" "weights of the columns"
## 12 "$call$marge.row" "weights of the rows"
De la anterior grafica se puede concluir que:
-Las viviendas ubicadas en un primer nivel están más asociadas con el estrato 3 -Los estratos 6,5 y 4 comparten viviendas ubicadas en pisos desde el 2 hasta el 12. Sin embargo, los pisos 9,6,11 y 12 están más asociados al estrato 6 y 5, y los pisos 4,5,10,8 y 7 los más relacionados con viviendas estrato 4.
Finalmente, se calculan los valores de los vectores propios, su varianza explicada y acumulada.
## eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.08416458 100 100
De la variable zona y tipo se puede observar que:
Tiene una alta correlacion que todos los individuos son explicados al 100% por una unica componente.
## eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.32215213 69.965515 69.96551
## dim 2 0.12745096 27.680002 97.64552
## dim 3 0.01084108 2.354483 100.00000
De la variable zona y estrato se puede observar que:
Los datos tienen más variabilidad, sin embargo logran ser exlicados por las 2 primeras componentes en un 97.6455%.
## eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.1401995467 57.3082082 57.30821
## dim 2 0.0814038931 33.2747955 90.58300
## dim 3 0.0223410068 9.1321484 99.71515
## dim 4 0.0006968556 0.2848479 100.00000
A la variables zona y piso les suceden lo mismo que a zona y estrato. Sin embargo, la variabildiad y la correlacion de estas variables es mucho menor, por lo que para explicar un 99% de los datos se necesitarian 3 componentes, aunque las dos primeras explican el 90% lo cual es un valor aceptable.
## eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.02699353 100 100
De las variables tipo y estrato se puede decir que estan estrechamente relacionada, tanto que del mismo modo que zona y tipo, la dispersión de estas variables logran ser explicadas por una unica componente al 100%
## eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.4447264 100 100
Al igual que zona y tipo, y tipo y estrato, las variables tipo y piso tambien tienen una alta correspondencia por lo que de igual forma su variabilidad logra ser explicada por una unica componente.
## eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.059394631 80.820845 80.82084
## dim 2 0.011570233 15.744117 96.56496
## dim 3 0.002524384 3.435038 100.00000
Por último, piso y estrato son variables que tienen una mayor variabilidad, por lo que se puede decir que su correlación es menor. Sin embargo, dos componentes son suficientes para explicar el 96,56% de su variabilidad.
Finalmente, después de haber realizado el análisis de correspondencia, se puede optar por reducir dimensionalidad con aquellas variables que tienen una alta relación ya que estas están correlacionadas entre si.
Para un efecto práctico, si se quisiera entrenar un modelo de aprendizaje automático supervisado como es el caso, para predecir precios de las viviendas, no es una buena idea tener variables de entrada altamente correlacionadas por lo que se podría optar por eliminar algunas de ellas.
El uso de métodos multivariados en este trabajo permitió identificar patrones complejos y relaciones dentro de un conjunto de datos amplio y variado. Cada método aportó una perspectiva única que, combinada, ofreció una visión clara y accionable sobre la información, lo que facilita una toma de decisiones más precisa en relación con el análisis de viviendas.
Algunos métodos son mejores que otros en cuanto a la naturaleza de los datos, por ejemplo PCA es excelente para datos cuantitativos, al igual que el análisis de conglomerados, mientras que el análisis de correspondencia ayuda en gran parte a identificar las relaciones entre las variables categóricas presentes. Todas estas metodologías son útiles a la hora de trabajar con bases de datos de gran dimensionalidad, pues ayudan a reducir variables en un entorno donde es necesario ahorrar recurso de cómputo y evitar la maldición de la dimensionalidad en los algoritmos de aprendizaje automático.
Finalmente, se anexan el codigo utilizado para cada una de las etapas.
Analisis exploratorio
# llamado a las librerias
library(paqueteMODELOS)
library(dplyr)
library(naniar)
library(DescTools)
library(factoextra)
library(gridExtra)
library(StatMatch)
library(cluster)
library(clustMixType)
library(ggplot2)
library(plotly)
library(ade4)
library(FactoMineR)
library(tidyr)
vivienda<-data.frame(vivienda) #importar BD
str(vivienda) # descripcion de la BD
summary(vivienda) # resumen estadistico
# Obtiene el numero de datos faltantes por campo
faltantes <- colSums(is.na(vivienda)) %>% as.data.frame() # suma los campos faltantes por cada columna del data.frame
Grafica_faltantes<-gg_miss_var(vivienda,show_pct=TRUE) # grafico de datos faltantes
Grafica_faltantes #grafica de faltantes
faltantes # muestra un resumen de las variables faltantes
which(is.na(vivienda$id))# se conulta que variables faltantes hay por campo id
vivienda<-vivienda[-which(is.na(vivienda$id)),] #eliminar datos faltantes de la columna id
str(vivienda) # descripcion de la base de datos
table(vivienda$piso) # tabla de frecuencias variable piso
vivienda$piso<-as.numeric(vivienda$piso) #convierte variable piso a numero
str(vivienda) # Descripcion de los datos
faltantes <- colSums(is.na(vivienda)) %>% as.data.frame() # suma los campos faltantes por cada columna del data.frame
faltantes # muestra un resumen de las variables faltantes
table(vivienda$zona) # tabla de frecuencias para zona
table(vivienda$tipo) # tabla de frecuencias para tipo
vivienda<-vivienda[,-11] # eliminacion de la variable barrios
# resumen de datos agrupados
resumen_zona_piso <- vivienda %>%
group_by(zona, tipo) %>%
summarise(
Promedio_piso = round(mean(piso,na.rm=TRUE),0),
Mediana_piso = round(median(piso,na.rm=TRUE),0),
moda= round(Mode(as.numeric(piso),na.rm=TRUE),0),
Max_piso = round(max(piso,na.rm=TRUE),0),
Min_piso = round(min(piso,na.rm=TRUE),0),
Desviacion_Estandar_piso = round(sd(piso,na.rm=TRUE),0)
)
resumen_zona_parqueaderos <- vivienda %>%
group_by(zona, tipo) %>%
summarise(
Promedio_parqueaderos = round(mean(parqueaderos,na.rm=TRUE),0),
Mediana_parqueaderos = round(median(parqueaderos,na.rm=TRUE),0),
Max_parqueaderos = round(max(parqueaderos,na.rm=TRUE),0),
Min_parqueaderos = round(min(parqueaderos,na.rm=TRUE),0),
Desviacion_Estandar_parqueaderos = round(sd(parqueaderos,na.rm=TRUE),0)
)
resumen_zona_piso
resumen_zona_parqueaderos
#imputacion de datos por la moda y la mediana
vivienda <- vivienda %>%
group_by(zona,tipo) %>%
mutate(piso = ifelse(is.na(piso), Mode(as.numeric(piso),na.rm = TRUE), piso)) %>%
mutate(parqueaderos = ifelse(is.na(parqueaderos), median(as.numeric(parqueaderos), na.rm = TRUE),parqueaderos))
#Cambio de tipo de vivienda para casas mayores a un cuarto piso
vivienda<- vivienda %>%
mutate(tipo=ifelse(piso>4 & tipo=="Casa","Apartamento",tipo))
# resumen de datos agrupados
resumen_zona_piso <- vivienda %>%
group_by(zona, tipo) %>%
summarise(
Promedio_piso = round(mean(piso,na.rm=TRUE),0),
Mediana_piso = round(median(piso,na.rm=TRUE),0),
moda= round(Mode(as.numeric(piso),na.rm=TRUE),0),
Max_piso = round(max(piso,na.rm=TRUE),0),
Min_piso = round(min(piso,na.rm=TRUE),0),
Desviacion_Estandar_piso = round(sd(piso,na.rm=TRUE),0)
)
resumen_zona_parqueaderos <- vivienda %>%
group_by(zona, tipo) %>%
summarise(
Promedio_parqueaderos = round(mean(parqueaderos,na.rm=TRUE),0),
Mediana_parqueaderos = round(median(parqueaderos,na.rm=TRUE),0),
Max_parqueaderos = round(max(parqueaderos,na.rm=TRUE),0),
Min_parqueaderos = round(min(parqueaderos,na.rm=TRUE),0),
Desviacion_Estandar_parqueaderos = round(sd(parqueaderos,na.rm=TRUE),0)
)
resumen_zona_piso
resumen_zona_parqueaderos
faltantes <- colSums(is.na(vivienda)) %>% as.data.frame() # suma los campos faltantes por cada columna del data.frame
faltantes # muestra un resumen de las variables faltantes
Analisis de componentes principales PCA
viviendaPCA<- vivienda[,-c(1,2,3,4,10,11,12)] # eliminacion de las variables id, zona,tipo,estrato,piso, latitud,longitud
viviendaZ= as.data.frame(scale(viviendaPCA[,1:5]))# Se normalizan las variables numericas.
head(viviendaZ) # primeros 6 registros
componentes<-prcomp(viviendaZ) #Se aplica PCA
componentes
fviz_eig(componentes, addlabels = TRUE) # grafica de varianza explicada
MVP<-componentes$rotation # matriz de vectores propios
MVP
DataPCA<-componentes$x #componentes principales
head(DataPCA) # imprime los 6 primeros registros tranformados
#graficas de contribucion de las variables
g1<-fviz_contrib(componentes, choice = "var", axes = 1, title = "PC1")
g2<-fviz_contrib(componentes, choice = "var", axes = 2, title = "PC2")
g3<-fviz_contrib(componentes, choice = "var", axes = 3, title = "PC3")
g4<-fviz_contrib(componentes, choice = "var", axes = 4, title = "PC4")
g5<-fviz_contrib(componentes, choice = "var", axes = 5, title = "PC5")
grid.arrange(g1, g2, g3, g4, g5, nrow = 2, ncol = 3) # unificacion de las graficas
# grafica de circulo de correlacion
g6<-fviz_pca_var(componentes,
col.var = "contrib",
gradient.cols= c("#FF7F00", "#034D94"),
repel=TRUE,
)
g6
# grafica nube de puntos
g7<-fviz_pca_ind(componentes,col.ind = "blue")
g7
# grafica de biplot por zona, componentes principales e individuos
g8<-fviz_pca_biplot(componentes,
repel=TRUE,
habillage=vivienda$zona,
col.var="#6429DB",
col.ind=c("#C0C1C3","#F48020")
)
g8
Analisis de conglomerados
zonas<- model.matrix(~ zona - 1, data = vivienda) # aplica on hot encoding variable zona
colnames(zonas)<-c("Centro","Norte","Oeste","Oriente","Sur") # aplica nombres a las columnas
tipo<- model.matrix(~ tipo - 1, data = vivienda)# aplica on hot encoding variable tipo
colnames(tipo)<-c("Apartamento","Casa") # aplica nombres a las columnas
vivienda2<-vivienda[,-c(1,2,10,11,12)] # elimina las columas mencionadas del data frame
vivienda2<-cbind(zonas,tipo,vivienda2) # une las columnas on hot enconding con la el data frame principal
normalizado<-scale(vivienda2[,c(10,11,12,13,14)]) # se normalizan solo las variables numericas
vivienda2z<-as.data.frame(cbind(vivienda2[,-c(10,11,12,13,14)],normalizado)) se unifican los datos categoricos con los datos normalizados
fviz_nbclust(vivienda2z, pam, method = "silhouette")** # Determinar el número óptimo de clusters
# se definen las variables categoricas como factor
vivienda$zona=as.factor(vivienda$zona)
vivienda$estrato=as.factor(vivienda$estrato)
vivienda$tipo=as.factor(vivienda$tipo)
vivienda$piso=as.factor(vivienda$piso)
# se hace el proceso de clusterig
kproto_result <- kproto(vivienda[,-c(1,11,12)], k = 2)
# se imprime el resultado del clustering
#head(kproto_result$cluster,n=20)
# se agrega el cluster a la bd vivienda
vivienda$cluster <- as.factor(kproto_result$cluster)
#resultado clustering
head(vivienda,n=20) # primeros 20 datos del dataset original
#grafica 3d zona,tipo,precio clusterizada.
g9 <- plot_ly(vivienda,
x = ~zona,
y = ~tipo,
z = ~preciom,
color = ~factor(cluster),
type = 'scatter3d',
mode = 'markers+text',
text = ~cluster,
textposition = 'top center',
marker = list(size = 5)) %>%
layout(scene = list(
xaxis = list(title = 'Zona'),
yaxis = list(title = 'tipo'),
zaxis = list(title = 'precio')
))
g9
#boxplots para cada tipo de variable
g10<-ggplot(vivienda, aes(x = cluster , y = (preciom))) +
geom_boxplot() +
labs(x = "Cluster", y = "Valor", title = "Precio vs Cluster")
g11<-ggplot(vivienda, aes(x = cluster , y = areaconst)) +
geom_boxplot() +
labs(x = "Cluster", y = "Valor", title = "Area vs Cluster")
g12<-ggplot(vivienda, aes(x = cluster , y = parqueaderos)) +
geom_boxplot() +
labs(x = "Cluster", y = "Valor", title = "park vs Cluster")
g13<-ggplot(vivienda, aes(x = cluster , y = banios)) +
geom_boxplot() +
labs(x = "Cluster", y = "Valor", title = "Banios vs Cluster")
g14<-ggplot(vivienda, aes(x = cluster , y = habitaciones)) +
geom_boxplot() +
labs(x = "Cluster", y = "Valor", title = "Habitaciones vs Cluster")
grid.arrange(g10, g11, g12, g13, g14, nrow = 2, ncol = 3)
#calculo de estadisticas descriptivas agrupado por cluster
resumen_cluster_precio <- vivienda %>%
group_by(cluster) %>%
summarise(
Promedio_precio = round(mean(preciom,na.rm=TRUE),0),
Mediana_precio = round(median(preciom,na.rm=TRUE),0),
Max_precio = round(max(preciom,na.rm=TRUE),0),
Min_precio = round(min(preciom,na.rm=TRUE),0),
Desviacion_precio= round(sd(preciom,na.rm=TRUE),0)
)
resumen_cluster_area <- vivienda %>%
group_by(cluster) %>%
summarise(
Promedio_area = round(mean(areaconst,na.rm=TRUE),0),
Mediana_area = round(median(areaconst,na.rm=TRUE),0),
Max_area = round(max(areaconst,na.rm=TRUE),0),
Min_area = round(min(areaconst,na.rm=TRUE),0),
Desviacion_area = round(sd(areaconst,na.rm=TRUE),0)
)
resumen_cluster_parqueaderos <- vivienda %>%
group_by(cluster) %>%
summarise(
Promedio_parqueaderos = round(mean(parqueaderos,na.rm=TRUE),0),
Mediana_parqueaderos = round(median(parqueaderos,na.rm=TRUE),0),
Max_parqueaderos = round(max(parqueaderos,na.rm=TRUE),0),
Min_parqueaderos = round(min(parqueaderos,na.rm=TRUE),0),
Desviacion_parqueaderos = round(sd(parqueaderos,na.rm=TRUE),0)
)
resumen_cluster_banios <- vivienda %>%
group_by(cluster) %>%
summarise(
Promedio_banios = round(mean(banios,na.rm=TRUE),0),
Mediana_banios = round(median(banios,na.rm=TRUE),0),
Max_banios = round(max(banios,na.rm=TRUE),0),
Min_banios = round(min(banios,na.rm=TRUE),0),
Desviacion_banios = round(sd(banios,na.rm=TRUE),0)
)
resumen_cluster_habitaciones <- vivienda %>%
group_by(cluster) %>%
summarise(
Promedio_habitaciones = round(mean(habitaciones,na.rm=TRUE),0),
Mediana_habitaciones = round(median(habitaciones,na.rm=TRUE),0),
Max_habitaciones = round(max(habitaciones,na.rm=TRUE),0),
Min_habitaciones = round(min(habitaciones,na.rm=TRUE),0),
Desviacion_habitaciones = round(sd(habitaciones,na.rm=TRUE),0)
)
resumen_cluster_precio
resumen_cluster_area
resumen_cluster_parqueaderos
resumen_cluster_banios
resumen_cluster_habitaciones
Analisis de correspondencia
# Crear tablas de contingencia para todas las combinaciones posibles
tabla1 <- table(vivienda$zona, vivienda$tipo)
tabla2 <- table(vivienda$zona, vivienda$estrato)
tabla3 <- table(vivienda$zona, vivienda$piso)
tabla4 <- table(vivienda$tipo, vivienda$estrato)
tabla5 <- table(vivienda$tipo, vivienda$piso)
tabla6 <- table(vivienda$estrato, vivienda$piso)
# pruebas chi cuadrado para cada tabla de contingencia
pruebat1<-chisq.test(tabla1)
pruebat2<-chisq.test(tabla2)
pruebat3<-chisq.test(tabla3)
pruebat4<-chisq.test(tabla4)
pruebat5<-chisq.test(tabla5)
pruebat6<-chisq.test(tabla6)
#imprimir las tablas y las pruebas de hipotesis
print(tabla1)
pruebat1
print(tabla12)
pruebat2
print(tabla3)
pruebat3
print(tabla4)
pruebat4
print(tabla5)
pruebat5
print(tabla6)
pruebat6
# aplicar analisis de correspondencia CA a cada tabla
resultados_ac1 <- CA(tabla1)
resultados_ac1
resultados_ac2 <- CA(tabla2)
resultados_ac2
resultados_ac3 <- CA(tabla3)
resultados_ac3
resultados_ac4 <- CA(tabla4)
resultados_ac4
resultados_ac5 <- CA(tabla5)
resultados_ac5
resultados_ac6 <- CA(tabla6)
resultados_ac6
# calculo de valores propios y varianza explicada para cada tabla
valores_prop1 <- resultados_ac1$eig
valores_prop1
valores_prop2 <- resultados_ac2$eig
valores_prop2
valores_prop3 <- resultados_ac3$eig
valores_prop3
valores_prop4 <- resultados_ac4$eig
valores_prop4
valores_prop5 <- resultados_ac5$eig
valores_prop5
valores_prop6 <- resultados_ac6$eig
valores_prop6