Data Science politica

Thelonious J.

Usuario Habitual nvl.3 ★
11 Nov 2018
1.870
1.035
112
46
Santiago
Hay algunos informáticos en el foro y algunas mentes curiosas. Que tal si en este tema usamos las bases de datos publicas para entender mejor la realidad socioeconomica del país y zanjar discusiones en base a evidencia?


EDIT: Se realizaron importantes modificaciones al post original.

En este primer post, partamos con algo simple, calculemos algunos estadísticos descriptivos de una base de datos de ingresos.


1)R es un paquete estadístico de código abierto, si no lo tienes, descargarlo e instalalo desde:
https://cloud.r-project.org/



2)Como ejemplo usemos la base de datos de la encuesta casen 2015
Descargamos el siguiente archivo y lo descomprimimos:
http://observatorio.ministeriodesar...tidimensional/casen/docs/casen_2015_stata.rar



3)Leer la base de datos
Ejecuamos R (el programa que instalaron en el primer paso), la interfaz grafica es una simple consola donde se ingresan comandos.
Para leer los datos importamos la librería "foreign":
Código:
library(foreign)
Luego obtenemos el path de la base de datos casen, el siguiente comando abre el selector de archivos:
Código:
file.choose()
Elegimos el archivo Casen 2015.dta que descomprimimos anteriormente y como resultado aparecerá el path completo del archivo en la consola de R.
Luego reemplazamos el "path" completo en el siguiente comando:
Código:
cas15 <- read.dta("path")
Si funciona, los datos de la casen están en la variable cas15 listos para ser consultados



4)Estudiar la estructura de la base de datos
El siguiente comando lista las columnas de la casen, son 776 columnas:
Código:
str(cas15, list.len=ncol(cas15))
La descripción de las columnas esta en el documento:
http://observatorio.ministeriodesar...al/casen/docs/Libro_de_Codigos_Casen_2015.pdf




5)Calculemos el ingreso de la actividad principal
La columna "yoprcor" representa el ingreso de la actividad principal. Sin embargo, para calcular totales regionales o a nivel de país debemos ponderarlo por el factor de expansión "expr". El factor de expansión indica a cuanta población representa cada observación de la encuesta, este factor hace la encuesta realmente representativa.

La media nacional, sin ponderar por factor de expansión, es 432071.2:
Código:
mean(cas15$yoprcor, na.rm=TRUE)

La media nacional ponderada por factor de expansión es 461916.1:
Código:
weighted.mean(cas15$yoprcor, cas15$expr, na.rm=True)

La diferencia es considerable. Por lo tanto, de aquí en adelante siempre usaremos el factor de expansión.

Ahora calculemos los deciles de ingreso:
Para esto debemos instalar la libreria "Hmisc" con el siguiente comando:
Código:
install.packages("Hmisc")

Las librerias se instalan una sola vez y quedan guardadas en el computador, pero cada vez que queramos usarlas debemos importarlas:
Código:
library("Hmisc")

Ahora podemos usar la funcion wtd.quantile() para calcular los deciles de ingresos:
Código:
wtd.quantile(cas15$yoprcor, p = seq(0, 1, length = 11), na.rm = FALSE, weight=cas15$expr)

El resultado es:
Código:
      0%      10%      20%      30%      40%      50%      60%      70%      80%      90%     100%
     500   125000   200000   241000   257194   300000   350000   450000   600000   879778 30000000

el p50 es la mediana: $300.000




como andamos con los cálculos de la fundación hoyo negro?
http://www.fundacionsol.cl/wp-content/uploads/2017/04/Salarios-al-Límite.pdf

Llegamos exactamente al mismo resultado en la mediana y el p70
En la media hay una pequeña diferencia $461.916 vs $461.951.







Script completo (reemplazar el path al archivo de la base de datos):

Código:
# Reemplazar el path a la base de datos Casen 2015.dta descomprimida (ojo, los backslash son dobles)
casen_path <- "C:\\Users\\thelonious\\Downloads\\casen_2015_stata\\Casen 2015.dta"

# Carga la libreria foreign (para importar los datos)
library(foreign)

# Instala libreria Hmisc si no esta instalada y la carga (para usar la funcion wtd.quantile())
if(!is.element("Hmisc", installed.packages()[,1]))
  install.packages("Hmisc")
library("Hmisc")

#Carga la base de datos en memoria
cas15 <- read.dta(casen_path)

# Lista las columnas de la base de datos
str(cas15, list.len=ncol(cas15))

