Código Python para tratamento de dados das planilhas PGV corrigido (700 pastas) e IPTU 2023 (3 planilhas por tributação obtidas no DATA.RIO)

O código Python realiza as seguintes ações:

  1. Importa a biblioteca pandas.
  2. Cria uma lista vazia chamada planilhas.
  3. Itera de 1 a 700, lendo cada planilha de um arquivo Excel chamado PGV 2018 - 2017-06-12 COM Bairros.xlsx, onde cada aba é nomeada como Sheet1Sheet2, …, Sheet700.
  4. Armazena cada planilha lida na lista planilhas.
  5. Concatena todas as planilhas da lista em um único DataFrame chamado df_total, ignorando índices originais.
  6. Salva o DataFrame consolidado em um novo arquivo Excel chamado PGV2018total.xlsx.

Após encontrar a tabela “Plantas Genéricas de Valores” em pdf e transformar em planilha Excel com 700 páginas, rodamos o código Python abaixo para concatenar todas as páginas da planilha em um único DataFrame.

planilhas = []

for i in range(1, 701):

  planilha = pd.read_excel(‘/content/drive/MyDrive/Python/PGV 2018 – 2017-06-12 COM Bairros.xlsx’, sheet_name=f’Sheet{i}’)

  planilhas.append(planilha)

df_total = pd.concat(planilhas, ignore_index=True)

df_total.to_excel(‘PGV2018total.xlsx’)

Após obter as planilhas contendo informações dos logradouros da cidade do Rio de Janeiro conforme seu tipo de uso (residencial, comercial ou territorial), com quantidade e áreas totais construídas, rodamos o código Python abaixo para concatenar todas as páginas da planilha em um único DataFrame.

O código Python executa as seguintes ações:

  1. Importação: Importa a biblioteca pandas.
  2. Leitura: Carrega todas as planilhas do arquivo Excel IPTU 2023 imóveis Rio de Janeiro.xlsx em um dicionário (planilhas).
  3. Concatenação: Une todas as planilhas verticalmente em um único DataFrame (df_concat), ignorando os índices originais.
  4. Salvamento: Exporta o DataFrame resultante para um novo arquivo Excel chamado iptu_2023_imoveis_rj_convertido.xlsx, sem incluir índices.
  5. Confirmação: Imprime a mensagem “Planilhas concatenadas com sucesso!”.

Código Python “Mesclar planilhas PGV corrigido e IPTU 2023”, corrigindo abreviações

O código Python realiza as seguintes ações:

  1. Importações: Usa pandas e unidecode para manipulação de dados e remoção de acentos.
  2. Mapeamento de Abreviaturas: Define um dicionário para substituir abreviações (ex.: ‘AVN’ por ‘Avenida’) em logradouros.
  3. Função de Limpeza: Cria limpar_logradouro, que substitui abreviações, remove acentos e converte logradouros para minúsculas, tratando valores nulos.
  4. Carregamento: Lê dois arquivos Excel: IPTU2023_M.xlsx (df_iptu) e PGV2024_IPCA-E-1,3774369768.xlsx (df_pgv).
  5. Limpeza: Aplica limpar_logradouro à coluna LOGRADOURO de ambos os DataFrames.
  6. Agrupamento: Calcula a média das colunas VRVN e V0 em df_pgv por logradouro, criando df_pgv_mean.
  7. Renomeação: Renomeia colunas de médias (VR_meanVN_meanV0_mean) para evitar conflitos.
  8. Mesclagem: Une df_iptu e df_pgv_mean pela coluna LOGRADOURO com merge à esquerda.
  9. Seleção de Valor: Usa a função escolher_valor para criar a coluna VALOR com base na coluna tributacao:
  • ‘R’ → VR_mean
  • ‘N’ → VN_mean
  • ‘T’ → V0_mean
  • Outros → None
  1. Salvamento: Exporta o DataFrame resultante para IPTU2023_M_com_valor.xlsx sem índices.

Código Python para teste de dados da planilha resultante da mesclagem através dos logradouros semelhantes e valores médios aplicados.

O código Python executa as seguintes ações:

  1. Importação: Usa a biblioteca pandas.
  2. Carregamento: Lê o arquivo Excel IPTU2023_M_com_valor.xlsx em um DataFrame (df_iptu_com_valor).
  3. Contagem de Nulos: Calcula o número de valores nulos na coluna VALOR usando isnull().sum().
  4. Exibição: Imprime:
  • O total de logradouros (linhas) no DataFrame.
  • O total de logradouros com valores nulos na coluna VALOR.

Foram contabilizados um total de 58.185 logradouros na planilha. Após a mesclagem de planilhas, calculando as médias para os diferentes valores de referência (Vr) aplicáveis para cada tipologia e logradouros similares, o resultado apresentou 17.701 logradouros com valores nulos na coluna VALOR, o que representa 30% dos logradouros.

Apesar de incluir e corrigir várias correlações possíveis, muitas abreviações constantes nas tabelas IPTU da DATA.RIO dificultaram a transposição dos valores.

O código Python realiza as seguintes ações:

  1. Importação: Usa a biblioteca pandas.
  2. Carregamento: Lê a aba Valores_teste do arquivo Excel PlanilhaIPTU_PGV_CensoRJ.xlsx em um DataFrame (df).
  3. Contagem por Bairro: Calcula o total de registros por bairro usando groupby('Bairro').size().
  4. Contagem de Nulos e Não Nulos:
  • Conta valores nulos na coluna VALOR por bairro.
  • Calcula valores não nulos subtraindo nulos do total.
  1. Cálculo de Percentuais:
  • Calcula o percentual de valores nulos (nulos / total * 100).
  • Calcula o percentual de valores não nulos (nao_nulos / total * 100).
  1. Criação de Novo DataFrame: Cria um DataFrame (novo_df) com colunas BairroPercentual de Nulos e Percentual de Não Nulos.
  2. Salvamento: Exporta o novo DataFrame para o arquivo Excel Novo_PlanilhaIPTU_PGV_CensoRJ.xlsx sem índices.

Tabela 1 – Teste de Valores Nulos

O código Python anterior calculou a quantidade de logradouros com valores de referência (Vr) nulos em relação ao total para verificar se a quantidade amostral foi suficiente após a mesclagem das tabelas PGV e IPTU.

No artigo Situação atual do IPTU no Rio de Janeiro e sua possível reforma[1], Pedro Humberto Bruno de Carvalho Júnior (IPEA), analisou as propostas de alteração da PGV que vigoravam desde 1997. Em 2012, “As isenções do IPTU foram bastante abrangentes em algumas principais cidades brasileiras. No Rio de Janeiro elas têm representado cerca de dois terços do cadastro desde 2000. Usando dados do Censo IBGE 2010, ele identificou a relação de 69% entre os imóveis recenseados pelo IBGE e aqueles cadastrados pela Prefeitura como residenciais e comerciais. No Censo IBGE 2000, essa relação foi de 64%.

Pedro Humberto destacou que “O fato do Rio de Janeiro aplicar uma depreciação de até 50% para todo o valor do imóvel residencial pode levar a sérias distorções e regressividade avaliatória, principalmente em imóveis antigos localizados nas áreas mais valoradas.”

Analisando as tabelas de isenção de IPTU, identificou que “os critérios de isenção ou redução de IPTU mais frequentes são para aposentados e pensionistas e para imóveis até determinado valor venal… Analisando-se os dados das cidades selecionadas, a proporção de isentos varia de apenas 8% em Manaus até 65% no Rio de Janeiro (o grifo é nosso). Curitiba e Belo Horizonte com 15% do cadastro isento são exemplos de poucas isenções. Por outro lado, São Paulo (40%) e Belém (54%) possui alta proporção de isentos.”

O artigo citado anteriormente, destaca que “O Rio de Janeiro isenta 65% dos imóveis no cadastro, porém essa situação existe devido a uma reforma tributária ocorrida em 1999 com a declaração de inconstitucionalidade do sistema de alíquotas progressivas (que passaram a ser permitidas somente mais tarde pela Emenda Constitucional nº 29 de 2000). Para não elevar abruptamente a carga tributária aos imóveis que antes eram aplicados as menores alíquotas do sistema progressivo, a solução encontrada foi conceder grandes descontos na avaliação imobiliária e no valor a ser pago de IPTU o que efetivamente isentou grande parte dos contribuintes.”.

As isenções e os descontos para o IPTU residencial eram tão significativos, que em 2011, os imóveis comerciais, apesar de perfazerem apenas 10% do cadastro, eram responsáveis por 60% da arrecadação.

O IPTU apresentava uma tendência de queda na arrecadação percentual das grandes cidades brasileiras, “em 2011, dentre as 12 cidades selecionadas, apenas São Paulo, Campinas, Campo Grande, Belo Horizonte e Rio de Janeiro, o IPTU tem representado pouco mais de 10% das Receitas Correntes, com tendência de queda. Em cidades como Brasília, Fortaleza e Manaus, o IPTU tem sido menos de 5% das receitas municipais.”.

IPTU no Rio de Janeiro (vigente em 2012)
Tipo de imóvelAlíquota
Imóvel edificado residencial1,2%
Imóvel edificado não residencial2,8%
Imóvel não edificado3,5%

No artigo Panorama do IPTU: um retrato da administração tributária em 53 cidades selecionadas, Pedro Humberto Bruno de Carvalho Júnior (IPEA) destaca que “Em relação à tributação média sobre os valores venais, a tributação territorial foi, aproximadamente, 3,2 vezes superior à tributação residencial e 2,2 vezes superior à não residencial.” O estudo apresentou os seguintes valores, referentes a 2012, para a cidade do Rio de Janeiro:

Tributação média sobre o valor venal residencial = 0,83

Tributação média sobre o valor venal não residencial = 1,82

Tributação média sobre o valor venal territorial = 1,91

Tributação média sobre o valor venal total = 1,30

No Censo IBGE de 2010[2], foram recenseados 2.408.891 domicílios particulares (DP) dos quais 260.475 estavam desocupados, para uma população de 6.320.446 habitantes na cidade do Rio de Janeiro. A média de moradores por domicílio particular ocupado era de 2,93.

No Censo IBGE de 2022[3], foram recenseados 2.439.321 domicílios particulares, dos quais 479.336 estavam desocupados (16,4%) para uma população de 6.211.223 habitantes na cidade do Rio de Janeiro.

          Em 2018, estimava-se que os imóveis comerciais possuíam a maior taxa de desocupação em torno de 35%. Os imóveis residenciais também tinham taxa de desocupação 12,5% em alguns meses do ano. Segundo especialistas do mercado imobiliário, o objetivo é uma taxa entre 8% a 10%.

Os resultados da análise revelam uma variação significativa no valor médio do IPTU em diferentes áreas da cidade.

A tabela IPTU possui 2.118.903 imóveis com diferentes tipologias distribuídas nos diversos bairros do Rio de Janeiro. Cabe ressaltar que alguns logradouros compreendem mais de um bairro.

Em 30/04/2024, a Prefeitura da cidade do Rio de Janeiro respondeu nossa LAI RIO-28629354-0, enviando o percentual de bairros isentos de pagamento de IPTU de 2018 a 2024.

As 2 tabelas abaixo demonstram os percentuais de imóveis isentos de pagamento por IPTU (a maioria devido ao cálculo do valor venal dos imóveis situarem-se abaixo do valor mínimo) por grupos de 25 bairros:

Além disso, em 30/04/2024, também respondeu a LAI RIO-28629414-8 informando os valores de IPTU e ITBI totais por bairros no período de 2018 a 2024.

Os dados compilados indicam uma desigualdade de geração de impostos pela Prefeitura do Rio de Janeiro. É possível sugerir que muitos moradores não pagam IPTU na cidade e que existe uma concentração de movimentação imobiliária na cidade.

Gráfico 1 – ITBI 2018 a 2024

O gráfico anterior demonstra os valores de ITBI obtidos nas vendas de imóveis nos 10 bairros que representam cerca de 2/3 (cerca de 65%) da arrecadação pela gestão municipal de 2018 a 2024.

O gráfico seguinte demonstra os valores de IPTU arrecadados pela Prefeitura do Rio de Janeiro dos imóveis nos 15 bairros que representam cerca de 2/3 (cerca de 70%) da arrecadação pela gestão municipal de 2018 a 2024.

Gráfico 2 – IPTU  2018 a 2024

          O Imposto sobre Transmissão de Bens Imóveis (ITBI) é um tributo brasileiro, de competência municipal baseado no artigo 156 da Constituição Federal, cobrada em transferências não gratuitas de imóveis. Em 2022, o STJ decidiu que a base de cálculo do ITBI deve ser o valor de mercado do imóvel, não o valor venal usado para IPTU.

Análise exploratória dos dados

Há situações em que as medidas de tendência central, como a média, a moda e a mediana, não são as mais adequadas para a análise de uma amostra de valores. Nesses casos, é necessário utilizar as medidas de dispersão como desvio-padrão e coeficiente de variação.

Código Python para cálculos estatísticos dos valores médios de IPTU por bairros

