PropTech Analytics: Apartamentos España 2019

Contenido

El sector inmobiliario global está experimentando una transformación estructural impulsada por el fenómeno PropTech (Property Technology), donde la analítica de datos avanzada y el Big Data sustituyen a los métodos tradicionales de tasación y análisis de mercado. Hoy en día, plataformas líderes como Idealista o Zillow operan como masivos agregadores de información en tiempo real, abriendo una ventana de oportunidad única para la toma de decisiones basada en datos (Data-Driven Decisions). En este contexto, la capacidad de procesar, limpiar y modelar datos extraídos directamente de la web no es solo una ventaja competitiva, sino el estándar operativo para inversores institucionales, desarrolladores urbanos y analistas financieros en mercados altamente dinámicos.

Data Science Pipeline 

  1. Ingesta de datos tabulares: Ejecutar el pipeline de lectura de fuentes de datos estructuradas en texto plano (raw data) para su inicialización en memoria.
  2. Curación y limpieza de datos (Data Wrangling / Preprocessing): Aplicar transformaciones en el DataFrame (imputación de valores nulos, parsing de tipos de datos, manejo de outliers y deduplicación) para optimizar la calidad de los datos (data quality) y mitigar sesgos en el modelado.
  3. Geocodificación y Enriquecimiento de Features: Implementar el proceso de geocoding mediante la API de Geopy para transmutar variables de texto (direcciones físicas) en vectores geoespaciales (latitud y longitud), permitiendo la representación cartográfica en un mapa interactivo.
  4. Análisis Exploratorio de Datos (EDA): examinar el conjunto de datos para entender sus características, detectar anomalías y descubrir patrones mediante resúmenes estadísticos y gráficos.
  5. Visualización de Analíticas Geoespaciales: Desplegar mapas de calor (heatmaps) o mapas coropléticos para mapear la distribución espacial e identificar sesgos geográficos o gradientes de precio entre regiones.
  6. Ingeniería de Características y Análisis de Correlación: Evaluar la covarianza y el impacto estadístico (feature importance) de las variables independientes del inmueble sobre la variable objetivo (target), que es el precio.
  7. Clustering para Segmentación de Mercado: Implementar algoritmos de aprendizaje no supervisado (como K-Means o DBSCAN) para agrupar patrones ocultos, reduciendo la dimensionalidad para perfilar clústeres del sector inmobiliario.
  8. Inferencia Estadística y Pruebas A/B (A/B Testing): Ejecutar tests estadísticos (como ANOVA, T-Test o pruebas no paramétricas) para validar la significancia estadística de las diferencias de precio e aislar el efecto de features específicas.
  9. Despliegue de un Dashboard de BI en Tableau: Desarrollar un cuadro de mando interactivo para habilitar el drill-down de métricas clave y permitir la exploración dinámica del dataset por parte de los stakeholders.
  10. Data Storytelling y Data-Driven Insights: Comunicar los hallazgos críticos del pipeline analítico mediante narrativas de datos, transformando métricas técnicas en recomendaciones estratégicas e insights accionables para el negocio.

Página del proyecto en GitHub:

https://github.com/fer78/Data-Analytics-Final-Portfolio-Project.git

1. Introducción y Contexto del Negocio (Business Understanding)

Proyecto Capstone del Curso Data Science: Analytics Specialist, de Codecademy. En este se desarrolla un Pipeline de Ciencia de Datos de extremo a extremo aplicado al sector PropTech (tecnología inmobiliaria). Para este análisis se ha seleccionado el Spanish Housing Dataset, un conjunto de datos reales de código abierto alojado en Kaggle. Los datos fueron recolectados originalmente mediante técnicas de web scraping automatizado sobre la plataforma  Idealista S.A.U., el portal inmobiliario líder en España.

La investigación se enfoca estratégicamente en el segmento de apartamentos (apartments/condos) dentro del territorio español. Este subsector representa una categoría crítica en los núcleos urbanos y suburbanos de alta densidad, donde la demanda de soluciones habitacionales eficientes, accesibles y con alta liquidez es elevada.

El propósito central de este análisis es desentrañar las dinámicas subyacentes del mercado inmobiliario español, aislando las características clave (features) que impactan directamente en la tasación y la elasticidad del precio. A través de un riguroso Análisis Exploratorio de Datos (EDA), estadística descriptiva e inferencial, se identifican patrones ocultos, asimetrías de precios y agrupaciones geoespaciales (clusters). Los resultados proveen insights de alto valor estratégico para tomadores de decisiones, inversores institucionales (REITs) y compradores privados internacionales.

Nota metodológica: Con el fin de garantizar la escalabilidad del proyecto, la fase de curación y preprocesamiento de datos (Data Wrangling) se ejecuta de manera agnóstica sobre el volumen total del dataset. Esto permite estructurar una base de datos limpia, robusta y optimizada para futuros análisis predictivos o modelos de Machine Learning aplicados a otros tipos de activos (como viviendas unifamiliares o locales comerciales).

2. Objetivos Estratégicos

El objetivo principal de este proyecto es modelar y analizar el comportamiento estadístico de los apartamentos y viviendas unifamiliares en venta a lo largo de diversas provincias españolas durante el ejercicio fiscal 2019.

