Data Science politica

Tema en 'Rincón Informático' iniciado por Thelonious J., 8 Dic 2018.

  1. Thelonious J.

    Thelonious J. Usuario Habitual nvl.3 ★
    112/163

    Registrado:
    11 Nov 2018
    Mensajes:
    1.961
    Me Gusta recibidos:
    1.092
    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":
    Insertar CODE, HTML o PHP:
    library(foreign)
    Luego obtenemos el path de la base de datos casen, el siguiente comando abre el selector de archivos:
    Insertar CODE, HTML o PHP:
    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:
    Insertar CODE, HTML o PHP:
    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:
    Insertar CODE, HTML o PHP:
    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:
    Insertar CODE, HTML o PHP:
    mean(cas15$yoprcor, na.rm=TRUE)
    La media nacional ponderada por factor de expansión es 461916.1:
    Insertar CODE, HTML o PHP:
    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:
    Insertar CODE, HTML o PHP:
    install.packages("Hmisc")
    Las librerias se instalan una sola vez y quedan guardadas en el computador, pero cada vez que queramos usarlas debemos importarlas:
    Insertar CODE, HTML o PHP:
    library("Hmisc")
    Ahora podemos usar la funcion wtd.quantile() para calcular los deciles de ingresos:
    Insertar CODE, HTML o PHP:
    wtd.quantile(cas15$yoprcor, p = seq(0, 1, length = 11), na.rm = FALSE, weight=cas15$expr)
    
    El resultado es:
    Insertar CODE, HTML o PHP:
          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):

    Insertar CODE, HTML o PHP:
    # 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)
     
    #1 Thelonious J., 8 Dic 2018
    Última edición: 9 Dic 2018
    A dx2words, DaniSpecial y fearman22 les gusta esto.
  2. Thelonious J.

    Thelonious J. Usuario Habitual nvl.3 ★
    112/163

    Registrado:
    11 Nov 2018
    Mensajes:
    1.961
    Me Gusta recibidos:
    1.092
    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):
    Insertar CODE, HTML o PHP:
    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.
    Insertar CODE, HTML o PHP:
    #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):
    Insertar CODE, HTML o PHP:
    
    # 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)
    
     
    #2 Thelonious J., 9 Dic 2018
    Última edición: 9 Dic 2018
  3. Thelonious J.

    Thelonious J. Usuario Habitual nvl.3 ★
    112/163

    Registrado:
    11 Nov 2018
    Mensajes:
    1.961
    Me Gusta recibidos:
    1.092
  4. Thelonious J.

    Thelonious J. Usuario Habitual nvl.3 ★
    112/163

    Registrado:
    11 Nov 2018
    Mensajes:
    1.961
    Me Gusta recibidos:
    1.092
    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.
    Insertar CODE, HTML o PHP:
    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.
    Insertar CODE, HTML o PHP:
    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.

    Insertar CODE, HTML o PHP:
    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):
    Insertar CODE, HTML o PHP:
    
    # 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
    
    
     
    #4 Thelonious J., 9 Dic 2018
    Última edición: 9 Dic 2018