Introducción

En este informe se analizara la oferta de vivienda usada en Cali publicada en OLX a través de un análisis exploratorio de datos. Olx es una plataforma plataforma de comercio electrónico que permite comprar, vender, o intercambiar bienes y servicios.

Análisis exploratorio

El análisis exploratorio de datos (EDA) es un paso clave para comprender la información de venta de vivienda, para identificar patrones y evaluar la distribución de las variables.

PASO 1. Instalar y cargar librerias

# Cargar librerías necesarias
library(readxl)
library(dplyr)
library(ggplot2)
library(plotly)
library(knitr)
library(kableExtra)
library(tidyr)
library(RecordLinkage)
library(leaflet)
library(htmltools)

PASO 2: Filtar o seleccionar la información que necesito

Se filtra la base de datos teniendo en cuenta sólo apartamentos y el barrio Santa teresita:

El código siguiente carga un archivo de Excel con datos de viviendas, les asigna un ID único a cada fila, y luego filtra los apartamentos que están en el barrio “Santa Teresita”, permitiendo pequeñas diferencias en la escritura del nombre.

library(readxl)
datos<- read_excel("~/MAESTRIA FINANZAS/ANALITICA DE DATOS/Datos_Vivienda.xlsx")


#Generar una secuencia de números desde 1 hasta el número total de filas y grega esta secuencia a la tabla como una nueva columna.

id=1:dim(datos)[1]
datos=data.frame(id,datos)


#Filtro

require(RecordLinkage)

#Busca coincidencias de nombres similares (ej., "Sta Teresita" aún sería válido).
#Encuentra las posiciones de las filas que cumplen ambas condiciones.
# Extrae solo esas filas y las guarda en datos_sub.

pos = which(jarowinkler("pance",datos$Barrio)>0.98&datos$Tipo=="Apartamento")
datos_sub=datos[pos,]
head(datos_sub)
id Zona piso Estrato precio_millon Area_contruida parqueaderos Banos Habitaciones Tipo Barrio cordenada_longitud Cordenada_latitud
10 10 Zona Sur 6 6 690 150 2 5 4 Apartamento pance -76.46478 3.42783
19 19 Zona Sur 3 6 550 136 2 4 4 Apartamento pance -76.46554 3.42933
35 35 Zona Sur NA 6 570 137 2 5 4 Apartamento pance -76.46851 3.42544
39 39 Zona Sur 4 6 510 148 2 3 3 Apartamento pance -76.46947 3.42527
44 44 Zona Sur 6 6 1200 211 2 3 3 Apartamento pance -76.47039 3.41435
46 46 Zona Sur 2 6 550 143 3 3 3 Apartamento pance -76.47112 3.42049

Ahora obtenemos los nombres exactos de las variables que tenemos en la base de datos

library(dplyr)
names(datos_sub)
##  [1] "id"                 "Zona"               "piso"              
##  [4] "Estrato"            "precio_millon"      "Area_contruida"    
##  [7] "parqueaderos"       "Banos"              "Habitaciones"      
## [10] "Tipo"               "Barrio"             "cordenada_longitud"
## [13] "Cordenada_latitud"
##Registros totales para el vivienda tipo "Apartamento" y  barrio "santa teresita" 
length(pos)
## [1] 206

Indicadores de centralidad

## Se calcula el promedio del precio, el área construida, las habitaciones y los baños de los apartamentos en  venta en el Barrio Santa Teresita y se colocan los datos en una tabla o dataframe

#na.rm:  ignora valores faltantes (NA) para evitar errores en el cálculo.

cantidad_ofertas= length(datos_sub$Zona)
promedio_precio= mean(datos_sub$precio_millon,na.rm=TRUE)
promedio_area= mean(datos_sub$Area_contruida,na.rm =TRUE)
promedio_habitaciones= mean(datos_sub$Habitaciones,na.rm=TRUE)
promedio_banos= mean(datos_sub$Banos,na.rm=TRUE)