Los objetivos específicos del pipeline analítico incluyen:

  • Ingesta y Curación de Datos: Diseñar un flujo de preprocesamiento robusto en Pandas para mitigar el ruido estadístico (outliers, nulos y duplicados).
  • Enriquecimiento Geoespacial: Implementar algoritmos de geocoding mediante la API de Geopy para transmutar direcciones textuales en vectores tridimensionales (latitud, longitud y altitud) que permitan una cartografía interactiva precisa.
  • Segmentación Avanzada: Aplicar modelos de aprendizaje no supervisado (Clustering) para clasificar el mercado e identificar micronichos de inversión.
  • Business Intelligence (BI): Construir e implementar un dashboard interactivo en Tableau enfocado en la exploración dinámica y el desglose (drill-down) de métricas macroeconómicas locales.
  • Localización Internacional: Adaptar la terminología técnica, métricas superficiales (de metros cuadrados a square feet) y formatos financieros al contexto normativo y cultural de los inversores privados de Estados Unidos (EE. UU.), facilitando la transferencia de conocimiento (Data Storytelling).

3. Fuente, Arquitectura y Estructura de los Datos

La fuente de datos de partida consiste en un dataset crudo de texto plano estructurado que consta de 100,000 registros (instancias) y 41 variables (características). La granularidad de la información abarca atributos multidimensionales de los listados inmobiliarios activos en el portal, agrupados de la siguiente forma:

  • Métricas Financieras y de Dimensión: Variable objetivo (target) precio, coste por unidad de superficie, tamaño del inmueble, entre otros.
  • Atributos Estructurales y de Calidad: Estado de conservación (renovado, a reformar), año de construcción, planta/piso.
  • Variables de Confort (Features Binarias): Presencia de sistemas de climatización (A/C), zonas verdes (jardín), terrazas, plazas de garaje y piscinas comunitarias o privadas.
  • Datos de Localización: Direcciones normalizadas, municipios, códigos postales y provincias.

El conjunto de datos presenta una naturaleza híbrida compuesta por variables cuantitativas (discretas y continuas) y cualitativas (nominales y ordinales), ofreciendo un entorno óptimo para la inferencia estadística robusta y la ingeniería de características.

4. Inspección Inicial del Dataset (Raw Data Snapshot)

Para validar la integridad estructural e iniciar el proceso de auditoría de datos (Data Profiling), se presenta a continuación una muestra del primer registro indexado en memoria dentro de nuestro DataFrame original:

print(raw_data.head(1).T)
                                                                               0
ad_description                 Precio chalet individual en la localidad de Ab...
ad_last_update                                Anuncio actualizado el 27 de marzo
air_conditioner                                                                0
balcony                                                                        0
bath_num                                                                       2
built_in_wardrobe                                                              0
chimney                                                                        0
condition                                               segunda mano/buen estado
construct_date                                                               NaN
energetic_certif                                                             NaN
floor                                                                  2 plantas
garage                                     plaza de garaje incluida en el precio
garden                                                                         1
ground_size                                                                  NaN
heating                                                                      NaN
house_id                                                                81717634
house_type                                           Casa o chalet independiente
kitchen                                                                      NaN
lift                                                                         NaN
loc_city                                                             Urcabustaiz
loc_district                                                          La iglesia
loc_full                                 La iglesia , Urcabustaiz , Zuya, Álava 
loc_neigh                                                                    NaN
loc_street                                                                   NaN
loc_zone                                                             Zuya, Álava
m2_real                                                                     1000
m2_useful                                                                  172.0
obtention_date                                                        2019-03-29
orientation                                              norte, sur, este, oeste
price                                                                     310000
reduced_mobility                                                               0
room_num                                                                       4
storage_room                                                                   0
swimming_pool                                                                  0
terrace                                                                        1
unfurnished                                                                  NaN
number_of_companies_prov                                                   19147
population_prov                                                           328868
companies_prov_vs_national_%                                                0.57
population_prov_vs_national_%                                               0.70
renta_media_prov                                                        19889.00

5. Pipeline de Procesamiento y Curación de Datos (Data Wrangling)

El proceso de preparación y adecuación del dataset se estructuró en un pipeline secuencial dividido en tres fases fundamentales, garantizando así la calidad de los datos (Data Quality), la consistencia interna y la reproducibilidad del análisis.

Fase 1: Preprocesamiento y Depuración Estructural (Initial Transformation)

El objetivo de esta primera fase fue mitigar el ruido estadístico inicial, descartar redundancias en el flujo de datos y homogeneizar los formatos vectoriales necesarios para las posteriores tareas de enriquecimiento geoespacial. Las operaciones críticas ejecutadas incluyeron:

  • Filtrado de Características (Feature Dropping / Data Filtering): Se realizó un análisis de relevancia para identificar y remover 16 variables que no aportaban valor predictivo ni descriptivo al núcleo del negocio (como identificadores internos del portal web o metadatos de los anuncios). Esta reducción de dimensionalidad optimizó drásticamente el consumo de memoria en el entorno de ejecución.
  • Deduplicación de Instancias (Data Deduplication): Se auditó el DataFrame en busca de registros idénticos que pudieran sesgar las distribuciones de precios (causados habitualmente por la republicación de anuncios). Se identificaron e indexaron 6,071 registros duplicados, los cuales fueron eliminados por completo para asegurar la unicidad de las observaciones.
  • Tratamiento de Valores Omisos (Handling Missing Data): Se evaluó la matriz de densidad de nulos para determinar el mecanismo de pérdida de información (MCAR, MAR o MNAR). Dependiendo de la variable, se aplicaron estrategias diferenciadas:
    • Filtrado por umbral (Drop) en variables críticas de localización imposibles de inferir.
    • Imputación estadística (empleando la mediana del vecindario/provincia) para variables numéricas continuas como la superficie o el precio.
    • Categorización explícita (como “No especificado”) para atributos cualitativos binarios o nominales, evitando así la pérdida de registros valiosos.
