ITBI São Paulo — dataset e análise
Transações imobiliárias com recolhimento de ITBI na cidade de São Paulo, 2019–2026, extraídas das planilhas oficiais da Secretaria Municipal da Fazenda, limpas, agregadas em negócios e geocodificadas.
O preço real por m² caiu, mesmo com o preço nominal subindo.
A mediana nominal de R$/m² de apartamentos em condomínio subiu ao longo de 2019–2026, mas a inflação acumulada no período foi maior. Em reais constantes o apartamento mediano de São Paulo está mais barato hoje do que em 2019. Qualquer leitura da série nominal isolada inverte essa conclusão.
Preço por m² — apartamentos em condomínio
Série is_clean_price: compra e venda de 100% do imóvel, com valor
venal de referência, dentro dos limites absolutos e sem outliers contra o próprio
mercado local. Uso IPTU 20, área construída acima de 20 m². É a mesma definição
usada pelo explorador e pela CLI.
| Ano | Negócios | Nominal R$/m² | Real R$/m² (202609) |
|---|---|---|---|
| 2019 | 40 190 | R$ 3 846 | R$ 5 680 |
| 2020 | 41 528 | R$ 3 962 | R$ 5 649 |
| 2021 | 59 665 | R$ 4 194 | R$ 5 546 |
| 2022 | 46 394 | R$ 4 330 | R$ 5 231 |
| 2023 | 45 894 | R$ 4 611 | R$ 5 324 |
| 2024 | 55 178 | R$ 4 907 | R$ 5 428 |
| 2025 | 57 454 | R$ 5 179 | R$ 5 460 |
| 2026 | 44 041 | R$ 5 306 | R$ 5 374 |
Volume transacionado
| Ano | Negócios de mercado | Volume real (R$ bi) |
|---|---|---|
| 2019 | 73 399 | 73.4 |
| 2020 | 75 522 | 80.5 |
| 2021 | 104 816 | 105.0 |
| 2022 | 83 269 | 76.9 |
| 2023 | 80 920 | 76.8 |
| 2024 | 94 792 | 89.9 |
| 2025 | 98 186 | 93.0 |
| 2026 | 72 224 | 67.2 |
Preço por distrito
Apartamentos, negócios a partir de 2025, distritos com pelo menos 40 negócios (91 distritos qualificados).
Ver os 25 primeiros em tabela
| Distrito | Negócios | R$/m² real |
|---|---|---|
| Jardim Paulista | 3 270 | R$ 9 337 |
| Moema | 3 242 | R$ 9 156 |
| Itaim Bibi | 4 802 | R$ 9 044 |
| Pinheiros | 2 553 | R$ 8 703 |
| Alto De Pinheiros | 594 | R$ 7 715 |
| Vila Mariana | 4 461 | R$ 7 501 |
| Consolacao | 1 988 | R$ 7 457 |
| Perdizes | 3 264 | R$ 7 120 |
| Campo Belo | 2 031 | R$ 7 071 |
| Vila Leopoldina | 938 | R$ 6 896 |
| Santo Amaro | 2 632 | R$ 6 877 |
| Barra Funda | 1 244 | R$ 6 712 |
| Bela Vista | 1 785 | R$ 6 604 |
| Lapa | 2 053 | R$ 6 347 |
| Republica | 2 625 | R$ 6 044 |
| Saude | 3 095 | R$ 5 853 |
| Ipiranga | 1 905 | R$ 5 776 |
| Santa Cecilia | 2 643 | R$ 5 659 |
| Tatuape | 2 384 | R$ 5 506 |
| Liberdade | 1 450 | R$ 5 374 |
| Mooca | 1 664 | R$ 5 323 |
| Cursino | 1 242 | R$ 5 282 |
| Belem | 980 | R$ 5 183 |
| Grajau | 93 | R$ 5 180 |
| Morumbi | 746 | R$ 5 178 |
Ágio sobre o valor venal de referência
Razão entre o valor declarado e o valor venal de referência da Prefeitura. Serve como termômetro de mercado e também de pressão por subdeclaração.
| Ano | Valor declarado / valor venal de referência |
|---|---|
| 2019 | 1.13× |
| 2020 | 1.20× |
| 2021 | 1.31× |
| 2022 | 1.19× |
| 2023 | 1.20× |
| 2024 | 1.23× |
| 2025 | 1.24× |
| 2026 | 1.22× |
Financiamento
| Ano | % financiado | LTV mediano |
|---|---|---|
| 2019 | 28.4% | 69.3% |
| 2020 | 32.9% | 72.7% |
| 2021 | 36.6% | 72.6% |
| 2022 | 32.8% | 72.2% |
| 2023 | 31.9% | 71.6% |
| 2024 | 34.8% | 71.3% |
| 2025 | 29.2% | 68.4% |
| 2026 | 36.6% | 72.2% |
Agregação de transações — o que foi feito e o quanto importa
A fonte não tem identificador de negócio: cada linha é uma DTI de um único SQL. Um apartamento vendido com sua vaga são duas linhas sem nenhum vínculo explícito. A agregação é inferida em tiers, e cada negócio carrega o tier que o produziu.
O efeito sobre os negócios afetados
Nos 34 358 negócios efetivamente agregados (tiers A e B, residenciais), a mediana de R$/m² passa de R$ 5 527 sem agregação para R$ 6 404 com agregação — uma diferença de +15.9%. Somar a vaga ao valor sem somá-la à área é o que corrige o número.
O efeito sobre o agregado
No total da cidade o deslocamento é pequeno, porque só uma fração dos negócios é agregada. Isso é um resultado, não uma decepção: para estatística agregada a agregação quase não muda nada; para o preço de um imóvel específico muda muito. A política agressiva é mostrada apenas para quantificar o erro que ela cometeria.
| Política | Negócios | Agregados | Maior grupo | R$/m² mediano | vs. sem agregação |
|---|---|---|---|---|---|
| no_merge | 444 541 | 0 | 1 | R$ 4 667 | +0.00% |
| A | 428 729 | 11 668 | 41 | R$ 4 709 | +0.90% |
| A+B | 428 254 | 12 019 | 41 | R$ 4 710 | +0.92% |
| A+B+C | 426 945 | 12 527 | 100 | R$ 4 710 | +0.92% |
| aggressive | 301 636 | 53 245 | 542 | R$ 4 750 | +1.78% |
Precisão medida em amostra rotulada
Amostra estratificada de grupos reais, rotulada manualmente a partir de complemento, uso, valores, áreas e proximidade de matrícula. A matrícula é um sinal independente: o algoritmo de agregação nunca a consulta.
| Grupo | Rotulados | Mesma transação | Não | Incerto | Precisão |
|---|---|---|---|---|---|
| A | 14 | 14 | 0 | 0 | 100% |
| B | 9 | 9 | 0 | 1 | 100% |
| C | 6 | 6 | 0 | 2 | 100% |
| REFUSED:launch_guard_multi_main | 6 | 0 | 6 | 0 | 0% recusa indevida |
Corroboração independente pela matrícula
Matrículas das unidades de um mesmo prédio são abertas em bloco, e as unidades transferidas na mesma escritura ficam próximas nesse bloco. O algoritmo de agregação nunca consulta a matrícula, então ela é uma evidência independente. Comparamos pares principal+acessório que foram agregados contra pares principal+acessório do mesmo prédio que não foram.
| Pares | N | Distância mediana de matrícula | p90 | Até 50 |
|---|---|---|---|---|
| Agregados pelo matcher (tiers A e B) | 53 357 | 5 | 954 | 64.4% |
| Mesmo prédio, não agregados (nulo) | 200 000 | 1 171 | 48 119 | 9.7% |
Pares agregados ficam 234× mais próximos no registro do que pares não agregados no mesmo prédio (mediana 5 contra 1 171). Se a agregação fosse arbitrária as duas distribuições coincidiriam.
Distribuição por tier
| Tier | Negócios | R$/m² real mediano |
|---|---|---|
| SINGLE | 1 241 344 | R$ 5 034 |
| A | 41 089 | R$ 6 430 |
| C | 2 136 | R$ 2 184 |
| B | 1 250 | R$ 6 181 |
Geocodificação
Cada SQL é resolvido para uma coordenada pela camada de lotes do GeoSampa, em ordem decrescente de confiança. Unidades de condomínio não têm polígono próprio — o prédio aparece como lote 0000 com código de condomínio — então elas são resolvidas por endereço dentro do próprio setor/quadra.
| Regra | SQLs | % |
|---|---|---|
| condo_address | 542 666 | 70.5% |
| sql_exact | 185 894 | 24.1% |
| street_interpolated | 11 563 | 1.5% |
| condo_address_key | 10 886 | 1.4% |
| street_nearest_number | 8 157 | 1.1% |
| street_in_block | 2 860 | 0.4% |
| condo_address_iptu | 2 571 | 0.3% |
| setor_street_nearest | 2 186 | 0.3% |
| block_centroid | 1 742 | 0.2% |
| street_nearest_key | 549 | 0.1% |
| address_city | 328 | 0.0% |
| sql_no_dv | 296 | 0.0% |
| street_in_block_key | 49 | 0.0% |
| none | 43 | 0.0% |
| street_near_block | 6 | 0.0% |
Validação independente
A área do lote registrada pelo GeoSampa é comparada com a área do lote registrada na própria planilha do ITBI, e SQLs resolvíveis por duas regras diferentes são comparados por distância.
área do lote: {"n_compared": 185893, "pct_lot_area_within_2pct": 99.69, "median_abs_area_diff_m2": 0.0}
concordância entre regras: {"n_compared": 170183, "median_distance_m": 0.0, "p90_distance_m": 0.0, "pct_within_100m": 99.96}
Qualidade dos dados
Nada é descartado silenciosamente: linhas problemáticas são mantidas e sinalizadas, e a contagem de cada flag é recalculada a cada execução.
| Flag de qualidade | Linhas | % do total |
|---|---|---|
| area_construida_zero | 198 687 | 14.69% |
| numero_placeholder | 140 602 | 10.40% |
| vvr_proporcional_zero | 39 967 | 2.96% |
| valor_transacao_nominal | 20 168 | 1.49% |
| identity_base_calculo_violated | 1 321 | 0.10% |
| proporcao_out_of_range | 186 | 0.01% |
| area_construida_building_level | 133 | 0.01% |
| valor_transacao_non_positive | 18 | 0.00% |
| data_transacao_missing | 13 | 0.00% |
| identity_vvr_proporcional_violated | 13 | 0.00% |
| cells_beyond_schema:AC | 7 | 0.00% |
| ano_construcao_implausible | 5 | 0.00% |
| cep_outside_sao_paulo | 3 | 0.00% |
| header_text_in_cell:complemento | 3 | 0.00% |
| acc_recovered_from_column_ac | 2 | 0.00% |
| header_text_in_cell:sql | 1 | 0.00% |
| sql_missing | 1 | 0.00% |
Verificações automáticas — 31 ok · 2 avisos · 0 falhas
| Verificação | Status | Valor | Descrição |
|---|---|---|---|
| row_count | OK | 1352376 | curated transaction rows |
| row_uid_unique | OK | 1352376 | row_uid must uniquely identify a curated row |
| parse_reconciles | OK | 1352376 | every sheet's rows accounted for as header/blank/data |
| clean_row_conservation | OK | 1352376 | no row silently lost between parse and curated table |
| sql_length | OK | 0 | every SQL is exactly 11 digits after zero-padding |
| sql_present | WARN | 1 | rows with no cadastral number (source contamination) |
| setor_092_absent | OK | 0 | the data dictionary states setor 092 does not exist |
| base_calculo_identity | OK | 1321 | base_calculo = max(valor, vvr_proporcional), excluding excess-tax naturezas |
| no_future_dates | OK | 0 | transaction dates in the future |
| guia_not_long_before_transaction | OK | 4 | guia paid more than a month before the deed date |
| guia_lag_bounded | OK | 5946 | guia paid more than two years after the deed date |
| guia_months_complete | OK | 1 | each source year should carry 12 guia months (current year excepted) |
| old_months_unchanged | OK | 0 | guia months already published keep their rows and value within 1% (a republished workbook should only add months) |
| apartment_price_per_m2_plausible | OK | 4286.0 | median R$/m2 for condominium apartments across 2019-2026 |
| price_series_no_implausible_drop | OK | 0 | nominal median R$/m2 should not fall more than 10% year on year |
| deal_row_conservation | OK | 1347324 | every canonical transaction row belongs to exactly one deal |
| launch_guard_holds | OK | 0 | no deal may contain two or more main units |
| no_row_in_two_deals | OK | 0 | a transaction row may not appear in more than one deal |
| deal_values_non_negative | OK | 0 | deal totals >= 0 |
| partial_accessory_keeps_market_sale | OK | 0 | market flat sales dropped only because a garage share was bought with them |
| enriched_matches_deals | OK | 1285819 | the enriched table has exactly one row per deal |
| enriched_deal_id_unique | OK | 0 | the geocode join must not multiply rows |
| every_market_deal_judged | WARN | 6227 | no market sale escapes the outlier test for want of a peer group |
| outlier_share_reasonable | OK | 3.059 | share of market sales flagged as price outliers |
| clean_series_within_bounds | OK | 0 | the clean price series respects its own absolute bounds |
| coords_inside_sao_paulo | OK | 0 | every geocoded point falls inside the municipal bounding box |
| geocode_assigned_precision | OK | 99.35 | share of SQLs whose ASSIGNED precision estimate is <= 100 m (a label from the rule that resolved them, not a measurement) |
| geocode_coverage | OK | 99.9944 | share of distinct SQLs resolved to a coordinate |
| predio_condominio | OK | 0 | vendas num pedaço de condomínio que não foram para o prédio principal (deve ser 0) |
| predio_condominio_ouro | OK | 8 | casos conferidos à mão de prédio = condomínio |
| predio_fantasma_residuo | OK | 1137 | endereços que parecem pedaço de outro número sem prova de condomínio no IPTU (só medida) |
| h9_faixa_c | OK | 12068 | vendas residenciais de mercado com price_flag faixa_c (H9; esperado 1–3%) |
| h9_sem_venal | OK | 3833 | vendas residenciais de mercado sem venal aceitas pela quadra (H9; esperado 0,3–1,5%) |
Ressalvas
A fonte identifica a transação pela guia paga, não pela escritura: a aba mensal da planilha é o mês de pagamento, e a data de transação pode ser bem anterior. Todas as séries aqui usam a data de transação.
Valores são declarados pelo contribuinte. Subdeclaração existe e o ágio sobre o valor venal de referência é um indicador indireto dela.
Unidades de lançamento ainda não individualizadas aparecem com uso “terreno” e, às vezes, com a área construída do prédio inteiro; essas linhas são sinalizadas e excluídas das estatísticas de preço.
A área construída é a do cadastro do IPTU. Em condomínio ela é a fração ideal aplicada à área construída total do empreendimento — o rateio das áreas comuns vem incluído — e por isso é maior que a área privativa dos anúncios: na R. Canário 130, 675–789 m² no cadastro contra 406–463 m² anunciados, um fator de ~1,6. O R$/m² daqui sai menor que o R$/m² “privativo” dos portais; a comparação entre imóveis dentro da base permanece consistente.
Nomes de compradores e vendedores não são divulgados, o que torna impossível provar que duas linhas pertencem ao mesmo negócio. Daí a estrutura em tiers.