Skip to content

Cargar DataFrame

Librerias

import re
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from scipy import stats
from datetime import datetime
#Carga del DataFrame 'House Pricing Data'
with open('text.txt', 'r') as file:
    content = file.read()
    
regex = r'https?://[^\s<>"]+|www\.[^\s<>"]+'
path = re.findall(regex,content)
df = pd.read_csv(path[0], nrows=5)
cols = df.columns
df.head()
# Se carga el dataset completo prescindiendo de columnas que no son objeto de estudio
cols_delete = ['date', 'street', 'city', 
               'statezip', 'country', 
               'waterfront', 'view', 'condition']

df = pd.read_csv(path[0], usecols=[col for col in cols if col not in cols_delete])

#Transformaciones
current_date = datetime.now()
current_date = pd.Timestamp(current_date)
current_year = current_date.year
df['yr_built'] = current_year - df['yr_built']
df['yr_renovated'] = [current_year-row if row != 0 else row for _, row in df['yr_renovated'].iteritems()]
df.head()

Eliminación de outliers para la variable 'Precio'

plt.figure(figsize=(3,3))
df['price'].hist()
plt.title("'Price' Distribution")
plt.show()

q25, q75 = np.quantile(df['price'], [0.25, 0.75]) # Quartiles 25 y 75
iqr = q75 - q25 # Rango inter cuartilico
low_price = q25 - (1.5 * iqr) # Limite inferior
up_price = q75 + (1.5 * iqr) # Limite superior

# Aplicacion de limites
df = df[(df['price'] >= low_price) & (df['price'] <= up_price)]

plt.figure(figsize=(3,3))
df['price'].hist()
plt.title("'Price' Distribution")
plt.show()

Conjuntos de prueba y entrenamiento

En este caso de estudio se pretende crear un modelo de regresión multivariable para predecir los precios de las viviendas, teniendo la columna 'price' como variable dependiente.

# Se obtienen la variable dependiente e independientes
X = df.drop(columns='price').values
y = df['price'].values

#Se asigna un 70% del conjunto de datos para entrenamiento
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=68)

Entrenamiento

def train_model(x_tr, y_tr, x_tst, y_tst):
    '''
    Parámetros:
        x_tr : Conjunto de datos de entrenamiento con las variables independientes.
        y_tr : Conjunto de datos de entrenamiento con la variable dependiente.
        x_tst : Conjunto de datos de prueba con las variables independientes.
        y_tst : Conjunto de datos de prueba con la variable dependiente.
    '''
    try:
        reg = LinearRegression()
        reg.fit(x_tr, y_tr)
    except Exception as e:
        msg = f'Error durante el entrenamiento: {e}'
        raise Exception(msg) from e
    else:
        train_score = reg.score(x_tr, y_tr)
        test_score = reg.score(x_tst, y_tst)
        print('Entrenamiento completado')
        print('Score del conjunto de entrenamiento: {:.3f}'.format(train_score))
        print('Score del conjunto de prueba: {:.3f}'.format(test_score))
        
if __name__ == "__main__":
    train_model(X_train, y_train, X_test, y_test)

La validación del modelo obtenido con el sampling generado por la función train_test_split arroja un coeficiente de determinación del 40%, lo que significa que aproximadamente el 40% de la variabilidad en la variable "precio" puede ser explicada por las características incluidas en la variable X.