missing_values = raw_data.isnull().sum().sort_values(ascending=False)
print(missing_values[missing_values > 0])
ground_size       93928
kitchen           91902
loc_street        80147
heating           69857
construct_date    63150
orientation       56789
garage            56130
loc_neigh         52086
m2_useful         44501
lift              38965
condition         13295
dtype: int64
  • Imputación por Ausencia Estructural (Structural Missingness):
    Se identificó que los valores faltantes en ciertas variables cualitativas binarias (como la disponibilidad de garaje o ascensor) no respondían a una pérdida aleatoria de información, sino a una omisión estructural. En el sector PropTech, la ausencia de registro equivale a la inexistencia del atributo. Por lo tanto, se ejecutó una imputación determinista reemplazando estos nulos por el valor binario 0 (Falso).
  • Filtrado por Umbral de Densidad (Sparsity Filtering):
    Se auditó la tasa de completitud de todas las características. Nueve variables que exhibían un índice de valores ausentes superior al 60% fueron descartadas de forma definitiva, mitigando el riesgo de introducir sesgos artificiales mediante técnicas de imputación masiva sobre matrices dispersas.

Fase 2: Armonización de Variables y Derivación de Características (Feature Engineering)

Con el fin de estandarizar el dataset e iniciar el proceso de auditoría y perfilado de variables (Data Profiling), se implementaron las siguientes operaciones a nivel de registro:

  • Estandarización de Categorías y Localización de Dominio: Para adaptar el proyecto al mercado objetivo de inversores de EE. UU., se transformó la taxonomía y codificación original hacia la jerga inmobiliaria americana (e.g., convirtiendo tipos de propiedad a Apartment/CondoSingle-Family Home, etc.). Asimismo, se corrigieron inconsistencias sintácticas y tipográficas presentes en el texto libre.
  • Casteo de Tipos de Datos (Type Casting): Se reasignaron los tipos de datos en memoria para optimizar el rendimiento del sistema, forzando variables numéricas mal indexadas a flotantes o enteros (float64/int64), y convirtiendo variables de texto repetitivas en el tipo eficiente category de Pandas.
  • Normalización de Texto para Geocodificación: Se aplicaron expresiones regulares (Regex) para limpiar la variable de dirección física, eliminando ruidos de texto y prefijos redundantes (como “Calle”, “Avenida”, “Av.”) que disminuyen la precisión de los motores de búsqueda geográfica.
  • Derivación de Características de Respaldo (Feature Derivation): Se diseñó una variable sintética denominada city_prov mediante la concatenación de los campos loc_city y loc_zone. Esta variable actúa como una directiva de ubicación secundaria (fallback location) en el pipeline, asegurando que si la dirección específica falla al geocodificarse, el sistema pueda aproximar el registro a nivel municipal.
  • Persistencia Intermedia: El DataFrame limpio y armonizado se exportó a un nuevo archivo serializado, garantizando un punto de restauración óptimo antes de iniciar la fase de cómputo intensivo.

6. Enriquecimiento Geoespacial y Procesamiento por Lotes (Batch Geocoding)

Para transformar las direcciones físicas en vectores de coordenadas espaciales (Latitud y Longitud), se integró la librería Geopy utilizando el servicio de geocodificación Nominatim, un motor de código abierto basado en el ecosistema de mapas vectoriales OpenStreetMap.

Arquitectura del Pipeline de Geocodificación por Bloques (Chunking)

Debido al volumen masivo del dataset (100,000 registros), realizar peticiones síncronas a una API externa en un solo bloque comprometería la memoria del sistema y provocaría el bloqueo por tiempo de espera (timeout). Para solucionar esta limitación de infraestructura, se diseñó una arquitectura de procesamiento por lotes (batch processing) dividiendo el DataFrame en bloques (chunks) de 10,000 registros.

El flujo algorítmico se estructuró a través del siguiente pipeline de funciones:

[Dataset Original] ──> (create_chunks) ──> [Bloques de 10k en Disco]
                                                    
             ┌──────────────────────────────────────┘
             
      (process_chunk) ──> Loop Fila por Fila > (geolocate) ──> (split_address)
             
             
     [Liberación Memoria] ──> [Fusión Final de Chunks] > [Dataset Geoespacial]
  • create_chunks: Segmenta el DataFrame maestro en particiones homogéneas de 10,000 filas y persiste temporalmente cada bloque en disco para minimizar la huella de memoria RAM.
  • geolocate: Invoca el motor de Nominatim fila por fila dentro del bloque para capturar las coordenadas y retornar una cadena de texto con la dirección normalizada completa encontrada por el servidor.
  • split_address: Realiza un proceso de parsing (análisis sintáctico) sobre la dirección completa devuelta por el servidor para extraer y estructurar vectorialmente variables críticas: código postal (ZIP code), municipio y región.
  • process_chunk: Actúa como la función orquestadora del lote. Ejecuta secuencialmente  geolocate y split_address, integra las nuevas características geoespaciales en el bloque actual, escribe el resultado parcial en almacenamiento físico y ejecuta el recolector de basura de Python para liberar la memoria antes de procesar el siguiente lote.

Finalmente, un script de consolidación unificó todos los bloques procesados en un único dataset maestro enriquecido.

