Nesta oportunidade será apresentada apenas uma análise inicial do problema e a tentativa de prever os dados por meio de dois modelos, sem análise aprofundada. Para isso, foi utilizado o python, iniciando-se com a importação das bibliotecas a serem utilizadas e a importação dos dados:
#importando as bibliotecas
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from sklearn.neighbors import KNeighborsClassifier
from sklearn import model_selection
from sklearn.metrics import r2_score
from sklearn.metrics import mean_squared_log_error
from sklearn.model_selection import train_test_split
%matplotlib inline
#importando os dados
df_train = pd.read_csv('train_liberty.csv')
df_test = pd.read_csv('test_liberty.csv')
Com os comandos abaixo verificou-se que a base de teste não traz a target 'Hazard". Assim, optou-se considerar apenas a base de dados de treino, tanto para a etapa de treino quanto para a etapa de teste. Verificou-se também a inexistência de valores faltantes dentre as 50999 observações da base de treino, um total de 32 variáveis, sendo 16 numéricas, aparentemente, e 16 categóricas.
#verificando as variáveis em cada base de dados
print(df_train.columns, df_test.columns)
#verificando dados da base de treino
df_train.set_index('Id', inplace=True)
print(df_train.shape) # 50999 observações, target mais 32 variáveis
print(df_train.count()) # Sem NA
print(df_train['Hazard'].value_counts())
print(df_train.describe(include='all'))
#separando as variáveis
target = 'Hazard'
variaveis = ['T1_V1', 'T1_V2', 'T1_V3', 'T1_V4', 'T1_V5', 'T1_V6', 'T1_V7',
'T1_V8', 'T1_V9', 'T1_V10', 'T1_V11', 'T1_V12', 'T1_V13', 'T1_V14',
'T1_V15', 'T1_V16', 'T1_V17', 'T2_V1', 'T2_V2', 'T2_V3', 'T2_V4',
'T2_V5', 'T2_V6', 'T2_V7', 'T2_V8', 'T2_V9', 'T2_V10', 'T2_V11',
'T2_V12', 'T2_V13', 'T2_V14', 'T2_V15']
variaveisNumericas = ['T1_V1', 'T1_V2', 'T1_V3', 'T1_V10', 'T1_V13', 'T1_V14',
'T2_V1', 'T2_V2', 'T2_V4', 'T2_V6', 'T2_V7', 'T2_V8', 'T2_V9', 'T2_V10', 'T2_V14', 'T2_V15']
variaveisCategoricas = ['T1_V4', 'T1_V5', 'T1_V6', 'T1_V7', 'T1_V8', 'T1_V9', 'T1_V11', 'T1_V12', 'T1_V15', 'T1_V16', 'T1_V17',
'T2_V3', 'T2_V5', 'T2_V11', 'T2_V12', 'T2_V13']
Em seguida, buscou-se conhecer melhor a target, que apresenta maior frequência de valores entre 1 e 8, passando à frequência ínfima quando atinge valor a partir de 30, e as variáveis anônimas, aparentemente sendo as numéricas discretas, em sua maioria, variando entre valores baixos (o que pode representar quantidade de cômodos, de pessoas que residem no imóvel etc).
#verificando target
print(f'Média: {df_train.Hazard.mean()}, desvio padrão: {df_train.Hazard.std()}')
df_train['Hazard'].plot.hist() #a maior parte da pontuação de perigo varia entre 1 e 8
df_train['Hazard'].plot.box()
#verificando variáveis numéricas
df_train[variaveisNumericas].plot.box()
plt.xticks(rotation=45)
#vendo algumas variáveis separadamente
df_train[['T1_V3']].plot.box(), df_train[['T1_V14']].plot.box(), df_train[['T2_V1']].plot.box(),
df_train[['T2_V6']].plot.box(), df_train[['T2_V8']].plot.box(), df_train[['T2_V14']].plot.box()
print(df_train['T1_V3'].value_counts(), df_train['T1_V14'].value_counts(),
df_train['T2_V1'].value_counts(), df_train['T2_V6'].value_counts(),
df_train['T2_V8'].value_counts(), df_train['T2_V14'].value_counts())


A seguir, seguem comandos para transformação das variáveis categóricas em variáveis dummies, passando ao todo de 32 para 112 variáveis
#transformando as variáveis categóricas em variáveis dummies
df_train_ = pd.get_dummies(df_train.copy(), columns=variaveisCategoricas)
variaveisIndependentes = list(df_train_.columns)
variaveisIndependentes.remove('Hazard')
variaveisIndependentes
df_train_.shape #a quantidade de variáveis passou de 32 para 112
Abaixo segue classe criada com função definida para separação dos dados entre dados para treino e para teste, bem como função para executar o treino e prever a target para posterior plot dos resultados:
class PrevisaoLiberty:
def __init__(self, df, target, listaVariaveis):
self.df=df
self.target=target
self.listaVariaveis=listaVariaveis
self.X=df[listaVariaveis]
self.y=df[target]
def separaTreinoTeste(self, percTeste, semente):
X_train, X_test, y_train, y_test = train_test_split(self.X, self.y, test_size=percTeste, random_state=semente)
self.X_train = X_train.values.tolist()
self.X_test = X_test.values.tolist()
self.y_train = y_train.tolist()
self.y_test = y_test.tolist()
def graficosPrevisao(self, dicionarioModelos):
for nome, modelo in dicionarioModelos.items():
modelo.fit(self.X_train,self.y_train)
y_pred = modelo.predict(self.X_test)
plt.plot(self.y_test, color='blue')
plt.plot(y_pred , color='red')
plt.show()
print(nome, 'R Quadrado', r2_score(self.y_test, y_pred))
