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>
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>