resultado_prom=data.frame(cantidad_ofertas,promedio_precio,promedio_area,promedio_habitaciones,promedio_banos)
resultado_prom
cantidad_ofertas promedio_precio promedio_area promedio_habitaciones promedio_banos
206 646.3058 153.3931 3.228155 3.854369
## Se calcula la mediana del precio, el área construida, las habitaciones y los baños de los apartamentos en  venta en el Barrio Santa Teresita y se colocan los datos en una tabla o dataframe

cantidad_ofertas= length(datos_sub$Zona)
mediana_precio= mean(datos_sub$precio_millon,na.rm=TRUE)
mediana_area= mean(datos_sub$Area_contruida,na.rm =TRUE)
mediana_habitaciones= mean(datos_sub$Habitaciones,na.rm=TRUE)
mediana_banos= mean(datos_sub$Banos,na.rm=TRUE)

resultado_med=data.frame(cantidad_ofertas,mediana_precio,mediana_area,mediana_habitaciones,mediana_banos)
resultado_med
cantidad_ofertas mediana_precio mediana_area mediana_habitaciones mediana_banos
206 646.3058 153.3931 3.228155 3.854369
### Indicadores de centralidad y variabilidad para la variable "precio"

promedio_precio=mean(datos_sub$precio_millon,na.rm = TRUE)
mediana_precio=median(datos_sub$precio_millon,na.rm = TRUE)
minimo_precio=min(datos_sub$precio_millon,na.rm = TRUE)
maximo_precio=max(datos_sub$precio_millon,na.rm = TRUE)
desvest_precio=sd(datos_sub$precio_millon,na.rm = TRUE)

indic_precio=data.frame(promedio_precio,mediana_precio,minimo_precio,maximo_precio,desvest_precio)
indic_precio
promedio_precio mediana_precio minimo_precio maximo_precio desvest_precio
646.3058 600 245 1750 231.0924
## Indicadores de centralidad y variabilidad para la variable "area construida"

promedio_areacon=mean(datos_sub$Area_contruida,na.rm =TRUE)
mediana_areacon=median(datos_sub$Area_contruida,na.rm =TRUE)
minimo_areacon=min(datos_sub$Area_contruida,na.rm =TRUE)
maximo_areacon=max(datos_sub$Area_contruida,na.rm =TRUE)
desvest_areacon=sd(datos_sub$Area_contruida,na.rm =TRUE)

indic_areacon=data.frame(promedio_precio,mediana_precio,minimo_precio,maximo_precio,desvest_precio)
indic_areacon
promedio_precio mediana_precio minimo_precio maximo_precio desvest_precio
646.3058 600 245 1750 231.0924

Representación gráfica

Histograma

Ahora creamos el histograma del precio y área de la vivienda para ver la distribución de los datos:

colnames(datos_sub)  # Muestra los nombres de las columnas
##  [1] "id"                 "Zona"               "piso"              
##  [4] "Estrato"            "precio_millon"      "Area_contruida"    
##  [7] "parqueaderos"       "Banos"              "Habitaciones"      
## [10] "Tipo"               "Barrio"             "cordenada_longitud"
## [13] "Cordenada_latitud"
str(datos_sub)       # Muestra la estructura del dataframe
## 'data.frame':    206 obs. of  13 variables:
##  $ id                : int  10 19 35 39 44 46 60 101 993 1100 ...
##  $ Zona              : chr  "Zona Sur" "Zona Sur" "Zona Sur" "Zona Sur" ...
##  $ piso              : chr  "6" "3" "NA" "4" ...
##  $ Estrato           : num  6 6 6 6 6 6 6 6 6 5 ...
##  $ precio_millon     : num  690 550 570 510 1200 550 595 390 840 415 ...
##  $ Area_contruida    : num  150 136 137 148 211 ...
##  $ parqueaderos      : chr  "2" "2" "2" "2" ...
##  $ Banos             : num  5 4 5 3 3 3 5 3 4 2 ...
##  $ Habitaciones      : num  4 4 4 3 3 3 4 3 4 3 ...
##  $ Tipo              : chr  "Apartamento" "Apartamento" "Apartamento" "Apartamento" ...
##  $ Barrio            : chr  "pance" "pance" "pance" "pance" ...
##  $ cordenada_longitud: num  -76.5 -76.5 -76.5 -76.5 -76.5 ...
##  $ Cordenada_latitud : num  3.43 3.43 3.43 3.43 3.41 ...
# Crear y mostrar el histograma interactivo
ggplotly(
  ggplot(datos_sub, aes(x=precio_millon)) +
    geom_histogram(binwidth=150, fill="steelblue", color="black", alpha=0.6) +
    labs(title="Figura 1. Histograma del Precio de Apartamentos en Santa Teresita",
         x="Precio", 
         y="Frecuencia") +
    theme_minimal()
)

