In [1]:
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
In [2]:
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)))
In [3]:
#data = pd.read_csv('/resources/data/Data Projects/ADS Project/dataFinalParaModelo.csv')
data = pd.read_csv('data/dataFinalParaModelo.csv')
data.head()
Out[3]:
In [5]:
data['hasSpouse'] = np.where(np.isnan(data.spouseJob.values),0,1)
data['spouseJob'] = np.where(np.isnan(data.spouseJob.values),0,data.spouseJob.values)
In [6]:
data['TotalFamilyIncome'].replace(to_replace=[0], value=[1] , inplace=True, axis=None)
In [7]:
data = data[data.TotalFamilyIncomeDecReg != 0]
In [8]:
data['income_log'] = np.log(data.TotalFamilyIncome)
In [9]:
(data['TotalFamilyIncome']==0).sum()
Out[9]:
In [10]:
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)
In [15]:
data['TotalFamilyIncome'].replace(to_replace=[0], value=[1] , inplace=True, axis=None)
In [16]:
data['income_logPer'] = np.log(data.PerCapInc)
In [17]:
data.corr()['TotalFamilyIncome'][data.corr()['TotalFamilyIncome'] > 0.10].sort_values()
Out[17]:
In [18]:
data['haciBool'] = (data.Hacinamiento > 3).astype(int)
In [21]:
#data solo para la ciudad de buenos aires
dataCaba = data.loc[data.AGLO1 == 32,:]
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
In [22]:
varForModel = [
'headEduc',
#'job',
#'SleepingRooms',
#'schoolAndJob',
#'Hacinamiento'
]
runModel(dataCaba, 'TotalFamilyIncome', varForModel)
In [24]:
varForModel = [
'headEduc',
'job',
#'SleepingRooms',
#'schoolAndJob',
#'Hacinamiento'
]
runModel(dataCaba, 'TotalFamilyIncome', varForModel)
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
In [25]:
varForModel = [
'headEduc',
'job',
'SleepingRooms',
#'schoolAndJob',
#'Hacinamiento'
]
runModel(dataCaba, 'TotalFamilyIncome', varForModel)
In [26]:
varForModel = [
#'headEduc',
#'job',
#'SleepingRooms',
'schoolAndJob',
#'Hacinamiento'
]
runModel(dataCaba, 'TotalFamilyIncome', varForModel)
In [27]:
varForModel = [
#'headEduc',
#'job',
#'SleepingRooms',
'schoolAndJob',
'Hacinamiento'
]
runModel(dataCaba, 'TotalFamilyIncome', varForModel)
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
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)