Inicio / Laboratorio de Políticas / Pensamiento investigativo
Introducción · Programación para ciencias sociales

Pensar como investigador, escribir como programador.

Programar no es un requisito técnico que se le añadió a la ciencia política, al periodismo o a las humanidades. Es escribir el razonamiento en un lugar donde otro pueda discutirlo. Esta página es la introducción: qué gana una pregunta cuando el procedimiento se escribe, qué cambia de verdad con la inteligencia artificial y cómo hacer el primer proyecto en una tarde.

Lectura · 15 minutos Sin requisitos previos Ejemplos en Python
00

El malentendido

Casi nadie deja de programar por las matemáticas. Se deja de programar por una frase que se dijo a los diecisiete años y nunca se revisó: «yo soy de letras».

Hay dos cosas distintas que se llaman igual. Una es la ingeniería de software: construir productos que no se caigan, con miles de usuarios, pruebas, servidores y gente de guardia. Esa es una profesión y toma años.

La otra es la notación de un procedimiento: escribir, paso por paso y sin ambigüedad, lo que usted quiere que se haga con unos datos. Eso no es una profesión. Es una forma de escribir, y usted ya la practica.

Cuando un historiador fija los criterios para incluir un documento en su corpus, cuando una socióloga define el libro de códigos con el que va a clasificar cuarenta entrevistas, cuando un periodista decide qué cuenta como «contrato sospechoso» antes de mirar la base —los tres escribieron un algoritmo. En prosa, con notas al pie y advertencias, pero un algoritmo: una regla que otra persona podría seguir y llegar a lo mismo.

Si usted puede explicarle a un auxiliar cómo contar algo, ya escribió el programa. Lo que falta es la notación.

Lo que sigue no es un curso de programación —para eso hay cursos, y buenos—. Es el mapa de por qué vale la pena, escrito desde el lugar donde de verdad se nota: cuando hay que sostener un hallazgo delante de alguien que quiere tumbarlo.

01

Lo que cambia cuando el procedimiento se escribe

Cuatro cosas, y ninguna de ellas es «ahorrar tiempo». El tiempo, al principio, se pierde.

Primero

Obliga a definir

La prosa tolera «los partidos de derecha». El código no: exige una lista. Y al pedir la lista aparece la pregunta que la prosa escondía —¿dónde va una coalición?, ¿dónde va un movimiento regional que no dice nada en su nombre?—.

Segundo

Se puede repetir

Un resultado que no se puede volver a correr es una anécdota con notas al pie. Si el dato se actualiza el martes, el procedimiento escrito se vuelve a ejecutar; el de la hoja de cálculo hay que rehacerlo de memoria.

Tercero

Escala sin cambiar de método

Treinta casos o treinta mil: el mismo script. Eso cambia qué preguntas se atreve uno a hacer. Muchas preguntas buenas no se hacían porque contar a mano era imposible, no porque no importaran.

Cuarto

Deja rastro del error

Cuando se equivoque —y se va a equivocar— va a poder señalar la línea. En un análisis hecho a mano el error no tiene domicilio: se descubre al final, contradiciendo todo, sin saber dónde entró.

Vale la pena detenerse en el primero, que es el que menos se menciona y el que más pesa. Clasificar los partidos colombianos por familia ideológica parece trivial hasta que hay que hacerlo: el Centro Democrático es fácil, el Pacto Histórico es fácil, pero «CAMBIO RADICAL - MIRA» es una coalición y «Córdoba Florece» no dice absolutamente nada sobre su ideología. Mientras el análisis está en prosa, esos casos se resuelven con un «y otros movimientos». Cuando hay que escribir la regla, ese «y otros» resulta ser casi la cuarta parte de los votos, y un cuarto en gris no es un matiz: es no haber leído.

El código no creó ese problema. Lo hizo visible y obligó a tomar una decisión —resolver las coaliciones por sus partes, medir los movimientos regionales por el rastro de sus candidatos en otras elecciones, y dejar declarado lo que no alcanza el corte—. Esa decisión ahora está escrita, se puede citar y se puede discutir.

El punto que casi siempre se pierde

Escribir el procedimiento no lo vuelve a usted más acertado. Lo vuelve más específico. Y ser específico es exactamente lo que le permite a otra persona demostrarle que se equivocó. Ese es el valor: no la certeza, sino la posibilidad de ser refutado.

