rm(list=ls())
setwd("/home/daniel/Dropbox/Papers-ponencias/Segregacion2020-isaforum/Analisis")
library(readr)
library(DBI)
library(RSQLite)
library(dplyr)
library(dbplyr)
Para calcular el Índice de disimilitud de Duncan (IDC) se emplearon los microdatos del Censo 2017, nivel personas.
Para hacer posible analizar una base de datos masiva, en un computador modesto y con el software R, se aplicó el código publicado por Julián Cabezas.
El primer paso es conocer la estructura de los microdatos personas Censo 2017.
delim_file <- "/home/daniel/Dropbox/Papers-ponencias/Segregacion2020-isaforum/Microdato_Censo2017-Personas/censo.csv"
readLines(delim_file, n=2)
## [1] "REGION;PROVINCIA;COMUNA;DC;AREA;ZC_LOC;ID_ZONA_LOC;NVIV;NHOGAR;PERSONAN;P07;P08;P09;P10;P10COMUNA;P10PAIS;P11;P11COMUNA;P11PAIS;P12;P12COMUNA;P12PAIS;P12A_LLEGADA;P12A_TRAMO;P13;P14;P15;P15A;P16;P16A;P16A_OTRO;P17;P18;P19;P20;P21M;P21A;P10PAIS_GRUPO;P11PAIS_GRUPO;P12PAIS_GRUPO;ESCOLARIDAD;P16A_GRUPO;REGION_15R;PROVINCIA_15R;COMUNA_15R;P10COMUNA_15R;P11COMUNA_15R;P12COMUNA_15R"
## [2] "15;152;15202;1;2;6;13225;1;1;1;1;1;73;1;98;998;3;15101;998;1;98;998;9998;98;2;4;6;2;1;2;98;7;98;98;98;98;9998;998;998;998;4;2;15;152;15202;98;15101;98"
total_records <- system2("wc", args = c("-l", delim_file), stdout = TRUE) %>%
sub(normalizePath(delim_file), "", .) %>%
as.integer() %>%
{
. - 1
}
total_records
## [1] 17574003
Se concluye que:
table_name_censo <- "censo2017"
sqlite_file_censo <- "censo2017.sqlite3"
read_delim2sqlite <- function(delim_file, delim, sqlite_file, table_name, batch_size = 10000, OS = "Unix") {
## establish a connection to the database
condb <- dbConnect(SQLite(), sqlite_file)
## get the total number of records in the file
# in Unix
if (OS == "Unix") {
total_records <- system2("wc", args = c("-l", delim_file), stdout = TRUE) %>%
sub(normalizePath(delim_file), "", .) %>%
as.integer() %>%
{
. - 1
}
} else {
# In windows
total_records <- system2("powershell", args = c("Get-content", delim_file, "|", "Measure-Object", "–Line"), stdout = TRUE)
total_records <- as.numeric(gsub("[^0-9]", "", paste(total_records, collapse = ""))) - 1
}
message("Total records: ", total_records)
## find the number of passes needed based on size of each batch
passes <- total_records %/% batch_size
remaining <- total_records %% batch_size
message("Total Passes to complete: ", passes)
## first pass determines header and column types
dat <- read_delim(delim_file, delim, n_max = batch_size, progress = FALSE) %>% as.data.frame()
if (nrow(problems(dat)) > 0) print(problems(dat))
col_names <- colnames(dat)
col_types <- c(character = "c", numeric = "d", integer = "i", logical = "l", Date = "c") %>%
.[sapply(dat, class)] %>%
paste0(collapse = "")
## write to database table
dbWriteTable(condb, table_name, dat, overwrite = TRUE)
## multiple passes
for (p in 2:passes) {
message("Pass number: ", p, ", Progress:", round(p / passes, 2) * 100, "%")
read_delim(delim_file, delim,
col_names = col_names, col_types = col_types,
skip = (p - 1) * batch_size + 1, n_max = batch_size, progress = FALSE
) %>%
as.data.frame() %>%
dbWriteTable(condb, table_name, ., append = TRUE)
}
if (remaining) {
read_delim(delim_file, delim,
col_names = col_names, col_types = col_types,
skip = p * batch_size + 1, n_max = remaining, progress = FALSE
) %>%
as.data.frame() %>%
dbWriteTable(condb, table_name, ., append = TRUE)
}
## close the database connection
dbDisconnect(condb)
}
Luego, se carga la base de datos en formato sqlite3 para hacerla manejable.
read_delim2sqlite(delim_file, delim=";", sqlite_file = sqlite_file_censo,
table_name = table_name_censo, batch_size=500000)
con <- dbConnect(SQLite(), sqlite_file_censo)
con
## <SQLiteConnection>
## Path: /home/daniel/Dropbox/Papers-ponencias/Segregacion2020-isaforum/Analisis/censo2017.sqlite3
## Extensions: TRUE
dbListTables(con)
## [1] "censo2017"
datos_db <- tbl(con, "censo2017")
datos_db
## # Source: table<censo2017> [?? x 48]
## # Database: sqlite 3.34.1
## # [/home/daniel/Dropbox/Papers-ponencias/Segregacion2020-isaforum/Analisis/censo2017.sqlite3]
## REGION PROVINCIA COMUNA DC AREA ZC_LOC ID_ZONA_LOC NVIV NHOGAR PERSONAN
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 15 152 15202 1 2 6 13225 1 1 1
## 2 15 152 15202 1 2 6 13225 3 1 1
## 3 15 152 15202 1 2 6 13225 3 1 2
## 4 15 152 15202 1 2 6 13225 3 1 3
## 5 15 152 15202 1 2 6 13225 3 1 4
## 6 15 152 15202 1 2 6 13225 9 1 1
## 7 15 152 15202 1 2 6 13225 9 1 2
## 8 15 152 15202 1 2 6 13225 9 1 3
## 9 15 152 15202 1 2 6 13225 9 1 4
## 10 15 152 15202 1 2 6 13225 10 1 1
## # … with more rows, and 38 more variables: P07 <dbl>, P08 <dbl>, P09 <dbl>,
## # P10 <dbl>, P10COMUNA <dbl>, P10PAIS <dbl>, P11 <dbl>, P11COMUNA <dbl>,
## # P11PAIS <dbl>, P12 <dbl>, P12COMUNA <dbl>, P12PAIS <dbl>,
## # P12A_LLEGADA <dbl>, P12A_TRAMO <dbl>, P13 <dbl>, P14 <dbl>, P15 <dbl>,
## # P15A <dbl>, P16 <dbl>, P16A <dbl>, P16A_OTRO <dbl>, P17 <dbl>, P18 <chr>,
## # P19 <dbl>, P20 <dbl>, P21M <dbl>, P21A <dbl>, P10PAIS_GRUPO <dbl>,
## # P11PAIS_GRUPO <dbl>, P12PAIS_GRUPO <dbl>, ESCOLARIDAD <dbl>,
## # P16A_GRUPO <dbl>, REGION_15R <dbl>, PROVINCIA_15R <dbl>, COMUNA_15R <dbl>,
## # P10COMUNA_15R <dbl>, P11COMUNA_15R <dbl>, P12COMUNA_15R <dbl>
Primero, se calculó la cantidad de jefes de hogar, que viven en zonas urbanas, a nivel comunal.
jefes_comuna <- datos_db %>%
filter(P07==1 & AREA ==1) %>%
group_by(COMUNA_15R) %>%
tally()
jefes_comuna <- collect(jefes_comuna)
jefes_comuna <- as.data.frame(jefes_comuna)
Luego, se calculó la cantidad de jefes de hogar, que viven en zonas urbanas, con menos de 12 años de escolaridad a nivel comunal.
jefes_comuna_esc11 <- datos_db %>%
filter(P07==1 & AREA ==1 & ESCOLARIDAD < 12) %>%
group_by(COMUNA_15R) %>%
tally()
jefes_comuna_esc11 <- collect(jefes_comuna_esc11)
jefes_comuna_esc11 <- as.data.frame(jefes_comuna_esc11)
En tercer lugar, se calculó la cantidad de jefes de hogar urbanos por zona censal.
jefes_zc <- datos_db %>%
filter(P07==1 & AREA ==1) %>%
group_by(COMUNA_15R, DC, ZC_LOC) %>%
tally()
jefes_zc <- collect(jefes_zc)
jefes_zc <- as.data.frame(jefes_zc)
Finalmente, la cantidad de jefes de hogar urbanos, con menos de 12 años de escolaridad, por zona censal.
jefes_zc_esc11 <- datos_db %>%
filter(P07==1 & AREA ==1 & ESCOLARIDAD < 12) %>%
group_by(COMUNA_15R, DC, ZC_LOC) %>%
tally()
jefes_zc_esc11 <- collect(jefes_zc_esc11)
jefes_zc_esc11 <- as.data.frame(jefes_zc_esc11)
Empleando la siguiente fórmula se calculó el IDC:
\[\frac{1}{2}*\sum^n_{i=1}\left|\frac{X_i}{X}-\frac{Y_i}{Y}\right|\]
Donde:
-\(X_i\) corresponde a la cantidad de jefes de hogar con menos de 12 años de escolaridad en la zona censal i de la comuna;
-\(X\) es la cantidad de jefes de hogar con menos de 12 años de escolaridad en la comuna;
-\(Y_i\) corresponde a la cantidad de jefes de hogar con 12 años de escolaridad o más en la zona censal i de la comuna;
-\(Y\) es la cantidad de jefes de hogar con 12 años de escolaridad o más en la comuna.
indice <- full_join(jefes_zc, jefes_zc_esc11, by = c("COMUNA_15R", "DC", "ZC_LOC"))
indice <- indice %>%
group_by(COMUNA_15R) %>%
mutate(jefes_comuna = sum(n.x, na.rm = TRUE))
indice <- indice %>%
group_by(COMUNA_15R) %>%
mutate(jefes_comuna_esc11 = sum(n.y, na.rm = TRUE))
indice <- rename(indice, jefes_zc = n.x , jefes_zc_esc11 = n.y)
indice <- as.data.frame(indice)
indice$jefes_zc_esc12 <- indice$jefes_zc - indice$jefes_zc_esc11
indice$jefes_comuna_esc12 <- indice$jefes_comuna - indice$jefes_comuna_esc11
indice$DC[indice$DC==99] <- NA
indice$DC[indice$ZC_LOC==999] <- NA
indice<-na.omit(indice)
indice <- indice %>%
group_by(COMUNA_15R) %>%
mutate(IDC = round((1/2)*sum(abs((jefes_zc_esc11/jefes_comuna_esc11)-
((jefes_zc_esc12/jefes_comuna_esc12)))),
digits = 3))
indice <- indice %>%
group_by(COMUNA_15R) %>%
summarise(unique(IDC))
indice <- rename(indice, IDC = "unique(IDC)")