O Cadastro Nacional de Endereços para Fins Estatísticos (CNEFE), elaborado pelo IBGE, é muito mais do que uma simples lista de locais: é a “espinha dorsal” da infraestrutura geoespacial brasileira. Atualizado massivamente durante o Censo Demográfico, ele representa o registro mais granular e completo da ocupação do território nacional.

Para cientistas de dados, urbanistas e gestores públicos, o CNEFE oferece oportunidades únicas de análise. No entanto, lidar com essa base apresenta um desafio técnico: o volume. Estamos falando de dezenas de milhões de pontos. Ferramentas tradicionais de plotagem (como matplotlib ou folium) frequentemente travam ou se tornam inutilizáveis ao tentar renderizar essa quantidade de dados de uma só vez.

Neste artigo, apresento uma solução robusta e escalável para transformar esses dados brutos em inteligência visual. Você aprenderá a:

  • Automatizar a coleta de dados: Baixar arquivos massivos do servidor FTP do IBGE via script.
  • Processar Big Data: Consolidar e otimizar a leitura de milhões de coordenadas com pandas.
  • Visualizar o invisível: Utilizar a biblioteca Datashader para criar mapas de calor (heatmaps) de altíssima resolução que revelam a estrutura demográfica do Brasil.

Para aprofundar-se na documentação oficial e dicionários de dados, visite a página do CNEFE no IBGE.

Nota de Ética e Uso: Ao utilizar dados públicos, verifique sempre a política de uso do IBGE. A citação adequada da fonte é fundamental para a integridade científica e profissional de seus relatórios.

O Desafio: Por que usar Datashader?

Antes de entrarmos no código, é crucial entender a escolha das ferramentas. Ao plotar pontos geográficos, a abordagem comum é desenhar um círculo para cada coordenada. Isso funciona bem para 1.000 ou 10.000 pontos. Porém, ao escalar para 100 milhões de endereços (a escala do Brasil), ocorrem dois problemas:

  1. Overplotting: Os pontos se sobrepõem tanto que o mapa vira uma mancha sólida, perdendo qualquer nuance de densidade.
  2. Performance: O navegador ou a ferramenta de plotagem consome toda a memória RAM tentando renderizar vetores individuais.

O Datashader resolve isso rasterizando os dados. Em vez de desenhar pontos, ele calcula matematicamente quantos pontos caem em cada pixel da imagem final e aplica uma coloração baseada nessa contagem. O resultado é uma visualização rápida, precisa e esteticamente informativa.


Preparando o Ambiente de Desenvolvimento

Para replicar este projeto, recomenda-se o uso do Python 3.10 ou superior. A criação de um ambiente virtual (venv ou conda) é fortemente sugerida para isolar as dependências.

Instale a stack necessária:

pip install datashader pandas colorcet Pillow

Por que essas bibliotecas?

  • pandas: O padrão da indústria para manipulação de dados tabulares.
  • datashader: O motor de rasterização que permite visualizar grandes volumes de dados sem estourar a memória da GPU/CPU.
  • colorcet: Uma coleção de mapas de cores (colormaps) projetados para serem perceptualmente uniformes. Diferente de paletas comuns (como o “jet”), o colorcet garante que a mudança visual na cor corresponda fielmente à mudança numérica nos dados, evitando interpretações erradas.
  • Pillow: Biblioteca gráfica fundamental para manipulação e exportação de formatos de imagem (PNG, JPG).

Vamos importar as ferramentas:

import ftplib
from pathlib import Path

import datashader as ds
import pandas as pd
import colorcet

1. Estruturação do Projeto

A organização é vital em projetos de dados. Vamos definir um diretório dedicado para evitar poluir a raiz do projeto.

data_dir = Path("./data")
data_dir.mkdir(parents=True, exist_ok=True)

O uso de Path (da biblioteca pathlib) torna o código agnóstico ao sistema operacional, funcionando perfeitamente em Windows, Linux ou macOS.

