Herramientas de la Ciencia de Datos
para la Investigación Social Reproducible


Modelo de Integración


Este curso plantea apoyarte brindando diversas herramientas de la ciencia de datos a utilizar durante el proceso de investigación. Cada herramienta tiene una función determinada, sin embargo, a lo largo del taller, veremos cómo podemos integrarlas de una manera sencilla.

Para ello, les planteamos que podríamos abstraer el proceso de investigación según lo describe la Figura 1.

Los elementos de la Figura 1 se dividen en dos grupos. En la parte superior figuran los grandes componentes:

No he puesto una secuencia entre estos componentes, pues es evidente que hay una serie de idas y venidas entre estos. En todo caso no es mi intención discutir el orden de éstos, sino más bien ver qué herramientas podemos utilizar para automatizar las diversas tareas relacionadas con cada una de ellas. Nótese que a cada componente se le ha asignado un color, y ese mismo color tienen las tareas ahí explicitadas; sin embargo, el hecho de no asignarle tareas al componente de definición de problema de investigación es por que este curso considera que ya sabes qué problema de investigación tienes.

Así, he designado como automatizables diversas tareas. Y esto lo he decidido pues detrás de cada una hay alguna herramienta computacional que nos puede apoyar:

Como también se muestra en la Figura 1, estas tareas están interrelacionadas, no se hacen de manera secuencial. Podríamos pensar en diversas relaciones entre ellas, siendo la más compleja la que hay entre el documento final y todas las demás.

Considera además que tantas idas y venidas durante el proceso de investigación nos acercan a cometer diversos errores de fondo y forma, que podrían ser controlados si hacemos uso de herramientas computacionales creadas para ayudar en diversas tareas, asi veremos:

Instala todo esto en tu máquina, veremos cada una de ellas en este curso, sobre todo R, y además aprenderemos como hacerlas interactuar.


Intro a R


Comandos básicos en R para exploración Univariada:

# carga de datos
filename="indexes.csv"
dataidx=read.csv(filename, 
                 stringsAsFactors = T)

# ver primeras filas los datos:
head(dataidx)

Los datos ya llegaron ‘limpios’ desde Python.

Aquí podemos ver la distribución de una variable:

demoTable=table(dataidx$Democracy)
demoTable

Ahora las frecuencias relativas:

demoTableRel=round(prop.table(demoTable)*100,1)
demoTableRel

Y aquí el plot que representa esta distribución:

title='Distribución de la Democracia'
paleta='red'
barplot(demoTableRel,main=title,
        col=paleta,ylim = c(0,100),
        ylab = "%")

Los mismo hacemos para ver la Libertad económica en el mundo en una tabla:

ecoTable=table(dataidx$EconomicFreedom)
ecoTable

Sus frecuencias relativas:

ecoTableRel=round(prop.table(ecoTable)*100,1)
ecoTableRel

Y aquí el plot:

title='Distribución de la Libertad Económica'
paleta='red'
barplot(ecoTableRel,main=title,
        col=paleta,ylim = c(0,100),
        ylab = "%")

La Libertad general en el mundo en una tabla:

worldTable=table(dataidx$WorldFreedom)
worldTable

Ahora las frecuencias relativas:

worldTableRel=round(prop.table(worldTable)*100,1)
worldTableRel

Y aquí el plot:

title='Distribución de la Libertad en el Mundo'
paleta='red'
barplot(worldTableRel,main=title,
        col=paleta,ylim = c(0,100),
        ylab = "%")

La Libertad de prensa en el mundo en una tabla:

pressTable=table(dataidx$PressFreedom)
pressTable

Sus frecuencias relativas:

pressTableRel=round(prop.table(pressTable)*100,1)
pressTableRel

Y aquí el plot que representa esta distribución:

title='Distribución de la Libertad de Prensa'
paleta='red'
barplot(pressTableRel,main=title,
        col=paleta,ylim = c(0,100),
        ylab = "%")

Podemos mostrar los estadísticos de cada variable:

summary(dataidx[,-1])

