3.
2 Registro de personas en SQL
Base de datos de personas del programa de Gestión para el Registro y
seguimiento de documentos Registr@.
3.2.1 Carga
Se ha exportado de SQL Server a fichero de texto. Cada persona está en
una línea del fichero. Los campos están separados por tabuladores.
registra_personas <-
read_tsv("./datos/registra/personas.txt",
locale= locale(encoding = "UTF-8"),
col_names=TRUE,
col_types = cols_only(id_persona = col_character(),
dni_nif_cif = col_character(),
apellido1 = col_character(),
apellido2 = col_character(),
nombre = col_character(),
telefono = col_character(),
fecha_nacimiento = col_datetime(),
id_domicilio_principal = col_integer(),
fecha_alta = col_datetime(),
fecha_baja = col_datetime(),
Correo_Electronico = col_character(),
nombre_pais = col_character(),
nombre_provincia = col_character(),
nombre_loc = col_character()
),
na=c('','NULL','-','.','*','--',',',',,'))
#source("registra.personas.r")
#registra_personas <- get_registra_personas()
load("registra_personas.rda")
3.2.2 Análisis
Número total de registros
nrow(registra_personas)
## [1] 753834
Esta es la distribución de los datos según la fecha de la observación. Hay
unas algunas observaciones muy antiguas (no muchas, la escala es
logarítmica).
registra_personas %>%
ggplot(aes(x=year(bdc_fecha_valor))) +
geom_histogram(color = "white", fill = "blue") +
scale_y_log10(name="count (logarithmic)")
En cuanto a los valores no conocidos, hay unos cuantos sin id oficial, y
muchos sin nombre, municipio o segundo apellido. Más de un treinta por
ciento no tienen fecha de nacimiento y ninguno tiene registrado el sexo.
registra_personas %>%
select(bdc_id_oficial, bdc_nombre, bdc_apellido_1, bdc_apellido_2,
bdc_fecha_nacimiento, bdc_sexo, bdc_municipio_domicilio) %>%
plot_missing()
La distribución de las personas sin identificador oficial en función de la fecha
en la que se hizo la observación indica que a partir de 2006 se recogen casi
siempre este dato ( la escala es logarítmica).
registra_personas %>%
filter(is.na(bdc_id_oficial)) %>%
ggplot(aes(x=year(bdc_fecha_valor))) +
geom_histogram(color = "white", fill = "blue") +
scale_y_log10(name="count (logarithmic)")
En cambio, la fecha de nacimiento falta sobre todo en las observaciones más
recientes, a partir del año 2000.
registra_personas %>%
filter(is.na(bdc_fecha_nacimiento)) %>%
ggplot(aes(x=year(bdc_fecha_valor))) +
geom_histogram(color = "white", fill = "blue")
En cuanto al nombre, parece que casi todos los que no tienen nombre son
personas jurídicas:
registra_personas %>% filter(is.na(bdc_nombre)) %>%
select(bdc_id_oficial, bdc_apellido_1) %>%
sample_n(10) %>% pulcro()
bdc_id_oficia
bdc_apellido_1
l
E31723133 CAYON OUTOMURO ANA Y GARDE FABRE GUILLERMO
E31591068 CARRERA CABALLERO JC Y DOMINGUEZ DE VIDAURRE TA ZUBIRI M
B01236488 ASESORIA COFISER 2000 SL
B31220973 AYERRA IRISARRI SL
B01025709 IMPRENTA SACAL S.L.
A02055598 PEDRO GALIANO SA
bdc_id_oficia
bdc_apellido_1
l
NA ILUMISA, S.L.
Q3150011I INSTITUTO DE LA SALUD PUBLICA
B31949910 PRODUCCIONES MUSICALES ETXE-ONDO SL
B71208797 GARABITO 111 SL
Como hemos visto, la base de datos de Registr@ tiene personas físicas y
jurídicas, y no tienen ninguna variable explícita que las distinga. Podemos
filtrar por el identificador oficial.
registra_personas %>% filter(parece_persona_juridica(bdc_id_oficial)) %>% nrow()
## [1] 90661
3.2.3 Filtrado
Asumiendo que las bases de datos que proporcionarán datos a la BDC serán
más completas que la de Registr@, para la POC filtraremos la base de datos
de Registr@.
nrow(registra_personas)
## [1] 753834
Prescindimos de los registros con identificador de persona jurídica
registra_personas <- registra_personas %>% filter(!parece_persona_juridica(bdc_id_oficial))
nrow(registra_personas)
## [1] 663173
Prescindimos de los registros sin nombre (asumiendo que también son de
personas jurídicas)
registra_personas <- registra_personas %>% filter(!is.na(bdc_nombre))
nrow(registra_personas)
## [1] 641051
3.2.4 Normalización
Los identificadores oficiles pueden tener signos de puntuación.
registra_personas %>% select(bdc_id_oficial) %>%
subset(grepl("[[:punct:]]",bdc_id_oficial)) %>%
unique() %>% sample_n(10) %>% pulcro()
bdc_id_oficial
.00000000
EXT981…
X907838-M
EXT090…
0.750.787
X83510…
EXT080…
EXT050…
0.818.544
EXT180…
Preprocesado del id oficial. Después del procesado no queda ningún DNI con
guiones o signos de puntuación:
registra_personas <- registra_personas %>% preproceso_id_oficial()
registra_personas %>% select(bdc_id_oficial) %>%
subset(grepl("-",bdc_id_oficial)) # %>% unique() %>% pulcro()
## # A tibble: 0 x 1
## # ... with 1 variables: bdc_id_oficial <chr>
Si miramos los id oficiales vemos que la mayoría no tienen la sintaxis de
persona física:
registra_personas %>% select(bdc_id_oficial) %>%
filter(!parece_persona_fisica(bdc_id_oficial)) %>% nrow()
## [1] 592362
Si miramos la pinta de los id oficiales vemos que hay muchos sin el caracter
de control y con un cero:
registra_personas %>% select(bdc_id_oficial) %>%
filter(!parece_persona_fisica(bdc_id_oficial)) %>%
sample_n(10) %>% pulcro()
bdc_id_oficial
072649517
034772005
018208364
072645485
015826757
010565560
073611561
03C323228
015753402
007889157
Asumiendo que son DNIs correctos, calculamos el dígito de control. Despues
de procesarlo casi todos los registros tienen algo que parece un DNI/NIE. Si
no fuera una POC habría que analizarlo mejor para asegurarse.
registra_personas <- registra_personas %>% preproceso_id_oficial_ceros()
registra_personas %>% select(bdc_id_oficial) %>%
subset(parece_persona_fisica(bdc_id_oficial)) %>%
sample_n(10) %>% pulcro()
bdc_id_oficial
44569854V
72643841C
15785121Z
72809530V
15626154T
15640658Z
70900930A
51420469J
33430850M
15830327W
Para poder enlazar los registros hay que normalizarlos. Por ejemplo, el
nombre “MARIA NIEVES” puede aparecer de muchas formas diferentes.
registra_personas %>% select(bdc_nombre) %>%
subset(grepl("^(M\\.|M?|MARI|MARIA)+ NIEVES$",bdc_nombre)) %>%
unique() %>% pulcro()
bdc_nombre
MARIA NIEVES
M NIEVES
M. NIEVES
Preprocesado del nombre y apellidos:
registra_personas <- registra_personas %>% preproceso_nombre_apellidos()
registra_personas %>% select(bdc_nombre) %>%
subset(grepl("^(M\\.|M?|MARI|MARIA)+ NIEVES$",bdc_nombre)) %>%
unique() %>% pulcro()
bdc_nombre
MARIA NIEVES
Finalmente guardamos las dos bases de datos para el siguiente paso.
save(nastat_personas, registra_personas, file ="bdc_poc_1.rda")