2. Coleta Automatizada (Web Scraping via FTP)

Os dados do CNEFE são distribuídos por Unidade da Federação (UF) em arquivos compactados. Fazer o download manual de 27 arquivos é propenso a erros e tedioso. O script abaixo automatiza essa tarefa, conectando-se diretamente ao servidor do IBGE.

host = "ftp.ibge.gov.br"
base_path = "/Cadastro_Nacional_de_Enderecos_para_Fins_Estatisticos/Censo_Demografico_2022/Arquivos_CNEFE/CSV/UF/"

ftp = ftplib.FTP(host)
ftp.login()
ftp.cwd(base_path)
files = ftp.nlst()

for file in files:
    dest_filepath = data_dir / file
    if dest_filepath.exists():
        # Se já baixou antes, evita download desnecessário
        continue
    print("Downloading file", file)
    with open(dest_filepath, "wb") as f:
        ftp.retrbinary(f"RETR {file}", f.write)

ftp.quit()

Dica Pro: Se você estiver apenas testando o código ou possui banda de internet limitada, filtre a lista files antes do loop para baixar apenas um estado menor (ex: Sergipe ou Distrito Federal):

# Exemplo: baixar apenas arquivos do Rio de Janeiro e São Paulo
ufs_teste = ["35_SP.zip", "33_RJ.zip"]
files = [f for f in files if f in ufs_teste]

3. Ingestão e Tratamento dos Dados

O CNEFE é rico em atributos (logradouro, número, complemento, tipo de domicílio), mas para nosso mapa de densidade, precisamos apenas da geometria: Latitude e Longitude.

Ler apenas as colunas necessárias (usecols) é uma técnica crucial de otimização de memória.

def read(filepath: Path) -> pd.DataFrame:
    print("Reading file", filepath)
    return pd.read_csv(
        filepath,
        compression="zip",
        sep=";",
        usecols=["LATITUDE", "LONGITUDE"],
    )


data = pd.concat((read(f) for f in data_dir.iterdir()))
data

O DataFrame resultante deve se parecer com:

LATITUDE	LONGITUDE
0	-11.929664	-62.008948
1	-11.929603	-62.009245
2	-11.940629	-62.009117
3	-11.932965	-62.009762
4	-11.932970	-62.009826
...	...	...
1318882	-15.803320	-47.866987
1318883	-15.802822	-47.864225
1318884	-15.804660	-47.867167
1318885	-15.803315	-47.866745
1318886	-15.804223	-47.867065
111102875 rows × 2 columns

Otimização de Memória (Dtypes)

Ao lidar com o Brasil inteiro, o DataFrame resultante pode ocupar vários Gigabytes de RAM. Uma otimização simples, mas poderosa, é forçar os tipos de dados para float32 (precisão simples) em vez do padrão float64 (precisão dupla). Isso corta o uso de memória pela metade com impacto insignificante na precisão visual do mapa.

def read(filepath: Path) -> pd.DataFrame:
    print("Reading file", filepath)
    return pd.read_csv(
        filepath,
        compression="zip",
        sep=";",
        usecols=["LATITUDE", "LONGITUDE"],
        dtype={"LATITUDE": "float32", "LONGITUDE": "float32"},
    )

4. O Pipeline de Visualização com Datashader

O processo do Datashader funciona em três etapas lógicas:

  1. Canvas: Criação de uma grade abstrata (o tamanho da imagem em pixels).
  2. Aggregation: Projeção dos pontos nessa grade (contagem de pontos por pixel).
  3. Shading (Transfer Function): Mapeamento dos números da grade para cores visíveis.

Renderização Inicial

cvs = ds.Canvas(plot_width=3000, plot_height=3000)
agg = cvs.points(data, "LONGITUDE", "LATITUDE")
img = ds.tf.shade(agg, cmap=colorcet.fire, how="log")
img

image host

Entendendo os parâmetros:

  • plot_width/height: Define a resolução. 3000x3000px gera uma imagem de 9 Megapixels.
  • how="log": Isso é essencial para dados populacionais. A distribuição humana segue leis de potência (muitas pessoas em poucos lugares, poucas pessoas em muitos lugares). A escala logarítmica permite ver detalhes tanto no centro de São Paulo quanto em áreas rurais remotas na mesma imagem.
  • cmap=colorcet.fire: Uma paleta que vai do preto (fundo) ao amarelo/branco (alta densidade), simulando iluminação.

Exportação

Visualizar no notebook é ótimo, mas geralmente precisamos enviar a imagem para um relatório ou apresentação.

ds.utils.export_image(img, "cnefe-brasil", background="black", export_path=".")

image host

5. Alta Definição: Detalhes em Escala Continental

O verdadeiro poder do Datashader aparece quando aumentamos a resolução. Ao gerar uma imagem de 10.000 x 10.000 pixels (100 Megapixels), criamos um mapa onde é possível fazer zoom e distinguir ruas e bairros, mesmo cobrindo o país todo.

cvs = ds.Canvas(plot_width=10000, plot_height=10000)
agg = cvs.points(data, "LONGITUDE", "LATITUDE")
img = ds.tf.shade(agg, cmap=colorcet.fire, how="log")

Este processo é intensivo computacionalmente. Certifique-se de ter memória disponível.

ds.utils.export_image(img, "cnefe-brasil-highres", background="black", export_path=".")

image host

Análise Visual: Decifrando a “Impressão Digital” do Brasil

A imagem resultante do processamento com o Datashader não é apenas um mapa bonito; é uma representação fidelíssima da demografia brasileira, livre das fronteiras artificiais dos polígonos municipais. Ao observar o mapa de calor gerado (figura acima), onde a cor preta representa ausência de dados e o amarelo/branco representa densidade máxima, emergem padrões geográficos e sociológicos profundos:

1. A Ocupação Litorânea e o “Arquipélago”

A primeira observação imediata é a confirmação visual da histórica ocupação costeira do Brasil. Uma linha contínua de alta luminosidade (densidade) percorre quase todo o litoral, do Rio Grande do Sul ao Rio Grande do Norte. Isso evidencia que, mesmo séculos após a colonização, a infraestrutura e a população permanecem massivamente concentradas a poucos quilômetros do mar.

2. A Morfologia da Amazônia: Rios e Rodovias

A região Norte (canto superior esquerdo da imagem) apresenta o contraste mais fascinante. Ao contrário do “vazio” que mapas de polígonos sugerem, o CNEFE revela uma estrutura de ocupação dendrítica (em forma de galhos) e linear:

  • Rios como Ruas: É possível traçar visualmente o curso do Rio Amazonas e seus afluentes apenas pela sequência de pontos luminosos. As comunidades ribeirinhas formam “veias” de ocupação no meio da floresta.
  • O Padrão “Espinha de Peixe”: Em áreas de fronteira agrícola (como no sul do Pará e Rondônia), a ocupação não segue rios, mas sim rodovias. O mapa mostra linhas retas e rígidas cortando a escuridão, com pequenos ramais perpendiculares, denunciando o padrão de assentamentos ao longo de estradas e projetos de colonização.

3. A Macrometrópole Paulista e o Eixo Rio-SP

A área mais brilhante do mapa (no Sudeste) explode em tons de amarelo e branco. Aqui, o conceito de “cidade” desaparece. A imagem mostra uma conurbação massiva onde a Grande São Paulo, a Baixada Santista, o Vale do Paraíba e a Região Metropolitana do Rio de Janeiro parecem fundir-se numa única mancha urbana incandescente.

  • A “teia de aranha” que se irradia de São Paulo para o interior (Campinas, Ribeirão Preto) demonstra como as rodovias estaduais funcionam como vetores de urbanização, levando a densidade da capital para o interior do estado.

4. Ilhas de Densidade no Centro-Oeste