Comandos básicos en R para exploración Bivariada y modelamiento:

Si asumimos que estamos interesados en el impacto de los otros indices en el GDP, podemos primero ver la relación que tiene esta variable con todas las demás:

explanans=names(dataidx)[c(3:6)]
corrDem=cor(x=dataidx[,2],
            y=dataidx[,explanans],
            use = "na.or.complete",
            method = "spearman")
corrDem

Veamos la correlación entre las variables independientes:

corrTable=round(cor(dataidx[explanans],
               use = "na.or.complete"),2)

# ocultar media matriz
corrTable[upper.tri(corrTable)]<-""
as.data.frame(corrTable)

Finalmente, vemos los modelos propuestos. Primero sin la libertad mundial como independiente:

LinRegA = lm(gdp ~ ., data = dataidx[,c(2:5)])
summary(LinRegA)

Luego con la libertad mundial

LinRegB = lm(gdp ~ ., data = dataidx[,c(2:6)])
summary(LinRegB)

Otros plots importantes

Podemos pintar un mapa con la información que tenemos. Veamos primero el mapa:

library(rgdal)
folder='world_map'
file='world_map.shp'
mapaFile=file.path(folder,file)
mapaMundo = rgdal::readOGR(mapaFile,stringsAsFactors=F) 
plot(mapaMundo)

Para pintarlo, podemos crear conglomerados. Tenemos para ello que juntar añadir la información de los índices al mapa (no al revés). Veamos cuales son las claves:

head(mapaMundo@data)

Usamos el campo respectivo para juntar los datos:

# añadiendo información de indices al mapa:
mapaMundoAll=merge(mapaMundo,
                   dataidx, 
                   by.x='NAME', 
                   by.y='Country',all.x=F)

De ahí hagamos varios pasos:

# nombres de las variables a utilizar
dimensions=names(dataidx)[c(3:6)]
#creando subconjunto
dataCluster=mapaMundoAll@data[,c(dimensions)]
# indicando que la data numerica es ordinal:
dataCluster=as.data.frame(lapply(dataCluster,as.ordered))
# llamando librería:
library(cluster)

# creando matriz de distancias
dist=daisy(dataCluster,metric = "gower")

# aplicando algoritmo
pam_fit <- pam(dist, diss = TRUE, k = 3)

# añadiendo los clusters al mapa:
mapaMundoAll$cluster=pam_fit$clustering

Ya tenemos los clusters, pero hay que recordar que los números asignados no son necesariamente ‘reveladores’:

aggregate(IndexofEconomicFreedom~cluster, 
          data=mapaMundoAll, 
          FUN=mean,
          na.rm=T)

Luego, debemos recodificar la columna cluster:

library(car)
mapaMundoAll$cluster<-recode(mapaMundoAll$cluster,
                             "2=3;3=2")

Con los clusters calculados, podemos pintar el mundo:

# que se pintara:
varToPlot=mapaMundoAll$cluster

#cuantos colores:
numberOfColors = length(unique(varToPlot)) 

#qué colores:
library(RColorBrewer)
colorForScale='Set2'
paleta = brewer.pal(numberOfColors, colorForScale)

# a dibujar:
plot(mapaMundo,col='grey',border=0)
plot(mapaMundoAll, col = paleta[varToPlot],border=F,add=T)
legend('left', legend = c("TOP","MEDIUM","LOW"), 
       fill = paleta,
       cex = 0.6, 
       bty = "n",
       title="Conglomerado")

AUSPICIO:

El desarrollo de estos contenidos ha sido posible gracias al grant del Berkeley Initiative for Transparency in the Social Sciences (BITSS) at the Center for Effective Global Action (CEGA) at the University of California, Berkeley

RECONOCIMIENTO

EL Dr. Magallanes agradece a la Pontificia Universidad Católica del Perú, por su apoyo en la elaboración de este trabajo.

El autor reconoce el apoyo que el eScience Institute de la Universidad de Washington le ha brindado desde el 2015 para desarrollar su investigación en Ciencia de Datos.