<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Modelos finales
Libraries
Step1:  Functions
Step2:  Get Data
Step3:  Modifiacion en variables
Step4:  Para CABA
Tome dos lineas de accion. 
Por un lado tomar la parte individual, de las personas que viven en la casa. Ya sea el nivel educativo del jefe y la cantidad de gente que trabaja o por otro lado usar la suma de años de escolaridad de todos los que trabajan en la casa.  Por el otro, las variables que tenian que ver con el hogar, la calidad del hogar. La que mejor funcionaba ahi esa hacinamiento (cantidad de personas por cuarto) o directamente la cantidad de cuartos.
Aca van los modelos que corri en retadatam
Modelo 1 a (educHead)
Step5:  Modelo 1 b (educHeadYjobs)
Step6:  Modelo 1 c (educHeadYjobsYrooms)
Este para mi es el que mejor da. Sobre estima sistematicamente, la R2 da muy alta, pero es el que mejor rendimiento tiene porque estan todos ajustados a una recta de mejor modo que en los otros. Creo que esto se podría ajustar. Si no usamos R2 sino el correlation coefficient, es el mas alto 96%. Ademas es el mejor mapa me parece
Step7:  Modelo 2 a (jobsAndSchool)
Step8:  Modelo 2 b (jobsAndSchoolYrooms)
Step9:  Modelo con todas las variables (Ignorar)
<ASSISTANT_TASK:>
Python Code:
import pandas as pd
import numpy as np
import os
import sys
import simpledbf
%pylab inline
import matplotlib.pyplot as plt
import statsmodels.api as sm
from sklearn.model_selection import train_test_split
from sklearn import linear_model
Explanation: Modelos finales
Libraries
End of explanation
def runModel(dataset, income, varForModel):
    
    '''
    This function takes a data set, runs a model according to specifications,
    and returns the model, printing the summary
    '''
    y = dataset[income].values
    X = dataset.loc[:,varForModel].values
    X = sm.add_constant(X)
    w = dataset.PONDERA
    
    lm = sm.WLS(y, X, weights=1. / w, missing = 'drop', hasconst=True).fit()
    print lm.summary()
    for i in range(1,len(varForModel)+1):
        print 'x%d: %s' % (i,varForModel[i-1])
    #testing within sample
    R_IS=[]
    R_OS=[]
    #R_prime = []
    n=500
    
    for i in range(n):  
        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state = 200)
        X_train = sm.add_constant(X_train)
        X_test = sm.add_constant(X_test)
        
        lm = linear_model.LinearRegression(fit_intercept=True)
        lm.fit(X_train, y_train, sample_weight = 1. / w[:len(X_train)])
        y_hat_IS = lm.predict(X_train)
        err_IS = y_hat_IS - y_train
        R2_IS = 1 - (np.var(err_IS) / np.var(y_train))
        
        y_hat_OS = lm.predict(X_test)
        err_OS = y_hat_OS - y_test
        R2_OS = 1 - (np.var(err_OS) / np.var(y_test))
        
        R_IS.append(R2_IS)
        R_OS.append(R2_OS)
        
    print("IS R-squared for {} times is {}".format(n,np.mean(R_IS)))
    print("OS R-squared for {} times is {}".format(n,np.mean(R_OS)))
