import pandas as pd
import numpy as np
import plotly.express as px
from scipy import stats # libreria estadistica de Scipy
from sklearn.feature_selection import RFE # RFE es para seleccionar modelos
from sklearn.model_selection import train_test_split # para dividir la base en train y test
from sklearn import linear_model # para modelo lineal
from sklearn.metrics import mean_squared_error, r2_score # para sacar las metricas
import statsmodels.api as sm ## Parte estadistica
from statsmodels.sandbox.regression.predstd import wls_prediction_std ## Parte estadistica
#Cargue del archivo csv y muestra de las primeras 5 filas
train = pd.read_csv("/work/train.csv")
train.head(5)
#Cargue del archivo csv y muestra de las primeras 5 filas
test = pd.read_csv("/work/test.csv")
test.head(5)
train.dtypes
train.describe().T
#Muestra las columnas de la base
train.columns
#Cuenta los tipos de datos
train.dtypes.value_counts()
#Cuenta los tipos de datos
test.dtypes.value_counts()
# Número total de filas y columnas
train.shape
# Número total de filas y columnas
test.shape
#Dataframe que suma los valores Nulos
null_value = pd.DataFrame()
null_value['variable'] = test.columns
null_value['Train'] = train.drop(labels='SalePrice',axis=1).isnull().sum().to_list()
null_value['Test']=test.isnull().sum().to_list()
null_value
train["SalePrice"].describe()
#Comportamiento de los precios de las casas
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style='darkgrid', context='notebook')
cols = ['SalePrice']
sns.pairplot(train[cols], height=7, kind="hist")
plt.show()
#sns.pairplot(train[cols], height=7)
fig=px.histogram(x=train.SalePrice, title='Precios de las casas')
fig.show()
fig=px.histogram(x=np.log(train.SalePrice+1)) ## Porque el logaritmo de cero
fig.show()
base_interes=train[['Id', 'MSSubClass', 'MSZoning', 'LotFrontage', 'LotArea', 'Street',
'Alley', 'LotShape', 'LandContour', 'Utilities', 'LotConfig',
'LandSlope', 'Neighborhood', 'Condition1', 'Condition2', 'BldgType',
'HouseStyle', 'OverallQual', 'OverallCond', 'YearBuilt', 'YearRemodAdd',
'RoofStyle', 'RoofMatl', 'Exterior1st', 'Exterior2nd', 'MasVnrType',
'MasVnrArea', 'ExterQual', 'ExterCond', 'Foundation', 'BsmtQual',
'BsmtCond', 'BsmtExposure', 'BsmtFinType1', 'BsmtFinSF1',
'BsmtFinType2', 'BsmtFinSF2', 'BsmtUnfSF', 'TotalBsmtSF', 'Heating',
'HeatingQC', 'CentralAir', 'Electrical', '1stFlrSF', '2ndFlrSF',
'LowQualFinSF', 'GrLivArea', 'BsmtFullBath', 'BsmtHalfBath', 'FullBath',
'HalfBath', 'BedroomAbvGr', 'KitchenAbvGr', 'KitchenQual',
'TotRmsAbvGrd', 'Functional', 'Fireplaces', 'FireplaceQu', 'GarageType',
'GarageYrBlt', 'GarageFinish', 'GarageCars', 'GarageArea', 'GarageQual',
'GarageCond', 'PavedDrive', 'WoodDeckSF', 'OpenPorchSF',
'EnclosedPorch', '3SsnPorch', 'ScreenPorch', 'PoolArea', 'PoolQC',
'Fence', 'MiscFeature', 'MiscVal', 'MoSold', 'YrSold', 'SaleType',
'SaleCondition', 'SalePrice']] ## Selecciono a Y y a las X
train1=base_interes.dropna(axis=1) ### Eliminar los NA'S
train1
# Número total de filas y columnas
train1.shape
# A la base train1 le quitamos la variable objetivo que es el precio de venta
# La matriz de las variables explicativas
X=train1.drop(["SalePrice"], axis=1)
# La variable dependiente Y va a ser el precio de venta
Y=train1["SalePrice"] ### Selecciono la variable objetivo
X.shape
X = pd.get_dummies(X, drop_first=True)
X
X.columns
#Cuenta los tipos de datos
#Se observa que no quedaron datos de tipo cualitativos
X.dtypes.value_counts()
### X_train y Y_train tendrán los mismos individuos (un 80%)
### X_test y Y_test tendrán el 20% restante
### Esta división se hace aleatoria
### El random_state es para garantizar que a otra persona le de los mismo
### en la selección aleatoria
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, train_size=0.8, random_state=20) ## Muestreo aleatorio simple
X_test.shape
X_train
X_test
Y_train
Y_test
model = sm.OLS(Y, X)
results = model.fit()
print(results.summary())
#### Sólo lo hago con los datos de entrenamiento
#### las 189 variables y las 1168 filas
RegresionLineal=linear_model.LinearRegression().fit(X_train, Y_train) ## Entrenar la regresión
### Los parametros estimados
print("Intercepto", RegresionLineal.intercept_)
print("betas", pd.DataFrame(RegresionLineal.coef_, index=X_train.columns))
## Para obtener un valor pronosticado,
## Simplemente le ingreso los valores de X
RegresionLineal.predict(X_test)[0:189]
pd.DataFrame(RegresionLineal.predict(X_test)[0:189], index=Y_test[0:189].index) ### Valores pronosticados
Y_test[0:189]
Y_test
pd.DataFrame(RegresionLineal.predict(X_test)[0:292], index=Y_test[0:292].index) ### Valores pronosticados
### Entrenamiento
from sklearn.metrics import r2_score
Y_pred_train=RegresionLineal.predict(X_train) ### Pronostico
r2_score(Y_train, Y_pred_train) ### Los datos de entrenamiento
## Pueba
Y_pred_test=RegresionLineal.predict(X_test) ### Pronostico
r2_score(Y_test, Y_pred_test) ### Los datos de prueba
### Entrenamiento
from sklearn.metrics import mean_squared_error
Y_pred_train=RegresionLineal.predict(X_train) ### Pronostico
mean_squared_error(Y_train, Y_pred_train) ### Los datos de entrenamiento
### Prueba
Y_pred_test=RegresionLineal.predict(X_test) ### Pronostico
mean_squared_error(Y_test, Y_pred_test) ### Los datos de prueba
from sklearn.metrics import r2_score
Y_pred_train=RegresionLineal.predict(X_train) ### Entrenamiento
Y_pred_test=RegresionLineal.predict(X_test) ## Prueba
print("R2 train",np.round(r2_score(Y_train, Y_pred_train),2)*100, "%")
print("R2 prueba",np.round(r2_score(Y_test, Y_pred_test),2)*100, "%")
X_train, X_test, y_train, y_test=train_test_split(X,Y, test_size=0.2)
reg=linear_model.LinearRegression()
reg.fit(X_train,y_train)
pred_train=reg.predict(X_train)
print("El R2 de entrenamiento es ",100*np.round(r2_score(y_train, pred_train),2), "%")
pred_test=reg.predict(X_test)
print("El R2 de prueba es ",100*np.round(r2_score(y_test, pred_test),2), "%")
seleccion=RFE(reg, n_features_to_select=189, step=1) ## Seleccionar un modelo más pequeño
seleccion = seleccion.fit(X_train, y_train) ## Parsimonioso
X.columns[seleccion.support_]
pred_train=seleccion.predict(X_train)
print("El R2 de entrenamiento es ",100*np.round(r2_score(y_train, pred_train),2), "%")
pred_test=seleccion.predict(X_test)
print("El R2 de prueba es ",100*np.round(r2_score(y_test, pred_test),2), "%")
fig=px.scatter(X, x=y_train, y=X_train.YearBuilt)
fig.show()
pd.DataFrame(seleccion.ranking_, index=X.columns).sort_values(by=0).iloc[1:189] ## Ordenar las variables por importancia
# filename = 'RL_modelo3.sav'
# pickle.dump(reg, open(filename, 'wb'))
#X_test.to_excel("Datos_nuevos.xlsx")