-
Notifications
You must be signed in to change notification settings - Fork 0
Home
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.
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.
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)
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.
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")
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.
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.
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")
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")
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")
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.
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.