# Calcula la media de ingresos de la actividad principal NO ponderada por factor de expansion
mean(cas15$yoprcor, na.rm=TRUE)

# Calcula la media de ingresos de la actividad principal ponderada por factor de expansion
weighted.mean(cas15$yoprcor, cas15$expr, na.rm=TRUE)

# Calcula los deciles de ingresos ponderados por factor de expansion
wtd.quantile(cas15$yoprcor, p = seq(0, 1, length = 11), na.rm = TRUE, weight=cas15$expr)
 
Última edición:
Continuando con el ejemplo anterior, calcularemos la media de ingresos filtrando por región y tipo de actividad.

Primero filtramos la base de datos "cas15" dejando solo las filas de la región de tarapaca y asignamos el resultado a la variable reg01. Luego calculamos la media sobre esta base de datos filtrada (resultado 544792.3):
Código:
reg01 <- cas15[cas15$region == "región de tarapacá",]
weighted.mean(reg01$yoprcor, reg01$expr, na.rm=TRUE)



Para filtrar por tipo de actividad es similar, la variable o15 contiene los cogidos de tipo de actividad.
Código:
#Empleador
emp <- cas15[cas15$o15 == "patrón o empleador",]
weighted.mean(emp$yoprcor, emp$expr, na.rm=TRUE)



Como vamos comparado con la Fundacion Hoyo Negro? Casi idénticos, aunque persisten algunas leves diferencias y seria interesan saber por que. De todas forma, todo indica que tenemos un instrumento solido para seguir explorando los datos.

Tarapaca
Nosotros: $544.792
Hoyo negro: $544.792

Antofagasta
Nosotros: $586.828
Hoyo negro: $586.828

Metropolitana
Nosotros: $533.533
Hoyo negro: $533.573


Empleador
Nosotros: $967.825
Hoyo negro: $967.965

Cuenta propia
Nosotros: $336.291
Hoyo negro: $336.290

Asalariado privado
Nosotros: $460.473
Hoyo negro:$460.527




Script completo (reemplazar el path a la base de datos):
Código:
# Reemplazar el path a la base de datos Casen 2015.dta descomprimida (ojo, los backslash son dobles)
casen_path <- "C:\\Users\\thelonious\\Downloads\\casen_2015_stata\\Casen 2015.dta"

# Carga la libreria foreign (para importar los datos)
library(foreign)

#Carga la base de datos en memoria
cas15 <- read.dta(casen_path)



# Calcula la media de ingresos por region:

#Tarapaca
reg01 <- cas15[cas15$region == "región de tarapacá",]
weighted.mean(reg01$yoprcor, reg01$expr, na.rm=TRUE)

#Antofagasta
reg02 <- cas15[cas15$region == "región de antofagasta",]
weighted.mean(reg02$yoprcor, reg02$expr, na.rm=TRUE)

#Metropolitana
regRM <- cas15[cas15$region == "región metropolitana de santiago",]
weighted.mean(regRM$yoprcor, regRM$expr, na.rm=TRUE)



# Calcula la media de ingresos para tipo de actividad:

#Empleador
emp <- cas15[cas15$o15 == "patrón o empleador",]
weighted.mean(emp$yoprcor, emp$expr, na.rm=TRUE)

#Cuenta propia
cp <- cas15[cas15$o15 == "trabajador por cuenta propia",]
weighted.mean(cp$yoprcor, cp$expr, na.rm=TRUE)

#Asalariado privado
ap <- cas15[cas15$o15 == "empleado u obrero del sector privado",]
weighted.mean(ap$yoprcor, ap$expr, na.rm=TRUE)
 
Última edición:
Tiempo atrás hubo una controversia acerca de las diferencias de sueldos entre los trabajadores del sector publico y privado.
Algunos foristas argumentaron que los sueldos públicos solo eran mas altos en los cargos directivos y eso aumentaba el promedio, pero no eran mas altos en puestos de menos calificación. Veamos que evidencia aporta la encuesta CASEN.


Calculemos la media y los deciles de ingresos de los trabajadores asalariados públicos. En la Casen, la categoría de trabajadores públicos esta dividida en dos tipos: empleado de empresa publicas y empleado del sector publico.
Código:
apub <- cas15[!is.na(cas15$o15) & (cas15$o15 == "empleado u obrero de empresas públicas" | cas15$o15 == "empleado u obrero del sector público (gobierno central o municipal)"),]
mean_pub <- weighted.mean(apub$yoprcor, apub$expr, na.rm=TRUE)
quan_pub <- wtd.quantile(apub$yoprcor, p = seq(0, 1, length = 11), na.rm = TRUE, weight=apub$expr)