Optimización Visual mediante Dispersión de Coordenadas (Spatial Jittering)

Durante la fase de control de calidad y representación cartográfica preliminar, se detectó una alta colisión de registros en coordenadas idénticas. Este fenómeno de superposición espacial responde a tres dinámicas del mercado real:

  1. Unidades Multifamiliares: Propiedades verticales (apartamentos) que coexisten dentro del mismo edificio físico.
  2. Geocodificación por Fallback: Registros cuya dirección original presentaba fallos sintácticos graves, forzando al pipeline a utilizar la variable de respaldo city_prov, ubicando la propiedad en el centroide geográfico de la ciudad.
  3. Anuncios Ciego (Blind Listings): Una práctica comercial extendida en el sector Real Estate donde las agencias omiten deliberadamente la dirección exacta para proteger la privacidad del vendedor, evitar la desintermediación y prevenir que competidores contacten directamente al propietario. Estos anuncios comparten coordenadas genéricas centralizadas.

Implementación del Algoritmo de Jittering

Para resolver la superposición visual en los mapas interactivos y permitir un análisis de densidad correcto, se aplicó la técnica estadística de Jittering Spatial, la cual introduce ruido estocástico aleatorio de baja magnitud a las coordenadas duplicadas.

El sub-pipeline matemático opera mediante dos funciones clave:

  • move_coordinates: Desplaza de forma vectorial las coordenadas originales calculando un nuevo punto a partir de un ángulo de azimut y una distancia radial aleatoria. Estos valores métricos se transmutan a grados de arco geográfico (ajustando la deformación por latitud) y se adicionan a los vectores originales.
    (Nota de limitación del modelo: Al aplicar ruido aleatorio en zonas costeras, existe un margen de error donde algunos registros pueden sufrir un desplazamiento infinitesimal que los posicione visualmente sobre la superficie marina).
  • disperse_coordinates: Actúa como la función de agrupación. Identifica mediante una operación de agregación todas las coordenadas duplicadas en el dataset y aplica de manera aislada la función move_coordinates a cada registro repetido, distribuyendo las propiedades de forma concéntrica en un radio controlado por parámetros de distancia mínima y máxima predefinidos.

Muestra Visual del Impacto del Algoritmo (Spatial Jittering Demo)

A continuación, se ilustra el comportamiento del algoritmo donde múltiples instancias colapsadas en un único centroide se transforman en una distribución dispersa y legible para el analista o el usuario final:

Curación de Datos Avanzada y Acotación del Espacio Muestral (Data Cleaning for Analytics)

Una vez integrado el algoritmo de jittering, el dataset se exportó como un punto de control intermedio. En esta etapa, el DataFrame maestro consolidó un volumen de 89,948 registros y 19 columnas  (incluyendo las 6 nuevas variables vectoriales derivadas de la fase de geocodificación).

processed_data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 89948 entries, 0 to 89947
Data columns (total 19 columns):
 #   Column           Non-Null Count  Dtype  
---  ------           --------------  -----  
 0   air_conditioner  89948 non-null  int64  
 1   bath_num         89948 non-null  int64  
 2   chimney          89948 non-null  int64  
 3   condition        89948 non-null  object 
 4   garage           89948 non-null  object 
 5   garden           89948 non-null  int64  
 6   house_type       89948 non-null  object 
 7   m2_real          89948 non-null  int64  
 8   price            89948 non-null  float64
 9   room_num         89948 non-null  int64  
 10  storage_room     89948 non-null  int64  
 11  swimming_pool    89948 non-null  int64  
 12  terrace          89948 non-null  int64  
 13  latitude         89948 non-null  float64
 14  longitude        89948 non-null  float64
 15  address          89948 non-null  object 
 16  p_code           89948 non-null  int64  
 17  region           89948 non-null  object 
 18  municipality     89948 non-null  object 
dtypes: float64(3), int64(10), object(6)
memory usage: 13.0+ MB

A partir de esta estructura, se diseñó un pipeline de depuración quirúrgica para asegurar la validez estadística, eliminando sesgos geográficos y comerciales antes de la fase de modelado analítico:

  • Validación de Límites Geoespaciales (Bounding Box Filtering): Para evitar errores de proyección en la cartografía, se realizó una auditoría de coordenadas aplicando máscaras booleanas basadas en el bounding box oficial del territorio español:
    • Latitud27.6ºN, 43.8ºN (Desde el archipiélago canario hasta el litoral cantábrico).
    • Longitud: -18.2ºW, 4.3ºE  (Desde la isla de El Hierro hasta la costa oriental de Baleares).
    Esta validación identificó 37 anomalías espaciales (outliers geográficos), las cuales fueron removidas del flujo principal para evitar distorsiones en los mapas interactivos.
  • Filtrado por Representatividad Muestral: Con el objetivo de estabilizar la varianza del modelo, se ejecutó una poda estadística en variables categóricas de baja frecuencia:
    • Se removieron regiones administrativas con un volumen de registros estadísticamente insignificante (low-density regions).
    • Se descartaron tipologías de vivienda con nula representatividad en el mercado masivo urbano (tales como castillos, palacios, ranchos, mansiones, casas torres y casas rurales), concentrando el espectro analítico puramente en el segmento residencial estándar.
Código de la gráfica
fig, ax = plt.subplots(2,1, figsize=(10, 4))

sns.boxplot(x=processed_data['latitude'], ax=ax[0])
ax[0].set_title('Latitude Range')

sns.boxplot(x=processed_data['longitude'], ax=ax[1])
ax[1].set_title('Longitude Range')

