Aprovechando que es festivo y no hay nadie mirando, vamos a tratar de ampliar el dataset con el CNAE de cada moroso. Seguiremos una metodología similar a la entrega anterior. Esto va a tardar un ratito…
library(rvest)
library(httr)
library(digest)
library(parallel)
library(dplyr)
load("data/debtors.RData")
url_base <- "http://www.einforma.com"
url_nif <- "/servlet/app/prod/ETIQUETA_EMPRESA/nif/"
url_name <- "/servlet/app/prod/LISTA_EMPRESAS/razonsocial/"
get_inf <- function(...) {
s <- html_session(paste0(url_base, ...), user_agent(digest(runif(1))))
cnae <- s %>%
html_node("td:contains(CNAE) + td") %>%
html_text %>%
strsplit(" - ") %>%
unlist
objsoc <- s %>%
html_node("td:contains(Objeto social) + td") %>%
html_text
c(cnae, objsoc)
}
res_by_nif <- do.call(rbind, mclapply(1:nrow(debtors), function(i) {
data <- data.frame(Identificador.Deudor = debtors[i,]$Identificador.Deudor,
es.empresa = FALSE,
CNAE.code = NA,
CNAE.desc = NA,
Objeto.Social = NA)
try({
inf <- get_inf(url_nif, debtors[i,]$NIF.CIF)
data$es.empresa <- TRUE
data$CNAE.code <- as.numeric(inf[[1]])
data$CNAE.desc <- inf[[2]]
data$Objeto.Social <- inf[[3]]
}, silent = TRUE)
data
}))
res_by_search <- do.call(rbind,
mclapply(1:nrow(debtors), function(i) {
data = res_by_nif[i,]
if (!data$es.empresa) try({
new_url <-
html_session(paste0(url_base, url_name, gsub(" ", "+", name)),
user_agent(digest(runif(1)))) %>%
html_node("table#nacional tbody tr") %>%
html_attr("url")
inf <- get_inf(new_url)
data$es.empresa <- TRUE
data$CNAE.code <- as.numeric(inf[[1]])
data$CNAE.desc <- inf[[2]]
data$Objeto.Social <- inf[[3]]
}, silent = TRUE)
data
}))
debtors <- left_join(debtors, res_by_search)
Hemos asumido que las búsquedas fallidas corresponden a personas físicas. Y ya que nos poníamos, hemos sacado también el objeto social. Veamos cuántas empresas y personas hay:
# Número de personas jurídicas (empresas)
sum(res_by_search$es.empresa)
## [1] 4031
# Número de personas físicas
sum(!res_by_search$es.empresa)
## [1] 792
792 personas físicas frente a 345 que reportaba eldiario.es. Está claro que se nos han colado algunas empresas que no producen resultados. Para aislarlas, todavía tenemos una última baza: buscar las siglas de Sociedad Anónima, Sociedad Limitada, etc., al final del nombre. Ojo a la expresión regular, que se las trae:
is_company <- function(x)
grepl("(\\.|,| )S(\\.| ){0,2}(L|L(\\.| ){0,2}U|A|C|A(\\.| ){0,2}T)(\\.)?", x)
new.es.empresa <- debtors$es.empresa | is_company(debtors$Identificador.Deudor)
debtors$es.empresa <- new.es.empresa
Volvemos a comprobar:
# Número de personas físicas
sum(!new.es.empresa)
## [1] 363
No va mal. Un vistazo rápido revela que quedan por ahí asociaciones, clubes de fútbol, fundaciones, cooperativas, universidades… Démosle otra vuelta un poco más ad hoc:
check_adhoc <- function(x)
grepl("CLUB|LIMITED|ASOC|COOP|FUND(ACI|\\.)|FEDERACI|DISTRIBUID|UNIVERSI|COMPAÑ|SOCI(E)?DAD|CONSORCI|CETECSER|DESTILER|DITRALSA|ELABORAD|FRUABISL|GESTI(O|Ó)N|LEGION|JUNTA|MANCOMUNIDAD|SERVIC|GOLF|ORGANIZA|TRASVASE|HOLDING|TRADER|OUTLET|GANADERA|SEGURIDAD|ENERGETIC|DIETMAR|GRAMANET|VALGRICENTRI", x)
debtors$es.empresa <- debtors$es.empresa | check_adhoc(debtors$Identificador.Deudor)
Lo que nos deja, finalmente,
# Número de personas físicas
sum(!debtors$es.empresa)
## [1] 303
Y paso a sobreescribir el dataset ampliado.
rm(list=setdiff(ls(), "debtors"))
save.image("data/debtors.RData")
Antes de cerrar este capítulo, echémosle un vistazo a los nuevos datos. ¿Cómo se distribuyen las empresas por actividad económica? Veamos un histograma por código CNAE:
library(ggplot2)
ggplot(debtors, aes(CNAE.code)) + geom_histogram(binwidth=500) +
scale_x_continuous(breaks=seq(0, 10000, 1000)) +
ylab("Número de empresas")
## Warning: Removed 816 rows containing non-finite values (stat_bin).
Revelador. Hay un pico enorme de empresas entre 4000 y 4500. ¿De qué serán? Efectivamente: de la construcción. El siguiente grupo en volumen, entre 4500 y 5000, se corresponde con mayoristas. Y el tercero, entre 6500 y 7000, engloba actividades financieras e inmobiliarias.