De la misma forma calculamos la media y deciles de los asalariados del sector privado.
Código:
apriv <- cas15[!is.na(cas15$o15) & cas15$o15 == "empleado u obrero del sector privado",]
mean_priv <- weighted.mean(apriv$yoprcor, apriv$expr, na.rm=TRUE)
quan_priv <- wtd.quantile(apriv$yoprcor, p = seq(0, 1, length = 11), na.rm = TRUE, weight=apriv$expr)


Resultados

Los trabajadores públicos ganan 35% mas en promedio que los privados
Media públicos: $622.722
Media privados: $460.473


Los trabajadores públicos ganan mas en todos los deciles de ingresos excepto en el mas alto. Lo que invalida el argumento esgrimido anteriormente. Si debo notar que la diferencia es un poco menor en los deciles mas bajos, aunque ya en torno al sueldo mínimo los publicos ganan un 20% mas y en la mediana ganan un 50% mas, lo cual es consistente con los datos de la encuesta ESI.

Código:
Asalariados públicos:
      p0      p10      p20      p30      p40      p50      p60      p70      p80      p90     p100
    8000   215143   250000   300000   370000   450000   520000   650000   850000  1200000 12500000

Asalariados privados:
      p0      p10      p20      p30      p40      p50      p60      p70      p80      p90     p100
    1197   200000   240000   250000   280000   300000   353166   443684   550000   800000 26000000

Comparación
      p0      p10      p20      p30      p40      p50      p60      p70      p80      p90     p100
    568%       8%       4%      20%      32%      50%      47%      47%      55%      50%     -52%



Los datos de la encuesta Casen arrojan evidencia contundente de que los empleados publico ganan mas que los privados en todo los niveles de ingresos excepto en el decil mas alto. En sueldos mayores que el mínimo el sobrepago esta entre 20% y 50%, lo cual constituye un importante desvió de recursos públicos que son capturados por ese grupo de interés.





Script completo (reemplazar el path a la base de datos):
Código:
# Reemplazar el path a la base de datos Casen 2015.dta descomprimida (ojo, los backslash son dobles)
casen_path <- "C:\\Users\\thelonious\\Downloads\\casen_2015_stata\\Casen 2015.dta"

# Carga la libreria foreign (para importar los datos)
library(foreign)

# Instala la libreria Hmisc si no esta instalada y la carga (para usar la funcion wtd.quantile())
if(!is.element("Hmisc", installed.packages()[,1]))
  install.packages("Hmisc")
library("Hmisc")

#Carga la base de datos en memoria
cas15 <- read.dta(casen_path)


#Calculamos la media y los deciles de ingresos de los trabajadores asalariados publicos
#En la Casen la categoria de trabajadores publicos esta devidida en dos tipos
apub <- cas15[!is.na(cas15$o15) & (cas15$o15 == "empleado u obrero de empresas públicas" | cas15$o15 == "empleado u obrero del sector público (gobierno central o municipal)"),]
mean_pub <- weighted.mean(apub$yoprcor, apub$expr, na.rm=TRUE)
quan_pub <- wtd.quantile(apub$yoprcor, p = seq(0, 1, length = 11), na.rm = TRUE, weight=apub$expr)


#Calculemos la media y los deciles de ingresos de los trabajadores asalariados privados
apriv <- cas15[!is.na(cas15$o15) & cas15$o15 == "empleado u obrero del sector privado",]
mean_priv <- weighted.mean(apriv$yoprcor, apriv$expr, na.rm=TRUE)
quan_priv <- wtd.quantile(apriv$yoprcor, p = seq(0, 1, length = 11), na.rm = TRUE, weight=apriv$expr)


#Comparacion de los valores
mean_comp <- mean_pub / mean_priv - 1
mean_comp <- sprintf("%.0f%%", 100 * mean_comp)
quan_comp <- (quan_pub / quan_priv) - 1
quan_comp <- sprintf("  %.0f%%", 100 * quan_comp)
encabezdos <- c("p0","p10","p20","p30","p40","p50","p60","p70","p80","p90","p100")
names(quan_pub) = names(quan_priv) = names(quan_comp) = encabezdos



#La media es 35% mas alta en el sector publico
mean_pub
mean_priv
mean_comp


#El sector publico paga mas en todos los deciles excepto en el de mayor ingresos.
#En torno al sueldo minimo el sector publico paga 20% mas. En la mediana paga un 50% mas, lo cual es consistente con la encuesta ESI.
quan_pub
quan_priv
quan_comp
 
Última edición: