Skip to content
Mario Hernández edited this page Apr 20, 2016 · 5 revisions

Reporte: Sobre la factibilidad de localización automatizada de domicilios geográficos

Mario Hernández Morales / Septiembre de 2015.


Para su desarrollo se implementa una técnica de inteligencia artificial denominada árbol de decisión.

La información de las direcciones se tienen almacenadas en un archivo con los campos de la dirección separadas según la norma técnica de domicilios geográficos de Inegi.

Por ejemplo, para localizar el siguiente domicilio:

source("qmaps.R", echo = FALSE)
map.is.visible <<- TRUE
dom <- lee("dom.xlsx", 4)[1,]

shiny::renderTable({
  t(dom)
})

El método consiste en utilizar la misma técnica de los usuarios al capturar una dirección, primero se captura el municipio, con ello tenemos la primera ubicación, más burda, pero es el inicio para localizar el domicilio:

r_mun <- identifica_mun(dom$mun)
mapa

Una vez contando con el municipio, se procede a localizar la localidad:

r_loc <- identifica_loc(dom$loc, r_mun)
mapa

Se localiza la colonia o asentamiento:

r_snt <- identifica_snt(dom$snt, r_loc)
mapa

Posteriormente se localiza la vialidad o calle. Hay que considerar todas las posibilidades, por lo que obtenemos una nube de puntos probables:

r_vld <- identifica_vld(dom$vld, r_loc)
mapa

Y finalmente el número exterior.

r_num <- identifica_num(dom$num, r_vld[1,])
mapa

No se utiliza el Código postal, pero es posible utilizar las entre calles o esquinas.

Construcción del árbol de desición

Crea el árbol de decisión:

Tt <- identifica(dom, TRUE)
entropia(Tt)
mapa

Podar el árbol:

Pt <- podar(Tt, TRUE)
entropia(Pt)
mapa

Atomiza el árbol podado:

At <- atomizar(Pt, TRUE)
entropia(At)
mapa
shiny::renderTable({
  t(At)
})

Reporte completo del análisis del rendimiento ante la base proporcionada para prueba de ubicación de domicilios.

Recomendaciones generales para optimizar el funcionamiento

Para un mejor aprovechamiento del sistema de "Localización automatizada de domicilios geográficos" localhost:3838/ldom, se recomienda lo siguiente:

  • Hacer una prueba previa con pocos datos, unos 10, para verificar que se estén utilizando correctamente los campos de entrada.
  • El archivo de Excel puede contener fórmulas para construir las variables de entrada, por ejemplo: '=SI(Q9,Q9,R9)' para juntar las variables S_NUM_EXT y S_LETRA_EXT. O bien '=EXTRAEB(E2,7,100)' para acortar un texto.
  • La variable n es opcional, ya que si se omite se genera una variable que es un número consecutivo.
## Pruebas de rendimiento
source("qmaps.R", echo = FALSE)
padron <- lee("P20160302.xlsx", 1)
test <- function(n = NULL) {
  if(is.null(n)) {
    require(random)
    n <- randomNumbers(1, 1, length(padron$n), 1)
  }
  dom = padron[n, ]
  s_ <- Sys.time()
  a_ <- identifica(dom)
  b_ <- podar(a_)
  c_ <- atomizar(b_)
  e_ <- Sys.time()
  c( e_ - s_, entropia(a_), entropia(b_), entropia(c_), c_$niv, c_$BM)
}
ad <- NULL
for(var in c(1:600))
  ad <- rbind(ad, test())
colnames(ad)[c(1,2,5,6)] <- c("Entropía", "Tiempo", "Nivel", "Error")
write_feather(as.data.frame(ad), "ad.data")
require(feather)
ad <- read_feather("ad.data")
ad$Nivel <- factor(ad$Nivel, labels = c("Número exterior", "Entrecalle", "Calle", "Colonia", "Localidad"))
require(ggplot2)

Tiempo de ejecución

El tiempo de ejecución con 1 procesador tiene la siguiente distribución en segundos:

  summary(ad$Tiempo)

