Analisis exploratorio

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.

Limpieza de datos

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.

Aplicación de metodos multivariados

Análisis de componentes principales (PCA)

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.

Analisis de conglomerados

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:

  1. Cluster 1:

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.

  1. Cluster 2:

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:

  1. Cluster 1:

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.

  1. Cluster 2:

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:

  1. Cluster 1:

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.

  1. Cluster 2:

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:

  1. Cluster 1:

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.

  1. Cluster 2:

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:

  1. Cluster 1:

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.

  1. Cluster 2:

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.

Análisis de correspondencia

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.

Conclusión

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.

Anexos

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