02

El ciclo, que no es una línea

Los manuales lo dibujan como una flecha. En la práctica se devuelve tres veces, y la mayoría de esas devoluciones ocurren porque el dato le contestó algo que no esperaba.

Ciclo de la investigación: pregunta, dato, procedimiento, evidencia y relato, con dos retornos aquí se va el 70 % del tiempo Pregunta Dato Procedimiento Evidencia Relato ¿qué quiero saber? ¿quién lo registró? ¿con qué regla? ¿qué salió? ¿a quién le sirve? el dato no dice lo que usted creía la respuesta cambia la pregunta
Enmarcadas, las dos etapas que el lector ve: la pregunta y el relato. Las flechas punteadas son las que nadie cuenta en la metodología y todas las investigaciones tienen.

Dos advertencias que los cursos omiten y que conviene oír antes de empezar:

03

Tres oficios, el mismo método

Cambia la fuente y cambia la pregunta. El procedimiento —definir, contar, comparar, declarar lo que quedó por fuera— es el mismo en los tres.

Pregunta
¿Los concejales que se cambian de partido pierden votos en la siguiente elección?
Dato
Resultados por candidato de dos elecciones consecutivas, publicados por la autoridad electoral.
La trampa
Para saber si «la misma persona» sacó menos votos hay que identificar a la misma persona en dos archivos distintos. Y hay tres «María Fernanda Gómez Rodríguez» en el mismo departamento.
Evidencia
Una distribución de la variación de votos, con los casos ambiguos separados y contados, no escondidos.
python · pandas
# La decisión está en la línea 4, no en el gráfico del final:
# qué significa "la misma persona". Todo lo demás se hereda de ahí.
import pandas as pd

def llave(nombre, cedula, departamento):
    """Si hay cédula, manda la cédula. Si no, el nombre normalizado
    dentro del departamento —y eso deja homónimos que hay que contar."""
    if pd.notna(cedula):
        return f"C:{cedula}"
    return f"N:{departamento}:{normalizar(nombre)}"

a = pd.read_csv("concejo_2019.csv")
b = pd.read_csv("concejo_2023.csv")
for d in (a, b):
    d["llave"] = d.apply(lambda r: llave(r.nombre, r.cedula, r.dep), axis=1)

# Antes de cruzar: ¿cuántas llaves están repetidas? Eso son homónimos
# o personas que se lanzaron dos veces. Si no lo mira, el cruce miente.
sospechosos = a[a.llave.duplicated(keep=False)]
print(f"revisar a mano: {len(sospechosos)} de {len(a)}")

panel = a.merge(b, on="llave", suffixes=("_19", "_23"))
panel["cambio"] = panel.votos_23 / panel.votos_19 - 1
panel["se_movio"] = panel.partido_19 != panel.partido_23

print(panel.groupby("se_movio").cambio.median())

Fíjese dónde está el argumento del artículo: no en groupby, que es una línea que cualquiera copia, sino en la definición de llave y en el conteo de sospechosos. Ahí es donde un evaluador va a pegar, y con razón.

Pregunta
¿A quién le contrata este municipio, y cuánto se concentra en pocas manos?
Dato
La base abierta de contratación pública. Un CSV grande, sucio y aburrido, que es donde suelen estar las historias.
La trampa
El mismo proveedor aparece como «CONSTRUCTORA ANDINA SAS», «Constructora Andina S.A.S.» y «CONST. ANDINA». Si agrupa por nombre, la concentración desaparece. Hay que agrupar por identificación tributaria.
Evidencia
El porcentaje del presupuesto que se llevan los cinco primeros. Si son tres de cada cuatro pesos, ahí hay nota —y todavía falta preguntar por qué—.
python · pandas
import pandas as pd

c = pd.read_csv("contratos.csv")
c = c[c.municipio == "TUNJA"]

# Agrupar por NIT, nunca por razón social: el nombre se escribe
# de seis formas y cada forma parece un proveedor distinto.
porProveedor = (c.groupby("nit")
                 .agg(valor=("valor", "sum"),
                      contratos=("valor", "size"),
                      nombre=("proveedor", "first"))
                 .sort_values("valor", ascending=False))

