This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.
When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:
# Garante que o pacote sidrar está instalado e carregado
if (!require("sidrar")) install.packages("sidrar")
library(sidrar)
library(tidyverse)
library(lubridate)
# 1. Puxa o IPCA (Série histórica) direto do IBGE a partir de 2008
ipca_ibge <- get_sidra(
api = "/t/1737/n1/all/v/2266/p/all/d/v2266%2013"
)
## All others arguments are desconsidered when 'api' is informed
# 2. Trata os dados exatamente para o formato que você precisa
ipca_raw <- ipca_ibge %>%
mutate(
# Transforma o texto "janeiro 2008" em data real (2008-01-01)
date = ym(paste0(str_sub(`Mês (Código)`, 1, 4), "-", str_sub(`Mês (Código)`, 5, 6))),
value = Valor
) %>%
filter(date >= as.Date("2008-01-01")) %>%
select(date, value)
# 3. Executa a sua lógica exata de deflação
ipca_base <- ipca_raw %>%
rename(data_mes = date, ipca_valor = value) %>%
mutate(data_mes = floor_date(data_mes, "month")) %>%
distinct(data_mes, .keep_all = TRUE) %>%
mutate(deflator = last(ipca_valor) / ipca_valor) %>%
select(data_mes, deflator)
base_final <- base_completa %>%
mutate(data_mes = floor_date(data_trans, "month"),
ano = year(data_trans)) %>%
left_join(ipca_base, by = "data_mes") %>%
mutate(
deflator = coalesce(deflator, 1),
v_decl_real = v_decl * deflator,
v_base_real = v_base * deflator,
v_m2_real = v_decl_real / area
)
library(dplyr)
library(stringr)
# Aplicando diretamente na sua base concluída
base_final <- base_final %>%
mutate(
rua_do_imovel = str_extract(endereco_oficial, "^.*?(?=\\s?\\d)") %>% str_trim()
)
base_final <- base_final %>%
mutate(
rua_do_imovel = str_extract(endereco_oficial, "^.*?(?=\\s?\\d)") %>% str_trim()
)
resultados_modelagem <- base_final %>%
# Agrupamento refinado por rua e demais características
group_by(ano, bairro, rua_do_imovel, padrao_acabamento, tipo_imovel) %>%
# Cálculo do metro quadrado justo fixado no percentil 0.5
mutate(v_m2_justo = quantile(v_m2_real, probs = 0.5, na.rm = TRUE)) %>%
ungroup() %>%
# Aplicação das métricas financeiras e fiscais de mercado
mutate(
valor_mercado_justo = v_m2_justo * area,
itbi_devido_justo = valor_mercado_justo * 0.03,
itbi_pago_efetivo = pmax(v_decl_real, v_base_real, na.rm = TRUE) * 0.03,
prejuizo_cofres_publicos = pmax(0, itbi_devido_justo - itbi_pago_efetivo, na.rm = TRUE)
)
resultados_modelagem <- resultados_modelagem %>%
mutate(
# 2. O seu coeficiente de mercado (CoefBase)
# Aqui o cálculo é direto: quanto o mercado pagou vs quanto a PBH avaliou
coefdecl = v_m2_real/v_m2_justo
)
df <-resultados_modelagem %>% filter(coefdecl<0.67)
You can also embed plots, for example:
## Warning: pacote 'plotly' foi compilado no R versão 4.4.3
##
## Anexando pacote: 'plotly'
## O seguinte objeto é mascarado por 'package:httr':
##
## config
## O seguinte objeto é mascarado por 'package:ggplot2':
##
## last_plot
## O seguinte objeto é mascarado por 'package:stats':
##
## filter
## O seguinte objeto é mascarado por 'package:graphics':
##
## layout
## Warning in RColorBrewer::brewer.pal(max(N, 3L), "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors
## Warning in RColorBrewer::brewer.pal(max(N, 3L), "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors
## [1] "bairro" "custo" "ano" "mediana_m2"
## [1] 2015 2018 2019 2020 2021 2022 2023 2024 2025 2026 2008 2009 2011 2012 2013
## [16] 2010 2016 2017 2014
Note that the echo = FALSE parameter was added to the
code chunk to prevent printing of the R code that generated the
plot.
library(dplyr)
library(tidyr)
library(DT)
# 1. Base consolidada (a mesma de antes, mantendo a estrutura limpa)
df_base <- df_agrupado %>%
group_by(bairro, custo, ano) %>%
summarise(media_m2 = mean(mediana_m2, na.rm = TRUE), .groups = "drop") %>%
crossing(area = c(20, 100, 200)) %>%
mutate(preco_ano = media_m2 * area)
# 2. Função dinâmica focada no Ano Final
# O front-end envia apenas o ano_final desejado
calcular_tabela_por_ano_final <- function(df, ano_alvo, taxa_inflacao = 0.06) {
# Pegamos os dados do ano alvo
dados_alvo <- df %>% filter(ano == ano_alvo) %>%
select(bairro, custo, area, preco_final = preco_ano)
# Cruzamos com todos os anos anteriores para calcular a variação
df %>%
filter(ano < ano_alvo) %>%
left_join(dados_alvo, by = c("bairro", "custo", "area")) %>%
mutate(
tempo_posse = ano_alvo - ano,
# Ajuste pela inflação do custo inicial até o ano final
custo_corrigido = preco_ano * (1 + taxa_inflacao)^tempo_posse,
ganho_bruto = preco_final - custo_corrigido,
# Redução fiscal (10% a cada 4 anos)
fator_reducao = pmax(0.20, 1 - (floor(tempo_posse / 4) * 0.10)),
base_trib = pmax(0, ganho_bruto * fator_reducao),
# Impostos
ir_pago = base_trib * 0.15,
itbi = preco_final * 0.03,
# Resultado Líquido
ganho_liq = ganho_bruto - ir_pago - itbi,
ic_inf = ganho_liq * 0.95,
ic_sup = ganho_liq * 1.05
)
}
# --- Exemplo de uso no seu Front-end ---
# Ao selecionar 2026, você terá a tabela com todos os anos anteriores comparados
tabela_dinamica <- calcular_tabela_por_ano_final(df_base, ano_alvo = 2026)
datatable(
tabela_dinamica,
filter = 'top',
options = list(pageLength = 20, scrollX = TRUE)
)
## Warning in instance$preRenderHook(instance): It seems your data is too big for
## client-side DataTables. You may consider server-side processing:
## https://rstudio.github.io/DT/server.html