fig.suptitle('Coordinate Ranges', fontsize=14)
plt.tight_layout()
plt.show()

  • Ingeniería de Características (Feature Binning & Binning Stratification): Se transformaron variables continuas en estructuras categóricas ordinales para facilitar la segmentación de mercado en Tableau:
    • price_segment: Clasificación del inventario según su valor financiero:
      • Affordable
      • Mid-Range
      • Luxury
    • size_category: Clasificación por densidad de superficie construida (mapeada bajo estándares internacionales de la industria):
      • Small ()
      • Medium
      • Large ()
  • Tratamiento de Inconsistencias Lógicas: Se ejecutó un filtro de integridad física eliminando registros con valores imposibles o nulos en variables clave de habitabilidad, tales como propiedades con cero baños o cero habitaciones.
  • Truncamiento del Espectro Inmobiliario (Capping Extremes): Al evaluar la función de densidad de probabilidad (PDF) de la variable objetivo price, se observó una cola pesada hacia la derecha (right-skewed distribution). Para mitigar el efecto de datos atípicos o errores de digitación en el portal inmobiliario, se parametrizó un umbral de corte estricto, aislando el análisis entre un mínimo de €10,000 y un máximo de €2,000,000. Cualquier registro fuera de este intervalo operativo fue removido.

Algoritmo de Remoción de Outliers Segmentado (Stratified Outlier Treatment)

Eliminar valores atípicos de forma global sobre un mercado tan heterogéneo como el inmobiliario introduce un sesgo metodológico crítico: un precio “atípico alto” para un apartamento pequeño en una región rural podría ser un precio “atípico bajo” para un inmueble en una zona de lujo urbana.

Para resolver esto, se desarrolló e implementó un enfoque de remoción adaptativa y estratificada mediante dos funciones customizadas en Python:

  1. remove_outliers: Función atómica que calcula el Rango Intercuartílico () sobre una serie numérica. Define las barreras de aceptación estadística mediante los límites inferior y superior tradicionales:
    Cualquier observación que se posicione fuera de estas fronteras analíticas es clasificada como un outlier estadístico y removida.
  2. clean_outliers_by_segment: Función orquestadora que aplica una estrategia de descomposición jerárquica mediante agrupamientos sucesivos (nested group-by). El algoritmo aísla el cálculo del IQR de forma justa y comparable, subdividiendo el conjunto de datos bajo el siguiente flujo: 
[Dataset Consolidado]
   
   └──> 1. Estratificación por Segmento de Precio (`price_segment`)
               
               └──> 2. Estratificación por Tipología de Vivienda (`property_type`)
                           
                           └──> 3. Estratificación por Región (`region`)
                                       
                                       └──> [Aplicación del IQR local]

Esta normalización multicapa garantiza que los valores considerados atípicos se evalúen respetando el comportamiento de sus pares directos de mercado, preservando la microestructura económica del conjunto de datos.

Consolidación del Dataset Final para Análisis

Tras la ejecución completa de este pipeline de ingeniería y curación de datos, la dimensión final del DataFrame maestro se estabilizó en 77,677 registros y 21 columnas. Este volumen de datos limpio, curado, enriquecido y libre de ruido estadístico conforma la base de datos de alta fidelidad (Analytics-Ready Dataset) utilizada para las posteriores fases de analítica inferencial y visualización.

Para verificar la disposición física de la estructura de datos en memoria lista para su ingesta en Tableau, se presenta un perfil transpuesto del primer registro procesado:

print(spain_housing.head(1).T)
air_conditioner                                                  0
bath_num                                                         2
chimney                                                          0
condition                                                   Resale
garage                                                Not Included
garden                                                           1
house_type                                      Single-Family Home
m2_real                                                        275
price                                                    242000.00
room_num                                                         3
storage_room                                                     1
swimming_pool                                                    1
terrace                                                          1
latitude                                                     38.59
longitude                                                    -0.14
address          Urbanizatzación Convent de les Monges / Urbani...
p_code                                                        3530
region                                        Comunidad Valenciana
municipality                                              Alicante
price_segment                                           Affordable
size_category                                                Large

Análisis Exploratorio de Datos (EDA) y Modularización Analítica

Con el conjunto de datos limpio y validado estadísticamente, se procedió a la fase de Análisis Exploratorio de Datos (EDA). En este punto, la investigación se estructuró de manera estratificada por cada price_segment, aislando el comportamiento de las variables continuas y categóricas para identificar dinámicas específicas de oferta y demanda.

Arquitectura de Software: Modularización mediante functions.py

Para garantizar la mantenibilidad, escalabilidad y legibilidad del código (siguiendo las mejores prácticas de ingeniería de software para Ciencia de Datos), se evitó saturar el cuaderno principal (Jupyter Notebook) con bloques de código redundantes de generación de gráficos. En su lugar, se encapsuló toda la lógica visual en un script modular independiente denominado functions.py.

Este fichero actúa como una librería interna que es importada en el entorno de ejecución, permitiendo invocar funciones dinámicas y parametrizables de manera limpia:

Catálogo de Funciones de Abstracción Analítica

Las funciones integradas en el pipeline modular se dividen según su propósito específico dentro de la auditoría analítica:

1. Motores de Transformación e Interrogación de Datos

  • filterdf(df, col1, val1, col2, val2): Retorna un sub-DataFrame ejecutando una máscara booleana bidimensional basada en dos características y sus respectivos umbrales operativos.