qplot(ad$Tiempo, geom="histogram", bins = 40) +
  labs(title="Distribución del tiempo de ejecución") +
  labs(x="Tiempo en segundos", y="Cantidad")

Por lo anterior se recomienda tener el mayor número de procesadores disponibles para la máquina virtual.

Entropía informática

Utilizando el principio de entropía informática (Shannon 1951), que mide el grado de aleatoriedad e incertidumbre de los datos, también puede verse como una medida del desorden. La entropía observada presenta la siguiente distribución:

  summary(ad$Entropía)

qplot(ad$Entropía, geom="histogram", bins = 40) +
  labs(title="Distribución de la entropía informática") +
  labs(x="Entropía", y="Cantidad")

Viscosidad informática

La relación entre la entropía y el tiempo de ejecución conserva una relación lineal entre ellos, así tenemos que a mayor entropía mayor tiempo de ejecución se requerirá. Lo anterior puede definir una medida de viscosidad informática igual a 1 / tangente del ángulo de la línea recta, dado que un ángulo mayor refleja una viscosidad menor. Solo como observación, el proceso de búsqueda se comporta como un fluido de una mezcla de líquidos de diversa viscosidad.

qplot(ad$Entropía, ad$Tiempo) +
  labs(title="Tiempo de ejecución y Entropía") +
  labs(x="Tiempo", y="Entropía")

Como puede observarse los datos presentan una combinación de casos en los cuales algunos se calculan muy rápido y otros no. Aquí, entonces, es importante el uso del cache inicial, por lo que internamente se ordena por municipio y localidad.

Distribución del nivel

La mayoría de los registros llegan a estimarse a nivel de número exterior. En general se tiene la siguiente distribución:

  summary(ad$Nivel)

qplot(ad$Nivel) +
  labs(title="Histograma para nivel") +
  labs(x="Nivel", y="Cantidad")

Observe que los niveles de colonia y localidad son los menores.

Error a nivel de número exterior

Cuando el error a nivel de número exterior no es cero, tiene la siguiente distribución de probabilidad:

  summary(ad$Error[which(ad$Nivel == "Número exterior" & ad$Error > 0)])

qplot(ad$Error[which(ad$Nivel == "Número exterior" & ad$Error > 0)], geom="histogram", bins = 30) +
  geom_density(col=2) + 
  labs(title="Distribución del error nivel de pie de casa") +
  labs(x="Error", y="Cantidad")

Error a nivel de calle

Cuando el error a nivel de calle no es cero, tiene la siguiente distribución de probabilidad:

  summary(ad$Error[which(ad$Nivel == "Calle" & ad$Error > 0)])

qplot(ad$Error[which(ad$Nivel == "Calle" & ad$Error > 0)], geom="histogram", bins = 20) +
  geom_density(col=2) + 
  labs(title="Distribución del error nivel de calle") +
  labs(x="Error", y="Cantidad")

Error a nivel de colonia

Cuando el error a nivel de colonia no es cero, tiene la siguiente distribución de probabilidad:

  summary(ad$Error[which(ad$Nivel == "Colonia" & ad$Error > 0)])

qplot(ad$Error[which(ad$Nivel == "Colonia" & ad$Error > 0)], geom="histogram", bins = 10) +
  geom_density(col=2) + 
  labs(title="Distribución del error nivel de colonia") +
  labs(x="Error", y="Cantidad")

Nota técnica

Para este reporte se eligieron 600 direcciones sin remplazo y en cada procesamiento se utilizó un solo procesador a 2.2 Ghz. A parte se tiene un procesador exclusivo para Postgresql e independiente.

Referencias

Ross Quinlan (1986) Induction Decision Tree. Machine Learning [1979].

Breiman et al. (1984) Classification and Regression Trees. Belmont, Calif.: Wadsworth.

Sean C. Anderson, plyr: Split-Apply-Combine for Mortals, 2013. http://seananderson.ca/2013/12/01/plyr.html.