Data & policies & politics

El Instituto Nacional de Estadística de Bolivia  ha publicado las bases de datos de la encuesta de violencia contra las mujeres 2016. Sin embargo, están mal. ¿Por qué?

Por dos razones:

1. El formato es privativo. Para acceder a las bases, se requiere comprar el programa SPSS de IBM que cuesta 99 dólares americanos por mes. Un procesador de datos común como Excel, aunque también privativo pero ampliamente usado, no puede abrir los archivos con extensión ".sav"; archivos privativos para SPSS.

2. Puede extraerse la información a través de otros programas que requieren mayores conocimientos de programación. Es decir, no se puede acceder a las bases inmediatamente.

Descargue las bases de datos en formato libre

A a través del programa R, sin costo,  convertí las bases a formatos accesibles. Puede descargar las bases en los formatos que desee a continuación:

Si desea trabajar en las bases en fomato "csv" aquí encuentra un tutorial de cómo abrirlas desde Excel.

Una vez que descargue la carpeta y la descomprima, encontrará 10 archivos:

Note que el nombre de 5 de ellos inician con la palabra explicación. Estos archivos explican las variables, subvariables y valores de las bases de datos. Por ejemplo, el archivo "separadas.csv" es la base de datos y el archivo "explicacion.separadas.csv" da cuenta de la misma. Las 5 bases de datos corresponden a los 5 archivos que publicó el INE.

¿Cómo trabajar con las bases de datos corregidas?

Si abre la base "separadas.csv" como ejemplo , encuesta a mujeres que se han separado de sus parejas,  encontrará esto:

Es claro que no se entiende porque  los nombres de las columnas y sus valores están codificados. Las bases con la palabra "explicacion", detallan que significan estos códigos. Abriendo el archivo "explicacion.separadas.csv" encontrará esto:

  • La columna "A" o código lista el nombre de las columnas en la base de datos
  • La columna "B" o  variable lista el significado de cada una de las columnas en las base de datos
  • La columna "C" o sub_variable lista los valores posibles que puede tener cada columna en la base de datos
  • La columna "D" o valor lista el número que se le asignó a la sub_variable en la base de datos
  • La columna "E" recuerda de qué base de datos se trata.

En las bases de datos están únicamente las columnas "A" y "D". Sin embargo, con el archivo de "explicacion" puede entenderse de que se trata.

Comprobación: graficar algo con las bases liberadas

Como tengo la base a mi disposición puedo presentar la información de mi interés en la forma y con las herramientas gráficas que decida. Véase los siguientes ejemplos:

ampliar ampliar

Compruebe que las bases del INE están mal liberadas

  • Dirígase a la página web del INE: www.ine.gob.bo
  • Una vez allí haga click en el botón que encierro en color rojo
  • Ahora, haga click sobre el botón con recuadro rojo
  • Ahora seleccione la "Encuesta de Prevalencia y características de la violencia contra las Mujeres 2016"
  • Su navegador descargará una carpeta comprimida parecida a esta:
  • Cuando abra su archivo comprimido, le aparecerán estos archivos:

El director del INE, Santiago Farjat,  ha dicho lo siguiente respecto a esta publicación:

Método

Todo lo anterior se hizo en R. No puedo ponerlo en GitHub porque pesa demasiado. Para reproducir el trabajo ver:

# información de sesión
R version 3.4.2 (2017-09-28)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS High Sierra 10.13.5

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] highcharter_0.5.0  bindrcpp_0.2       magrittr_1.5       foreign_0.8-70     rio_0.5.5         
 [6] dplyr_0.7.4        purrr_0.2.4        readr_1.1.1        tidyr_0.7.2        tibble_1.4.2      
[11] ggplot2_3.0.0.9000 tidyverse_1.1.1

library(tidyverse)
library(purrr)
library(foreign)
library(magrittr)
library(highcharter)
Sys.setlocale(locale = "es_ES.UTF-8")

# importar
bases <- list.files(recursive = T, pattern = ".sav")

# usar la librería foreing para importar en objeto de tipo lista
datos <- map(bases, function(x) foreign::read.spss(x, to.data.frame = FALSE, use.value.labels = FALSE))

# extraer la lista como base de datos
df <- map(datos, as.data.frame)

# extracción de nombres de variables
variables <- map(datos, function(x) attr(x, "variable.labels"))  %>%
  map(., as.data.frame) %>%
  map(., rownames_to_column)

for(i in 1:length(variables)) {
  variables[[i]] %<>% dplyr::rename(
    codigo = rowname,
    variable = ".x[[i]]"
  )
}
rm(i)

# extración de valores de variables
valores_variables <- map(datos, function(x) attr(x, "label.table"))

vars <- list()

for(ii in 1:length(valores_variables)) {
  dataf <- data.frame()
  cat("trabajando en base; ", ii, "\n")
  for(i in 1:length(valores_variables[[ii]])) {
    cat("trabajando en base; ", i, "\n")
    if(valores_variables[[ii]][[i]] %>% is.null) {
      next()
    }
    names <- valores_variables[[ii]][i] %>% names %>% as.data.frame() %>% rename(codigo = ".")
    names1 <- valores_variables[[ii]][[i]] %>% as.data.frame() %>% rownames_to_column()
    temp1 <- cbind(names, names1)
    dataf <- rbind(dataf, temp1)
    vars[[ii]] <- dataf
  }
}
rm(ii, i, vars, names, names1, temp1, dataf)