2. Motores de Análisis Univariado y Distribución

  • boxplot_view(dataframe, column): Despliega diagramas de caja para diagnosticar la asimetría y el rango intercuartílico de variables continuas.
  • boxplot_view_wo(dataframe, column): Muestra la misma distribución de cajas, pero truncando los extremos (whiskers) para aislar visualmente los datos atípicos y mejorar el detalle de los cuartiles centrales.
  • distribution_views(dataframe): Inicializa una cuadrícula de gráficos de densidad para contrastar la dispersión en los campos críticos m2_real y price.
  • plot_histogram(df, column, bins=20, kde=True, xlim=None): Genera histogramas avanzados con la estimación de densidad de kernel (KDE) integrada para evaluar la normalidad de la variable.

3. Motores de Análisis Categórico y Frecuencias

  • binary_categorical_view(dataframe): Evalúa simultáneamente el volumen y tasa de penetración de características booleanas ligadas al confort habitacional (air_conditionerchimneygardenstorage_roomswimming_poolterrace).
  • categorical_features_view(dataframe): Desglosa las variables categóricas ordinales y cardinales del inventario como room_numbath_num y el estado general (condition).
  • plot_rooms_bathrooms_distribution(df): Muestra la densidad de la distribución cruzada de dormitorios y cuartos de baño específicos para un nicho analítico.
  • plot_category_histograms(df, numeric_col, category_col): Superpone histogramas de variables cuantitativas segregados por etiquetas de una dimensión cualitativa.

4. Motores de Análisis Bivariado, Multivariado y Correlación

  • bivariate_distribution(dataframe, group_col, target_col, show_outliers): Acopla diagramas de caja cruzados junto a una matriz de salida de estadística descriptiva (media, mediana, desviación estándar) para analizar la variabilidad de una métrica frente a factores grupales.
  • plot_binary_categorical_relationships(dataframe, target_variable): Ejecuta un análisis de contraste que mapea el impacto de cada atributo binario sobre una variable continua (como el precio), inyectando una tabla resumen con los deltas de variación.
  • correlation_heatmap_by_size_category(df): Calcula y grafica matrices de correlación de Pearson o Spearman segregadas de forma independiente para cada nivel de size_category.
  • plot_distribution_by_price_segment(df): Ejecuta un cruce multidimensional agrupando por segmento financiero y tipología de activo para proyectar la densidad de la oferta mediante un mapa de calor bidimensional.

Muestra de implementación: functions.py (Script Snippet)

A continuación se expone, a modo de ejemplo de ingeniería de código, la arquitectura interna de una de las funciones clave del módulo. Esta estructura destaca por su manejo integrado de visualizaciones con Seaborn/Matplotlib y la inyección automática de resúmenes de datos numéricos en la consola:

def bivariate_distribution(dataframe, group_col, target_col, show_outliers=True, figsize=(10, 6)):
    """
    Displays a boxplot and a summary table of a variable grouped by another variable's values.
    """
    df_copy = dataframe.copy()

    # Boxplot
    plt.figure(figsize=figsize)
    ax = sns.boxplot(data=df_copy, x=group_col, y=target_col, showfliers=show_outliers, palette="pastel")
    plt.title(f'Boxplot of {target_col} by {group_col} with Mean Values')
    plt.xlabel(group_col)
    plt.ylabel(target_col)
    plt.xticks(rotation=45)
    plt.show()

    # Summary Statistics table
    summary_stats = df_copy.groupby(group_col)[target_col].agg(
        mean=lambda x: round(x.mean(), 2),
        Q1=lambda x: x.quantile(0.25),
        Q3=lambda x: x.quantile(0.75),
        std_dev=lambda x: round(x.std(), 2)
    ).reset_index()
    summary_stats = summary_stats.sort_values(by='mean', ascending=False).reset_index(drop=True)
    print(f"Summary Table of {target_col} by {group_col} sorted by Mean:")
    print(summary_stats)
bivariate_distribution(affordable_apartments, 'region', 'price', show_outliers=False)
Summary Table of price by region sorted by Mean:
                 region      mean        Q1        Q3  std_dev
0        Islas Baleares 197767.25 155000.00 240000.00 56301.50
1   Comunidad de Madrid 180755.40 133350.00 229000.00 59592.77
2            País Vasco 176976.07 133000.00 220794.00 60137.55
3              Cataluña 133926.13  96000.00 168000.00 50869.32
4               Galicia 116780.80  77000.00 140000.00 55973.88
5              Canarias 114996.06  85000.00 136000.00 41459.24
6       Castilla y León 108825.89  69000.00 140000.00 53845.32
7             Andalucía 104710.97  61650.00 141650.00 54689.41
8  Comunidad Valenciana 100787.91  59000.00 126800.00 58180.42
9    Castilla-La Mancha  94720.85  58555.00 120000.00 50163.13

Hallazgos Analíticos y Evidencia Empírica (Exploratory Insights)

A lo largo de cada sección del análisis de datos se documentaron detalladamente las métricas clave descubiertas y las distribuciones de frecuencia de las variables del entorno PropTech. El reporte analítico exhaustivo, junto con los gráficos de dispersión y mapas de calor interactivos generados en esta etapa, se encuentra completamente documentado y disponible para su consulta en el repositorio oficial del proyecto en GitHub.

Inferencia Estadística y Modelado Predictivo (Advanced Analytics)

