1. Introducción


2. Objetivos


3. Métodos


4. Resultados


5. Discusión


6. Conclusiones


7. Anexos


Anexo 1: Proceso de Limpieza de Datos


La base de datos cuenta con 13 variables y 8330 registros, a continuacion se describe cada una de las variables encontradas en la base de datos.

str(vivienda_faltantes)
## spc_tbl_ [8,330 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ id       : num [1:8330] 8312 8311 8307 8296 8297 ...
##  $ zona     : chr [1:8330] "Zona Oeste" "Zona Oeste" "Zona Oeste" "Zona Sur" ...
##  $ piso     : num [1:8330] 4 1 NA 2 NA NA 2 NA NA 2 ...
##  $ estrato  : num [1:8330] 6 6 5 3 5 5 6 5 5 5 ...
##  $ preciom  : num [1:8330] 1300 480 1200 220 330 1350 305 480 275 285 ...
##  $ areaconst: num [1:8330] 318 300 800 150 112 390 125 280 74 120 ...
##  $ parquea  : num [1:8330] 2 1 4 1 2 8 2 4 1 2 ...
##  $ banios   : num [1:8330] 4 4 7 2 4 10 3 4 2 4 ...
##  $ habitac  : num [1:8330] 2 4 5 4 3 10 3 4 3 3 ...
##  $ tipo     : chr [1:8330] "Apartamento" "Casa" "Casa" "Casa" ...
##  $ barrio   : chr [1:8330] "arboleda" "normandía" "miraflores" "el guabal" ...
##  $ longitud : num [1:8330] -76576 -76571 -76568 -76565 -76565 ...
##  $ latitud  : num [1:8330] 3454 3454 3455 3417 3408 ...
##  - attr(*, "spec")=List of 3
##   ..$ cols   :List of 13
##   .. ..$ id       : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ zona     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ piso     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ estrato  : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ preciom  : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ areaconst: list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ parquea  : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ banios   : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ habitac  : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ tipo     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ barrio   : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ longitud : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ latitud  : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   ..$ default: list()
##   .. ..- attr(*, "class")= chr [1:2] "collector_guess" "collector"
##   ..$ delim  : chr ","
##   ..- attr(*, "class")= chr "col_spec"
##  - attr(*, "problems")=<externalptr>


VIM::aggr(vivienda_faltantes, cex.axis = 1, cex.lab= 1)  


De acuerdo a la grafica la variables con datos faltantes son piso y parquea.

Se analiza la variable piso imputando por 0 los datos faltantes y se analiza el comportamiento de la variable preciom con respecto a esta.

datos1=vivienda_faltantes
datos1$piso[is.na(datos1$piso)] = 0
boxplotPiso = ggplot(datos1, aes(x = datos1$piso, y = datos1$preciom, group=datos1$piso)) +
  geom_boxplot() +
  labs(title = "Distribución precios por piso", x = "Piso", y = "Precio (Millones de Pesos)") +
  theme_minimal()
boxplotPiso

Se podria decir que la variable piso es una variable de tipo idenpendiente conrespecto a la variable preciom y se podria no tomar encuenta esta variable para el analisis.

datos2 = datos1
datos2$piso = NULL
datos2


Al analizar la variable parquea de la misma forma la variable piso encontramos que las variables parquea y precio podrian tener una relacion de tipo dependiente, para evitar agregar sesgos a la base de datos realizando imputacion con una medida de tendencia central se prefiere no tener en cuenta estos datos para el analisis.

datos3 = datos2
datos3$parquea[is.na(datos2$parquea)] = 0
boxplotParquea = ggplot(datos3, aes(x = datos3$parquea, y = datos3$preciom, group=datos3$parquea)) +
  geom_boxplot() +
  labs(title = "Distribución precios por Parqueadero", x = "No. Parqueaderos", y = "Precio (Millones de Pesos)") +
  theme_minimal()
boxplotParquea

datos3 = na.omit(datos2)
datos3


Despues de realizar la limpieza de datos faltantes, podriamos decir que tenemos un 80.72% de los registros iniciales y 1 variable menos a analizar.

porcentaje_datos_completos = length(datos3$id)*100/length(vivienda_faltantes$id)
porcentaje_datos_completos
## [1] 80.72029
VIM::aggr(datos3, cex.axis = 1, cex.lab= 1)  

Descripcion de las viariables


Id:


##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       1    2476    4478    4417    6433    8319


Esta variable no se considera como una variable estadistica debido que marca la posicion del registro aunque es numerica no se repite.


Zona:


##    Length     Class      Mode 
##      6724 character character


La variable Zona es considerada una variable de tipo string cualitativa con una escala nominal y no presenta datos faltantes o datos ambiguos por lo tanto no se modifica.


