Introducción

Este informe presenta el análisis descriptivo de la base de datos “vivienda_faltantes”, propiedad de la empresa B&C. Para llevar a cabo este estudio se empleó software R, herramienta estadística líder en el ámbito del análisis de datos. El proyecto se enfoca en tres fases, la primera comprende un preprocesamiento y organización de la data, como preparación para el análisis posterior. En la segunda fase, se realiza un análisis univariado, explorando las variables individualmente para entender su distribución y características principales. Finalmente, en la tercera etapa se realiza cruce de variables con el objetivo de identificar tendencias y patrones en los datos que pueden ser de ayuda en la toma de decisiones de la empresa B&C.

Objetivos

  1. Realizar análisis descriptivo de datos.

  2. Identificar las características de las viviendas más vendidas en Cali.

  3. Identificar la zona de mayor popularidad y posible desarrollo.

  4. Identificar las áreas con mayor nivel socioeconómico.

  5. Identificar patrones en los datos que puedan ser relevante para empresa B&C.

Métodos

El análisis de datos se realizó en 3 fases:

Fase I. Pre procesamiento de data: cargue de información, revisión, descripción de tipo de data, estandarización y visualización de variables.

Fase II. Análisis univariado de las variables:

Fase III. Cruce de variables: identificación de tendencia e información relevante para la compañía.

Resultados

Fase I. Pre procesamiento de data

La base de datos “vivienda_faltantes” está compuesta por 8330 datos y 13 variables.

##  [1] "id"        "zona"      "piso"      "estrato"   "preciom"   "areaconst"
##  [7] "parquea"   "banios"    "habitac"   "tipo"      "barrio"    "longitud" 
## [13] "latitud"

Hay 4279 datos en valor NA siendo las variables piso y parqueadero con mayor número de datos faltantes.

##        id      zona      piso   estrato   preciom areaconst   parquea    banios 
##         3         3      2641         3         2         3      1606         3 
##   habitac      tipo    barrio  longitud   latitud 
##         3         3         3         3         3

Las variables presentan las siguientes subdivisiones:

## $Uzona
## [1] "Zona Oeste"   "Zona Sur"     "Zona Norte"   "Zona Oriente" "Zona Centro" 
## [6] NA            
## 
## $Upiso
##  [1]  4  1 NA  2  6  8  3  9  5 12 11  7 10
## 
## $Uestrato
## [1]  6  5  3  4 NA
## 
## $Uparquead
##  [1]  2  1  4  8 NA  3  6  5 10  7  9
## 
## $Ubanios
##  [1]  4  7  2 10  3  5  1  6  0  8  9 NA
## 
## $Utipo
## [1] "Apartamento" "Casa"        "APARTAMENTO" "casa"        "CASA"       
## [6] "apto"        NA

La variable tipo requirió estandarización para corregir errores de escritura.

## [1] "apartamento" "casa"        NA

Visualización de variables

Fase II. Analisis univariado de varaible

Para las variables numéricas: piso, estrato, preciom, areaconst, parquea, banios, habitac, se calculan:

  • Indicadores de centro: media, mediana, media truncada
  • Indicadores de dispersión: rango, desviación estándar, desviación absoluta
  • Indicadores de forma: curtosis, asimetría.
## $piso
##    vars    n mean   sd median trimmed  mad min max range skew kurtosis   se
## X1    1 5689 3.77 2.62      3    3.37 1.48   1  12    11 1.28     1.05 0.03
## 
## $estrato
##    vars    n mean   sd median trimmed  mad min max range  skew kurtosis   se
## X1    1 8327 4.63 1.03      5    4.67 1.48   3   6     3 -0.18    -1.11 0.01
## 
## $preciom
##    vars    n   mean     sd median trimmed    mad min  max range skew kurtosis
## X1    1 8328 434.24 329.02    330  374.72 209.05  58 1999  1941 1.85     3.66
##      se
## X1 3.61
## 
## $areaconst
##    vars    n   mean     sd median trimmed   mad min  max range skew kurtosis
## X1    1 8327 174.99 142.95    123  149.22 84.51  30 1745  1715 2.69     12.9
##      se
## X1 1.57
## 
## $parquea
##    vars    n mean   sd median trimmed  mad min max range skew kurtosis   se
## X1    1 6724 1.84 1.13      2    1.62 1.48   1  10     9 2.32     8.29 0.01
## 
## $banios
##    vars    n mean   sd median trimmed  mad min max range skew kurtosis   se
## X1    1 8327 3.11 1.43      3    2.99 1.48   0  10    10 0.92     1.12 0.02
## 
## $habitac
##    vars    n mean   sd median trimmed  mad min max range skew kurtosis   se
## X1    1 8327 3.61 1.46      3    3.41 1.48   0  10    10 1.64     3.99 0.02
  • Indicador de posición: caurtiles
