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.
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.
Lo que cambia cuando el procedimiento se escribe
Cuatro cosas, y ninguna de ellas es «ahorrar tiempo». El tiempo, al principio, se pierde.
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?—.
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.
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.
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.
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.
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.
Dos advertencias que los cursos omiten y que conviene oír antes de empezar:
- Limpiar los datos es el trabajo. Nombres escritos de seis maneras, fechas en tres formatos, tildes que aparecen y desaparecen, celdas combinadas en un Excel oficial. No es un preámbulo del análisis: es el análisis, y ahí es donde se toman las decisiones que después el resultado hereda.
- El relato no es el adorno del final. Un hallazgo que nadie entiende no existe. La gráfica, el título y los tres párrafos que la acompañan son parte del método, no un empaque que se le pone encima.
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.
# 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é—.
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.
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.
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.
- Un cuaderno. Google Colab corre en el navegador, no se instala nada y guarda solo. Escriba una celda, apriete play, vea el resultado debajo. Ese ciclo de dos segundos es lo que hace que se aprenda.
- Una tabla.
pandases Excel sin mouse: filas, columnas, filtros. Si entiende una tabla dinámica, ya entiende el 70 % de pandas. - Filtrar y agrupar. «Quédese solo con estos» y «cuénteme por grupo». Con esas dos operaciones se responden más preguntas de las que parece.
- Una gráfica. Una línea de código para verla usted; una herramienta de publicación para que la vea el lector. No son la misma gráfica y confundirlas cuesta lectores.
- Un texto. Qué preguntó, qué hizo, qué encontró, qué no puede afirmar. Los cuatro, siempre. El cuarto es el que da credibilidad.
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.
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—.
- Cuente antes y después. Entraron 12.400 filas, salieron 11.980. ¿Dónde se fueron las 420? Un cruce que pierde datos en silencio es el error más común y el más caro.
- Verifique tres casos a mano. Escoja tres filas del resultado y compruébelas contra la fuente original. Tres. Toma diez minutos y ha salvado carreras.
- Pida la contra. «¿Qué tendría que ser cierto para que este resultado estuviera mal?» Es la pregunta que rompe la complacencia, y funciona igual con la IA que con usted mismo.
- Abra toda fuente citada. Si le dio un artículo, un fallo o una cifra oficial, ábralo. Si no existe, acaba de aprender algo importante sobre la conversación entera.
- Guarde el prompt junto al código. Lo que le pidió es parte del método. Dentro de seis meses, cuando alguien pregunte por qué el umbral quedó en 5 %, el prompt es la respuesta.
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—.
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.
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.
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.
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.
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.
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.
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.
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.
- Escoja una pregunta pequeña y suya. De su municipio, de su tesis, de su fuente. «¿Cuánto se gastó mi alcaldía en publicidad el año pasado?» sirve perfectamente. Que sea pequeña es una virtud, no una limitación.
- Consiga el archivo. Datos abiertos, el portal de la entidad, un derecho de petición. Si le llega en PDF, también sirve —y ya aprendió que a veces el dato existe pero no está disponible, que es un hallazgo en sí mismo—.
- Ábralo y descríbalo. Las cuatro líneas de la sección 04. Cuántas filas, qué columnas, qué falta. Todavía no analice nada.
- Haga una sola cuenta. Una suma, un promedio, un conteo por grupo. Una. Si le dio un número raro, celébrelo: acaba de encontrar o un error suyo o una historia.
- Verifique tres casos a mano. Sí, otra vez. Es el paso que la gente se salta y el que separa el trabajo publicable del resto.
- Escriba tres párrafos y una gráfica. Qué preguntó, qué hizo, qué encontró —y un cuarto párrafo corto con lo que no puede afirmar—. Eso ya es investigación con datos. El resto es más de lo mismo, con más práctica.
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.