## 
##  Zona Centro   Zona Norte   Zona Oeste Zona Oriente     Zona Sur 
##           64         1289         1103          163         4105
barrasZonas = ggplot(datos3, aes(x = datos3$zona)) + 
  geom_bar()+
  labs(title = "Cantidad de Viviendas por Zonas", x = "Zonas", y = "Frecuencia") +
  theme_minimal()
barrasZonas

boxplotZona = ggplot(datos3, aes(x = datos3$zona, y = datos3$preciom)) +
  geom_boxplot() +
  labs(title = "Distribución precios por zonas", x = "Zona", y = "Precio (Millones de Pesos)") +
  theme_minimal()
boxplotZona


Tipo:

summary(datos3$tipo)
##    Length     Class      Mode 
##      6724 character character


table(datos3$tipo)
## 
## Apartamento APARTAMENTO        apto        casa        Casa        CASA 
##        4191          42           4          11        2469           7


es considerada una variable cualitativa con una escala ordinal, los datos almacenados en esta variable deberian tener solo 2 valores posibles “Apartamento” y “Casa” por lo tanto se realiza una transformacion de datos

datos4 = datos3

datos4$tipo = case_when(
  datos4$tipo %in% c("Apartamento","APARTAMENTO","apto") ~ "Apartamento",
  datos4$tipo %in% c("casa","Casa","CASA") ~ "Casa"
)
table(datos4$tipo)
## 
## Apartamento        Casa 
##        4237        2487
barrasTipo = ggplot(datos4, aes(x = datos4$tipo)) + 
  geom_bar()+
  labs(title = "Cantidad de Viviendas por Tipo", x = "Tipo de Vivienda", y = "Frecuencia") +
  theme_minimal()
barrasTipo

boxplotTipo = ggplot(datos4, aes(x = datos4$tipo, y = datos4$preciom)) +
  geom_boxplot() +
  labs(title = "Distribución de Precios por Tipo de Vivienda", x = "Tipo de Vivienda", y = "Precio (Millones de Pesos)") +
  theme_minimal()

boxplotTipo


Estrato:

summary(datos4$estrato)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   3.000   4.000   5.000   4.831   6.000   6.000


es considerada una variable cualitativa con una escala ordinal

datos4$estrato = as.factor(datos4$estrato)
boxplotEstrato = ggplot(datos4, aes(x = datos4$estrato, y = datos4$preciom, group=datos3$estrato)) +
  geom_boxplot() +
  labs(title = "Distribución de Precios por Estratos", x = "Estrato", y = "Precio (Millones de Pesos)") +
  theme_minimal()

boxplotEstrato


Preciom: es considerada una variable cuantitativa continua

summary(datos4$preciom)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    58.0   248.8   355.0   469.3   580.0  1999.0
hisPrecio = ggplot(datos4, aes(x = datos4$preciom)) +
  geom_histogram(binwidth = 50, color = "black", fill = "gray") +
  labs(title = "Histograma de Precios Viviendas", 
       x = "Precio (Millones)", 
       y = "Cantidad") +
  theme_minimal()

hisPrecio

psych::describe(datos4$preciom)

Areaconst: es considerada una variable cuantitativa continua

summary(datos4$areaconst)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    30.0    86.0   130.0   181.2   234.0  1745.0
hisArea = ggplot(datos4, aes(x = areaconst)) +
  geom_histogram(binwidth = 25, color = "black", fill = "gray") +
  labs(title = "Histograma de Area Construida", 
       x = "Area Construida (m²)", 
       y = "Cantidad") +
  theme_minimal()

hisArea

ggplot(datos4, aes(y = areaconst, x = preciom, color = estrato, shape = tipo)) +
  geom_point() +
  labs(title = "Dispersión de Precio vs. Área por Tipo de Casa y Estrato",
       y = "Área (m2)",
       x = "Precio (Millones)",
       color = "Estrato",
       shape = "Tipo de Casa") +
  facet_wrap(~ estrato) +
  theme_minimal() +
  scale_color_brewer(palette = "Set1")

psych::describe(datos4$areaconst)

Parquea:

summary(datos4$parquea)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   1.000   2.000   1.836   2.000  10.000

es considerada una variable cuantitativa discreta

datos4$parquea = as.factor(datos4$parquea)
boxplotParquea = ggplot(datos4, aes(x = datos4$parquea, y = datos4$preciom, group=datos3$parquea)) +
  geom_boxplot() +
  labs(title = "Distribución de Precios por No. Parqueaderos", x = "No. Parqueaderos", y = "Precio (Millones de Pesos)") +
  theme_minimal()

boxplotParquea

Banios:

summary(datos4$banios)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   2.000   3.000   3.257   4.000  10.000


es considerada una variable cuatitativa discreta