No centro do mapa, vemos pontos de luz isolados, mas intensos, cercados por vastas áreas de baixa densidade (vermelho escuro ou preto). Estes pontos correspondem a hubs como Brasília e Goiânia. A escuridão ao redor não significa necessariamente terra improdutiva, mas sim o modelo do agronegócio: grandes latifúndios mecanizados com baixíssima densidade populacional (poucos endereços por km²), contrastando com a agricultura familiar mais densa do Sul e Nordeste.

5. O Invisível Revelado

O que o mapa não mostra é tão importante quanto o que ele mostra. As grandes áreas negras, especialmente em Unidades de Conservação e Terras Indígenas, validam a eficácia (ou a falha, onde houver invasões visíveis) das políticas de proteção territorial. O Datashader permite, inclusive, fiscalizar visualmente se há “pontos de luz” (endereços) surgindo dentro de áreas que deveriam ser de preservação integral.


Esta análise visual só é possível graças à escala logarítmica (how="log") aplicada no código. Uma escala linear mostraria apenas os centros de SP e Rio, “apagando” as pequenas vilas da Amazônia e do Sertão, tornando-as invisíveis aos olhos.

Aplicações em Sustentabilidade

A categoria “Sustentabilidade” deste artigo não é por acaso. O CNEFE é uma ferramenta poderosa para o planeamento sustentável:

  1. Gestão de Resíduos: Mapear a densidade exata de domicílios permite otimizar rotas de coleta de lixo, reduzindo a pegada de carbono da frota.
  2. Saneamento Básico: Identificar aglomerados de endereços distantes das redes principais de água e esgoto.
  3. Resposta a Desastres: Em enchentes ou deslizamentos, saber exatamente quantos endereços (e potencialmente quantas pessoas) existem na área afetada é vital para o dimensionamento do socorro.

Conclusão e Próximos Passos

Neste artigo, transformamos arquivos CSV brutos em visualizações de alto impacto. O uso combinado de pandas para estruturação e datashader para renderização provou ser uma estratégia eficiente para lidar com a magnitude dos dados do CNEFE.

Para levar este projeto ao próximo nível, sugiro:

  • Segmentação: Utilize as colunas de “Tipo de Unidade” do CNEFE para criar mapas distintos: um para domicílios residenciais e outro para estabelecimentos comerciais/serviços.
  • Interatividade: Explore bibliotecas como Holoviews ou Bokeh, que permitem dar zoom dinâmico no navegador, recalculando a densidade em tempo real.
  • Cruzamento de Dados: Sobreponha os pontos do CNEFE com shapefiles de Unidades de Conservação ou Terras Indígenas para analisar pressões de ocupação.

Referências Bibliográficas e Recursos

  1. IBGE - Instituto Brasileiro de Geografia e Estatística. (2024). Cadastro Nacional de Endereços para Fins Estatísticos (CNEFE) - Censo Demográfico 2022. Disponível em: https://www.ibge.gov.br/estatisticas/sociais/populacao/38734-cadastro-nacional-de-enderecos-para-fins-estatisticos.html. Acesso em: 25 dez. 2025.
  2. COLORCET DEVELOPMENT TEAM. colorcet: Collection of perceptually accurate colormaps. Disponível em: https://colorcet.holoviz.org/. Acesso em: 25 dez. 2025.
  3. DATASHADER. Datashader: accurately render even the largest data. Disponível em: https://datashader.org/. Acesso em: 25 dez. 2025.
  4. PANDAS DEVELOPMENT TEAM. pandas: Python Data Analysis Library. Disponível em: https://pandas.pydata.org/. Acesso em: 25 dez. 2025.
  5. KOVESI, P. Good Colour Maps: How to Design Them. arXiv:1509.03700 [cs.GR], 2015. Disponível em: https://arxiv.org/abs/1509.03700. Acesso em: 25 dez. 2025.
  6. PILLOW. Pillow: Python Imaging Library (PIL Fork). Disponível em: https://pillow.readthedocs.io/en/stable/. Acesso em: 25 dez. 2025.