final <- list()
for(i in 1:5) {
  final[[i]] <- merge(variables[[i]], vars[[i]], all.x = T)
  final[[i]]  %<>% rename(
    sub_variable = rowname,
    valor = "."  
  )
}
rm(i)

final[[2]]$variable %<>% as.character()
temp <- final[[2]]$codigo == "depto"
final[[2]][temp, "variable"] <- "Departamento"
rm(temp)

# añadir columna con el tipo de base
bases
tipo <- c("casadas", "persona", "separadas", "solteras", "vivienda")
for(i in 1:length(final)) {
  final[[i]]  %<>% mutate(
    encuesta = tipo[i])
  df[[i]] %<>% mutate(
    encuesta = tipo[i])
}

# exportar
dir.create("csv")
dir.create("xlsx")

for(i in 1:length(final)) {
  readr::write_csv(df[[i]], paste0("csv/", tipo[i], ".csv"))
  readr::write_csv(final[[i]], paste0("csv/", "explicacion.", tipo[i], ".csv"))
  rio::export(df[[i]], paste0("xlsx/", tipo[i], ".xlsx"))
  rio::export(final[[i]], paste0("xlsx/", "explicacion.", tipo[i], ".xlsx"))
}

# gráficos
a <- df[[1]] %>%
  select(S1_01_1, depto) %>%
  group_by(S1_01_1) %>%
  count(depto) %>%
  spread(S1_01_1, n) %>%
  mutate(
    total = `1` + `2` + `3` + `4`,
    no = `4` / total * 100,
    si = 100 - no,
    no.ocurrio = `4` / total * 100,
    una.vez = `3` / total * 100,
    pocas.veces = `2` / total * 100,
    muchas.veces = `1` / total * 100
    ) %>%
  arrange(desc(si))

a$depto %<>% as.character()
a$depto %<>% gsub("1", "Chuquisaca", .)
a$depto %<>% gsub("2", "La Paz", .)
a$depto %<>% gsub("3", "Cochabamba", .)
a$depto %<>% gsub("4", "Oruro", .)
a$depto %<>% gsub("5", "Potosí", .)
a$depto %<>% gsub("6", "Tarija", .)
a$depto %<>% gsub("7", "Santa Cruz", .)
a$depto %<>% gsub("8", "Beni", .)
a$depto %<>% gsub("9", "Pando", .)

# gráfico 1
muestra <- highchart() %>%
  hc_chart(type = "area") %>%
  hc_title(text = "¿A lo largo de su vida, en algún lugar público algún(os) hombre(s)
           conocido(s) o desconocido(s), sin considerar a su (ex) pareja/ (ex) novio,
           la han humillado o menospreciado (la han hecho sentir menos)") %>%
  hc_subtitle(text = "Mujeres casadas de 15 años de edad o más") %>%
  hc_xAxis(categories = a$depto,
           tickmarkPlacement = "on",
           title = list(enabled = FALSE)) %>%
  hc_yAxis(max = 100) %>%
  hc_tooltip(pointFormat = "<span style=\"color:{series.color}\">{series.name}</span>:
             <b>{point.percentage:.1f}%</b><br/>",
             shared = TRUE) %>%
  hc_plotOptions(area = list(
    stacking = "normal",
    lineColor = "#ffffff",
    lineWidth = 1,
    marker = list(
      lineWidth = 0.3,
      lineColor = "#ffffff"
    ))
  ) %>%
  hc_add_series(name = "NO", data = a$no) %>%
  hc_add_series(name = "SI", data = a$si)  %>%
  hc_credits(enable = T, text = "rafalopezv") %>%
  hc_add_theme(hc_theme_smpl())
htmlwidgets::saveWidget(muestra, "muestra.html")

# gráfico 2
muestra.2 <- highchart() %>%
  hc_chart(type = "area") %>%
  hc_title(text = "¿A lo largo de su vida, en algún lugar público algún(os) hombre(s)
           conocido(s) o desconocido(s), sin considerar a su (ex) pareja/ (ex) novio,
           la han humillado o menospreciado (la han hecho sentir menos)") %>%
  hc_subtitle(text = "Mujeres casadas de 15 años de edad o más") %>%
  hc_xAxis(categories = a$depto,
           tickmarkPlacement = "on",
           title = list(enabled = FALSE)) %>%
  hc_yAxis(max = 100) %>%
  hc_tooltip(pointFormat = "<span style=\"color:{series.color}\">{series.name}</span>:
             <b>{point.percentage:.1f}%</b><br/>",
             shared = TRUE) %>%
  hc_plotOptions(area = list(
    stacking = "normal",
    lineColor = "#ffffff",
    lineWidth = 1,
    marker = list(
      lineWidth = 0.3,
      lineColor = "#ffffff"
    ))
  ) %>%
  hc_add_series(name = "No ocurrió", data = a$no.ocurrio) %>%
  hc_add_series(name = "Una vez", data = a$una.vez) %>%
  hc_add_series(name = "Pocas veces", data = a$pocas.veces) %>%
  hc_add_series(name = "Muchas veces", data = a$muchas.veces)  %>%
  hc_credits(enable = T, text = "rafalopezv") %>%
  hc_add_theme(hc_theme_smpl())
htmlwidgets::saveWidget(muestra.2, "muestra.2.html")