0% encontró este documento útil (0 votos)
45 vistas1 página

Análisis de Precios en el Mercado Inmobiliario

El proyecto busca analizar el comportamiento del precio del mercado inmobiliario en una zona específica utilizando un modelo de regresión lineal para identificar variables que afectan el costo por metro cuadrado. Se emplean herramientas de Python como pandas y sklearn para procesar y explorar los datos, que consisten en un conjunto de 414 registros con 7 variables. La preparación de datos incluye la eliminación de outliers y la selección de variables predictoras antes de realizar la predicción del precio por unidad de área.

Cargado por

Steph Anie
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
45 vistas1 página

Análisis de Precios en el Mercado Inmobiliario

El proyecto busca analizar el comportamiento del precio del mercado inmobiliario en una zona específica utilizando un modelo de regresión lineal para identificar variables que afectan el costo por metro cuadrado. Se emplean herramientas de Python como pandas y sklearn para procesar y explorar los datos, que consisten en un conjunto de 414 registros con 7 variables. La preparación de datos incluye la eliminación de outliers y la selección de variables predictoras antes de realizar la predicción del precio por unidad de área.

Cargado por

Steph Anie
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

1.

Compresión del Negocio


Mercado inmobliario
El objetivo del siguiente proyecto es entender el comportamiento del precio del mercado inmobiliario de una zona en particular, y cuales de las variables presentes en el dataset afectan directamente en la consolidación del precio por m .
2

Para dar cumplimiento al presente objetivo, utilizaremos un modelo de regresión lineal que nos permita identificar las variables predictoras que influyen en un posible modelo que de cuenta de la variable a predecir (costo por metro cuadrado).

Adicional, utilizaremos las librerias pandas, matplotlib, seaborn y sklearn de Python como herramientas de procesamiento de datos, exploración y mineria.

In [ ]: import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.feature_selection import RFE
from sklearn.svm import SVR
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

%matplotlib inline

El modelo de datos cuenta con un único set de datos principal, el cual sera almacenado en un storage local en formato csv, para su facil consumo, y el cual será leido por la libreria pandas en formato dataframe.

In [ ]: df = pd.read_csv('./Real estate.csv')
df.head(10)

Out[ ]: No X1 transaction date X2 house age X3 distance to the nearest MRT station X4 number of convenience stores X5 latitude X6 longitude Y house price of unit area

0 1 2012.917 32.0 84.87882 10 24.98298 121.54024 37.9

1 2 2012.917 19.5 306.59470 9 24.98034 121.53951 42.2

2 3 2013.583 13.3 561.98450 5 24.98746 121.54391 47.3

3 4 2013.500 13.3 561.98450 5 24.98746 121.54391 54.8

4 5 2012.833 5.0 390.56840 5 24.97937 121.54245 43.1

5 6 2012.667 7.1 2175.03000 3 24.96305 121.51254 32.1

6 7 2012.667 34.5 623.47310 7 24.97933 121.53642 40.3

7 8 2013.417 20.3 287.60250 6 24.98042 121.54228 46.7

8 9 2013.500 31.7 5512.03800 1 24.95095 121.48458 18.8

9 10 2013.417 17.9 1783.18000 3 24.96731 121.51486 22.1

2. Compresión de los datos


Las dimesiones del presente dataframe son las siguientes:

In [ ]: print(f'Las dimesiones del dataframe son: {df.shape[0]} filas y {df.shape[1]} columnas')

Las dimesiones del dataframe son: 414 filas y 8 columnas

