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.

Descarga de datos

Se descargan, los resultados desde la plataforma web de la encuesta, en un excel:

Figura 1

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

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

Figura 1

Limpieza de datos

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  -  -  -  -  -
Estoy mostrando solo algunas de las columnas y filas, de manera que no se llene el espacio en la págin web, utilizando las funciones head() y select().
  • Se eliminan las preguntas que no han sido incluidas este mes, al eliminar todas las columnas que no tienen ningun valor.
  • Las primeras 57 columnas son de las preguntas que se repiten mensualmente. Columnas adicionales pueden ser de preguntas especiales que se añaden ocasionalmente a la encuesta.
  • Se eliminan columnas que no añaden ninguna información al procesamiento final como es el nombre, cargo, encuesta, etc.
    -Se verifica que las columnas sean del mismo tipo que el contenido que contienen, es decir, que las columnas con valores cuantitativos sean del tipo númerico (double).
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

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.

Procesamiento de datos

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),

El procesamiento cualitativo se realiza de la siguiente manera:

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>
Los demás procesamientos se realizan de la siguiente manera:
  • Filtro capacidad instalada y niveles de inventario, solo para manufactura.
  • Creo la variable de nivel de inventario no deseado, al restar el nivel de inventario deseado menos el actual.
  • Obtengo la media de las columnas con preguntas cuantitativas (valores numéricos).
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

Final

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>

Gráficos

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.