O código Python realiza as seguintes ações:

  1. Importação: Usa a biblioteca pandas.
  2. Carregamento: Lê a aba Censo2022RJ do arquivo Excel PlanilhaIPTU_PGV_CensoRJmapa.xlsx em um DataFrame (df).
  3. Seleção de Colunas: Extrai as colunas IPTU_NIPTU_R e IPTU_T em um novo DataFrame (data).
  4. Cálculos Estatísticos:
  • Calcula a média (mean), moda (mode), mediana (median), desvio padrão (std) e coeficiente de variação ((desvio_padrao / media) * 100) para as colunas selecionadas.
  1. Organização dos Resultados: Cria um DataFrame (estatisticas) com as métricas calculadas: MédiaModaMedianaDesvio Padrão e Coeficiente de Variação (%).
  2. Exibição: Imprime o DataFrame com os resultados estatísticos.

Após o cálculo de valores médios, mediana e desvio-padrão dos valores de IPTU, é possível identificar e avaliar alguns outliers (valores atípicos), especialmente em áreas mais nobres da cidade em relação ao tributo aplicado à grande maioria dos bairros.

 MédiaModa     MedianaDesvio PadrãoCoeficiente Variação (%)
IPTU_N 1320.62  0.0  679.08   2045.77154.90
IPTU_R  594.79  0.0  341.65    858.81144.38
IPTU_T 4557.54  0.0 1919.17   8895.58195.18

Uma visão geral sobre o comportamento individual das variáveis pode ser obtida através do gráfico de histograma. Este gráfico mostra a distribuição do conjunto de valores de uma variável. Os histogramas foram plotados utilizando o método hist() do pandas.

Código Python para gerar histograma dos IPTU médios por bairros

O código Python realiza as seguintes ações:

  1. Importações: Usa pandas para manipulação de dados e matplotlib.pyplot para visualização.
  2. Carregamento: Lê a aba Censo2022RJ do arquivo Excel PlanilhaIPTU_PGV_CensoRJmapa.xlsx em um DataFrame (df).
  3. Seleção de Colunas: Filtra as colunas BairroIPTU_NIPTU_R e IPTU_T.
  4. Agrupamento: Agrupa os dados por Bairro, somando os valores das colunas IPTU_NIPTU_R e IPTU_T.
  5. Criação do Histograma: Gera um gráfico de barras empilhadas (stacked bar) com os dados agrupados.
  6. Personalização do Gráfico:
  • Define o título como “Histograma de IPTU por Bairro”.
  • Rotula o eixo X como “Bairro” e o eixo Y como “Valor do IPTU”.
  • Configura o eixo Y com 5 marcações baseadas nos quantis (0, 25%, 50%, 75%, 100%) da soma total por bairro.
  1. Exibição: Mostra o gráfico gerado.

Gráfico 3 – Histograma de IPTU por Bairro

Em razão do grande número de bairros da cidade do Rio de Janeiro, foi necessário um agrupamento dos mesmos por região administrativa (RA) para se obter uma análise estatística mais ponderada para os 3 valores de IPTU entre as regiões e uma visualização gráfica mais compreensível para entender as razões para o desequilíbrio da cobrança de IPTU.

Código Python para cálculos estatísticos dos valores médios de IPTU por bairros

O código Python realiza as seguintes ações:

  1. Importações: Usa as bibliotecas pandas para manipulação de dados, matplotlib.pyplot e seaborn para visualização, e geopandas para dados geoespaciais (embora não seja utilizado no código fornecido).
  2. Carregamento: Lê a aba TabelaRA do arquivo Excel IPTU+ITBI-Isenções_2018-2024.xlsx em um DataFrame (dados).
  3. Inspeção de Dados:
  • Exibe as dimensões do DataFrame com dados.shape.
  • Mostra informações sobre as colunas (tipos de dados, valores nulos) com dados.info().
  1. Cálculo de Médias:
  • Calcula a média da coluna Média de IPTU_Não residencial, arredondada para 2 casas decimais.
  • Calcula a média da coluna Média de IPTU_Residencial, arredondada para 2 casas decimais.
  • Calcula a média da coluna Média de IPTU_Territorial, arredondada para 2 casas decimais.
  1. Estatísticas Descritivas: Gera um resumo estatístico (média, desvio padrão, mínimo, máximo, quartis) das colunas numéricas com dados.describe(), arredondado para 2 casas decimais.
Média de IPTU Não residencialMédia de IPTU ResidencialMédia de IPTU Territorial
count34.0034.0034.00
mean1692.75641.966019.71
std2465.06475.7711706.00
min114.2751.86276.42
25%649.86280.041518.37
50%1082.51502.903019.28
75%1874.45924.604987.92
max14537.472013.8369102.85

Código Python para gerar histograma dos IPTU médios por Regiões administrativas

O código Python realiza as seguintes ações:

  1. Importações: Usa pandas para manipulação de dados e matplotlib.pyplot para visualização.
  2. Carregamento: Lê a aba TabelaRA do arquivo Excel IPTU+ITBI-Isenções_2018-2024.xlsx em um DataFrame (dados).
  3. Seleção de Colunas: Filtra as colunas Regiões AdministrativasMédia de IPTU_Não residencialMédia de IPTU_Residencial e Média de IPTU_Territorial em dados_filtrados.
  4. Configuração do Índice: Define Regiões Administrativas como índice do DataFrame.
  5. Criação do Gráfico: Gera um gráfico de barras com as médias de IPTU por tipo e região, com tamanho 10×6 polegadas.
  6. Personalização:
  • Adiciona título: “Média de IPTU por tipo e Região Administrativa”.
  • Rotula o eixo X como “Regiões Administrativas” e o eixo Y como “Valor médio de IPTU”.
  1. Exibição: Mostra o gráfico gerado.

Gráfico 4 – Média de IPTU por tipo e Região Administrativa

# Histograma para IPTU_N

plt.title(‘Distribuição dos valores do Média de IPTU_Não residencial’, size=20) #definição do título

sns.histplot(data=dados, x=’Média de IPTU_Não residencial’, bins=34) # definição dos dados, a variavel e numero de colunas

Gráfico 5 – Distribuião dos valores do Média de IPTU_Não Residencial

# Histograma para IPTU_R

plt.title(‘Distribuição dos valores do Média de IPTU_Residencial’, size=20) #definição do título

sns.histplot(data=dados, x=’Média de IPTU_Residencial’, bins=34) # definição dos dados, a variavel e numero de colunas

Gráfico 6 – Distribuição dos valores do Média de IPTU Residencial

# Histograma para IPTU_T

plt.title(‘Distribuição dos valores do Média de IPTU_Territorial’, size=20) #definição do título

sns.histplot(data=dados, x=’Média de IPTU_Territorial’, bins=34) # definição dos dados, a variavel e numero de colunas

Gráfico 7 – Distribuição dos valores do Média de IPTU Territorial

O Teste de Shapiro-Wilk tem como objetivo avaliar se uma distribuição é semelhante a uma distribuição normal. A distribuição normal também pode ser chamada de gaussiana e sua forma assemelha-se a de um sino.

Código Python para teste Shapiro-Wilk entre as variáveis de IPTU

O código Python realiza as seguintes ações:

  1. Importações: Usa numpy para cálculos numéricos e scipy.stats para análises estatísticas.
  2. Teste de Normalidade: Aplica o teste de Shapiro-Wilk para verificar a normalidade das colunas:
  • Média de IPTU_Não residencial
  • Média de IPTU_Residencial
  • Média de IPTU_Territorial
  • Remove valores nulos (dropna()) antes de cada teste.
  1. Resultados: Armazena os resultados (estatística e p-valor) para cada variável.
  2. Exibição: Imprime os resultados do teste Shapiro-Wilk para cada coluna, mostrando:
  • A estatística do teste (arredondada a 4 casas decimais).
  • O p-valor (em notação científica com 4 casas decimais).

Nota: O código contém linhas comentadas que sugerem testes em colunas diferentes (IPTU_Não ResidencialIPTU_ResidencialIPTU_Territorial), mas apenas as colunas com “Média” são testadas.

Shapiro-Wilk test results:

IPTU_Não Residencial: statistic = 0.4997, p-value = 1.2592e-09

IPTU_Residencial: statistic = 0.9048, p-value = 6.1444e-03

IPTU_Territorial: statistic = 0.4043, p-value = 1.2739e-10

Portanto, P-valores menores que o nível de significância de 5%, rejeita-se H0, sugerindo que dados não seguem normalidade, especialmente para a grande diferença dos valores de IPTU cobrados para imóveis comerciais (não residenciais) e terrenos vazios (territoriais) entre diferentes bairros e regiões administrativas.

Embora alguns bairros da Região Oeste apresentem valores de IPTU médios residenciais relativamente maiores em relação à outras regiões mais valorizadas e com maior renda per capita, provavelmente ocorrem muitas isenções por conta da baixa renda dos proprietários e grandes descontos no valor de IPTU efetivamente cobrado devido à diferentes fatores que compõem o cálculo dos valores venais dos imóveis.


[1] https://www.e-publicacoes.uerj.br/index.php/cdf/article/view/30685, consultado em 08/04/2024.

[2] https://cidades.ibge.gov.br/brasil/rj/rio-de-janeiro/pesquisa/23/27652

[3] https://www.data.rio/datasets/PCRJ::censo-2022-popula%C3%A7%C3%A3o-e-domic%C3%ADlios-por-bairros-dados-preliminares/explore