Explanation: Functions
End of explanation
#data = pd.read_csv('/resources/data/Data Projects/ADS Project/dataFinalParaModelo.csv')
data = pd.read_csv('data/dataFinalParaModelo.csv')
data.head()
Explanation: Get Data
End of explanation
data['hasSpouse'] = np.where(np.isnan(data.spouseJob.values),0,1)
data['spouseJob'] = np.where(np.isnan(data.spouseJob.values),0,data.spouseJob.values)
data['TotalFamilyIncome'].replace(to_replace=[0], value=[1] , inplace=True, axis=None)
data = data[data.TotalFamilyIncomeDecReg != 0]
data['income_log'] = np.log(data.TotalFamilyIncome)
(data['TotalFamilyIncome']==0).sum()
data['FloorMaterial'] = np.where(np.isnan(data.FloorMaterial.values),5,data.FloorMaterial.values)
data['sumPredicted'] = np.where(np.isnan(data.sumPredicted.values),0,data.sumPredicted.values)
data['Sewer'] = np.where(np.isnan(data.Sewer.values),5,data.Sewer.values)
data['ToiletType'] = np.where(np.isnan(data.ToiletType.values),4,data.ToiletType.values)
data['Water'] = np.where(np.isnan(data.Water.values),4,data.Water.values)
data['RoofCoat'] = np.where(np.isnan(data.RoofCoat.values),2,data.RoofCoat.values)
data['TotalFamilyIncome'].replace(to_replace=[0], value=[1] , inplace=True, axis=None)
data['income_logPer'] = np.log(data.PerCapInc)
data.corr()['TotalFamilyIncome'][data.corr()['TotalFamilyIncome'] > 0.10].sort_values()
data['haciBool'] = (data.Hacinamiento > 3).astype(int)
#data solo para la ciudad de buenos aires
dataCaba = data.loc[data.AGLO1 == 32,:]
Explanation: Modifiacion en variables
End of explanation
varForModel = [
    'headEduc',
    #'job', 
    #'SleepingRooms',
    #'schoolAndJob',
    #'Hacinamiento'
]
runModel(dataCaba, 'TotalFamilyIncome', varForModel)
Explanation: Para CABA
Tome dos lineas de accion. 
Por un lado tomar la parte individual, de las personas que viven en la casa. Ya sea el nivel educativo del jefe y la cantidad de gente que trabaja o por otro lado usar la suma de años de escolaridad de todos los que trabajan en la casa.  Por el otro, las variables que tenian que ver con el hogar, la calidad del hogar. La que mejor funcionaba ahi esa hacinamiento (cantidad de personas por cuarto) o directamente la cantidad de cuartos.
Aca van los modelos que corri en retadatam
Modelo 1 a (educHead)
End of explanation
varForModel = [
    'headEduc',
    'job', 
    #'SleepingRooms',
    #'schoolAndJob',
    #'Hacinamiento'
]
runModel(dataCaba, 'TotalFamilyIncome', varForModel)
Explanation: Modelo 1 b (educHeadYjobs)
End of explanation
varForModel = [
    'headEduc',
    'job', 
    'SleepingRooms',
    #'schoolAndJob',
    #'Hacinamiento'
]
runModel(dataCaba, 'TotalFamilyIncome', varForModel)
Explanation: Modelo 1 c (educHeadYjobsYrooms)
Este para mi es el que mejor da. Sobre estima sistematicamente, la R2 da muy alta, pero es el que mejor rendimiento tiene porque estan todos ajustados a una recta de mejor modo que en los otros. Creo que esto se podría ajustar. Si no usamos R2 sino el correlation coefficient, es el mas alto 96%. Ademas es el mejor mapa me parece
End of explanation
varForModel = [
    #'headEduc',
    #'job', 
    #'SleepingRooms',
    'schoolAndJob',
    #'Hacinamiento'
]
runModel(dataCaba, 'TotalFamilyIncome', varForModel)
Explanation: Modelo 2 a (jobsAndSchool)
End of explanation
varForModel = [
    #'headEduc',
    #'job', 
    #'SleepingRooms',
    'schoolAndJob',
    'Hacinamiento'
]
runModel(dataCaba, 'TotalFamilyIncome', varForModel)
Explanation: Modelo 2 b (jobsAndSchoolYrooms)
End of explanation
income1 = 'income_log'
income2 = 'TotalFamilyIncome'
income = 'TotalFamilyIncomeDecReg'
income = 'income_log'
varForModel = [
    'SleepingRooms','HouseMembers','WaterRec',
    'CookingCombustible',
    
#     'SleepingRooms', 'UsableTotalRooms', 'RoomsNumber', 'HouseMembers', 'WaterRec', # positivas
#     'CookingCombustible', 'FloorMaterial', 'Sewer', 'ToiletType','Sink', 'RoofCoat', 'Water', #negativas
#     'headReading', 'OwnershipRec','WaterType', #sospechoso
    'headAge', 'headEduc','headJob', 'spouseJob' #base
                      ]
runModel(data, income, varForModel)
Explanation: Modelo con todas las variables (Ignorar)
End of explanation
<END_TASK>