datos4$banios = as.factor(datos4$banios)
barrasBanios = ggplot(datos4, aes(x = datos4$banios)) + 
  geom_bar()+
  labs(title = "Cantidad de Viviendas por No. Baños", x = "No. Baños", y = "Frecuencia") +
  theme_minimal()
barrasBanios

boxplotBanios = ggplot(datos4, aes(x = datos4$banios, y = datos4$preciom, group=datos4$banios)) +
  geom_boxplot() +
  labs(title = "Distribución de Precios por No. Baños", x = "No. Baños", y = "Precio (Millones de Pesos)") +
  theme_minimal()

boxplotBanios

table(datos4$banios)
## 
##    0    1    2    3    4    5    6    7    8    9   10 
##   15  199 2230 1758 1292  805  279   93   36   12    5
registrosAT_banios = datos4[datos4$banios == "0", ]
registrosAT_banios
boxplotBanios_estratos = ggplot(datos4, aes(y = datos4$banios, x = datos4$estrato, group=datos4$estrato)) +
  geom_boxplot() +
  labs(title = "Distribución de No. Baños por Estratos", y = "No. Baños", x = "Estrato") +
  theme_minimal()

boxplotBanios_estratos

datos4$banios=as.character(datos4$banios)
datos4$banios=as.numeric(datos4$banios)
medianas_banios <- aggregate(banios ~ estrato, data = datos4, FUN = median)
medianas_banios
datos5=datos4
datos5$banios = ifelse(datos5$banios == 0 &  datos5$estrato == 3, 2,
                       ifelse(datos5$banios == 0 &  datos5$estrato == 4, 2,
                              ifelse(datos5$banios == 0 &  datos5$estrato == 5, 3,
                                     ifelse(datos5$banios == 0 &  datos5$estrato == 6, 4, datos5$banios))))
             
datos5
datos5$banios = as.factor(datos5$banios)
boxplotBanios2 = ggplot(datos5, aes(x = datos5$banios, y = datos5$preciom, group=datos5$banios)) +
  geom_boxplot() +
  labs(title = "Distribución de Precios por No. Baños", x = "No. Baños", y = "Precio (Millones de Pesos)") +
  theme_minimal()

boxplotBanios2

Habitac:

summary(datos5$habitac)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   3.000   3.000   3.611   4.000  10.000


es considerada una variable cuatitativa discreta

barrasHabitac = ggplot(datos5, aes(x = datos5$habitac)) + 
  geom_bar()+
  labs(title = "Cantidad de Viviendas por No. Habitciones", x = "No. Habitaciones", y = "Frecuencia") +
  theme_minimal()
barrasHabitac

datos5$habitac = as.factor(datos5$habitac)
boxplotHabitac = ggplot(datos5, aes(x = datos5$habitac, y = datos5$preciom, group=datos5$habitac)) +
  geom_boxplot() +
  labs(title = "Distribución de Precios por No. Habitaciones", x = "No. Habitaciones", y = "Precio (Millones de Pesos)") +
  theme_minimal()

boxplotHabitac

tablaHabit = table(datos5$habitac, datos5$tipo)
tablaHabit
##     
##      Apartamento Casa
##   0           12   11
##   1           40    4
##   2          609   39
##   3         2841  536
##   4          671  841
##   5           57  516
##   6            5  240
##   7            1  125
##   8            0   77
##   9            1   62
##   10           0   36

Barrio: es considerada una variable cualitativa con una escala nominal

Longitud:

summary(datos4$longitud)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## -76576.00 -76516.00    -76.54 -21691.54    -76.52    -76.46


esta variable indica la posicion con respecto al meridiano de Greenwich y es considerada una variable cuantitativa continua, al analizar los datos se puede observar que cuenta con un rango amplio y esto lleva a indicar que hay un error de digitacion ya que esta variable no puede variar signficativamente en la misma area de estudio, por lo tanto se debe corregir este error dividiendo por 1000 los datos que presentan anomalias.

datos5 = datos4
datos5$longitud <-  ifelse(datos5$longitud < -1000, datos5$longitud/1000, datos5$longitud)

summary(datos5$longitud)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  -76.59  -76.54  -76.53  -76.53  -76.52  -76.46


Latitud:

##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##    3.333    3.387    3.448  967.862 3365.000 3494.000


esta variable indica la posicion con respecto al meridieje del ecuador y es considerada una variable cuantitativa continua, al analizar los datos se puede observar que presenta el mismo error detectado en la Longitud, por lo tanto se debe corregir este error dividiendo por 1000 los datos que presentan anomalias.

datos6=datos5
datos6$latitud <-  ifelse(datos6$latitud > 1000, datos6$latitud/1000, datos6$latitud)

summary(datos6$latitud)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   3.333   3.379   3.412   3.415   3.451   3.498