¿Como elegir la mejor opción según múltiples criterios?

¿Como elegir la mejor opción según múltiples criterios?

foco

Francisco Macaya

-
Sígueme en:
linkedin icongithub icon
Publicado el: Sep 8, 2025

El mercado inmobiliario cada vez ha estado mas difícil para todos, con un aumento de la tasa de interés hipotecaria desde 1,9% hasta 4,3% en los últimos 6 años, junto con el incremento del precio de la UF ($39,474) y la incertidumbre económica que vivimos, me ha hecho pensar como poder encontrar el mejor departamento para vivir. Se que este es un problema multi-factorial, ya que un departamento tiene múltiples características, tales como: precio, numero de dormitorio, numero de baño, numero de estacionamiento, etc, pero que pasaría si puedo usar algún algoritmo que me encuentra el mejor departamento en base a todos sus características.


En este articulo estuve investigando un método de ranking para elegir la mejor opción entre múltiples opciones, según preferencias de una persona. Los resultados pueden cambiar según el criterio de la persona, así que no es una verdad absoluto, pero si es útil para resolver este tipo de casos, donde no tiene las preferencias de las personas a priori, sino que intentas encontrar la mejor opción posible según todo los datos.

TOPSIS

El método TOPSIS (Technique for Order of Preference by Similarity to Ideal Solution) es una técnica de decisión multicriterio, que se utiliza para ordenar o elegir alternativas considerando varios criterios al mismo tiempo, algunos son de tipo beneficio y otros de tipo de costo. En este caso, el estudio se realizo con los datos de Yapo (un sitio inmobiliario en Chile), extrayendo los siguientes características de los anuncios publicados:

  • Precio de la vivienda.
  • Tipo (departamento).
  • Comuna.
  • latitud.
  • longitud.
  • numero de dormitorios.
  • numero de baños.
  • numero de estacionamiento.
  • total de metros cuadrados.
  • terraza.
  • Lavandería.
  • Piscina.
  • Sala de multiuso.
  • Gimnasio.
  • distancia del metro.
  • Proximidad del metro (< 15 minutos a pie).

Este algoritmo considera alguno criterios que son beneficios, y otros costos, debido a que hay factores que afectan negativamente a la “mejor” opción y otros positivamente. Por ejemplo:

  1. Precio de la vivienda: Este criterio es un “costo”, ya que a menor precio, el candidato es más optimo.
  2. Numero de Dormitorios: Este criterio es un “beneficio”, ya que ha mayor numero de dormitorio, el candidato es más optimo.

Este punto es relevante, ya que el algoritmo es flexible en cuanto al sentido de las variables que afectan la situación ideal, marcando negativamente (inversamente proporcional) variables que afectan en sentido opuesto a la solución ideal.

Importante: Se que el Portal Inmobiliario es el sitio más utilizado en Chile para vender y arrendar departamentos, pero es complicado extraer la información de ese portal por temas de bloqueo de IP. No obstante, Yapo es una buena alternativa para extraer una buena cantidad de departamentos a la venta y en arriendo de Chile.

¿Cómo funciona?

Este algoritmo funciona siguiendo las próximos pasos:

  1. Normalizar los datos: Debido a la naturaleza de los datos, el precio esta en una escala muy distinta al numero de dormitorio, por lo que, si no normalizamos los datos, la magnitud de los datos afectaría a los resultados. Se normalizaron los distintos criterios (datos) usando min-max scale.
  2. Invertir costos: Para todos los criterios de tipo costo (precio y arriendo promedio por comuna), el criterio se invierte, dejándolo en sentido negativo.
  3. Aplicar los pesos: Se normalizan los pesos de preferencia del usuario para que sumen 1 y se multiplican columna a columna.
  4. Ideales: Se obtiene el máximo del valor por cada criterio, generando un máximo ideal para el conjunto. Esto se hace de la misma manera con el mínimo.
  5. Distancia: Se calcula la distancia euclidiana de cada alternativa al ideal positivo y el negativo.
  6. Cercanía Relativa: Calculo del score de TOPSIS según la "cercanía" del ideal.

Pero.. ¿Cómo se aplica en un conjunto de datos?

Yapo es un sitio oficial en Chile que contiene anuncios de inmuebles en arriendo y a la venta, con una web sencilla para la extracción de sus datos a través técnicas de webscrapping. Con mis conocimientos, junto con algunas conversaciones con ChatGPT, construí un script en Python sencillo de extracción y almacenamiento de sus publicaciones en una tabla de Supabase, consiguiendo extraer alrededor de 15.000 registros, que se distribuyen de la siguiente manera:

mapa_santiago.png

Los registros abarcan una gran cantidad de comunas de la región metropolitana. De hecho, la distribución por comuna es:

cantidad_por_comuna-1.png

El proceso solo extrae los anuncios de los departamentos publicado, tanto en arriendo como en venta de las comunas de la región de Santiago. La oferta de los departamentos en Santiago se concentra principalmente en la comuna de Santiago, seguido por la comuna de Nuñoa y Las Condes.

Algoritmo de TOPSIS

