Hace un par de semanas os hablé de cómo se podía hacer una segmentación semejante a k-means en excel, y creo que a muchos os sorprendió hasta qué punto el proceso que hay detrás es bastante sencillo.
A menudo en los cálculos numéricos existen cálculos sencillos que pedimos a nuestro ordenador que haga de manera recurrente, para ahorrarnos el trabajo.
Hoy vengo a explicaros algo que seguro que a muchos os suena: Ajustes de línea. En excel en sí es súper fácil, creamos una gráfica de tipo dispersión y clicando con el botón derecho podemos "agregar línea de tendencia". Listo y hecho. Pero creedme, vale la pena saber cómo calcularlo más "a mano" porque así podemos empezar a personalizar nuestros análisis de una manera mucho más avanzada.
Caso de uso: Precios de unas viviendas
Para una gran ciudad, tengo los datos de venta de unas viviendas. Su superficie, número de habitaciones, el precio de venta final, cantidad de habitaciones... esas cosas. Como soy español, y en nuestro país sabemos mucho de comprar y vender casas, sé que cuanto más grande más cara va a ser.
Así que vamos a representar esto en una gráfica de dispersión. Como yo ya sé cómo funciona eso de "Agregar una línea de tendencia", lo hago y me sale una línea muy maja. Con una ecuación que veo que me da una relación lineal. Y quizá sea básico, pero sólo para aclarar: decimos que es lineal porque la x es sólo una x, no está al cuadrado, ni es logarítmico, ni exponencial...
¿Pero qué es lo que hace exactamente excel y otros programas para ajustar esta línea? Busca la recta que quede tan cerca como sea posible de todos los puntos de la dispersión. Para hacerlo, existen fórmulas analíticas que vuelven mucho más sencillo el cálculo, pero también implica que tomamos una serie de hipótesis respecto a cómo estos puntos están dispersos para que las fórmulas funcionen. Así que nosotros vamos a saltarnos todas esas chuladas, y vamos a hacerlo con maza y cincel, porque luego además es más fácil generalizar.
Vamos a reproducir algo parecido a lo que hace excel. ¿Y cómo? Vamos a coger la ecuación de una recta:
y = m·x + n
En este caso, "y" sería el precio de venta, y "x" la superficie total de la casa. Los otros parámetros, serían lo que normalmente llamamos "la pendiente" y la "ordenada en el origen". Es decir, "n" sería el valor de una casa cuando la x (superficie) fuera cero; y "m" serían los euros por metro cuadrado, que ya sabéis que en el mercado inmobiliario se usa mucho.
En este caso como sabemos que una casa de cero metros no costaría dinero, decimos que n = 0. Así que vamos a tener sólo que encontrar el valor de "m".
Lo siguiente es por tanto probar con un valor de la pendiente de la recta (m) y ver la diferencia entre el valor real. En otras palabras, vamos a probar con una m = 4800 €/m2. Y vamos a ver cuánto costaría una casa de 80m2.
Preciomodelo (casa de 80 m2 ) = 4800 €/m2 * 80 m2 = 383.040€
Cuando comprobamos en los datos, vemos que una casa de ese tamaño costaría:
PrecioReal (casa de 80 m2 ) = 395.000€
Generalmente, la distancia se mide de forma cuadrática (elevado a dos), es decir:
Distancia = (Preciomodelo - PrecioReal)^2 = (383,040 - 395.000)^2 = 143.041.600
Este cálculo que yo he hecho manualmente para uno, se puede hacer para todos los puntos. Luego simplemente podemos hacer la suma o el promedio de las distancias (lo llaman el error cuadrático medio) y buscar cuál es el punto más bajo.
¡Que veis que está en torno a los 4750€/m2! Y de nuevo, lo he calculado usando sólo cálculos de tabla. Simplemente he encontrado cuál es la recta más cercana a todos los puntos, y hemos reproducido un ajuste lineal... ¡casusalidades de la vida!
¿De qué nos sirve esto? Excel ya lo hace
No os quito la razón, lo que en excel tardamos dos segundos, hacer todos esos cálculos de tabla me ha llevado un ratillo importante. Pero aquí es donde podemos empezar a hacer cosas interesantes:
- ¿Qué pasa si quiero hacer un ajuste que tenga menos en cuenta los outliers?
- Normalmente quitamos los valores que se alejan mucho del cúmulo principal de puntos porque nos "estropean" la gráfica y presuponemos que son valores límite (outliers). ¿Y si no quisiera quitarlos?
- ¿Qué pasa si mis datos se ajustan a una curva que no está entre las opciones de excel?
- Si mis datos se ajustaran a una curva que no es ni lineal, ni polinómica, ni exponencial... ¿Cómo lo puedo ajustar?
- ¿Qué pasa si quiero hacer el ajuste por más de una variable?
- Por ejemplo, he hecho el modelo según superficie total: ¿Pero es posible que no cuente lo mismo el metro cuadrado de casa habitable que de terraza?
Sé que no es una tarea que vayamos a hacer normalmente, y personalmente os recomendaría que si os vierais en ese tipo de tesituras a menudo os pasarais a un software estadístico más potente. Sale a cuenta invertir el tiempo en aprender a usar R, python o una opción más clásica como SPSS.
¿Qué pasa si quiero hacer un ajuste que tenga menos en cuenta los outliers?
Recordemos en un repaso rápido: Lo que buscamos es minimizar la distancia. Pero nosotros esta distancia podemos definirla como queramos. Clásicamente hacemos el algoritmo que llamamos de "mínimos cuadrados", es decir que minimizamos la distancia cuadrática:
Distancia cuadrática = (Preciomodelo - PrecioReal)^2
Pero la distancia cuadrática va a dar distancias mucho más grandes cuanto más lejos nos encontremos. Vamos a comparar una distancia lineal (línea morada) vs una distancia cuadrática (línea azul):
Nada nos impide que en vez de hacer el ajuste con una distancia cuadrática, no lo hagamos con una lineal:
Distancia lineal = |Preciomodelo - PrecioReal|
Aquí esas líneas verticales significan "valor absoluto" (así nos aseguramos de que las distancias siempre sean positivas. Sí que es importante destacar, que esto no va a evitar que los outliers no tengan su peso y que no deban ser estudiados, pero resultaría una forma más robusta de hacer un ajuste.
¿Qué pasa si mis datos se ajustan a una curva que no está entre las opciones de excel?
La verdad que esto es lo más sencillo de hacer. Supongamos que quisiéramos ajustar una función a trozos, que dependiendo del valor de la superficie creamos que va a tener una dependencia distinta:
Una función así podría interesarnos si pensáramos que llegado cierto punto cuando las casas son muy grandes, el precio ya no iría lineal con la superficie si no con la raíz. Esto en excel sólo lo podríamos hacer "manualmente" en excel. Y sería que cuando calculamos el Precio
modelo, hiciéramos:
Preciomodelo (casa de 80 m2 ) = 4800 €/m2 * 80 m2 = 383.040€
Pero para casas que sean mayores de 100 metros cuadrados, en vez de hacer simplemente m·x, vamos a hacer lo de la raiz.
Preciomodelo (casa de 120 m2 ) = 4800 €/m2 * 10 * RAIZ(120) m2 = 525.813,66 €
Y seguimos calculando luego la distancia del punto real con el del modelo. Nada diferente.
¿Qué pasa si quiero hacer el ajuste por más de una variable?
Dejad que os haga una pregunta: ¿Por qué creéis que la gente cierra sus terrazas y las habilita como si fuera otra habitación en su casa?
Es simple, el metro cuadrado de superficie habitable es más caro que el metro cuadrado. ¿Pero cuánto más barato? Aquí es donde vemos necesario hacer un
dos dimensiones. Es decir, vamos a suponer que:
Preciomodelo (casa de X metros habitables, Y metros de terraza) = A·X + B·Y
Así que realmente lo único que vamos a hacer es calcular la distancia:
Distancia cuadrática = (Preciomodelo - PrecioReal)^2
y vamos a hacer simulaciones para las dos dimensiones.
Primero, veamos la dependencia para los metros habitables:
Y luego para el tamaño de la terraza
Y así obtenemos que mientras que el metro de terraza se paga por unos 3120€ el de casa habitable se paga por 4980€. Es decir, tiene sentido que mucha gente haga cerramientos.
Pero yo quiero una casa con terraza
Ah! Tengo que decir que me encanta cuando vamos analizando cosas y los datos parece que sean muy claros en una dirección pero la intuición nos dice otra. ¿Es posible que hayamos encontrado un límite?
Aquí no os voy a negar que es algo que empecé a pensar cuando me lo encontré: ¿No vale la pena hacer casas con terraza?
Pues pensándolo me dije:
- ¿Me sirve de algo una terraza (o mejor dicho, un balcón) de 1 metro cuadrado?
- ¿Necesito una terraza de 50 metros o preferiría añadirle 30 metros habitables a mi casa?
Claramente, ¡estamos ante un caso de análisis no lineal! Si supiera con qué tipo de función podría modelarlo, sería sencillo añadirlo al modelo de antes y en vez de poner B·Y podría poner... pues lo que fuera. Pero sinceramente, no tengo ni idea.
Cuando hay suficientes datos, una cosa que podemos hacer, es hacer ajustes lineales a cachos. Es decir, hago un ajuste lineal de 1 a 10 metros, de 10 a 20, de 20 a 30... y aunque no sé la función subyacente, sí que puedo sacar las dependencias. Esto no lo he hecho con excel, no os voy a engañar, pero como decía antes... vale la pena de vez en cuando echarle ganas y aprender por ejemplo R.
¿Qué más podría hacer en R que no puedo hacer en excel?
Pues por ejemplo, podríamos ir a lo bruto y meter todas las variables posibles de un set de datos y ver qué nos da.
Importar un set de datos y hacer un ajuste lineal es tan fácil como hacer:
glm es la función "general linear model" y con la funcíon summary sacamos una tabla resumen parecida a la que veis ahora. En este caso, he hecho un modelo que trata de predecir el precio por metro cuadrado de una casa en función de una serie de parámetros.
De las variables, más o menos quedan todas claras, excepto "ratio" que corresponde al ratio entre superficie de vivienda y de terraza. Veríamos por tanto que:
- Es mejor hacer habitaciones espaciosas
- Es mejor hacer baños extra
- Ojo con las terrazas demasiado grandes. En el punto anterior veíamos que las terrazas de alrededor de 18 metros son las que optimizan el precio de la vivienda.
- Por supuesto, el barrio donde se encuentre la casa es muy importante.
Bueno, entonces, hagamos un poco de repaso de lo aprendido:
- Hemos aprendido que ajustar funciones en realidad se trata de minimizar distancias
- Por tanto puedo escoger la función que quiera
- Con tantas variables como quiera
- Con la distancia definida como a mí me apetezca
- Aún así, hacerlo en excel es trabajoso y otros softwares como R lo hacen mucho más sencillo y rápido. Permitiéndonos además llegar a hacer cosas mucho más sofisticadas una vez aprendemos lo básico.
Comentarios