En esta fase del pipeline, se transicionó de la analítica descriptiva a la analítica diagnóstica y predictiva. Se aplicaron metodologías de estadística inferencial y modelos lineales avanzados para validar con rigor matemático las correlaciones y patrones observados durante el EDA, buscando dar respuesta a la pregunta de negocio central: ¿Cuáles son los inductores de valor (value drivers) estadísticamente significativos en la tasación del mercado de apartamentos en España?

Este bloque de analítica avanzada se articuló bajo dos verticales metodológicas:

  1. Inferencia Estadística (Pruebas de Hipótesis): Diseñada para mitigar el riesgo de sesgo por aleatoriedad y confirmar la significancia de las relaciones.
  2. Modelado Predictivo Supervizado: Orientado a cuantificar el poder explicativo y la elasticidad de los vectores geográficos sobre la variable objetivo (target).

Validaciones Estadísticas e Inferencia

1. Análisis de Varianza (ANOVA) para Segmentos de Superficie (size_category)

Se ejecutó un test ANOVA de una vía (One-Way ANOVA) para contrastar si las discrepancias de precio observadas entre los grupos de tamaño (SmallMediumLarge) eran producto del azar o respondían a dinámicas estructurales de mercado:

  • Hipótesis Nula () (No existen diferencias significativas entre los precios medios de las tres categorías).
  • Hipótesis Alternativa (): Al menos un par de medias poblacionales difiere significativamente entre sí.
  • Resultado: El rechazo de la hipótesis nula () confirmó que la escala métrica de la vivienda fragmenta el mercado en estratos de valoración completamente independientes.

2. Evaluación del Impacto del Estado de Conservación (condition) en el Precio

Para determinar si el ciclo de depreciación física o la prima por estreno impactan la valoración de forma homogénea, se estructuró un segundo diseño ANOVA comparando los precios según el estado de preservación indexado en el portal:

  • Grupos de ContrasteNew construction (Nueva), Good condition (Reventa) y To renovate (Necesita reforma).
  • Resultado: La prueba arrojó significancia estadística crítica, validando empíricamente que el coste de oportunidad de la reforma y el valor premium del suelo a estrenar son factores determinantes en la dispersión de precios.

3. Análisis de Correlación de Pearson para Atributos de Habitabilidad (bath_num)

Se evaluó la intensidad del vínculo lineal existente entre la densidad de cuartos de baño y el precio final de los apartamentos:

  • Hipótesis Nula () (No existe correlación lineal estadísticamente significativa entre el número de baños y el precio del inmueble).
  • Hipótesis Alternativa () (Existe una correlación lineal significativa entre ambas variables).
  • Resultado: Se evidenció una correlación lineal positiva y robusta, confirmando que la infraestructura interna de fontanería actúa como un proxy de lujo y confort habitacional fuertemente valorado por el mercado.

Modelado Lineal Predictivo: El Vector Geográfico como Inductor de Valor

Más allá de la validación de hipótesis aisladas, se construyó y entrenó un modelo de Regresión Lineal Múltiple. El objetivo de este algoritmo supervisado fue aislar el impacto puramente geoespacial, evaluando en qué medida los vectores tridimensionales combinados (latitud, longitud) y las variables categóricas regionales explican estadísticamente la varianza de la variable dependiente price.

Este modelo base (baseline model) cuantifica el impacto marginal de la ubicación geográfica exacta, sentando los cimientos matemáticos para algoritmos más complejos de tasación automatizada (AVM – Automated Valuation Models).

Impacto del Proyecto y Aplicación de Negocio (Business Value)

Al integrar la exploración visual, la inferencia estadística y el modelado predictivo, el proyecto transita con éxito desde la descripción analítica hacia la anticipación del comportamiento del mercado. Este marco de trabajo robusto se traduce en una toma de decisiones informada por datos (Data-Driven Decisions) con aplicaciones críticas para diversos stakeholders de la industria:

  • Agentes y Brókers Inmobiliarios: Optimiza las estrategias de fijación de precios de salida (listing price) basándose en el comportamiento real de las features del entorno.
  • Inversores Corporativos y Compradores Privados: Permite identificar anomalías del mercado, micronichos de inversión de alto rendimiento (yield) y activos infravalorados respecto a su entorno geoespacial.
  • Desarrolladores, Constructores y Arquitectos: Provee métricas claras sobre la configuración óptima de la vivienda (relación de tamaño, habitaciones y baños) más demandada y valorada en cada región.
  • Planificadores Urbanos y Oficinas de Desarrollo Económico: Aporta datos empíricos sobre la densidad de la oferta y la distribución del valor del suelo, esenciales para el diseño de políticas de vivienda y zonificación urbana.

Visualización Interactiva y Business Intelligence (Tableau Dashboard)

Para democratizar el acceso a los insights y permitir que los stakeholders no técnicos exploren los resultados de manera autónoma, los datos curados fueron exportados e integrados en un cuadro de mando interactivo desarrollado en Tableau.

El diseño del dashboard se estructuró bajo los siguientes pilares de Experiencia de Usuario (UX) y Analítica Visual:

  • Exploración Dinámica mediante Filtros en Cascada: Permite al usuario aislar el mercado de forma interactiva seleccionando el price_segment, la región geográfica o la tipología específica de la vivienda.
  • Mapeo de Densidad Geoespacial: Utiliza las capas vectoriales enriquecidas en la fase de geocodificación para proyectar mapas de calor y clústeres visuales, permitiendo identificar zonas calientes (hotspots) de precios en tiempo real.
  • Métricas Macroeconómicas Locales: Cuadros de mando (KPI Cards) que calculan automáticamente el precio medio por metro cuadrado (y su equivalencia a square feet para el mercado de EE. UU.), la mediana de habitaciones y los ratios de disponibilidad por provincia.