In [ ]: df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 414 entries, 0 to 413
Data columns (total 8 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 No 414 non-null int64
1 X1 transaction date 414 non-null float64
2 X2 house age 414 non-null float64
3 X3 distance to the nearest MRT station 414 non-null float64
4 X4 number of convenience stores 414 non-null int64
5 X5 latitude 414 non-null float64
6 X6 longitude 414 non-null float64
7 Y house price of unit area 414 non-null float64
dtypes: float64(6), int64(2)
memory usage: 26.0 KB

In [ ]: # Removiendo la columna "No"


df.drop("No", inplace=True, axis=1)
df.head(10)

Out[ ]: X1 transaction date X2 house age X3 distance to the nearest MRT station X4 number of convenience stores X5 latitude X6 longitude Y house price of unit area

0 2012.917 32.0 84.87882 10 24.98298 121.54024 37.9

1 2012.917 19.5 306.59470 9 24.98034 121.53951 42.2

2 2013.583 13.3 561.98450 5 24.98746 121.54391 47.3

3 2013.500 13.3 561.98450 5 24.98746 121.54391 54.8

4 2012.833 5.0 390.56840 5 24.97937 121.54245 43.1

5 2012.667 7.1 2175.03000 3 24.96305 121.51254 32.1

6 2012.667 34.5 623.47310 7 24.97933 121.53642 40.3

7 2013.417 20.3 287.60250 6 24.98042 121.54228 46.7

8 2013.500 31.7 5512.03800 1 24.95095 121.48458 18.8

9 2013.417 17.9 1783.18000 3 24.96731 121.51486 22.1

Otra transformación adecuada para este caso, sería el de renombrar las columnas de tal forma que puedan ser utilizadas y transformadas de una manera mas sencilla.

In [ ]: nombre_columnas = ["Fecha Transaccion", "Edad Casa", "Distancia Estacion Tren", "No. tiendas cercanas", "Latitud", "Longitud", "Precio por unidad de area"]
df.columns = nombre_columnas
df.head(5)

Out[ ]: Fecha Transaccion Edad Casa Distancia Estacion Tren No. tiendas cercanas Latitud Longitud Precio por unidad de area

0 2012.917 32.0 84.87882 10 24.98298 121.54024 37.9

1 2012.917 19.5 306.59470 9 24.98034 121.53951 42.2

2 2013.583 13.3 561.98450 5 24.98746 121.54391 47.3

3 2013.500 13.3 561.98450 5 24.98746 121.54391 54.8

4 2012.833 5.0 390.56840 5 24.97937 121.54245 43.1

El tipo de datos almacenados en cada variable lo encontramos a continuación:

In [ ]: df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 414 entries, 0 to 413
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Fecha Transaccion 414 non-null float64
1 Edad Casa 414 non-null float64
2 Distancia Estacion Tren 414 non-null float64
3 No. tiendas cercanas 414 non-null int64
4 Latitud 414 non-null float64
5 Longitud 414 non-null float64
6 Precio por unidad de area 414 non-null float64
dtypes: float64(6), int64(1)
memory usage: 22.8 KB

Las medidas de tendencia central para cada una de las variables observadas es la siguiente:

In [ ]: df.describe()

Out[ ]: Fecha Transaccion Edad Casa Distancia Estacion Tren No. tiendas cercanas Latitud Longitud Precio por unidad de area

count 414.000000 414.000000 414.000000 414.000000 414.000000 414.000000 414.000000

mean 2013.148971 17.712560 1083.885689 4.094203 24.969030 121.533361 37.980193

std 0.281967 11.392485 1262.109595 2.945562 0.012410 0.015347 13.606488

min 2012.667000 0.000000 23.382840 0.000000 24.932070 121.473530 7.600000

25% 2012.917000 9.025000 289.324800 1.000000 24.963000 121.528085 27.700000

50% 2013.167000 16.100000 492.231300 4.000000 24.971100 121.538630 38.450000

75% 2013.417000 28.150000 1454.279000 6.000000 24.977455 121.543305 46.600000

max 2013.583000 43.800000 6488.021000 10.000000 25.014590 121.566270 117.500000

Mendiante una matriz de correlaciones, podremos indagar de manera gráfica, cuales son las variables que podrian aportar mayor valor a la hora de establecer nuestro modelo de regresión.

In [ ]: matriz_corr = df.corr()
sns.heatmap(matriz_corr, annot=True, cmap="Greens")
plt.title("Matriz de Correlación de Variables")

Out[ ]: Text(0.5, 1.0, 'Matriz de Correlación de Variables')

3. Preparación de los datos


División del dataframe en set de entrenamiento y set de pruebas
In [ ]: df_entrenamiento, df_pruebas = train_test_split(df, test_size=0.2, random_state=40)
print(f"Longitud del set de entrenamiento: {len(df_entrenamiento)}")
print(f"Longitud del set de pruebas: {len(df_pruebas)}")

Longitud del set de entrenamiento: 331


Longitud del set de pruebas: 83

Identificación de outliers
In [ ]: #Histogramas de frecuencias
fig = plt.figure(figsize=(16,16))
for i, c in enumerate(df_entrenamiento):
plt.subplot(6,3, i + 1)
sns.histplot(df_entrenamiento.loc[:, c].dropna(), kde=True, stat='density', linewidth = 0.5)
plt.grid()
fig.tight_layout(pad=1.0)

In [ ]: #box plot
fig = plt.figure(figsize=(14,15))
for i, c in enumerate(df_entrenamiento):
plt.subplot(6,3,i+1)
sns.boxenplot(y=c, data=df_entrenamiento.dropna())
plt.grid()

fig.tight_layout(pad=1.0)

Podemos encontrar presencia de outliers en las siguientes variables:

Precio por unidad de área


Longitud
Distancia a estacion de tren Por lo cual, procederemos a realizar un filtrado de los datos.

In [ ]: # Eliminando outliers
df_entrenamiento = df_entrenamiento[df_entrenamiento['Precio por unidad de area'] < 80]
df_entrenamiento = df_entrenamiento[df_entrenamiento['Distancia Estacion Tren']< 3000]
df_entrenamiento = df_entrenamiento[df_entrenamiento['Longitud']> 121.5]

In [ ]: #box plot
fig = plt.figure(figsize=(14,15))
for i, c in enumerate(df_entrenamiento):
plt.subplot(6,3,i+1)
sns.boxenplot(y=c, data=df_entrenamiento.dropna())

plt.grid()
fig.tight_layout(pad=1.0)

4. Modelado

Seleccionando las variables predictoras mediante SVR


In [ ]: df.columns.values.tolist()

Out[ ]: ['Fecha Transaccion',


'Edad Casa',
'Distancia Estacion Tren',
'No. tiendas cercanas',
'Latitud',
'Longitud',
'Precio por unidad de area']

In [ ]: # Seleccion de columnas
columnas_predictoras = ['Edad Casa', 'Distancia Estacion Tren', 'No. tiendas cercanas', 'Latitud', 'Longitud']

In [ ]: # Estableciendo nuestras variables


X = df_entrenamiento[columnas_predictoras]
Y = df_entrenamiento['Precio por unidad de area']

In [ ]: # Estableciendo el estimador
estimador = SVR(kernel='linear')
selector = RFE(estimador, n_features_to_select=5, step=1)
selector = selector.fit(X, Y)

In [ ]: selector.support_

Out[ ]: array([ True, True, True, True, True])

Nuestras variables predictoras elegidas por nuestro vector de regresión y su respectiva función de ranking nos dejan con:

No. tiendas cercanas


latitud
longitud

In [ ]: selector.ranking_

Out[ ]: array([1, 1, 1, 1, 1])

Realizando la predicción
In [ ]: x_predictoras = df_entrenamiento[["Edad Casa", 'Distancia Estacion Tren','No. tiendas cercanas', 'Latitud', 'Longitud']]
linear_model = LinearRegression()
linear_model.fit(x_predictoras, Y)

Out[ ]: ▾ LinearRegression

LinearRegression()

In [ ]: print(f'Intercepto con el eje: {linear_model.intercept_}')


print(f'Coeficientes: {linear_model.coef_}')
print(f'Coeficiente R: {linear_model.score(x_predictoras, Y)}')

Intercepto con el eje: -11672.127517206656


Coeficientes: [-3.37089980e-01 -8.43520775e-03 9.91494453e-01 3.01625933e+02
3.44549909e+01]
Coeficiente R: 0.6271200699326649

In [ ]:

In [ ]:

También podría gustarte