top5 = porProveedor.head(5).valor.sum() / porProveedor.valor.sum()
print(f"los 5 primeros se llevan el {top5:.1%} del total")

# Y el control que salva de publicar un error: ¿cuánta plata
# se quedó sin NIT? Si es mucha, el porcentaje de arriba no vale.
sinNit = c[c.nit.isna()].valor.sum() / c.valor.sum()
print(f"sin identificar: {sinNit:.1%}")

Ese último bloque es la diferencia entre una nota y una rectificación. El dato que falta no es cero: si el 30 % de los contratos no tiene identificación del proveedor, la concentración que usted calculó es sobre el 70 % restante, y el titular tiene que decirlo.

Pregunta
¿En qué momento la prensa colombiana dejó de decir «la violencia» y empezó a decir «el conflicto armado»?
Dato
Un corpus de prensa digitalizada. Puede ser un archivo institucional, o mil PDF que usted mismo convirtió a texto.
La trampa
Si un año hay diez mil notas y otro hay mil, contar apariciones absolutas mide el tamaño del archivo, no el cambio de lenguaje. Hay que normalizar por volumen.
Evidencia
Dos curvas que se cruzan. La fecha del cruce no es un adorno: es una afirmación histórica, fechada y discutible.
python
import re, collections, pandas as pd

TERMINOS = {
    "violencia": r"\bla violencia\b",
    "conflicto": r"\bconflicto armado\b",
}

filas = []
for nota in corpus:                      # cada nota: {año, texto}
    t = nota["texto"].lower()
    fila = {"anio": nota["anio"], "palabras": len(t.split())}
    for k, patron in TERMINOS.items():
        fila[k] = len(re.findall(patron, t))
    filas.append(fila)

d = pd.DataFrame(filas).groupby("anio").sum()

# Frecuencia por cada 100.000 palabras: así 1985 y 2005 son comparables
# aunque el archivo de un año sea diez veces más grande que el del otro.
for k in TERMINOS:
    d[k + "_norm"] = d[k] / d.palabras * 100_000

d[["violencia_norm", "conflicto_norm"]].plot()

Nadie está diciendo que contar palabras reemplace leer. El conteo dice dónde mirar: le entrega tres años en los que algo pasó, y entonces usted va y lee esas notas con el oficio de siempre. La computadora hace el rastreo; la interpretación no se delega.

04

Cinco piezas y ya puede trabajar

El 90 % de la investigación social con datos se hace con esto. No hace falta más para empezar, y casi nunca hace falta más para terminar.

el primer programa útil de su vida
import pandas as pd

d = pd.read_csv("mis_datos.csv")

print(len(d), "filas")      # ¿cuántas entraron?
print(d.columns.tolist())    # ¿qué trae?
print(d.isna().sum())        # ¿qué falta, y dónde?
print(d.head())              # ¿esto se parece a lo que creo que es?

Esas cuatro líneas no producen ningún hallazgo y son, de lejos, las más importantes de la página. La mayoría de los errores publicados se habrían evitado con la tercera.

05

La IA, sin misticismo

Lo importante no es que escriba código. Es que borró el peaje que mantenía a los humanistas afuera.

Hasta hace poco, entre «quiero contar cuántos concejales cambiaron de partido» y «sé escribir eso» había un semestre de sintaxis: comillas, indentación, mensajes de error en inglés que no decían nada. Ese peaje no enseñaba a investigar; solo filtraba por paciencia y por tiempo libre. Hoy esa distancia es una frase bien hecha.

Eso es genuinamente grande, y conviene decir por qué: cambia qué preguntas se hacen. Cuando probar una idea costaba tres días, uno solo probaba las ideas de las que ya estaba bastante seguro. Cuando cuesta diez minutos, uno prueba las dudas —y las dudas son mejores preguntas que las certezas—.

Ahora, lo que no cambió: la pregunta sigue siendo suya, los datos siguen siendo suyos y la verificación sigue siendo suya. La IA es un asistente rapidísimo y sin criterio propio sobre su tema.

