Ir al contenido

Una de las utilidades principales del paquete territorial es poder limpiar automáticamente las comunas de una base de datos que venga con datos sucios: comunas mal escritas, en mayúsculas, sin tildes, sin eñes, etc.

En este ejemplo, probaremos la función territorial::limpiar_comunas() con un caso extremo de datos intencionalmente sucios.

Crearemos una tabla con nombres de comunas ensuciados, a partir de la tabla territorios que viene con el paquete, y usando algunas funciones utilitarias inspiradas en el paquete {messy} para ensuciar los datos.

sucios <- territorios |> 
  select(nombre_comuna) |> 
  mutate(nombres_sucios = nombre_comuna |> 
      reemplazar_texto(porcentaje = 0.1) |>
      eliminar_texto(porcentaje = 0.1) |>
      insertar_texto(porcentaje = 0.1)
  ) |> 
  filter_out(nombre_comuna == nombres_sucios) # excluir los que no se ensuciaron por azar

Como sus nombres lo indican, estas funciones reemplazan, eliminan e insertan texto aleatoriamente, para simular errores de escritura, datos corruptos, u otros problemas de calidad de datos.

Así queda una muestra de los datos sucios:

sucios |> 
  slice_sample(n = 10)
# A tibble: 10 × 2
   nombre_comuna  nombres_sucios
   <chr>          <chr>
 1 Puerto Montt   Suemro Montt
 2 San Bernardo   GSa Bgrnardo
 3 Puchuncaví     Pwhuncaví
 4 San Felipe     San FYlie
 5 La Pintana     LaPUntana
 6 San Esteban    SaQn stebQn
 7 Alto Biobío    EAfto Bioío
 8 Juan Fernández dJuan Ftnández
 9 San Carlos     fan Crlos
10 Pozo Almonte   ozo Aolmovte  

Ahora que tenemos la columna nombres_sucios, usamos limpiar_comunas() para limpiar los datos, creando la columna nombres_limpios:

limpios <- sucios |> 
  mutate(nombres_limpios = limpiar_comunas(nombres_sucios))

Ahora veamos el resultado de esta prueba de limpieza extrema:

limpios |> 
  select(nombres_sucios, nombres_limpios) |> 
  print(n = 30)
# A tibble: 109 × 2
   nombres_sucios      nombres_limpios
   <chr>               <chr>
 1 Alo Hvospicpo       Alto Hospicio
 2 ozo Aolmovte        Pozo Almonte
 3 AnoRagKasta         Antofagasta
 4 ejillones           Mejillones
 5 Sierrp GrdaA        Sierra Gorda
 6 SvnMPmedro d Atacaa San Pedro de Atacama
 7 María EleaZ         María Elena
 8 Tiera AVmarilln     Tierra Amarilla
 9 DiXeno de Almgro    Diego de Almagro
10 Alto del Cawmdn     Alto del Carmen
11 a uiguera           La Higuera
12 Combrbtlá           Combarbalá
13 Monte PJctia        Monte Patria
14 RíoEHrtasdo         Río Hurtado
15 Valparase           Valparaíso
16 Csablanca           Casablanca
17 dJuan Ftnández      Juan Fernández
18 Pwhuncaví           Puchuncaví
19 Viña denYMar        Viña del Mar
20 Isla e Pamscua      Isla de Pascua
21 Calle LFgaP         Calle Larga
22 SaQn stebQn         San Esteban
23 Son UAtonio         San Antonio
24 SantWDominJgo       Santo Domingo
25 San FYlie           San Felipe
26 SanaWMaríaW         Santa María
27 Vvila AlemanF       Villa Alemana
28 as Cabras           Las Cabras
29 ichideguq           Pichidegua
30 Quinta mPe Tilcco   Quinta de Tilcoco
# ℹ 79 more rows

Podemos confirmar que la limpieza realizada con limpiar_comunas() es capaz de abarcar casos muy extremos: por ejemplo, identifica que SvnMPmedro d Atacaa es San Pedro de Atacama, o que SanaWMaríaW es Santa María, por lo que la función podría resultar apropiada para detección de datos escritos a mano o de documentos antiguos procesados con OCR.

A este nivel de dificultad, la limpieza no siempre es 100% correcta.

problemas <- limpios |> 
  filter(is.na(nombres_limpios) | nombre_comuna != nombres_limpios)

Luego de esta limpieza, quedaron 0 casos donde los nombres limpios se dedujeron incorrectamente a partir de los nombres sucios:

problemas
# A tibble: 0 × 3
# ℹ 3 variables: nombre_comuna <chr>, nombres_sucios <chr>,
#   nombres_limpios <chr>