Calidad de los datos y descriptiva con propósito
Dpto. de Fundamentos del Análisis Económico. Universidad de Alicante
Importante
El ejercicio del tema se va haciendo durante estas clases, no después: está en Tema 04 - Ejercicios del tema, y son cuatro ejercicios que se corresponden con las tres PRÁCTICAS de estas transparencias más un cuarto con datos del INE. Cada vez que toque, aparecerá un aviso como este.
marketplace.RData, de la página Datos: un volcado del sistema de un marketplace, con los problemas de calidad que trae de verdadDel fichero recibido a la decisión informada, con dos objetivos:
Conocer los datos y su calidad: qué mide cada variable, qué falta, qué está mal, qué no es comparable
Describir con propósito: los patrones que responden a una pregunta económica concreta
No hay receta: depende de los datos Y del objetivo, y es iterativo.
Una decisión empresarial o de política se toma sobre un número: un margen, una tasa de paro, un ticket medio, una elasticidad
Ese número hereda todos los defectos de los datos que lo produjeron
Si el 30% de los clientes insatisfechos no contesta la encuesta, la satisfacción media no mide la satisfacción de los clientes
Si un vendedor declara su facturación en miles y otro en euros, la “empresa más grande” del ranking puede ser la más pequeña
La limpieza no es un trámite previo: cada decisión de limpieza es un supuesto sobre cómo se generaron los datos
Regla del tema: toda decisión se escribe, se justifica y se puede deshacer
Plataforma que conecta pequeños comercios con compradores en el Levante y Madrid
Dirección quiere responder a tres preguntas:
¿Cuánto gasta un cliente típico y en qué canal?
¿Qué vendedores son más productivos?
¿Crecemos o solo es la campaña de Navidad?
Tablas disponibles (simuladas)
pedidos_bruto: una fila por pedido, tal y como sale del sistema
vendedores: una fila por comercio, con datos de un formulario que rellenan ellos mismos
serie_ventas: ventas mensuales agregadas, 2023-2025
| variable | qué debería ser | qué llega |
|---|---|---|
fecha |
fecha | texto en DOS formatos distintos |
importe |
número (euros) | texto con coma decimal y punto de miles |
canal |
factor de 3 niveles | texto con mayúsculas y espacios |
cp_envio |
texto de 5 dígitos | número (ha perdido el cero inicial) |
valoracion |
1 a 10, o ausente | incluye el valor centinela -99 |
descuento |
0 a 1, o “sin promoción” | NA con DOS significados distintos |
Antes de tocar nada, cuatro preguntas siempre iguales:
Tamaño y unidad de observación: ¿cuántas filas y qué es una fila? ¿coincide con lo que esperábamos?
Tipos: ¿cada variable tiene el tipo que corresponde a lo que mide?
Rango y categorías: ¿los valores son posibles? ¿las categorías son las del diccionario?
Ausencias: ¿dónde falta información y por qué?
"1.234,56". Hay que decirle a R cuál es el separadorUna fecha en texto se ordena alfabéticamente: "04/03/2025" va antes que "12/01/2024"
El riesgo real es la ambigüedad: 03/04/2025 es 3 de abril en España y 4 de marzo en EE.UU.
group_by() del Tema 03 obedece al texto, no a la intenciónNA, es que había una categoría que no estaba en nuestra listaEl caso más caro y el más difícil de ver: cada fila está medida en una escala distinta
Los vendedores rellenan su facturación anual en un formulario libre: unos ponen euros y otros miles de euros
Hay dos tipos y no significan lo mismo
Filas idénticas: casi siempre un fallo de exportación o de carga
Clave repetida con contenido distinto: dos versiones del mismo hecho
-99 no declarado contamina toda la descriptiva: entra en la media, en la desviación típica y en el gráficoTambién existen informes completos automáticos (DataExplorer::create_report(), dlookr) y se pueden pedir a una IA generativa
Limitaciones: producen mucho ruido, no conocen el contexto y no distinguen un error de un dato extremo legítimo
Regla: la automatización acelera la detección; la decisión sigue siendo del analista, que es quien conoce el negocio
Trabajad con pedidos_bruto y vendedores. En 25 minutos, y sin corregir nada todavía, elaborad un informe de una página con:
Número de filas y comprobación de si id_pedido identifica de forma única cada pedido
Lista de variables cuyo tipo NO corresponde a lo que miden, con el problema concreto de cada una
Recuento de las categorías realmente presentes en canal y en provincia, señalando cuáles son la misma cosa
Número de ausentes por variable, distinguiendo los NA de los códigos centinela
Para CADA problema detectado, una frase: qué cifra del informe final quedaría mal si no lo corregimos
Nota
Ahora el ejercicio 1, los cinco apartados: es esta misma auditoría, apartado por apartado.
Tres mecanismos, con consecuencias muy distintas para el análisis
Ausencia completamente aleatoria: falta por azar (un fallo del servidor un martes). Trabajar con los casos completos reduce la muestra pero no sesga
Ausencia aleatoria condicionada: falta según variables que SÍ observamos (los pedidos por app registran menos el descuento). Corregible si condicionamos en esas variables
Ausencia no aleatoria: falta según el propio valor que no vemos. Aquí no hay arreglo estadístico limpio
El tercer caso es el habitual en economía:
En una encuesta de presupuestos familiares, quien tiene rentas muy altas responde menos: la renta media observada subestima la real
En nuestra encuesta post-compra, el cliente enfadado no contesta: la valoración media mide la satisfacción de los que contestan
Ventaja de trabajar con datos simulados: sabemos la verdad. La valoración media real es 7,5 y la observada entre quienes responden se acerca a 7,9. Ninguna limpieza corrige esa diferencia
Antes de decidir, distinguir el ausente estructural del ausente por falta de información
descuento = NA significa “este pedido no entró en promoción”: el valor correcto es 0, no “desconocido”Para los demás, tres opciones y lo que implica cada una:
Eliminar filas (drop_na()): válido si la ausencia es aleatoria. Si no, se elimina justo el tipo de cliente que interesa
Imputar (media, mediana, o un valor del grupo): mantiene el tamaño muestral pero inventa variación que no existe y reduce artificialmente la dispersión
Indicador de ausencia: crear una variable sin_valoracion y analizarla. No arregla el sesgo, pero lo hace visible
La detección no dice qué hacer. Hay que separar tres casos:
Error de registro: un importe 100 veces mayor por una coma mal puesta. Se corrige o se elimina, documentándolo
Observación real y relevante: un pedido mayorista de 4.000 euros. Es el cliente más valioso: eliminarlo destruye la información
Observación real pero de otra población: es un cliente B2B en una tabla pensada para minoristas. Se analiza aparte
El contraste con otras variables distingue el error del caso real: 4.729 euros con 3 unidades no es un cliente, es una coma mal puesta; 4.974 euros con 90 unidades es un mayorista
En economía, las colas son el fenómeno: unas pocas empresas concentran la mayor parte de las exportaciones o del empleo. Recortar la cola por comodidad estadística elimina el objeto de estudio
Alternativas menos destructivas: analizar en logaritmos, usar la mediana, o acotar (winsorizar) declarándolo
vendedores <- vendedores |>
mutate(
# regla: una facturación por empleado por debajo de 5.000 euros al año
# es imposible en este sector; esa fila estaba declarada en miles
fact_empleado = facturacion_anual / empleados,
facturacion_eur = if_else(fact_empleado < 5000,
facturacion_anual * 1000, facturacion_anual)
)
vendedores |> summarize(min = min(facturacion_eur / empleados),
max = max(facturacion_eur / empleados))El umbral es un supuesto: hay que escribirlo, y comprobar que ningún caso queda cerca del corte
Con los duplicados, la regla depende de la pregunta: si el conflicto es “con IVA” frente a “sin IVA”, quedarse con el menor no es limpiar, es elegir la definición del ingreso
pedidos_limpio <- pedidos_bruto |>
# 1. tipos
mutate(importe = parse_number(importe,
locale = locale(decimal_mark = ",", grouping_mark = ".")),
cp_envio = str_pad(as.character(cp_envio), 5, pad = "0"),
fecha = if_else(str_detect(fecha, "/"),
as.Date(fecha, format = "%d/%m/%Y"),
as.Date(fecha, format = "%Y-%m-%d"))) |>
# 2. categorías
mutate(canal = parse_factor(str_squish(str_to_lower(canal)),
levels = c("web", "app", "tienda"))) |>
# 3. ausentes: centinela y estructural
mutate(valoracion = na_if(valoracion, -99),
descuento = replace_na(descuento, 0)) |>
# 4. duplicados exactos
distinct()Sobre la auditoría de la práctica anterior, en 30 minutos:
Escribid un único bloque de limpieza que corrija tipos, categorías y ausentes centinela, y elimine los duplicados exactos
Comprobad el resultado: filas antes y después, tipos, recuento de canal y rango de fecha
Calculad los ingresos totales y el ticket medio antes y después de eliminar los duplicados exactos. ¿En cuántos euros y en qué porcentaje cambia la cifra que iría al informe?
Decidid qué hacer con los 8 pedidos de clave repetida y justificad la decisión en dos frases
Elegid un pedido atípico y argumentad si es error, cliente mayorista u otra población, usando unidades como apoyo
Nota
Ahora el ejercicio 2. Los apartados a) a e) son esta práctica; f) y g) van un paso más allá, con la columna que viene dada y con la identidad que tiene que cumplirse.
Un informe con veinte gráficos y ninguna conclusión es un informe fallido
El orden correcto es siempre el mismo:
pregunta económica → magnitud que la responde → estadístico o gráfico → lectura
Ejemplos con nuestro caso:
| Pregunta de dirección | Magnitud | Herramienta |
|---|---|---|
| ¿Cuánto gasta un cliente típico? | centro de una distribución asimétrica | mediana y cuartiles |
| ¿La app canibaliza la web o amplía el mercado? | gasto por cliente y solapamiento | tabla por canal y por cliente |
| ¿Qué vendedores son más productivos? | ventas por empleado | ratio + dispersión por sector |
| ¿Crecemos? | variación interanual | serie mensual y tasas |
La media responde a “cuánto factura la empresa por pedido”: es lo que hay que usar para presupuestar, porque media x n = total
La mediana responde a “cuánto gasta un cliente típico”: no la mueven unos pocos pedidos mayoristas
Con renta, salarios, ventas o tamaño de empresa, la media siempre está por encima de la mediana. El INE publica ambas por eso mismo
Un solo número nunca describe una distribución asimétrica: acompañadlo de cuartiles o de un gráfico
La visualización se vio en el Tema 02: aquí solo elegimos, según lo que se quiera mostrar.
Una distribución: histograma o densidad (forma, asimetría, acumulaciones raras)
Comparar distribuciones entre grupos: diagramas de caja o densidades superpuestas
Relación entre dos cantidades: dispersión (con logaritmos si hay asimetría)
Evolución en el tiempo: línea, nunca barras
Composición o reparto: barras apiladas al 100%
Y antes de cualquier comparación por grupos: cuántas observaciones hay en cada grupo. Una media sobre 7 pedidos no se compara con una sobre 700.
Importante
Hasta ahora geom_bar() contaba él solo las observaciones de cada categoría. Aquí no: la altura de cada barra ya la hemos calculado nosotros (con count()), así que hay que decirle que no vuelva a contar y dibuje el valor tal cual. Eso es geom_bar(stat = "identity"), y geom_col() es su atajo: exactamente lo mismo, escrito más corto.
:::
Un KPI es un número que resume el estado del negocio y sobre el que alguien decide
Para que sirva necesita cuatro cosas, y las cuatro se olvidan a menudo:
Definición escrita: ¿“cliente activo” es quien compró alguna vez, en el último año o en el último mes?
Denominador explícito: por pedido, por cliente, por empleado, por euro invertido
Frecuencia y periodo de comparación: mensual frente al mes anterior no es lo mismo que frente al mismo mes del año pasado
Responsable: quién puede actuar sobre él
| provincia | ventas 2024 | ventas 2025 | variación absoluta | variación % |
|---|---|---|---|---|
| Teruel | 4.000 | 10.000 | +6.000 | +150,0% |
| Alicante | 412.000 | 445.000 | +33.000 | +8,0% |
| Valencia | 380.000 | 399.000 | +19.000 | +5,0% |
| Madrid | 915.000 | 951.000 | +36.000 | +3,9% |
Teruel encabeza el crecimiento porcentual y aporta el 6% del aumento total. Madrid es el último en porcentaje y el primero en euros
Un porcentaje sobre una base pequeña es ruido: mostrad siempre el nivel al lado, y no calculéis tasas con denominadores minúsculos
La media de medias da a un vendedor con 3 pedidos el mismo peso que a otro con 90
Para agregar tasas hay que ponderar por el denominador, o mejor: sumar numeradores y denominadores
| categoría | canal | pedidos | devueltos | tasa |
|---|---|---|---|---|
| Electrónica | web | 200 | 20 | 10,0% |
| Electrónica | app | 800 | 96 | 12,0% |
| Textil | web | 800 | 240 | 30,0% |
| Textil | app | 200 | 64 | 32,0% |
| TOTAL | web | 1.000 | 260 | 26,0% |
| TOTAL | app | 1.000 | 160 | 16,0% |
La app devuelve más en cada categoría (12 frente a 10, y 32 frente a 30), pero menos en el total (16 frente a 26)
No hay ningún error de cálculo: es la paradoja de Simpson
La causa es la composición: la app vende sobre todo electrónica (poco devuelta) y la web sobre todo textil (muy devuelta). El total mezcla el efecto del canal con el efecto del producto
Qué hacer:
Comparar dentro de grupos homogéneos, no en el agregado
Si hace falta un número único, ponderar todos los canales con la misma composición de producto
Preguntarse siempre qué variable puede estar detrás del reparto
Esto no es una curiosidad estadística: es el problema central del análisis con datos observacionales
El salario medio subió durante la crisis de 2008-2013 en varios países mientras casi nadie tenía subidas: los empleos destruidos fueron los de menor salario, y eso elevó la media de los que quedaron
Una comparación de rentabilidad entre sectores sin controlar el tamaño de las empresas mide tamaño, no sector
El Tema 05 formaliza esto: comparar “todo lo demás igual” es lo que hace una regresión
Una variación no significa nada sin saber respecto a qué
Efecto base: crecer un 20% en 2021 tras caer un 22% en 2020 no es un récord, es recuperar parte de lo perdido
Elección del periodo: casi cualquier tendencia se puede fabricar eligiendo el punto de partida
Ausencia de contrafactual: las ventas suben un 15% tras una campaña, pero también subieron un 14% en los comercios sin campaña
Ese 65% no mide crecimiento: mide la distancia entre el mes más flojo y la campaña de Navidad
Antes de atribuir un cambio a una causa, comprobad: ¿qué habría pasado sin la intervención? ¿hay un grupo de comparación?
Y una regla práctica para informes: mostrar la serie completa, no dos puntos elegidos
Tres formas correctas de mirar una serie estacional:
Variación interanual: mismo mes del año anterior (lo más simple y lo más habitual)
Media móvil de 12 meses: elimina el patrón y deja la tendencia
Serie desestacionalizada: la publican las fuentes oficiales (INE, Eurostat) ya calculada
Y no comparéis nunca una tasa mensual con una interanual en el mismo cuadro sin decirlo
Dirección pide cinco indicadores para la reunión mensual. En 30 minutos, sobre pedidos_limpio y serie_ventas:
Elegid los cinco KPI y escribid la definición exacta de cada uno (numerador, denominador, periodo)
Calculadlos con summarize() y presentadlos en una tabla
Para el gasto por cliente, decidid si dais media o mediana y justificadlo con la forma de la distribución
Añadid la variación interanual de ventas del último mes, no la mensual, y explicad en una frase por qué
Escribid al pie del cuadro una advertencia sobre la trampa que más amenaza a vuestros indicadores (composición, base pequeña, estacionalidad o selección en las valoraciones)
Nota
Ahora el ejercicio 3. Los apartados a), b), c), g) y h) son esta práctica; d), e) y f) son las tres trampas de estas transparencias: los promedios de promedios, la agregación que invierte el resultado y la base pequeña.
Hasta aquí, datos simulados. Ahora una pregunta que solo se puede responder con datos oficiales:
¿Ha subido la cesta de la compra más que el resto de los precios?
Es la pregunta que hay detrás de la percepción de encarecimiento: el índice general puede crecer moderadamente mientras alimentación crece mucho más
El Instituto Nacional de Estadística publica el IPC mensual, con el índice general y el de cada grupo de gasto
Qué necesitamos para responder:
La serie del índice general y la de alimentos y bebidas no alcohólicas
Sus variaciones anuales, no los niveles: un índice base 100 no es un precio
Un periodo suficientemente largo para no confundir un mes raro con una tendencia
Y una advertencia de la Parte I que aquí es literal: el IPC es una media ponderada de precios con una cesta fija. Es un promedio, con todas las trampas de los promedios
https://servicios.ine.es/wstempus/js/ES/DATOS_TABLA/{id_tabla}?nult={n}
{id_tabla} es el identificador de la tabla publicada en INEbase, y nult el número de periodos más recientes que se pidenlibrary(jsonlite)
# Tabla 50902: IPC nacional, índice general y grupos ECOICOP
url_ipc <- "https://servicios.ine.es/wstempus/js/ES/DATOS_TABLA/50902?nult=36"
ipc_json <- fromJSON(url_ipc, simplifyVector = FALSE)
# Tabla 65335: tasa de paro por sexo y comunidad autonoma, trimestral
# (identificador comprobado en INEbase). Otras utiles: 74999 y 14506
# (paro por grupos de edad y por comunidad).
# url_epa <- "https://servicios.ine.es/wstempus/js/ES/DATOS_TABLA/65335?nult=20"Existe además un paquete de R que envuelve esta API (ineapir): consultad su documentación antes de usarlo en un trabajo
Regla del curso: nunca copiéis un identificador de tabla sin comprobar en la web del INE qué contiene exactamente
ipc <- tibble(serie = map_chr(ipc_json, "Nombre"),
datos = map(ipc_json, "Data")) |>
filter(str_detect(serie, "Variación anual"),
str_detect(serie, "Índice general|Alimentos")) |>
unnest_longer(datos) |>
mutate(anio = map_int(datos, "Anyo"),
mes = map_int(datos, "FK_Periodo"),
fecha = as.Date(sprintf("%d-%02d-01", anio, mes)),
valor = map_dbl(datos, "Valor")) |>
select(serie, fecha, valor) |> arrange(serie, fecha)La fecha se construye con el año y el periodo que vienen etiquetados. El campo Fecha trae milisegundos desde 1970 en hora local: convertirlo suponiendo UTC desplaza cada observación un mes atrás, y el error es silencioso
Y entonces, y solo entonces, se responde a la pregunta
Un dato oficial también exige AED. Antes de publicar el gráfico:
Cuántas series han llegado y si son las que pedimos: el filtro por nombre es texto, y el texto cambia entre publicaciones
Ausencias y huecos: ¿faltan meses? ¿hay valores provisionales?
Base del índice: los índices se rebasan cada cierto tiempo; comparar niveles de bases distintas no tiene sentido, comparar variaciones sí
Ponderaciones: la cesta del IPC se actualiza cada año, así que el índice de 2019 y el de 2025 no pesan lo mismo los mismos bienes
Y la lectura económica, que es lo que se pide en el informe:
Si alimentación crece por encima del general, el encarecimiento golpea más a los hogares de renta baja, porque dedican una proporción mayor de su gasto a alimentación
Ese es un resultado distributivo que un índice medio, por sí solo, esconde
El INE publica cientos de tablas, pero son un menú cerrado: alguien decidió qué cruces salen. Paro por sexo y comunidad, sí. Paro según la situación laboral de la pareja, no
Todas esas tablas se calculan a partir de la misma cosa: un fichero con una fila por persona entrevistada, los microdatos
Con ese fichero podéis hacer tres cosas, y solo la primera la da la tabla:
Reproducir cualquier tabla publicada
Construir el agregado que nadie publicó, porque a nadie se le ocurrió cruzar esas dos variables
Estimar modelos a nivel individual: una regresión, una clasificación. Eso una tabla agregada no lo permite nunca, y es la mitad que queda del curso
El precio: los conceptos (activo, ocupado, parado) NO vienen calculados. Los construís vosotros, y ahí es donde se rompe todo
https://www.ine.es/ftp/microdatos/epa/datos_2t26.zip # 21 MB, segundo trimestre de 2026
https://www.ine.es/ftp/microdatos/epa/dr_EPA_2026.xlsx # diseño de registro
datos_<trimestre>t<año con dos dígitos>.zip. Y el diseño de registro es obligatorio: es el documento que dice qué significa cada columna y cada códigoEl mismo zip trae los datos en ancho fijo (.txt), en texto separado por tabuladores, en un .RData y en parquet, más el diccionario en JSON
En clase leemos el texto separado, y no es por gusto:
Es lo que os vais a encontrar fuera: la mayoría de las fuentes no os regalan un .RData
Obliga a mirar los tipos, que es medio análisis exploratorio
Que existan los otros formatos conviene saberlo: load() para el .RData (cómodo pero solo sirve en R) y arrow::read_parquet() para el parquet (el formato que hay que conocer cuando el fichero no cabe en memoria)
Quien solo sabe abrir el .RData se queda bloqueado el día que la fuente no lo publique. Y lo leemos como texto porque los códigos del INE son texto: "03" no es el número 3
| Variable | Qué es |
|---|---|
NVIVI, NPERS |
identificador de vivienda y orden de la persona dentro de ella (47.914 hogares) |
RELPP1, NCONY |
relación con la persona de referencia y orden de su cónyuge |
AOI |
situación laboral codificada (la variable clave) |
FACTOREL |
factor de elevación: a cuántas personas de la población representa esta fila |
Una fila NO es “una persona más” en la media: representa a un número distinto de personas según su probabilidad de haber sido elegida
Y el nivel de hogar no viene dado: se construye agrupando por NVIVI, que es un group_by() del Tema 03
AOI está vacía para los menores de 16 años. Pero “vacía” aquí significa dos espacios, no una cadena vacíaAOI != "" cree haber quitado a los menores y no ha quitado a nadie. No hay error ni aviso, y la tasa de actividad sale mal:| Fichero completo | Tasa de actividad |
|---|---|
filter(AOI != "") |
51,22% |
filter(trimws(AOI) != "") |
59,29% |
.RData en vez del texto, los blancos pueden llegar como NA: entonces filter los descarta él solo, en silencio, y el error cambia de cara pero sigue ahíAOI no es “0 = parado, 1 = ocupado”. Hay que leer el diseño de registro:| Código | Significado |
|---|---|
| 03, 04 | ocupados (03 son ocupados subempleados) |
| 05, 06 | parados (05 busca su primer empleo) |
| 07, 08, 09 | inactivos |
06 como paro deja fuera a quien busca su primer empleo, que son justo los jóvenes: la tasa nacional baja de 9,873% a 8,757%. Un punto entero de paro por no leer una tabla de códigos de siete líneas| Fichero completo | Sin ponderar | Ponderando |
|---|---|---|
| Tasa de paro | 9,499% | 9,873% |
La suma de FACTOREL es 49.345.143: la población de 16 y más años. Si al sumar los pesos no sale una cifra reconocible de población, algo está mal
El INE publica 9,87% para ese trimestre (tabla 65335). Coincide con nuestro 9,873%: eso es la prueba de que hemos entendido el fichero
La regla, y va en serio: primero se replica una cifra publicada y solo después se calcula lo que no está publicado. Si no reproducís lo conocido, nadie tiene por qué creerse lo nuevo
Ya podemos contestar lo que no está en ninguna tabla: ¿cómo es el paro de una persona según la situación de su pareja?
Cada fila trae en NCONY el orden de su cónyuge dentro del hogar, así que hay que unir el fichero consigo mismo
| Situación de la pareja | Tasa de paro de la persona | n |
|---|---|---|
| pareja ocupada | 6,00% | 26.046 |
| pareja parada | 21,04% | 1.842 |
Con 33.345 personas activas que conviven en pareja: el coeficiente de pareja_parada es 1,40 (razón de probabilidades 4,07), y en versión lineal son 14,5 puntos porcentuales más de probabilidad de estar parado. Tener estudios superiores la reduce (razón de probabilidades 0,45)
Esto es exactamente lo que vamos a hacer en los temas siguientes, y solo se puede con datos individuales
Dos honestidades obligatorias: es asociación, no causa (quien tiene pareja parada se parece a ella en muchas cosas: sector, comarca, estudios), y los errores estándar de una encuesta con diseño complejo no son los que da glm() sin más
| Variable (fichero completo) | Vacía | Qué significa |
|---|---|---|
RELLB1, TRAANT |
100% | relleno del formato: se tiran |
OCUPLU1 |
98,7% | no aplicable: solo quien tiene segundo empleo |
SITU, PARCO1 |
56,8% | no aplicable: solo los ocupados |
Tirar OCUPLU1 por “tener demasiados ausentes” es tirar la respuesta a una pregunta que sí se hizo
Cuatro reglas si usáis microdatos en el trabajo final:
Leed el diseño de registro antes de escribir una línea de código
Replicad una cifra publicada antes de calcular la vuestra
Comprobad que la suma de los pesos es una población reconocible
El fichero grande se descarga a una caché fuera del repositorio; en el repositorio va el código
En la limpieza
Los datos en bruto no se modifican nunca: la limpieza es un script reproducible
Cada corrección lleva escrito el motivo y la regla aplicada, no solo el código
Contar filas antes y después de cada paso, y comprobar que el cambio es el esperado
Los ausentes y los atípicos se investigan antes de tratarse: por qué faltan, por qué son extremos
En la descriptiva
Primero la pregunta, después el estadístico. Si ninguna decisión cambia, sobra
Con distribuciones asimétricas, nunca un solo número: centro, dispersión y forma
Toda tasa lleva su denominador y su nivel al lado
Antes de comparar grupos, mirar la composición de cada grupo
Errores más caros: convertir con as.numeric() sin mirar, promediar promedios, comparar meses consecutivos en series estacionales y confiar en una media calculada sobre quienes decidieron responder