## $piso
## 25% 50% 75% 
##   2   3   5 
## 
## $estrato
## 25% 50% 75% 
##   4   5   5 
## 
## $preciom
## 25% 50% 75% 
## 220 330 540 
## 
## $areaconst
## 25% 50% 75% 
##  80 123 229 
## 
## $parquea
## 25% 50% 75% 
##   1   2   2 
## 
## $banios
## 25% 50% 75% 
##   2   3   4 
## 
## $habitac
## 25% 50% 75% 
##   3   3   4

Comentarios sobre los restultados del calculo de indicadores.

“piso”

  • La distribución es asimétrica hacia la derecha (skew = 1.28), indicando que hay algunas viviendas con un número muy alto de pisos.

“estrato”

  • El estrato medio es de 4.63, la mediana de 5, la distribución tiene una leve asimetría negativa (skew = -0.18), lo que confirma que hay más datos agrupados en los estratos superiores.

“preciom”

  • Posee una desviación estandar alta (329.02) para el precio medio es de 434.24.

  • La mediana es de 330, lo que indica que el 50% de las viviendas tienen un precio inferior a 330.

  • La distribución es asimétrica hacia la derecha (skew = 1.85), lo que sugiere que hay algunas viviendas con precios muy altos que elevan la media.

“areaconst”

  • El área media de construcción es de 174.99, con una desviación estándar de 142.95.

  • La distribución es fuertemente asimétrica hacia la derecha (skew = 2.69), lo que sugiere que hay algunas viviendas con áreas de construcción muy grandes.

  • La curtosis es alta, lo que indica una distribución con extremos.

“parquea”

  • La mitad de las viviendas tienen 2 espacios de estacionamiento.
  • No hay cambio entre el 50% y el 75% de cuartiles, lo que sugiere que la mayoría de las viviendas tienen 2 espacios de estacionamiento.

“habitac”

  • La distribución es asimétrica hacia la derecha, lo que sugiere que hay algunas viviendas con un número muy alto de habitaciones.

Fase III. Cruce de variables:

## # A tibble: 3 × 2
##   tipo        mean_price
##   <chr>            <dbl>
## 1 casa              540.
## 2 apartamento       368.
## 3 <NA>              330

## # A tibble: 3 × 2
##   tipo        mean_areaconst
##   <chr>                <dbl>
## 1 casa                  273.
## 2 apartamento           113.
## 3 <NA>                  NaN
## Warning: Removed 1 rows containing missing values (`position_stack()`).

## # A tibble: 6 × 2
##   zona         mean_price
##   <chr>             <dbl>
## 1 Zona Oeste         679.
## 2 Zona Sur           427.
## 3 Zona Norte         346.
## 4 <NA>               330 
## 5 Zona Centro        310.
## 6 Zona Oriente       229.

## # A tibble: 6 × 2
##   zona         median_estrato
##   <chr>                 <dbl>
## 1 Zona Oeste                6
## 2 Zona Sur                  5
## 3 Zona Norte                4
## 4 Zona Centro               3
## 5 Zona Oriente              3
## 6 <NA>                     NA
## Warning: Removed 1 rows containing missing values (`position_stack()`).

Cruces calculados pero no graficados