Lo que hace bien

  • Traducir una intención a código. «Agrúpame por municipio y sácame la mediana» sale correcto casi siempre.
  • Explicar un error. Pegue el mensaje completo y pregunte qué significa. Es el mejor uso y el más subestimado.
  • Proponer un camino. «Quiero comparar estos dos corpus, ¿qué enfoques hay?» — le da el mapa, usted escoge.
  • El 80 % aburrido. Normalizar nombres, convertir fechas, leer treinta archivos de una carpeta.
  • Documentar y criticar. «Léete este código y dime qué supuestos está haciendo sin decirlo.»

Lo que hace mal

  • Inventa con total seguridad. Cifras, citas, artículos de ley, nombres de columnas que no existen. No le avisa: se lo dice con el mismo tono que lo cierto.
  • Le da la razón. Está entrenada para ser útil y eso la vuelve complaciente. Es la peor propiedad posible en alguien que debería revisarle el trabajo.
  • No sabe si sus datos están mal. Procesa con perfecta obediencia una columna con la coma en el lugar equivocado.
  • No conoce su caso. No sabe que en Colombia hay dos sistemas de códigos de municipio y que mezclarlos le daña el mapa.
  • Prefiere responder a decir «no sé». Ante una pregunta sin respuesta disponible, produce una plausible.

La IA puede escribir el código. La verificación no se delega —y la firma del artículo es suya, no de la máquina—.

La regla práctica es simple: úsela para el cómo, nunca para el qué. «¿Cómo agrupo esta tabla por año?» es una pregunta excelente. «¿Cuántos concejales cambiaron de partido en 2023?» es una pregunta pésima —para eso están los datos, y si la IA le contesta con una cifra, esa cifra es sospechosa hasta que usted la reproduzca—.

Una distinción que evita disgustos

Aprender con IA no es lo mismo que depender de ella. Si cada vez que copia un bloque lo lee y lo entiende antes de correrlo, está aprendiendo rápido. Si lo pega sin leerlo, está construyendo algo que no puede defender —y en investigación, lo que no puede defender no lo puede publicar—.

06

Los errores que cuestan

No son errores de programación. Son errores de razonamiento que el código ejecuta con obediencia perfecta y a gran velocidad.

Identidad

El homónimo

Dos personas con el mismo nombre se vuelven una sola, o una persona que firma de dos maneras se vuelve dos. Todo análisis de trayectorias descansa sobre esto y casi nadie lo declara.

Escala

La falacia ecológica

Un barrio votó 60 % por un candidato y tiene 60 % de mujeres. De ahí no se sigue que las mujeres votaron por él. El agregado no le dice qué hizo el individuo.

Aritmética

El denominador ausente

«Creció 300 %» puede ser de uno a cuatro. Toda cifra relativa necesita su base al lado, y toda comparación entre territorios necesita per cápita.

Inferencia

La correlación disfrazada

Dos series que suben juntas normalmente suben por una tercera cosa. El código correlaciona cualquier par de columnas sin preguntarle si tiene sentido.

Vacíos

El dato que falta no es cero

Un municipio que no reportó homicidios no tuvo cero homicidios: no reportó. Convertir vacíos en ceros inventa hallazgos donde solo hay silencio administrativo.

Autoría

La abdicación

«Lo dijo el modelo» no es un argumento. Un método es responsabilidad de quien lo firma, y la herramienta —hoja de cálculo, script o IA— nunca es coautora.

07

Un primer proyecto, esta tarde

No empiece por aprender Python. Empiece por una pregunta que le importe y déjese arrastrar por ella: se aprende el triple y no se abandona en la semana dos.

Sobre el punto 06

El párrafo de lo que no puede afirmar parece una debilidad y es lo contrario. Declarar el límite es lo que vuelve creíble lo que sí afirmó: le dice al lector que usted miró los bordes de su propio trabajo antes que él.

Programar no lo va a volver más inteligente, ni más riguroso por decreto, ni le va a dar la razón. Lo va a volver discutible: alguien va a poder tomar su procedimiento, correrlo de nuevo y decirle exactamente en qué línea se equivocó. Eso es más difícil, es más incómodo y es, casi siempre, lo único que separa una opinión bien escrita de un hallazgo.

Seguir en el laboratorio

Ricardo Ruiz · Laboratorio de Políticas
¿Le sirvió, le falta algo o está en desacuerdo? Escríbame.