[R-br] georeferenciamento CEP Curitiba

Éder Comunello comunello.eder em gmail.com
Terça Maio 5 10:00:10 BRT 2015


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"
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 <comunello.eder em gmail.com>omunello.eder em gmail.com>
Dourados, MS - [22 16.5'S, 54 49'W]
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20150505/2e8c57dc/attachment.html>


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