La encuesta de expectativas macroeconómicas se divide en dos: encuesta a empresas no financieras y encuesta a analistas y entidades.
En el siguiente articulo veremos el procesamiento de la encuesta a empresas no financieras.
Se descargan, los resultados desde la plataforma web de la encuesta, en un excel:
Figura 1
Las primeras columnas corresponden a los datos de los individuos encuestados. Para este ejemplo, he eliminado nombres y cualquier referencia a las empresas, manteniendolas en el anonimato.
Figura 1
Las columnas a la derecha muestran las respuestas a todas las preguntas realizadas historicamente en la encuesta, incluidas aquellas preguntas que no han sido incluidas este mes, que, por lo tanto, muestran todos sus valores en blanco.
Figura 1
Los siguientes pasos para procesar la encuesta pueden ser replicados en stata, excel o cualquier otro codigo, sin embargo, los realizaré en R.
Llamo a las librerías más comunes:
library(tidyverse)
library(openxlsx)
library(lubridate)
library(zoo)
Primero, se deben leer los datos de las columnas en el excel descargado (es posible que se descargue en formato *.html, por lo que debe volver a guardarse como *.xlsx).
mes = tolower(format(as.Date("2020-08-01"),"%B-%Y")) #Agosto-2020
print(mes)
## [1] "agosto-2020"
pre = mes %>%
{paste("resultados-encuesta-",.,".xlsx",sep="")} %>% #Nombre del archivo
read.xlsx(startRow = 8,check.names = TRUE) %>% #Leo el excel, desde la fila 8, corrijo nombres
mutate(X2 = convertToDate(X2)) %>% #Leo Fecha de excel
mutate(year = year(X2),month=month(X2)) %>% #Creo variable año y mes
select(year,month,everything()) #Ordeno: Año, Mes y el resto.
print(head(select(pre,1:10),5))
## year month X1 X2 X3 X4 X5 X6 X7 X8
## 1 2020 8 - 2020-08-20 MANUFACTURA - - - - -
## 2 2020 8 - 2020-08-20 SERVICIOS - - - - -
## 3 2020 8 - 2020-08-20 CONSTRUCCIÓN - - - - -
## 4 2020 8 - 2020-08-20 MANUFACTURA - - - - -
## 5 2020 8 - 2020-08-20 COMERCIO - - - - -
ultimo = pre %>%
{.[, which(colMeans(is.na(.)) != 1)]} %>% #Elimino columnas vacias
select(1:57) %>% #Elijo primeras 57 columnas
rename("Sector" = X3,"Empresa" = X4,"Encuesta" = X6, "RUC" = X5) %>% #Renombro
select(-X1,-X2,-X7,-X8) %>% #Elimino
mutate_at(vars(starts_with("Exp")),as.double) %>% #Formato de número
mutate_at(vars(c(X38:Nivel_pt_Deseado)),as.double) #Formato de número
print(head(select(ultimo,1:10),5))
## year month Sector Empresa RUC Encuesta ExpPBI_Anio1 ExpPBI_Anio2
## 1 2020 8 MANUFACTURA - - - -10 7.0
## 2 2020 8 SERVICIOS - - - -16 -5.0
## 3 2020 8 CONSTRUCCIÓN - - - -5 3.0
## 4 2020 8 MANUFACTURA - - - 2 2.4
## 5 2020 8 COMERCIO - - - 0 10.0
## ExpPBI_Anio3 ExpIPC_Anio1
## 1 5.0 2.0
## 2 2.5 3.3
## 3 3.0 2.5
## 4 3.0 2.0
## 5 5.0 1.0
Los nombres de las variables son códigos largos y dificiles de seguir.
sample(names(ultimo),size = 10) #Muestra de 10
## [1] "ExpIPC_Anio1" "month" "SitActNeg" "NivelProduc" "NumPerEmp.1"
## [6] "X312" "NivelEmpleo" "OrdCompra" "RapEntrega" "ProdTerm"
Se deben renombrar con una base de datos donde se encuentren los códigos, la clasificación y los nombres completos.
Figura 1
codigos = paste("Encuesta_Expectativas codigos.xlsx",sep="") %>%
read.xlsx(sheet="Hoja2",colNames = FALSE) #Leo los codigos
#Renombro los nombre de los códigos
names(ultimo)[7:12] = codigos$X1[1:6]
names(ultimo)[13:15] = codigos$X1[9:11]
names(ultimo)[16:21] = codigos$X1[12:17]
names(ultimo)[16:21] = codigos$X1[12:17]
names(ultimo)[22:27] = codigos$X1[19:24]
names(ultimo)[28:34] = codigos$X1[26:32]
names(ultimo)[35:41] = codigos$X1[41:47]
names(ultimo)[42] = "SitActNeg"
names(ultimo)[43:49] = codigos$X1[33:39]
names(ultimo)[50:51] = codigos$X1[7:8]
names(ultimo)[52] = "OG"
names(ultimo)[53] = "OH"
Finalmente, se modifican los valores de la columna Sector de forma que el nombre de los sectores sea homogeneo. Asimismo, se modifica la fecha para que muestre unicamente el mes y el año, más no la hora y el día.
Se ve que los sectores no son homogeneos.
print(unique(ultimo$Sector))
## [1] "MANUFACTURA" "SERVICIOS"
## [3] "CONSTRUCCIÓN" "COMERCIO"
## [5] "MINERÍA E HIDROCARBUROS" "TRANSPORTE Y COMUNICACIONES"
## [7] "AGROPECUARIO" "ELECTRICIDAD , GAS Y AGUA"
## [9] "CONSTRUCCION" "Servicios"
## [11] "ELECTRICIDAD"
ultimo = ultimo %>%
select(year,month,Empresa,RUC,Sector,Encuesta,codigos$X1)%>% #Orden
mutate(Fecha = as.yearmon(as.Date(paste(year,month,"01"),format = "%Y %m %d"))) %>% #Modifico fecha
select(Fecha,everything()) %>% #Pongo la fecha primero
mutate(Sector = ifelse(Sector=="PESCA" | Sector=="AGROPECUARIO","AGRO Y PESCA",Sector)) %>% #modifico los nombres del sector
mutate(Sector = ifelse(Sector=="TRANSPORTE Y COMUNICACIONES" | Sector=="Servicios","SERVICIOS",Sector)) %>%
mutate(Sector = ifelse(Sector == "ELECTRICIDAD" | Sector=="ELECTRICIDAD. GAS Y AGUA" | Sector=="ELECTRICIDAD , GAS Y AGUA" | Sector =="ELECTRICIDAD . GAS Y AGUA" | Sector =="ELECTRICIDAD, AGUA Y GAS" | Sector=="ENERGÍA, GAS Y AGUA","ELECTRICIDAD, GAS Y AGUA",Sector)) %>%
mutate(Sector = ifelse(Sector=="CONSTRUCCION" | Sector=="Construcción","CONSTRUCCIÓN",Sector)) %>%
mutate(Sector = ifelse(Sector=="Manufactura","MANUFACTURA",Sector)) %>%
mutate(Produc = ifelse(Sector=="COMERCIO" | Sector=="SERVICIOS","",Produc)) %>% #Producción sin Comercio ni Servicios
mutate(PreInsTresFor = ifelse(Sector=="COMERCIO","",PreInsTresFor)) %>% #Precio de insumos a 3 meses sin considerar Comercio.
arrange(year,month) %>% #ordeno según el año y el mes
mutate_at(vars(starts_with("expipc")),as.double) #formato de número
Se puede ver que los sectores ahora son homogeneos:
print(unique(ultimo$Sector))
## [1] "MANUFACTURA" "SERVICIOS"
## [3] "CONSTRUCCIÓN" "COMERCIO"
## [5] "MINERÍA E HIDROCARBUROS" "AGRO Y PESCA"
## [7] "ELECTRICIDAD, GAS Y AGUA"
Siempre es bueno revisar esta parte, para corregir algun nuevo nombre mal colocado.
En la encuesta hay dos tipos de preguntas: cualitativas y cuantitativas.
Las preguntas cuantitativas se procesan obteniendo el promedio de las columnas.
La preguntas cualitativas se procesan utlizando — la cual resta el numero de respuestas pesimistas de las optimistas, para dividirla entre el total de respuestas, multiplicarla por 2 y restarle 50. El numero resultante es un indicador que va de 0 a 100, en donde el 0 significa pesimismo abosluto, 50 significa ningun cambio, y 100 es optimismo absoluto (El respecto a que periodo depende de la pregunta en la encuesta),
Para el procesamiento, creó una función, la cual más tarde va a aplicarse a cada columna seleccionada:
funcion = function(x) (((sum(x=="Mayor o Mejor" |x=="Mayor o mejor" | x=="mayor o mejor" | x=="mayor"| x=="Mayor" | x=="mayor a lo esperado" | x=="Mayor a lo esperado" | x=="mejor" | x=="buena" | x=="muy buena" | x=="muy Buena" | x=="Muy buena" | x=="Muy Buena"| x=="buena / mayor a lo esperado" | x=="1",na.rm = TRUE) -
sum(x=="Menor o Peor" | x=="Menor o peor" |x=="menor o peor" | x=="Menor"| x=="menor" | x=="Menor a lo esperado"| x=="menor a lo esperado" | x=="peor" | x=="mala" | x=="mala / menor a lo esperado" | x=="3",na.rm = TRUE))/
sum(!is.na(x) & x !="" & x !="no Aplica" & x !="No Aplica" & x !="No aplica" & x !="no aplica" & x!="2",na.rm = TRUE))+1)*50
Aplico a cada columna:
temp = ultimo %>%
select(-c(year:Encuesta)) %>% #elimino cosas innecesarias
group_by(Fecha) %>% #Agrupo por fecha
summarize_if(is.character,funcion) #aplico función a columnas cualitativas
print(temp)
## # A tibble: 1 x 33
## Fecha Dda3Prox Empl3Prox Inv3Emp Eco3Prox Sec3Prox Emp3prox OG DdaAñoProx
## <yea> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Ago.~ 46.5 43.5 37.4 36.2 40.6 45 42.1 63.0
## # ... with 24 more variables: EmplAñoProx <dbl>, InvAñoEmp <dbl>,
## # EcoAñoProx <dbl>, SecAñoProx <dbl>, EmpAñoprox <dbl>, OH <dbl>,
## # Produc <dbl>, Ventas <dbl>, OrdCompra <dbl>, InvMaterPrim <dbl>,
## # Rapidez <dbl>, Inventario <dbl>, NivelEmpleo <dbl>, Produc3prox <dbl>,
## # Ventas3prox <dbl>, OrdCompra3prox <dbl>, InvMaterPrim3prox <dbl>,
## # Rapidez3prox <dbl>, Inventario3prox <dbl>, NivelEmpleo3prox <dbl>,
## # SitActNeg <dbl>, NivDda <dbl>, PreVtaTresFor <dbl>, PreInsTresFor <dbl>
El procesamiento de datos puede hacerse por sector económico, o considerando el total de empresas. Para realizarlo por sector económico, se realizar los mismo procedimientos solo que se realiza agrupando la base de datos respecto a la variable Sector.
temp3 = ultimo %>%
group_by(Fecha,Sector) %>% #Agrupo por sector
select(-c(year:Encuesta)) %>% #elimino cosas innecesarias
summarize_if(is.character,funcion) #aplico función a columnas cualitativas
## Adding missing grouping variables: `Sector`
print(temp3)
## # A tibble: 7 x 34
## # Groups: Fecha [1]
## Fecha Sector Dda3Prox Empl3Prox Inv3Emp Eco3Prox Sec3Prox Emp3prox OG
## <yea> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Ago.~ AGRO ~ 80 80 60 40 70 70 50
## 2 Ago.~ COMER~ 53.0 47.0 43.9 43.9 47.0 53.0 46.9
## 3 Ago.~ CONST~ 39.3 33.3 25 32.1 35.7 35.7 32.1
## 4 Ago.~ ELECT~ 25 50 50 50 50 50 50
## 5 Ago.~ MANUF~ 48.3 42.2 36.2 36.2 37.1 41.4 42.2
## 6 Ago.~ MINER~ 55. 45 45 45 55. 65 40
## 7 Ago.~ SERVI~ 33.3 40.8 32.4 27.6 34.2 38.2 40.5
## # ... with 25 more variables: DdaAñoProx <dbl>, EmplAñoProx <dbl>,
## # InvAñoEmp <dbl>, EcoAñoProx <dbl>, SecAñoProx <dbl>, EmpAñoprox <dbl>,
## # OH <dbl>, Produc <dbl>, Ventas <dbl>, OrdCompra <dbl>, InvMaterPrim <dbl>,
## # Rapidez <dbl>, Inventario <dbl>, NivelEmpleo <dbl>, Produc3prox <dbl>,
## # Ventas3prox <dbl>, OrdCompra3prox <dbl>, InvMaterPrim3prox <dbl>,
## # Rapidez3prox <dbl>, Inventario3prox <dbl>, NivelEmpleo3prox <dbl>,
## # SitActNeg <dbl>, NivDda <dbl>, PreVtaTresFor <dbl>, PreInsTresFor <dbl>
temp2 = ultimo %>%
mutate(CapInstal = ifelse(Sector != "MANUFACTURA",NA,CapInstal)) %>% #Cap. Instalada
mutate(nivel_inv_m_lag = ifelse(Sector != "MANUFACTURA",NA,nivel_inv_m_lag)) %>% #Inv. mes pasado
mutate(nivel_inv_m = ifelse(Sector != "MANUFACTURA",NA,nivel_inv_m)) %>% #Inv. este mes
mutate(NivelDeseado_pt = ifelse(Sector != "MANUFACTURA",NA,NivelDeseado_pt)) %>% #Inv. deseado
select(Fecha,CapInstal:NivelDeseado_pt) %>% #Elijo cuantitativas
mutate(inv_nd = nivel_inv_m - NivelDeseado_pt) %>% #Creo Inv. Deseado
mutate(inv_nd = ifelse(inv_nd >= 800,NA,inv_nd)) %>% #Filtro anomalías
group_by(Fecha) %>%
summarize_if(is.double,mean,na.rm=TRUE) #Procesa cuantitativas
print(temp2)
## # A tibble: 1 x 6
## Fecha CapInstal nivel_inv_m_lag nivel_inv_m NivelDeseado_pt inv_nd
## <yearmon> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Ago. 2020 60.4 83.3 78.7 58.6 20.5
Finalmente, agrupo el procesamiento de preguntas cuantitativas y cualitativas:
ultimo = full_join(temp,temp2,by="Fecha")
print(ultimo)
## # A tibble: 1 x 38
## Fecha Dda3Prox Empl3Prox Inv3Emp Eco3Prox Sec3Prox Emp3prox OG DdaAñoProx
## <yea> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Ago.~ 46.5 43.5 37.4 36.2 40.6 45 42.1 63.0
## # ... with 29 more variables: EmplAñoProx <dbl>, InvAñoEmp <dbl>,
## # EcoAñoProx <dbl>, SecAñoProx <dbl>, EmpAñoprox <dbl>, OH <dbl>,
## # Produc <dbl>, Ventas <dbl>, OrdCompra <dbl>, InvMaterPrim <dbl>,
## # Rapidez <dbl>, Inventario <dbl>, NivelEmpleo <dbl>, Produc3prox <dbl>,
## # Ventas3prox <dbl>, OrdCompra3prox <dbl>, InvMaterPrim3prox <dbl>,
## # Rapidez3prox <dbl>, Inventario3prox <dbl>, NivelEmpleo3prox <dbl>,
## # SitActNeg <dbl>, NivDda <dbl>, PreVtaTresFor <dbl>, PreInsTresFor <dbl>,
## # CapInstal <dbl>, nivel_inv_m_lag <dbl>, nivel_inv_m <dbl>,
## # NivelDeseado_pt <dbl>, inv_nd <dbl>
Al procesar el resultado del mes, lo siguiente es unir los valores a la base de datos histórica y a continuación presentar los resultados a travéz de gráficos y tablas.