## # A tibble: 5 × 2
##   estrato mean_price
##     <dbl>      <dbl>
## 1       6       801.
## 2       5       410.
## 3      NA       330 
## 4       4       275.
## 5       3       210.
## # A tibble: 6 × 2
##   zona         mean_areaconst
##   <chr>                 <dbl>
## 1 Zona Oeste             197.
## 2 Zona Centro            194.
## 3 Zona Oriente           192.
## 4 Zona Sur               173.
## 5 Zona Norte             161.
## 6 <NA>                   NaN
## # A tibble: 5 × 2
##   estrato mean_areaconst
##     <dbl>          <dbl>
## 1       6           248.
## 2       5           173.
## 3       3           142.
## 4       4           131.
## 5      NA           NaN

Conclusiones

Anexo

Descripcion del codigo en R.

# Cargar el paquete necesario
library(paqueteMET) 
data(vivienda_faltantes)

# instalación de libreria
library(dplyr)
library(moments)
library(naniar)
library(ggplot2)
library(tidyverse)

#Revision de variables presente en la base de datos
columnas <- names(vivienda_faltantes)
columnas

# Calcular el número de valores NA en cada variable
gg_miss_var(vivienda_faltantes)
na_count <- colSums(is.na(vivienda_faltantes))
na_count

# identificar la subdivisión de las variables zona, piso, estrato, parqueadero, baños, habitaciones.
Uzona <- unique(vivienda_faltantes$zona) 
Upiso <- unique(vivienda_faltantes$piso) 
Uestrato <- unique(vivienda_faltantes$estrato) 
Uparquead <- unique(vivienda_faltantes$parquea) 
Ubanios <- unique(vivienda_faltantes$banios) 
Ubanios <- unique(vivienda_faltantes$banios)
Utipo <- unique(vivienda_faltantes$tipo)

Subdiv <- list(Uzona = Uzona, Upiso = Upiso, Uestrato = Uestrato, Uparquead = Uparquead, Ubanios = Ubanios, Utipo = Utipo)
Subdiv

# Estandarizar los valores de la variable "tipo"
vivienda_faltantes <- vivienda_faltantes %>% mutate(tipo = recode(tipo, "Apartamento" = "apartamento", "APARTAMENTO" = "apartamento", "apto" = "apartamento", "Casa" = "casa", "casa" = "casa", "CASA" = "casa", "NA" = "NA"))

# Verificar los cambios de la variable tipo
unique(vivienda_faltantes$tipo)

#grafico pie de variable tipo
data_pie <- round(table(vivienda_faltantes$tipo) %>% prop.table()*100, 2) 
etiquetas_pie <- paste(vivienda_faltantes$tipo,"(", table(vivienda_faltantes$tipo), "-", data_pie, "%", ")" )
pie(data_pie, label=etiquetas_pie)

#Grafico de barra variable zona
ggplot(vivienda_faltantes, aes(x = zona)) + geom_bar(fill = "orange", color = "black", alpha = 0.7) + geom_text(stat='count', aes(label=after_stat(count)), vjust=-0.5) + theme_minimal() + labs(title = "Número de viviendas por zona", x = "Zona", y = "Número de viviendas") +
  theme(legend.position = "none")

#histograma de piso
ggplot(vivienda_faltantes, aes(x = piso)) + geom_histogram(binwidth = 1, fill = "lightgreen", color = "black", alpha = 0.7, na.rm = TRUE) + labs(title = "Histograma distribución de piso", x = "Piso", y = "Viviendas")

#histograma de baños
ggplot(vivienda_faltantes, aes(x = banios)) + geom_histogram(binwidth = 1, fill = "gray", color = "black", alpha = 0.7, na.rm = TRUE) + labs(title = "Histograma distribución de baños", x = "Baños", y = "Viviendas")

#histograma de habitacion
ggplot(vivienda_faltantes, aes(x = habitac)) + geom_histogram(binwidth = 1, fill = "darkblue", color = "black", alpha = 0.7, na.rm = TRUE) + labs(title = "Histograma distribución de habitación", x = "Habitacion", y = "Viviendas")

# Boxplot para 'preciom'
ggplot(vivienda_faltantes, aes(y = preciom)) + geom_boxplot(fill = "salmon", color = "black", na.rm = TRUE) + labs(title = "Boxplot variable preciom", y = "Precio")

