[R-br] georeferenciamento CEP Curitiba

Elias T. Krainski eliaskrainski em yahoo.com.br
Terça Maio 5 10:56:34 BRT 2015


wow! Achei muito legal o que voce descobriu! Isso com certeza sera' util 
em caso de haver base maior de CEPs. Como sabiamos, CEP e' menos preciso 
que logradouro+numero. Mas agora temos tambem conhecimento do nivel de 
precisao de raiz do CEP.

Elias

On 05/05/15 15:00, Éder Comunello wrote:
> Elias, bom dia!
>
> Fiz mais um exercício pra tentar medir o impacto da "simplificação" 
> dos ceps...
>
> O primeiro fato que percebo é que a consulta por cep, mesmo completo, 
> é pouco precisa/acurada. A busca por logradouro é possível, mas talvez 
> complicada pra implementar nessas bases...
>
> Se você tiver paciência de seguir o código abaixo, o que eu queria 
> mostrar é que quando você trunca o cep, zerando o último dígito, 99% 
> dos valores retornados vão diferir até 2 km da consulta original, mas 
> economizam 22% de consultas ao geocode().
>
> Zerando os dois últimos dígitos, 97% dos dados variam até 2 km, mas 
> economiza 90% das consultas.
>
> E essa variação não é necessariamente erro, porque não temos as 
> coordenadas "reais" pra avaliar...
>
> No código eu não reconsultei os valores, mas tentei aproveitar sua 
> base. Daí a presença dos NA's...
>
> ### <code r>
> url0 <- 
> "http://leg.ufpr.br/~elias/tmp/cep_curitiba_cwb_georef_longlat.txt 
> <http://leg.ufpr.br/%7Eelias/tmp/cep_curitiba_cwb_georef_longlat.txt>"
> df0  <- read.table(url0, head=T)
> head(df0)
> length(unique(df0$cep)) # 9183 ceps
> length(unique(paste(df0$long, df0$lat))) # 6414 pares de coordenadas 
> distintas
>
> ### Truncando "xxxxx-xxx" para "xxxxx-xx0"
> ### Desconsiderando o último dígito do cep
> df1 <- df0
> df1$cep2=trunc(df0$cep/10)*10
> head(df1)
> length(unique(df1$cep2)) # 7135 ceps (-2048 ou -22%)
>
> ### Pra não gastar minhas 2500 consultas :D, vou usar os dados já 
> consultados!
> df2 <- merge(df1, df0, all.x=T, sort=F, by.x="cep2", by.y="cep")
> head(df2)
> sum(complete.cases(df2)) # 9071! Com a consulta de geocode, 
> provavelmente todos retornariam valor
>
> ### Valor aproximado de 1 grau dessa área (em km)
> require(sp)
> spDistsN1(matrix(c(-49,-50, -25,-26),2,2), matrix(c(-50,-25),1,2), 
> longlat=TRUE)
>
> df2$dist <- sqrt((df2[,3]-df2[,5])^2+(df2[,4]-df2[,6])^2)*105 ### 
> distância aproximada em km!
> hist(df2$dist)
> range(df2$dist, na.rm=T)
> table(cut(df2$dist, breaks=c(-1:5,20)))
> # (-1,0]  (0,1]  (1,2]  (2,3]  (3,4]  (4,5] (5,20]
> #   7528   1132    362   24      2      0     23
>
> sum(table(cut(df2$dist, breaks=c(-1:5,20)))[1:3])
> ### 99% dos dados (9022/9071) diferem até 2 km em relação a consulta 
> original
>
> sum(df2$dist>5, na.rm=T) ### 23 valores bem imprecisos
> df2[which(df2$dist>5),]
>
> ### Onde estão ocorrendo problemas?
> require(ggmap)
> adr <- paste0("Curitiba, PR, Brazil, ", df2[which(df2$dist>5),2])
> res <- geocode(adr, output="more")
> res[c(1:4,10)]
>
> cbind(df2[which(df2$dist>5),1:4],res[1:6])
> ### boa parte dos problemas referem-se aos ceps da cidade industrial
> ### você pode filtrar esses ceps e tratá-los diferenciados
>
>
> ### Truncando "xxxxx-xxx" para "xxxxx-x00"
> df10 <- df0
> df10$cep2=trunc(df0$cep/100)*100
> head(df10)
> length(unique(df10$cep2)) # 941 ceps (-8242 ou -90%)
>
> df20 <- merge(df10, df0, all.x=T, sort=F, by.x="cep2", by.y="cep")
> head(df20)
> sum(complete.cases(df20)) # 8312! Com a consulta de geocode, 
> provavelmente todos retornariam valor
>
> df20$dist <- sqrt((df20[,3]-df20[,5])^2+(df20[,4]-df20[,6])^2)*105 ### 
> distância aproximada em km!
> hist(df20$dist)
> range(df20$dist, na.rm=T)
> table(cut(df20$dist, breaks=c(-1:5,20)))
> # (-1,0]  (0,1]  (1,2]  (2,3]  (3,4]  (4,5] (5,20]
> #   1647   5403   1050  131     17      6     58
>
> sum(table(cut(df20$dist, breaks=c(-1:5,20)))[1:3])
> ### 97% dos dados (8100/8312) diferem até 2 km em relação a consulta 
> completa
>
> sum(df20$dist>5, na.rm=T) ### 23 valores bem imprecisos
> df20[which(df20$dist>5),]
>
> ### Onde estão ocorrendo problemas?
> require(ggmap)
> adr1 <- paste0("Curitiba, PR, Brazil, ", df20[which(df20$dist>5),2])
> res1 <- geocode(adr1, output="more")
> res1[c(1:4,10)]
>
> cbind(df20[which(df20$dist>5),1:4],res1[1:6])
> ### aumentam as localidades com problema, mas acho que ainda assim dá 
> pra contornar
> ### </code>
>
>
> Éder Comunello <c 
> <mailto:comunello.eder em gmail.com>omunello.eder em gmail.com 
> <mailto:omunello.eder em gmail.com>>
> Dourados, MS - [22 16.5'S, 54 49'W]
>
>
>
>
> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br
> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

-- 
In God we trust, all others bring data.
  – William Edwards Deming (1900-1993)

-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20150505/2a990993/attachment.html>


Mais detalhes sobre a lista de discussão R-br