R Markdown

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)

Including Plots

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