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² (202607) |
|---|---|---|---|
| 2019 | 43 727 | R$ 3 703 | R$ 5 432 |
| 2020 | 45 055 | R$ 3 810 | R$ 5 407 |
| 2021 | 63 340 | R$ 4 065 | R$ 5 348 |
| 2022 | 49 668 | R$ 4 179 | R$ 5 024 |
| 2023 | 49 272 | R$ 4 453 | R$ 5 114 |
| 2024 | 58 694 | R$ 4 733 | R$ 5 211 |
| 2025 | 61 480 | R$ 5 000 | R$ 5 248 |
| 2026 | 29 339 | R$ 5 128 | R$ 5 189 |
Volume transacionado
| Ano | Negócios de mercado | Volume real (R$ bi) |
|---|---|---|
| 2019 | 73 087 | 72.6 |
| 2020 | 75 202 | 79.6 |
| 2021 | 103 287 | 101.9 |
| 2022 | 81 848 | 74.6 |
| 2023 | 79 715 | 74.7 |
| 2024 | 93 095 | 87.4 |
| 2025 | 96 783 | 89.9 |
| 2026 | 44 569 | 42.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 | 2 863 | R$ 8 983 |
| Moema | 2 835 | R$ 8 926 |
| Itaim Bibi | 4 284 | R$ 8 817 |
| Pinheiros | 2 235 | R$ 8 515 |
| Alto De Pinheiros | 526 | R$ 7 486 |
| Vila Mariana | 3 822 | R$ 7 333 |
| Consolacao | 1 718 | R$ 7 226 |
| Perdizes | 2 822 | R$ 6 951 |
| Campo Belo | 1 844 | R$ 6 928 |
| Vila Leopoldina | 860 | R$ 6 800 |
| Santo Amaro | 2 334 | R$ 6 711 |
| Barra Funda | 1 162 | R$ 6 534 |
| Bela Vista | 1 579 | R$ 6 393 |
| Lapa | 1 842 | R$ 6 222 |
| Saude | 2 683 | R$ 5 792 |
| Republica | 2 385 | R$ 5 758 |
| Ipiranga | 1 720 | R$ 5 659 |
| Santa Cecilia | 2 341 | R$ 5 513 |
| Liberdade | 1 248 | R$ 5 295 |
| Tatuape | 2 194 | R$ 5 245 |
| Cursino | 1 090 | R$ 5 239 |
| Mooca | 1 542 | R$ 5 074 |
| Butanta | 861 | R$ 5 070 |
| Grajau | 96 | R$ 4 992 |
| Agua Rasa | 1 006 | R$ 4 989 |
Á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.19× |
| 2024 | 1.23× |
| 2025 | 1.23× |
| 2026 | 1.21× |
Financiamento
| Ano | % financiado | LTV mediano |
|---|---|---|
| 2019 | 28.5% | 69.3% |
| 2020 | 32.9% | 72.7% |
| 2021 | 36.9% | 72.6% |
| 2022 | 33.1% | 72.2% |
| 2023 | 32.2% | 71.7% |
| 2024 | 35.2% | 71.3% |
| 2025 | 29.4% | 68.4% |
| 2026 | 35.8% | 71.9% |
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 29 017 negócios efetivamente agregados (tiers A e B, residenciais), a mediana de R$/m² passa de R$ 5 410 sem agregação para R$ 6 280 com agregação — uma diferença de +16.1%. 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 186 064 | R$ 5 018 |
| A | 38 688 | R$ 6 303 |
| C | 2 065 | R$ 2 177 |
| B | 1 046 | R$ 6 104 |
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 | 521 505 | 70.2% |
| sql_exact | 179 414 | 24.1% |
| street_nearest_number | 19 166 | 2.6% |
| block_centroid | 17 045 | 2.3% |
| street_in_block | 2 832 | 0.4% |
| setor_street_nearest | 2 432 | 0.3% |
| address_city | 336 | 0.1% |
| sql_no_dv | 288 | 0.0% |
| street_near_block | 90 | 0.0% |
| none | 30 | 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": 179413, "pct_lot_area_within_2pct": 99.68, "median_abs_area_diff_m2": 0.0}
concordância entre regras: {"n_compared": 163653, "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 | 187 129 | 14.50% |
| numero_placeholder | 132 498 | 10.26% |
| vvr_proporcional_zero | 38 326 | 2.97% |
| valor_transacao_nominal | 19 534 | 1.51% |
| identity_base_calculo_violated | 1 293 | 0.10% |
| proporcao_out_of_range | 183 | 0.01% |
| area_construida_building_level | 130 | 0.01% |
| valor_transacao_non_positive | 18 | 0.00% |
| data_transacao_missing | 12 | 0.00% |
| identity_vvr_proporcional_violated | 12 | 0.00% |
| cells_beyond_schema:AC | 6 | 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 — 25 ok · 1 avisos · 0 falhas
| Verificação | Status | Valor | Descrição |
|---|---|---|---|
| row_count | OK | 1290782 | curated transaction rows |
| row_uid_unique | OK | 1290782 | row_uid must uniquely identify a curated row |
| parse_reconciles | OK | 1290782 | every sheet's rows accounted for as header/blank/data |
| clean_row_conservation | OK | 1290782 | 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 | 1293 | 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 | 5753 | 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) |
| apartment_price_per_m2_plausible | OK | 4250.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 | 1285824 | 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 |
| enriched_matches_deals | OK | 1227863 | 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 | OK | 0 | no market sale escapes the outlier test for want of a peer group |
| outlier_share_reasonable | OK | 3.128 | 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 | 95.81 | 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.996 | share of distinct SQLs resolved to a coordinate |
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.