El algoritmo se implementa de la siguiente manera:

1def rank_properties(
2 df: pd.DataFrame,
3 criteria,
4 weights=None,
5 cost_criteria=None,
6 method="topsis",
7 top_k=5,
8 return_all=False,
9 score_col="score"
10):
11 cost_criteria = set(cost_criteria or [])
12 # numeric + normalize
13 scaled = {}
14 for c in criteria:
15 col = pd.to_numeric(df[c], errors="coerce")
16 s = _minmax_scale(col)
17 if c in cost_criteria:
18 s = 1 - s
19 scaled[c] = s
20 M = pd.DataFrame(scaled, index=df.index)
21 # weights
22 if weights is None:
23 w = np.array([1/len(criteria)]*len(criteria))
24 else:
25 w = np.array([weights[c] for c in criteria], dtype=float)
26 w = w / w.sum()
27 # method
28 if method == "weighted":
29 scores = (M.values * w.reshape(1, -1)).sum(axis=1)
30 elif method == "topsis":
31 V = M.values * w.reshape(1, -1)
32 ideal = V.max(axis=0); nideal = V.min(axis=0)
33 d_pos = np.linalg.norm(V - ideal, axis=1)
34 d_neg = np.linalg.norm(V - nideal, axis=1)
35 scores = d_neg / (d_pos + d_neg + 1e-12)
36 else:
37 raise ValueError("method must be 'weighted' or 'topsis'")
38 out = df.copy()
39 out[score_col] = scores
40 out = out.sort_values(score_col, ascending=False).reset_index(drop=True)
41 return out if return_all else out.head(top_k)

No es un código demasiado complejo, y sus principales consideraciones son:

  1. Criterios: Lista de las variable que se utilizan para calcular el score de TOPSIS.
  2. Weight: Ponderaciones del usuario según sus preferencias de los criterios.
  3. Criterios de Costos: Lista de los criterios que afectan negativamente al indicador, por lo que se invierten.
  4. Método: Se aplica por default el método de TOPSIS, que genera el mejor y peor candidato y un score en base a ello.

Resultados

Si aplicamos este algoritmo a la base de datos, usando los siguiente pesos:

1weights_base = {
2 "total_price": 0.30,
3 "total_m2_usage_processed": 0.21,
4 "n_of_rooms_processed": 0.07,
5 "n_of_bathrooms_processed": 0.07,
6 "n_of_parking_spaces_processed": 0.03,
7 "n_of_storage_rooms_processed": 0.03,
8 "terrace": 0.01,
9 "laundry_rooms": 0.01,
10 "swimming_pool": 0.01,
11 "multiused_room": 0.01,
12 "gym_room": 0.01,
13 "distance_subway": 0.06,
14 "days_since_publication": 0.05,
15 "rent_price": 0.10
16}

Los resultados son:

  1. Departamentos en San Bernardo | VENTA DEPARTAMENTO 4HAB 1BA SAN BERNARDO:
    URL: https://www.yapo.cl/bienes-raices-venta-de-propiedades-apartamentos/venta-departamento-4hab-1ba-san-bernardo/31230641
    Precio: $63.000.000
  2. Departamentos en Santiago | Venta departamento, a una cuadra del Teatro Municipal, JMV
    URL: https://www.yapo.cl/bienes-raices-venta-de-propiedades-apartamentos/venta-departamento-a-una-cuadra-del-teatro-municipal-jmv/30904723
    Precio: $200.000.000
  3. Departamentos en Ñuñoa | Oportunidad pie en venta ñuñoa.
    URL: https://www.yapo.cl/bienes-raices-venta-de-propiedades-apartamentos/oportunidad-pie-en-venta-nunoa/30946965
    Precio: UF 850

El algoritmo consigue los mejores resultados en base a los ideal positivos y negativos, pero si queremos una visualizaciones de todos los puntos, y donde estarían los tres candidatos con mayor scores seria:

distanciasolucino.png

Estos puntos son los ideales ya que están más cercanos (distancia) de la solución ideal positiva (eje X) y más lejanos a la solución ideal negativa (eje Y). En términos simples, minimizan su distancia al ideal perfecto y maximizan la distancia al peor escenario, lo que significa que son los más equilibrados y atractivos según los criterios y pesos del usuario.

Conclusión

  1. Este algoritmo es un buen punto de partida en temas de ranking, ya que considera tanto los criterios positivos y negativos, junto con una implementación sencilla y rápida en python.
  2. Las preferencias pueden ser dinámica por usuario, dejando un enfoque personalizado por cada persona.
  3. Los resultados pueden ser diversos, y algunas veces filtros de datos pueden dar muestras más representativas para el usuario. En general, todo dependerá de sus gustos y preferencias, pero es un buena metodología como punto de inicio, ya que no requiere etiquetas de datos para su implementación.

Si quiere saber más, revisa el github.

https://github.com/Foco22/FA_Posts/blob/main/%239%20TOPSIS/jupyter.ipynb

Saludos

Ir arriba
¿Como elegir la mejor opción según múltiples criterios?