Interpretación Figura 1.

La Figura 1. muestra la distribución de los precios de los apartamentos en Santa Teresita. Permite identificar patrones, concentración de precios y posibles sesgos en la distribución.

📌 Distribución de Precios:

La mayoría de los apartamentos tienen precios entre 400 y 1000 millones.

Se observa una mayor concentración entre 400 y 800 millones, con los valores más frecuentes en ese rango.

Hay apartamentos más costosos, superando los 1500 millones, pero son menos frecuentes.

📈 Modos y Agrupaciones:

Se identifican dos picos principales:

Uno entre 400 y 800 millones (mayor cantidad de apartamentos).

Otro entre 1000 y 1300 millones, aunque menos pronunciado.

También hay pocos apartamentos en el rango de 1500 a 2000 millones, lo que sugiere que los apartamentos de lujo son menos comunes.

📊 Dispersión y Rango de Precios:

Los precios van desde 150 millones hasta cerca de 2000 millones. El mercado tiene una alta variabilidad en precios, con una clara diferencia entre apartamentos más accesibles y otros de alto costo.

⚠️ Los apartamentos con precios superiores a 1500 millones parecen ser excepciones en el mercado, indicando que son propiedades de lujo o exclusivas.

# Crear y mostrar el histograma interactivo
ggplotly(
  ggplot(datos_sub, aes(x=Area_contruida)) +
    geom_histogram(binwidth=30, fill="green", color="black", alpha=0.6) +
    labs(title="Figura 2. Histograma del área (m2) de Apartamentos en Santa Teresita",
         x="Area_contruida", 
         y="Frecuencia") +
    theme_minimal()
)

Interpretación Figura 2.

La Figura 2. muestra la distribución de áreas construidas (en metros cuadrados) de los apartamentos en Santa Teresita.

📌 Distribución del Área Construida:

La mayoría de los apartamentos tienen entre 100 y 250 m². El valor más frecuente (pico más alto) se encuentra alrededor de 150 m². Existen algunos apartamentos con áreas mayores a 400 m², pero son casos menos frecuentes.

📈 Modos y Agrupaciones:

Hay un pico importante entre 100 y 200 m², lo que sugiere que la mayoría de los apartamentos en Santa Teresita tienen este rango de tamaño.

Otro grupo menos denso se observa en el rango de 250 a 300 m².

Se identifican algunos apartamentos con áreas superiores a 400 m², que probablemente correspondan a propiedades exclusivas o penthouses.

📊 Dispersión y Rango de Áreas:

Los apartamentos más pequeños tienen alrededor de 50 m², mientras que los más grandes superan los 500 m². La distribución tiene una ligera asimetría hacia la derecha, lo que indica que hay menos apartamentos grandes, pero aún existen algunas unidades de tamaño considerable.

⚠️ Posibles Valores Atípicos:

Los apartamentos mayores a 400 m² parecen ser excepcionales, lo que podría indicar que son propiedades de lujo.

Boxplot

Ahora creamos el boxplot del precio de la vivienda para ver la distribución de los datos:

# Crear y mostrar el boxplot interactivo
ggplotly(
  ggplot(datos_sub, aes(y=precio_millon)) +
    geom_boxplot(fill="lightblue", color="black", outlier.colour="red", outlier.shape=16, outlier.size=3) +
    labs(title="Figura 3. Boxplot del Precio de Apartamentos en Santa Teresita",
         y="Precio") +
    theme_minimal()
)

Interpretación Fgura 3-Boxplot