Conclusiones y Recomendaciones del Pipeline Analítico (Data-Driven Insights)

Tras completar el pipeline analítico, validar las pruebas inferenciales y ajustar el modelo de regresión sobre el segmento de apartamentos en España, se sintetizan las siguientes conclusiones fundamentales para el negocio (p. 1):

1. Validación de los Inductores de Valor Físicos (Property Features)

  • El impacto crítico de la infraestructura interna: Las pruebas estadísticas rechazaron formalmente la hipótesis nula respecto a la distribución de baños (p-value = 0.0), demostrando una correlación positiva moderada (p=0.49) con el precio de venta. Esto confirma que la densidad de cuartos de baño es un proxy de confort habitacional que pondera más en el precio final que el número de habitaciones independientes, especialmente en los segmentos Medium y Large (p. 1).
  • Preeminencia del área construida: La matriz de correlaciones determinó que la superficie real (m2_real) mantiene el vínculo más fuerte con la variable objetivo precio (p=0.60). Asimismo, se validó mediante el test ANOVA (F-stat = 7878.25, p-value = 0.0) que la segmentación por tamaño (SmallMediumLarge) divide el mercado en estratos de valoración completamente independientes y significativos.

2. Dinámicas de Conservación y Segmentación del Mercado

  • El paradigma de la Obra Nueva vs. Reventa: El test ANOVA enfocado en el estado de conservación (condition) ratificó la existencia de diferencias significativas en los precios medios. (F-stat = 17.64, p-value < 0.05) Sin embargo, el análisis descriptivo profundo reveló un comportamiento asimétrico según el poder adquisitivo: mientras que en el segmento Affordable la obra nueva lidera el precio premium, en el segmento Luxury las propiedades de reventa (resale) mantienen promedios superiores a €1M, sugiriendo que la ubicación prime de los activos consolidados supera el valor de depreciación física.
  • Asimetría Geográfica de la Oferta: El inventario inmobiliario de apartamentos está masivamente dominado por el segmento Affordable (79% del total de registros) y propiedades Small de hasta 93  (57%). Territorios como el País Vasco lideran el volumen absoluto de este mercado base, mientras que la oferta de los segmentos Mid-Range (16%) y Luxury (4%) está estrictamente polarizada y concentrada en tres núcleos: Islas Baleares, Comunidad de Madrid y País Vasco (p. 1).

3. Diagnóstico del Modelo Predictivo Geoespacial (Spatial Regression)

  • Poder Explicativo de la Ubicación: El modelo de regresión lineal múltiple (OLS) parametrizado con variables puramente geográficas arrojó un R^2  ajustado de 0.192. Esto demuestra matemáticamente que la localización (coordenadas vectoriales y región) es capaz de explicar de forma aislada el 19.2% de la variabilidad total de los precios de los apartamentos en España.
  • Gradiente de Precios y Sesgo Regional: La regresión confirmó la influencia del eje Norte-Sur del país a través de la variable latitude, la cual posee un coeficiente positivo y altamente significativo. Asimismo, se identificó que la región de Canarias inyecta el mayor impacto positivo marginal en la tasación promedio , contrastando con penalizaciones significativas en la valoración media de regiones como Galicia o Cataluña tras ajustar por el resto de factores espaciales .
  • Limitaciones del Modelo Baseline: El elevado número de condiciones del modelo alerta sobre la existencia de multicolinealidad entre los predictores espaciales. Además, la falta de normalidad en la distribución de los residuos (confirmada por el test de Jarque-Bera) evidencia la necesidad de transicionar en futuras iteraciones hacia arquitecturas no lineales (como Random Forest Regressor o XGBoost) e incorporar las variables estructurales desestimadas (m2_real y bath_num) para elevar la robustez del ajuste predictivo.

Recomendaciones Estratégicas para Stakeholders

  • Para Inversores Internacionales (EE. UU.): Las regiones de Castilla-La Mancha y Comunidad Valenciana presentan las oportunidades de arbitraje más eficientes en coste por unidad de superficie, ofreciendo apartamentos sustancialmente más amplios a tasas de cotización bajas. Por el contrario, Madrid y Cataluña representan mercados altamente competitivos y compactos con ratios elevados de precio por pie cuadrado.
  • Para Desarrolladores Urbanos: Dada la fuerte correlación de la variable bath_num con el precio de mercado, los proyectos de optimización de activos (house flipping o remodelaciones residenciales) deben priorizar la adición o mejora de un segundo o tercer cuarto de baño por encima de la subdivisión de dormitorios, maximizando el retorno de la inversión (ROI) por metro cuadrado.

Stack Tecnológico y Entorno de Ejecución (Tech Stack)

Para garantizar la reproducibilidad de este entorno de análisis, se detallan las tecnologías y librerías de Python utilizadas en el pipeline:

  • Manipulación y Core AnalíticoPython 3.xPandasNumPy.
  • Ingeniería GeoespacialGeopy (Motor OpenStreetMap/Nominatim).
  • Inferencia Estadística y ModeladoSciPy (módulo stats para ANOVA y Pearson), Statsmodels / Scikit-Learn (Regresión Lineal).
  • Visualización de Datos y BIMatplotlibSeabornTableau Desktop / Public.

https://github.com/fer78/Data-Analytics-Final-Portfolio-Project.git

Deja un comentario