Skip to contents

Compara entregas sin exigir que tengan las mismas columnas. Devuelve cambios de esquema, tipos, faltantes, cardinalidad, rango, patrones y hallazgos como un objeto de datos filtrable.

Usage

comparar_perfiles(anterior, actual, umbral_cambio = 0.05, umbral_error = 0.2)

Arguments

anterior, actual

Objetos producidos por perfilar().

umbral_cambio

Diferencia mínima para considerar significativo un cambio de proporción, cardinalidad o rango relativo. Cinco puntos porcentuales evita elevar variaciones pequeñas a hallazgo.

umbral_error

Diferencia a partir de la cual un aumento de faltantes o un patrón nuevo se clasifica como error.

Value

Data frame deriva_perfil. severidad usa el factor ordenado ok < sospechoso < error; los cambios menores permanecen como filas ok para que la serie sea exportable sin ocultar diferencias.

Details

Los patrones se comparan sobre el resumen acotado que conserva cada perfil, no sobre los valores originales ni una distribución completa. Si las dos corridas usaron configuraciones de patrones diferentes, se informa un error de comparabilidad y esa parte de la comparación se omite.

Los nombres de columnas y las configuraciones que contienen texto del usuario se comparan por sus bytes, no por la marca de codificación ni por la intercalación del locale.

Eso alcanza mientras los bytes lleguen intactos, y hay un caso en que no llegan y no depende de este paquete: el formato RDS 3 —el de saveRDS() por omisión— anota la codificación nativa de quien escribe, y al leer traduce desde ella el texto que no declara la suya. Un perfil guardado bajo LC_CTYPE=C y releído bajo otro locale puede volver con el texto cambiado; en Windows el cambio es silencioso, porque ahí la conversión no falla.

Cuando eso pasa, el perfil releído está alterado, y conviene saber qué alcanza a ver esta función. Compara las propiedades medidas de cada columna, los hallazgos, el alcance del resumen y las configuraciones declaradas —no los valores uno por uno—: la columna aspecto del resultado nombra, fila por fila, qué se comparó, y es la enumeración viva. Un cambio de texto que no altera ninguna propiedad medida no aparece: por ejemplo, si la moda de una columna pasa de "Basico" a "Casico" —mismo largo, misma forma de patrón, mismos conteos—, la comparación devuelve cero filas. Por eso el remedio ante una relectura sospechosa no es confiar en la comparación para detectarla.

El remedio es una línea, saveRDS(perfil, archivo, version = 2), porque ese formato no anota codificación nativa y por lo tanto no traduce nada. La persistencia propia del paquete —guardar_historico() y guardar_analisis()— ya lo usa. Las claves internas que agrupan hallazgos también se normalizan por bytes; por eso dos perfiles idénticos no emiten avisos espurios bajo C.

Que la moda no se compare es una decisión, no un pendiente: la moda es un valor, no una propiedad medida, y cambia con cualquier corrimiento normal de los datos, así que compararla llenaría la deriva de filas que no son deterioro. Quien necesite detectar una relectura corrompida tiene el remedio de una línea que está dos párrafos más abajo, que la evita en lugar de detectarla.

Entre las propiedades comparadas está la unidad en la que la columna publica sus cifras, con la misma severidad que un cambio de tipo: dos entregas con los mismos valores y la unidad cambiada de m a km son un cambio real —la cifra dejó de significar lo mismo— y antes devolvían cero filas. Un perfil guardado antes de que ese campo existiera no hace mentir la comparación: esa parte se declara no comparable, como el resto de los campos ausentes.

Las columnas que aparecen o desaparecen generan cambios estructurales de severidad error, pero no impiden comparar las columnas compartidas. Un hallazgo de una columna retirada no se presenta como resuelto.

Un hallazgo que ya no aparece se informa como resuelto sólo si el diagnóstico volvió a evaluarse. Si el perfil nuevo lo declinó —y lo dice en su cobertura_diagnosticos—, el cambio se informa como no_evaluado con severidad sospechoso, porque no se sabe si el hallazgo sigue: dejar de mirar no es lo mismo que arreglar.

Los hallazgos que cuentan filas de la tabla y no pertenecen a una columna concreta tampoco se declaran resueltos si aparecieron o desaparecieron columnas entre las corridas: cambio el universo que define esas filas. En ese caso se publica no_comparable, con severidad error, y se nombran las columnas cambiadas. Con las mismas columnas, el veredicto resuelto se conserva.

Examples

anterior <- perfilar(data.frame(codigo = c("AA1", "AA2")),
                     fecha = as.POSIXct("2026-01-01", tz = "UTC"))
actual <- perfilar(data.frame(codigo = c("AA1", "B-2"), nueva = 1:2),
                   fecha = as.POSIXct("2026-02-01", tz = "UTC"))
comparar_perfiles(anterior, actual)
#>   columna aspecto    cambio severidad valor_anterior valor_actual delta
#> 1   nueva columna aparecida     error           <NA>        nueva    NA
#> 2  codigo  patron aparecido     error           <NA>          A-9   0.5
#>   cambio_relativo significativo fecha_anterior fecha_actual
#> 1              NA          TRUE     2026-01-01   2026-02-01
#> 2              NA          TRUE     2026-01-01   2026-02-01
#>                                                  descripcion
#> 1 Apareció una columna que no estaba en la entrega anterior.
#> 2                       Apareció un patrón de formato nuevo.
#>                                        evidencia
#> 1 No existe una base anterior para sus métricas.
#> 2                      Proporción actual: 0.5000