# Boxplot para 'areaconst'
ggplot(vivienda_faltantes, aes(y = areaconst)) + geom_boxplot(fill = "green", color = "black", na.rm = TRUE) + labs(title = "Boxplot variable area construida", y = "Area construida")

# Barras para 'parqueadero'
ggplot(vivienda_faltantes, aes(x = parquea)) + geom_bar(fill = "purple", color = "black", alpha = 0.7, na.rm = TRUE) + theme_minimal() + labs(title = "Número parquederos por vivienda", x = "Parqueadero", y = "Número de viviendas")

# Indicadpres de centro, dispersion y forma
Estad_descrip <- lapply(vivienda_faltantes[, c("piso", "estrato", "preciom", "areaconst", "parquea", "banios", "habitac")], psych::describe)
Estad_descrip

#Indicador de posición:  caurtiles
Cuartiles <- lapply(vivienda_faltantes[c("piso", "estrato", "preciom", "areaconst", "parquea", "banios", "habitac")], quantile, probs = c(0.25, 0.5, 0.75), type = 6, na.rm = TRUE) 
Cuartiles

# cruce entre varaibles precio y  tipo 
df_1 <-vivienda_faltantes %>% group_by(tipo) %>% summarise(mean_price = mean(preciom, na.rm = TRUE)) %>% arrange(-mean_price)
df_1
# Gráfico 
ggplot(df_1, aes(x = reorder(tipo, -mean_price), y = mean_price)) + geom_bar(stat = "identity", fill = "darkblue", color = "black", alpha = 0.7, na.rm = TRUE) +
  labs(title = "Promedio de precio por tipo de vivienda", x = "Tipo", y = "Promedio de precio") + theme_minimal()

# cruce entre varaibles precio y zona
df_2 <- vivienda_faltantes %>% group_by(zona) %>% summarise(mean_price = mean(preciom, na.rm = TRUE)) %>% arrange(-mean_price)
df_2
# Gráfico 
ggplot(df_2, aes(x = reorder(zona, -mean_price), y = mean_price)) + geom_bar(stat = "identity", fill = "pink", color = "black", alpha = 0.7, na.rm = TRUE) +
  labs(title = "Promedio de precio por zona", x = "Zona", y = "Promedio de precio") + theme_minimal()

# cruce entre varaibles zona y estrato
df_3 <-vivienda_faltantes %>% group_by(zona) %>% summarise(median_estrato = median(estrato, na.rm = TRUE)) %>% arrange(-median_estrato) 
df_3
# Gráfico
ggplot(df_3, aes(x = reorder(zona, -median_estrato), y = median_estrato)) + geom_bar(stat = "identity", fill = "darkgreen", color = "black", alpha = 0.7, na.rm = TRUE) + labs(title = "Mediana de estrato por Zona", x = "zona", y = "Mediana de estrato") + theme_minimal()

# cruce entre varaibles tipo y area construida
df_4 <- vivienda_faltantes %>% group_by(tipo) %>% summarise(mean_areaconst= mean(areaconst, na.rm = TRUE)) %>% arrange(-mean_areaconst)
df_4
# Gráfico
ggplot(df_4, aes(x = reorder(tipo, -mean_areaconst), y = mean_areaconst)) + geom_bar(stat = "identity", fill = "purple", color = "black", alpha = 0.7, na.rm = TRUE) + labs(title = "Promedio de area construida por tipo de vivienda", x = "Tipo de vivienda", y = "Media de area construida") + theme_minimal()

# cruce de variables calculadas pero no graficadas
vivienda_faltantes %>% group_by(estrato) %>% summarise(mean_price = mean(preciom, na.rm = TRUE)) %>% arrange(-mean_price) 

vivienda_faltantes %>% group_by(zona) %>% summarise(mean_areaconst= mean(areaconst, na.rm = TRUE)) %>% arrange(-mean_areaconst)

vivienda_faltantes %>% group_by(estrato) %>% summarise(mean_areaconst= mean(areaconst, na.rm = TRUE)) %>% arrange(-mean_areaconst)