Path: blob/main/Trabajo_grupal/WG5/Grupo_6_py.py
2714 views
# -*- coding: utf-8 -*-1"""2Created on Sat Oct 1 19:16:21 202234@author: HP5"""67################ TAREA 6 #####################8######### Curso: Laboratorio de R y Python #########9################ GRUPO 6 #####################1011#%% Pregunta 11213#--------------- Recordando todo lo avanzado en la Tarea 414# Primero es necesario que importemos las librerias para crear las clases, definir atributos y finalmente crear los modelos1516import numpy as np17import pandas as pd18from pandas import DataFrame, Series19import statistics20import inspect21import pyreadr # Cargar la base de datos de R22import os # Para identificar el directorio2324# Llamamos el paquete que nos permitirá llevar a cabo la regresión lineal25from scipy.stats import t #Refiriendo al estadistico t-student2627# Comenzamos a crear la clase, en la parte de class RegClass, podemos omitir object, pues es lo mismo28class RegClass( object ):2930def __init__( self, X : pd.DataFrame , y : pd.Series , intercept = True ):31def __init__(self, explicativas, vector, extraer, booleano):3233self.explicativas = explicativas34self.vector = vector35self.booleano = booleano3637# Indicamos que X sea un data frame e Y sea una lista, proponiendo una condicional para ambos)38if not isinstance( X, pd.DataFrame ):39raise TypeError( "X must be a pd.DataFrame." )4041if not isinstance( y , pd.Series ):42raise TypeError( "y must be a pd.Series." )4344# asignando atributos de la clase correspondientes4546self.X = X47self.y = y48self.intercept = intercept4950if self.intercept:5152self.X[ 'Intercept' ] = 153# Se coloca la columna Intercept en la primera columna54cols = self.X.columns.tolist() # nombre de varaible a lista55new_cols_orders = [cols[ -1 ]] + cols[ 0:-1 ] # juntando listas5657# new_cols_orders = [cols[ -1 ]].extend(cols[ 0:-1 ]) # append lista a una lista5859# [cols[ -1 ]] la jala la ultima fila , cols[ 0:-1 ] primera fila hasta la penultima fila6061self.X = self.X.loc[ : , new_cols_orders ] # usamos .loc que filtra por nombre de filas o columnas6263else:64pass6566# Ahora se está creando nuevos atributos y filtramos los nombres6768self.X_np = self.X.values # Dataframe a multi array69self.y_np = y.values.reshape( -1 , 1 ) # de objeto serie a array columna70self.columns = self.X.columns.tolist() # nombre de la base de datos como objeto lista7172##### Método 1 #####73##################74# Se busca estimar los coeficientes de la regresión75# Definimos la regresión7677def reg_beta_OLS( self ):78# X se define como Matriz, mientras Y como vector columna7980X_np = self.X_np81y_np = self.y_np8283# Utilizando el beta_ols84beta_ols = np.linalg.inv( X_np.T @ X_np ) @ ( X_np.T @ y_np )8586# columnas de X87index_names = self.columns88# Aqui definimos la salida o el output89beta_OLS_output = pd.DataFrame( beta_ols , index = index_names , columns = [ 'Coef.' ] )9091# Finalmente, queda un Dataframe de coeffientes como atributo9293self.beta_OLS = beta_OLS_output9495return beta_OLS_output9697##### Método 2 #####98##################99# Se busca hallar la matriz de varianzas y covarianzas, en modo estándar:100# Primero buscamos hallar el error estandar y la varianza a continuación101102def reg_var_OLS( self ):103104# PRIMERO, Se corre la función reg_beta_OLS para estimar el vector de coeficientes105106self.reg_beta_OLS()107108X_np = self.X_np109y_np = self.y_np110111# beta_ols112beta_OLS = self.beta_OLS.values.reshape( - 1, 1 ) # Dataframe a vector columna113114# Analizamos los errores115e = y_np - ( X_np @ beta_OLS )116117# Luego, se evalua la varianza del error118N = X.shape[ 0 ]119total_parameters = X.shape[ 1 ]120error_var = ( (e.T @ e)[ 0 ] )/( N - total_parameters )121122# SEGUNDO, para hallar la Varianza123var_OLS = error_var * np.linalg.inv( X_np.T @ X_np )124125# columns names126index_names = self.columns127# Tendremos el output desde la creación del atributo VAR128var_OLS_output = pd.DataFrame( var_OLS , index = index_names , columns = index_names )129## variance output como nuevo atributo del objeto130self.var_OLS = var_OLS_output131132# TERCERO, ahora corremos la funcion OLS, para hallar la varianza y desviacion estandar133def reg_OLS( self ):134135# Se corren las funciones136self.reg_beta_OLS()137self.reg_var_OLS()138X = self.X_np139140# Varianza y Coeficientes betas141beta_OLS = self.beta_OLS.values.reshape( -1, 1 )142var_OLS = self.var_OLS.values143144# Hallando error estándar145beta_se = np.sqrt( np.diag( var_OLS ) )146147# FINALMENTE, para analizar la significacia se calcula el test statistic para cada coeficiente148t_stat = beta_OLS.ravel() / beta_se.ravel()149150# .ravel() te multiarray a simple array151152# p-value:153N = X.shape[ 0 ]154k = beta_OLS.size155self.nk = N-k156pvalue = (1 - t.cdf(t_stat, df= N - k) ) * 2157158# ADEMÁS, se evalúa el intervalo de confianza para los coeficientes estimados (bajo un 95% con un valor de 1.96)159160up_bd = beta_OLS.ravel() + 1.96*beta_se161lw_bd = beta_OLS.ravel() - 1.96*beta_se162163table_data ={ 'Coef.' : beta_OLS.ravel() , # .ravel() :: .flatten()164"Std.Err." : beta_se.ravel(),165"t" : t_stat.ravel(),166"P>|t|" : pvalue.ravel(),167"[0.025" : lw_bd.ravel(),168"0.975]" : up_bd.ravel()169}170171# defining index names172index_names = self.columns173174# defining a pandas dataframe175reg_OLS = pd.DataFrame( table_data , index = index_names )176177return reg_OLS178179##### Método 3 #####180##################181# Aqui nos piden un método para hallar la matriz de varianza y covarianza robusta182def M_ROBUST_COV(self):183# ESTIMACIÓN DEL VECTOR DE COEFICIENTES.184self.beta_OLS_Reg()185186# usamos atributos pero con el nombre simplificado187X_np = self.X_np188y_np = self.y_np189190# VARIANZA ROBUSTA, tomando de base a la matriz propuesta de White para muestras grandes191# V = np.zeros ((X_np.shape[1]. X_np. shape(1)))192self.y_est = X_np @ self.beta_OLS193194matrix_robust = np.diag(list( map( lambda x: x**2 , y_np - self.y_est)))195196self.robust_var = np.linalg.inv(X_np.T @ X) @ X_np.T @ matrix_robust @ X_np @ np.linalg.inv(X_np.T @ X_np)197198##### Método 4 #####199##################200# Se definirá el método que permita hallar la matriz de varianza y covarianza estándar, los errores estándar de cada coeficiente, e intervalos de confianza. Determinamos que X sea un data frame, mientras Y sea una columna, de modo que tambien se utiliza el args201#Se crea atributo de vector de variable Y202X1 = self.Y.to_numpy().reshape(self.n ,1) # Se mantiene como DataFrame. Se crea atributo de variables explicativas203self.X = X204self.Y = Y #Se crea el atributo para extraer el vector de la variable Y205self.beta = np.linalg.inv(X.T @ X) @ ((X.T) @ Y )206207self.nk = self.n - k #Para determinar grados de libertad208# Se definirá un método que halle el R2 y root MSE (mean square error)209210def R2(self):211212self.coeficientes()213y_est = self.X @ self.beta214error = self.Y - y_est215self.SCR = np.sum(np.square(error))216SCT = np.sum(np.square(self.Y - np.mean(self.Y)))217R2 = 1 - self.SCR/SCT218219return R2220# Ahora, para hallar el root MSE, primero hay que llamar al paquete que nos permitirá encontrarlo221from sklearn.metrics import mean_squared_erro222#Definimos el método223224def MSE(true,predicted):225226MSE = mean_squared_error(true,predicted, squared=False)227228return MSE229230##### Método 5 #####231##################232# Primero se necesita cargar la base de datos, por ello utilizamos el user que se utilice sin necesidad de cambiar el usuario del computador233user = os.getlogin()234os.chdir(f"Users/{user}/Documents/GitHub/1ECO35_2022_2/Lab4") #Tomar en cuenta que al trabajar en una Mac o sistema IOs, no se usa el C:"235236cps2012_UNO = pyreadr.read_r("../data/cps2012.Rdata")237cps2012 = cps2012_UNO['data']238dt = cps2012.describe239240#ES NECESARIO FILTRAR LAS VARIANZAS DISTINTAS A 0241242variance_cols = cps2012.var().to_numpy()243dataset = cps2012.iloc[:, np.where(variance_cols !=0 )[0]]244## aca poner un dataset específico desde el general, podría ser con iloc y squeeze()245246247#%%248#--------------- Se privatizará el atributo X249250############# Privatizando el atributo X (Data frame)251252### EN MÉTODO 1: INICIALMENTE, Comenzamos a crear la clase, class RegClass253class RegClass( object ):254255#Ahora comenzamos a cambiar la estructura de privatización, cambiando a los atributos de X256def __init__( self, X : pd.DataFrame , y : pd.Series , intercept = True ):257def __init__(self, explicativas, vector, extraer, booleano):258# asignando atributos de la clase correspondientes259260self.__X = X261self.y = y262self.intercept = intercept263if self.intercept:264265self.X[ 'Intercept' ] = 1266# Se coloca la columna Intercept en la primera columna267cols = self.__X.columns.tolist() # nombre de varaible a lista268new_cols_orders = [cols[ -1 ]] + cols[ 0:-1 ] # juntando listas269270# new_cols_orders = [cols[ -1 ]].extend(cols[ 0:-1 ]) # append lista a una lista271272# [cols[ -1 ]] la jala la ultima fila , cols[ 0:-1 ] primera fila hasta la penultima fila273274self.__X = self.__X.loc[ : , new_cols_orders ] # usamos .loc que filtra por nombre de filas o columnas275276else:277pass278279# Ahora se está creando nuevos atributos y filtramos los nombres280281self.__X_np = self.__X.values # Dataframe a multi array282self.y_np = y.values.reshape( -1 , 1 ) # de objeto serie a array columna283self.columns = self.__X.columns.tolist() # nombre de la base de datos como objeto lista284### EN MÉTODO 2:285def reg_var_OLS( self ):286287# PRIMERO, Se corre la función reg_beta_OLS para estimar el vector de coeficientes288289self.reg_beta_OLS()290291X_np = self.__X_np292y_np = self.y_np293294# beta_ols295beta_OLS = self.beta_OLS.values.reshape( - 1, 1 ) # Dataframe a vector columna296297# Analizamos los errores298e = y_np - ( X_np @ beta_OLS )299300# Luego, se evalua la varianza del error301N = X.shape[ 0 ]302total_parameters = X.shape[ 1 ]303error_var = ( (e.T @ e)[ 0 ] )/( N - total_parameters )304305# SEGUNDO, para hallar la Varianza306var_OLS = error_var * np.linalg.inv( X_np.T @ X_np )307308# columns names309index_names = self.columns310# Tendremos el output desde la creación del atributo VAR311var_OLS_output = pd.DataFrame( var_OLS , index = index_names , columns = index_names )312## variance output como nuevo atributo del objeto313self.var_OLS = var_OLS_output314315# TERCERO, ahora corremos la funcion OLS, para hallar la varianza y desviacion estandar316def reg_OLS( self ):317318# Se corren las funciones319self.reg_beta_OLS()320self.reg_var_OLS()321X = self.__X_np322323# Varianza y Coeficientes betas324beta_OLS = self.beta_OLS.values.reshape( -1, 1 )325var_OLS = self.var_OLS.values326327# Hallando error estándar328beta_se = np.sqrt( np.diag( var_OLS ) )329330# FINALMENTE, para analizar la significacia se calcula el test statistic para cada coeficiente331t_stat = beta_OLS.ravel() / beta_se.ravel()332333# .ravel() te multiarray a simple array334335# p-value:336N = X.shape[ 0 ]337k = beta_OLS.size338self.nk = N-k339pvalue = (1 - t.cdf(t_stat, df= N - k) ) * 2340### EN METODO 3341def M_ROBUST_COV(self):342# ESTIMACIÓN DEL VECTOR DE COEFICIENTES.343self.beta_OLS_Reg()344345# usamos atributos pero con el nombre simplificado346X_np = self.__X_np347y_np = self.y_np348349# VARIANZA ROBUSTA, tomando de base a la matriz propuesta de White para muestras grandes350# V = np.zeros ((X_np.shape[1]. X_np. shape(1)))351self.y_est = X_np @ self.beta_OLS352353matrix_robust = np.diag(list( map( lambda x: x**2 , y_np - self.y_est)))354355self.robust_var = np.linalg.inv(X_np.T @ X) @ X_np.T @ matrix_robust @ X_np @ np.linalg.inv(X_np.T @ X_np)356357### EN METODO 4358X1 = self.Y.to_numpy().reshape(self.n ,1) # Se mantiene como DataFrame. Se crea atributo de variables explicativas359self.__X = X360self.Y = Y #Se crea el atributo para extraer el vector de la variable Y361self.beta = np.linalg.inv(X.T @ X) @ ((X.T) @ Y )362363self.nk = self.n - k #Para determinar grados de libertad364# Se definirá un método que halle el R2 y root MSE (mean square error)365366def R2(self):367368self.coeficientes()369y_est = self.__X @ self.beta370error = self.Y - y_est371self.SCR = np.sum(np.square(error))372SCT = np.sum(np.square(self.Y - np.mean(self.Y)))373R2 = 1 - self.SCR/SCT374375return R2376# Ahora, para hallar el root MSE, primero hay que llamar al paquete que nos permitirá encontrarlo377from sklearn.metrics import mean_squared_erro378#Definimos el método379380def MSE(true,predicted):381382MSE = mean_squared_error(true,predicted, squared=False)383384return MSE385386#%%387#--------------- Se privatizará el método de diccionario388### EN MÉTODO 5389# A continuación el punto clave: Colocar la instancia __slot__ con todos los atributos que hayan creado en su estructura de clase.390391__slots__ = [ '__X', 'y', 'intercept', 'X_np', 'y_np', 'columns', 'beta_OLS'] # colocar todos los atributos que hayan definido en se clase. Observen que X se incluye privatizado392393ghjkl394#%% Pregunta 2395from IPython.display import display, HTML396397display(HTML(data="""398<style>399div#notebook-container { width: 75%; }400div#menubar-container { width: 95%; }401div#maintoolbar-container { width: 65%; }402</style>403"""))404405import numpy as np406import pandas as pd407from pandas import DataFrame,Series408import savReaderWriter as sav409410!pip install pyreadstat # open spss dataset // #por si necesitamos instalar411!pip install savReaderWriter // #por si necesitamos instalar412413data_administrativa = pd.read_spss( r"../data/enapres_2020_ch_100/736-Modulo1618/CAP_100_URBANO_RURAL_3.sav" )414415# cargamos usando pandas416417data_administrativa418419with sav.SavHeaderReader(r"../data/data_administrativa.sav", ioUtf8=True) as header:420metadata = header.all()421labels_data_administrativa = metadata.valueLabels422var_labels_data_administrativa = metadata.varLabels423424# Mostrar las variables que presentan missing values425426# Opción 1 -> info, todo lo que no presente 42153 datos (N), necesariamente presentará missing values.427428data_administrativa.info(verbose=True,null_counts=True)429430# Opción 2 -> isnull para explorar sobre todas las variables que presenten missing values.431data_administrativa.isnull432433# Mostrar las etiquetas de dos variables (var labels) y las etiquetas de los valores en dos variables (value's labels).434435labels_data_administrativa.keys #utilizamos keys para conocer las variables436var_labels_data_administrativa.keys437438#ya que nos piden dos de cada uno, necesitamos conocer los nombres.439440labels_data_administrativa['AREA'] # mostramos las etiquetas de los valores441labels_data_administrativa['ESTRATO']442443var_labels_data_administrativa['REGIONNATU'] # mostramos las etiquetas de dos variables444var_labels_data_administrativa['TSELV']445446data_administrativa.attrs[ 'value_labels' ] = labels_data_administrativa # guardamos todas las lables.447data_administrativa.attrs[ 'var_labels' ] = var_labels_data_administrativa448449# Detectar personas que fueran entrevistadas en ambos años. Para ello, se pide detectar duplicados a partir del identificador por persona : conglome, vivienda, hogar y codperso.450451Nos piden crear un identificador por persona "Conglo, viv, hog, codper"452453Con esto, buscamos identificar aquellos que se repitan.454455data_administrativa[ data_administrativa.loc[:, ['CONGLOMERADO' , 'VIVIENDA', 'HOGAR', 'P100_C']].duplicated(keep = False)]456457# keep False para mostrar todos los duplicados.458459data_administrativa[ data_administrativa.loc[:, ['CONGLOMERADO' , 'VIVIENDA', 'HOGAR', 'P100_C']].duplicated(keep = False) ]\460[['CONGLOMERADO' , 'VIVIENDA', 'HOGAR', 'P100_C']]461462# Ordene la base de datos a partir de las variables que identifican cada miembro y la variable de año (year). Así podrá observar a cada individuo en ambos años.463464data_administrativa[ data_administrativa.loc[:, ['CONGLOMERADO' , 'VIVIENDA', 'HOGAR', 'P100_C']].duplicated() ]465466467# crear una base de datos para cada año y guardar en la carpeta data con los siguientes nombres data_2019_(numero de grupo) y data_2020_(numero de grupo).468import pyreadstat469470pyreadstat.write_sav(df, r"../../data/enapres_2020_ch_100/736-Modulo1618/CAP_100_URBANO_RURAL_3.sav")471472