Este boxplot muestra la distribución de los precios de los apartamentos en Santa Teresita y permite identificar la dispersión, la mediana y posibles valores atípicos.

📌 Mediana (median: 730):

La línea negra dentro de la caja representa la mediana del precio de los apartamentos, que es 730 millones. Esto significa que el 50% de los apartamentos tienen un precio menor o igual a 730 millones, y el otro 50% tiene un precio mayor.

📦 Rango Intercuartílico (IQR – Interquartile Range):

Q1 (Primer Cuartil - q1: 560): El 25% de los apartamentos tiene un precio inferior a 560 millones. Q3 (Tercer Cuartil - q3: 1150): El 75% de los apartamentos tiene un precio inferior a 1150 millones.

El 50% de los precios se encuentran entre 560 y 1150 millones.

📊 Rango Total (Bigotes del Boxplot):

Mínimo (min: 150): El precio más bajo registrado es 150 millones. Máximo (max: 1900): El precio más alto es 1900 millones.

Los “bigotes” (líneas que se extienden desde la caja) representan el rango de precios sin outliers.

⚠️ ¿Hay valores atípicos?

No se observan outliers marcados en rojo en este gráfico o porfuera de los bigotes, lo que sugiere que todos los precios se encuentran dentro del rango esperado.

Ahora creamos el boxplot del área de la vivienda para ver la distribución de los datos:

# Crear y mostrar el boxplot interactivo
ggplotly(
  ggplot(datos_sub, aes(y=Area_contruida)) +
    geom_boxplot(fill="green", color="black", outlier.colour="red", outlier.shape=16, outlier.size=3) +
    labs(title="Figura 4. Boxplot del Área construida de Apartamentos en Santa Teresita",
         y="Área (m2)") +
    theme_minimal()
)

Interpretación Figura 4

Este boxplot muestra la distribución del área construida de los apartamentos en Santa Teresita, permitiendo analizar la dispersión, la mediana y los valores atípicos.

📌 Mediana (median: 194.00 m²)

La línea negra dentro de la caja representa la mediana del área, que es 194 m². Esto significa que el 50% de los apartamentos tienen un área menor o igual a 194 m², y el otro 50% tiene un área mayor.

📦 Rango Intercuartílico (IQR – Interquartile Range):

Q1 (Primer Cuartil - q1: 147.76 m²): El 25% de los apartamentos tienen un área menor a 147.76 m². Q3 (Tercer Cuartil - q3: 254.00 m²): El 75% de los apartamentos tienen un área menor a 254 m². El 50% de los apartamentos tienen un área entre 147.76 m² y 254 m².

📊 Rango Total (Bigotes del Boxplot):

Mínimo (min: 54 m²): El apartamento más pequeño tiene 54 m². Máximo (max: 550 m²): El apartamento más grande registrado es de 550 m². Upper fence (upper fence: 400 m²): Cualquier valor superior a 400 m² es considerado atípico.

⚠️ Valores Atípicos (Outliers)

Se observan varios puntos por encima de 400 m², lo que indica que algunos apartamentos tienen áreas significativamente mayores que la mayoría.

Estos valores atípicos pueden representar apartamentos de lujo o penthouses.

Exploración bivariada entre precio y área construida

Gráfico de dispersión

Opción 1

g1=ggplot(data = datos_sub,aes(y=precio_millon, x=Area_contruida)) + geom_point() + geom_smooth()
ggplotly(g1)

Opción 2

# Crear gráfico interactivo con correlación
ggplotly(
  ggplot(datos_sub, aes(x = Area_contruida, y = precio_millon)) +
    geom_point(color = "purple", alpha = 0.8, size = 2) +  # Puntos con color y transparencia
    geom_smooth(method = "loess", color = "grey", se = TRUE) +  # Línea de tendencia lineal
    labs(
      title = paste("Figura 5. Relación entre Área Construida y Precio\nCoef. de correlación: ", 
                    round(cor(datos_sub$precio_millon, datos_sub$Area_contruida, use = "complete.obs"), 2)),
      x = "Área Construida (m²)",
      y = "Precio (Millones)",
      caption = "Fuente: Datos de Vivienda"
    ) +
    theme_minimal() +
    theme(
      plot.title = element_text(size = 14, face = "bold", hjust = 0.5),
      axis.title = element_text(size = 12),
      axis.text = element_text(size = 10)
    )
)

Interpretación Figura 5.

Este gráfico muestra la relación entre el precio de los apartamentos (en millones de pesos) y el área construida (en m²).

🔹 Tendencia general:

Se observa una relación positiva: a mayor área construida, mayor precio del apartamento. Sin embargo, la relación no es completamente lineal, ya que hay zonas con más dispersión.

🔹 Patrones clave:

Para áreas menores a 100 m², los precios se concentran en el rango de 200-600 millones. Entre 100 y 250 m², los precios son más dispersos, con algunos apartamentos alcanzando 1500 millones. *Más de 300 m², los precios aumentan significativamente, pero con más variabilidad.

🔹 Curva de tendencia (línea gris):

La línea suavizada sugiere un crecimiento acelerado del precio cuando el área supera los 250 m². Hay una leve meseta alrededor de los 300 m², donde algunos apartamentos parecen menos costosos de lo esperado.

Coeficiente de correlación

A medida que el área construida aumenta, el precio también tiende a aumentar. Es una relación directamente proporcional: apartamentos más grandes suelen costar más. La correlación está en el rango de 0.7 a 1.0, lo que indica una relación fuerte. Aunque hay variabilidad en los precios, en general, el tamaño del apartamento explica una parte importante del precio. Una correlación alta NO significa que el área cause el precio. Otros factores como ubicación, acabados, demanda y oferta también influyen en el precio.

Un coeficiente de 0.72 indica que el tamaño del apartamento es un buen predictor del precio, pero no es el único factor determinante.

Hallazgos relevantes

Economías de escala: Puede haber un punto donde aumentar el área no incrementa el precio proporcionalmente.

Ubicación y exclusividad: Apartamentos más grandes pueden estar en zonas premium, lo que explica los precios elevados.

Oferta y demanda: Algunos outliers podrían indicar diferencias en calidad, ubicación o antigüedad del inmueble.

El área construida es un fuerte predictor del precio, pero hay variaciones que podrían explicarse por otros factores como ubicación, acabados y amenities del edificio

Representación espacial de la información

#Mapa 1
#Muestra un mapa con puntos morados en las ubicaciones especificadas por las coordenadas de la tabla datos_sub. Cada punto tiene una etiqueta con un identificador (id).

#leaflet() → Inicia la creación de un mapa interactivo.
#lng= datos_sub$cordenada_longitud → Usa la columna de longitudes como coordenadas en el eje X.

#lat= datos_sub$Cordenada_latitud → Usa la columna de latitudes como coordenadas en el eje Y.

#radius=1.0 → Define el tamaño de los marcadores (círculos pequeños).

#label= datos_sub$id → Muestra una etiqueta con el identificador de cada punto cuando el usuario pase el mouse sobre el marcador.


leaflet() %>% addCircleMarkers(lng= datos_sub$cordenada_longitud, lat= datos_sub$Cordenada_latitud, radius=1.0, color= "purple", label= datos_sub$id)%>% addTiles()
#Mapa 2 

#Etiqueta enriquecida (label) muestra información detallada del punto, incluyendo:
#ID del inmueble.
#Precio en millones.
#Área construida.
#Barrio.
#Latitud y longitud.

#Añade un fondo de mapa base → addTiles()

leaflet() %>% addCircleMarkers(lng = datos_sub$cordenada_longitud, lat = datos_sub$Cordenada_latitud, radius = 1, color = "purple",label = paste0( 'ID: ',datos_sub$ID,', Precio: ', datos_sub$precio_millon, ', Area: ', datos_sub$Area_contruida, ', Barrio: ', datos_sub$Barrio,', Lat: ',datos_sub$Cordenada_latitud,', Long: ',datos_sub$cordenada_longitud)) %>% addTiles()

Qué tipo de decisiones se podrian hacer de acuerdo al análisis previamente realizado?