Introdução

é um pacote de software que busca facilitar a prática da Engenharia de Avaliações com a utilização de software livre, conforme as recomendações da NBR 14.653-02 (2011).

A confecção deste pacote também busca facilitar o ensino da Engenharia de Avaliações, assim como da Ciência Estatística aos novos avaliadores, já que atualmente o ensino normalmente depende da utilização de um software comercial, haja vista as dificuldades para tratamento dos dados, ajuste de modelos e verificações das hipóteses básicas com a utilização das planilhas eletrônicas comuns.

Foi escolhida a linguagem devido à facilidade de programação nesta linguagem, à disponibilidade de uma infinidade de métodos e testes estatísticos pré-programados e à disponibilidade de poderosas ferramentas gráficas dentro do ambiente , seja através dos gráficos do pacote básico, seja através dos gráficos gerados com os pacotes (WICKHAM, 2016) e (SARKAR, 2008).

Conjuntos de dados disponíveis

Foram disponibilizados alguns conjuntos de dados visando possibilitar a confecção de testes dos algoritmos implementados, bem como a avaliação da possibilidade de aplicação de novos métodos estatísticos na Engenharia de Avaliações. Foram acrescentados ainda dados de novos trabalhos visando garantir a sua reprodutibilidade técnica.

Desta forma, procura-se acrescentar, sempre que possível, dados de trabalhos mais novos produzidos pelo Grupo de Pesquisa em Engenharia de Avaliações e Perícias da UFSC (GEAP/UFSC) no Programa de Pós-Graduação em Engenharia de Transportes e Gestão Territorial (PPGTG) (ver ZILLI, 2020) assim como dados de trabalhos anteriores produzidos ainda no Programa de Pós-Graduação em Engenharia Civil (TRIVELLONI, 2005).

Quando disponíveis as coordenadas dos pontos, os dados são disponibilizados como um objeto do tipo sf (simple features), do pacote (PEBESMA, 2018), o que visa facilitar a confecção de mapas com os dados e análises geoespaciais.

Um destes é um conjunto de 50 dados de apartamentos em Florianópolis (HOCHHEIM, 2015), que será utilizado neste texto, fins de demonstrar o funcionamento do pacote.

dados <- centro_2015
dados <- within(dados, VU <- valor/area_total)

Como os dados estão geoespacializados é possível confeccionar um simples mapa com o auxílio do pacote (CHENG et al., 2019), como pode ser visto na Figura , onde os círculos tem tamanhos proporcionais aos valores unitários dos imóveis e cores representando os padrões de acabamento de cada um (baixo padrão em vermelho, médio padrão em laranja e alto padrão em amarelo).

library(leaflet)
dados <- st_transform(dados, 4326)
factpal <- colorFactor(heat.colors(3), dados$padrao)
m <- dados %>% 
  leaflet() %>% 
  addWMSTiles(baseUrl = "http://sigsc.sc.gov.br/sigserver/SIGSC/wms", 
              layers = list("OrtoRGB-Landsat-2012"))%>% 
  addCircleMarkers(radius = ~VU/1000, color = ~factpal(padrao))
Espacialização dos dados sobre ortofotos do Estado de Santa Catarina.

Espacialização dos dados sobre ortofotos do Estado de Santa Catarina.

Os modelos podem ser ajustados com as variáveis qualitativas na forma de caracteres ou fatores (situação em que o automaticamente as transforma em variáveis dicotômicas em grupo para o ajuste do modelo).

Por uma questão de compatibilidade com o exemplo disponível em Hochheim (2015), no entanto, efetua-se a transformação da variável qualitativa padrao para o formato código alocado (numérico):

dados <- within(dados, padrao <- as.numeric(padrao))

Análise exploratória de dados

Em relação à análise exploratória de dados, a NBR 14.653-2 (2011) recomenda, em seu item A.2.1.1:

Recomenda-se ser analisado, primeiramente, o comportamento gráfico da variável dependente em relação a cada variável independente, em escala original. Isto pode orientar o avaliador na transformação a adotar.

plt <- plotdf(valor ~ area_total + quartos + suites + garagens +
                dist_b_mar + padrao, data = dados)
print(plt)
Comportamento gráfico da variável dependente em relação a cada variável independente, em escala original.

Comportamento gráfico da variável dependente em relação a cada variável independente, em escala original.

Neste mesmo item, a NBR 14.653-02 ainda recomenda que:

As transformações utilizadas para linearizar o modelo devem, tanto quanto possível, refletir o comportamento do mercado, com preferência pelas transformações mais simples de variáveis, que resultem em modelo satisfatório. Após as transformações realizadas, se houver, examina-se a linearidade do modelo, pela construção de gráficos dos valores observados para a variável dependente versus cada variável independente, com as respectivas transformações.

plt1 <- plotdf(log(valor) ~ area_total + quartos + suites + garagens + 
                 log(dist_b_mar) + I(1/padrao), data = dados)
print(plt1)
Comportamento gráfico da variável dependente em relação a cada variável independente, com respectivas transformações.

Comportamento gráfico da variável dependente em relação a cada variável independente, com respectivas transformações.

Seleção de modelos

A seleção de modelos pode ser feita através da função bestfit, fornecendo-se uma fórmula com as variáveis desejadas, sem qualquer transformação (o algoritmo se encarrega de testar as transformações). As transformações a serem testadas são fornecidas pelo argumento transf. Também é possível remover outliers e/ou pontos influenciantes através do argumento subset. Dados amostrais com alguma informação faltante serão automaticamente removidos.

Em alguns conjuntos de dados, como este em análise, os dados para os bens-avaliandos são incluídos no próprio conjunto de dados, sem a informação de valor. Estes dados, portanto, não são utilizados na confecção do modelo.

best_fits <- bestfit(valor~area_total + quartos + suites + garagens + 
                       dist_b_mar + padrao, data = dados,
                     transf = c("rec", "rsqrt", "log", "sqrt"),
                     subset = -c(31, 39))

O pacote gera um objeto da classe bestfit.

class(best_fits)
## [1] "bestfit"

Uma vez feitas as combinações de transformações, elas podem ser vistas no console do , ordenadas pelo critério do maior \(R^2_{ajustado}\):

print(best_fits)
## Call:
## bestfit(formula = valor ~ area_total + quartos + suites + garagens + 
##     dist_b_mar + padrao, data = dados, subset = -c(31, 39), transf = c("rec", 
##     "rsqrt", "log", "sqrt"))
## 
## Best 10 fits:
##       id valor area_total quartos   suites garagens dist_b_mar padrao    adj_R2
## 5593   1 rsqrt       sqrt   rsqrt identity     sqrt      rsqrt    rec 0.9571809
## 5588   2 rsqrt       sqrt   rsqrt identity     sqrt        rec    rec 0.9571217
## 11843  3 rsqrt       sqrt   rsqrt     sqrt     sqrt      rsqrt    rec 0.9571084
## 5218   4 rsqrt        log   rsqrt identity     sqrt      rsqrt    rec 0.9570525
## 5568   5 rsqrt       sqrt     rec identity     sqrt      rsqrt    rec 0.9569846
## 11838  6 rsqrt       sqrt   rsqrt     sqrt     sqrt        rec    rec 0.9569357
## 5563   7 rsqrt       sqrt     rec identity     sqrt        rec    rec 0.9569192
## 11818  8 rsqrt       sqrt     rec     sqrt     sqrt      rsqrt    rec 0.9567659
## 5219   9 rsqrt        log   rsqrt identity     sqrt      rsqrt  rsqrt 0.9566598
## 5193  10 rsqrt        log     rec identity     sqrt      rsqrt    rec 0.9566553
## ...

Foi desenvolvido um método summary para os objetos da class bestfit, que, por padrão, imprime no console um sumário do modelo mais ajustado:

summary(best_fits)
## Call:
## bestfit(formula = valor ~ area_total + quartos + suites + garagens + 
##     dist_b_mar + padrao, data = dados, subset = -c(31, 39), transf = c("rec", 
##     "rsqrt", "log", "sqrt"))
## 
## Best (Chosen) Transformations:
##      id valor area_total quartos   suites garagens dist_b_mar padrao    adj_R2
## 5593  1 rsqrt       sqrt   rsqrt identity     sqrt      rsqrt    rec 0.9571809
## 
## Best (Chosen) fit LM summary:
##                        Estimate   Std. Error   t value   Pr(>|t|) signif
## (Intercept)        1.396969e-03 1.174218e-04 11.897014 7.0720e-15    ***
## sqrt(area_total)  -2.247445e-05 4.941773e-06 -4.547851 4.7388e-05    ***
## rsqrt(quartos)     6.727862e-04 1.079289e-04  6.233604 2.0127e-07    ***
## identity(suites)  -3.000932e-05 1.795598e-05 -1.671272    0.10228     **
## sqrt(garagens)    -2.889276e-04 3.970770e-05 -7.276361 6.7302e-09    ***
## rsqrt(dist_b_mar) -2.863179e-03 4.625967e-04 -6.189362 2.3266e-07    ***
## rec(padrao)        3.829555e-04 6.231043e-05  6.145929 2.6824e-07    ***
## ---
##  Signif. codes:  0 ‘***’ 0.10 ‘**’ 0.20 ‘*’ 0.30 ‘ ’ 1
## NBR-14.653-2 check:
## Number of market data used:
## [1] "n = 48 >= 42 --> Grau III"
## Max significance level allowed for each predictor:
## [1] "10% < t máximo = 10.23 % < 20% --> Grau II"
## Max significance level allowed for F-test:
## [1] "p-valor F = 1.22e-25 % < 1% --> Grau III"

Pode-se escolher, no entanto, qualquer modelo da lista, através da adição do argumento fit, fornecendo o número do modelo desejado. No entanto, é sabido que pode não ser tarefa fácil encontrar um modelo adequado em meio a tantas transformações3.

Recomenda-se, portanto, tentar encontrar a transformação mais adequada para a variável dependente através da análise do gráfico do perfil de log-verossimilhança das possíveis transformações com a família de Box-Cox, como, aliás, já recomenda a própria NBR 14.653-02 (2011, p. A.2.1.1):

Existem formas estatísticas de se buscar a transformação mais adequada, como, por exemplo, os procedimentos de Box e Cox.

No , isto pode ser feito facilmente através da utilização da função boxCox do pacote (FOX; WEISBERG, 2019), como abaixo:

library(car)
fit <- lm(valor ~ area_total + quartos + suites + garagens + dist_b_mar + padrao, 
          data = dados)
s <- summary(fit)
boxCox(fit)
Perfil da Log-Verossimilhança do parâmetro $\lambda$ da família de Box-Cox

Perfil da Log-Verossimilhança do parâmetro \(\lambda\) da família de Box-Cox

A partir da análise da Figura , pode-se restringir a busca aos modelos que utilizam a transformação logarítmica à variável dependente, já que \(\lambda = 0\) ([-0,1; 0,3] @95%).

A tabelas das transformações aplicadas a cada variável do modelo fica armazenada sob o nome de tabs dentro do objeto.

names(best_fits)
## [1] "adj.R2"       "tab"          "call"         "subset"       "combinations"
## [6] "response"     "predictors"   "newdata"

Por exemplo, pode-se selecionar apenas os modelos cuja transformação da variável resposta foi a transformação logaritmica.

options(digits = 3)
df <- best_fits$tab
logs <- df[which(df$valor == "log"), ]
head(logs)
##       id valor area_total  quartos   suites garagens dist_b_mar padrao adj_R2
## 3869 130   log   identity     sqrt identity     sqrt      rsqrt  rsqrt  0.953
## 3868 137   log   identity     sqrt identity     sqrt      rsqrt    rec  0.953
## 3867 141   log   identity     sqrt identity     sqrt      rsqrt    log  0.953
## 3768 151   log   identity identity identity     sqrt      rsqrt    rec  0.953
## 3863 152   log   identity     sqrt identity     sqrt        rec    rec  0.953
## 3769 156   log   identity identity identity     sqrt      rsqrt  rsqrt  0.953

Pode-se, então, selecionar o sumário de um modelo diferente, através da escolha apropriada do id na tabela acima.

summary(best_fits, fit = 514)
## Call:
## bestfit(formula = valor ~ area_total + quartos + suites + garagens + 
##     dist_b_mar + padrao, data = dados, subset = -c(31, 39), transf = c("rec", 
##     "rsqrt", "log", "sqrt"))
## 
## Best (Chosen) Transformations:
##      id valor area_total  quartos   suites garagens dist_b_mar padrao adj_R2
## 633 514   log   identity identity identity identity        log    rec   0.95
## 
## Best (Chosen) fit LM summary:
##                      Estimate Std. Error t value Pr(>|t|) signif
## (Intercept)          13.56386   0.230495   58.85   <2e-16    ***
## identity(area_total)  0.00147   0.000288    5.11    8e-06    ***
## identity(quartos)     0.16357   0.035356    4.63    4e-05    ***
## identity(suites)      0.06096   0.033686    1.81     0.08    ***
## identity(garagens)    0.20873   0.033416    6.25    2e-07    ***
## log(dist_b_mar)      -0.14072   0.027197   -5.17    6e-06    ***
## rec(padrao)          -0.56284   0.105001   -5.36    3e-06    ***
## ---
##  Signif. codes:  0 ‘***’ 0.10 ‘**’ 0.20 ‘*’ 0.30 ‘ ’ 1
## NBR-14.653-2 check:
## Number of market data used:
## [1] "n = 48 >= 42 --> Grau III"
## Max significance level allowed for each predictor:
## [1] "t máximo = 7.77 %  < 10% --> Grau III"
## Max significance level allowed for F-test:
## [1] "p-valor F = 3.25e-24 % < 1% --> Grau III"

Diagnósticos

Uma das vantagens de utilizar o é que existem diversos pacotes com funções disponíveis para elaborar uma série de diagnósticos sobre os modelos de avaliação ajustados.

Abaixo ilustramos alguns testes de normalidade previstos pela NBR 14.653-02:

# Modelo adotado (514)
fit <- summary(best_fits, fit = 514)$fit

Normalidade

Existem diversos pacotes com funções para a verificação da normalidade, dentre os quais destacam-se os pacotes (GROSS; LIGGES, 2015) e . (GAVRILOV; PUSEV, 2014)

library(nortest)
library(normtest)
  1. Teste do \(\chi^2\):
## 
##  Pearson chi-square normality test
## 
## data:  resid(fit)
## P = 5, p-value = 0.7
  1. Teste de Jarque-Bera:
## 
##  Jarque-Bera test for normality
## 
## data:  resid(fit)
## JB = 0.7, p-value = 0.7

Alguns testes não previstos no texto normativo, porém de grande poder, também estão disponíveis, como o teste de Shapiro-Wilk (RAZALI; WAH, 2011).

  1. Shapiro-Wilk:
## 
##  Shapiro-Wilk normality test
## 
## data:  resid(fit)
## W = 1, p-value = 0.9
  1. Teste K-S (Kolgomorov-Smirnov) (HARRIS, 2015)
KS(fit)
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  rstandard(fit)
## D = 0.05, p-value = 1
## alternative hypothesis: two-sided
Curva da função de distribuição acumulada (FDA) empírica

Curva da função de distribuição acumulada (FDA) empírica

  1. Histograma
res <- data.frame(residuals = rstandard(fit))
ggplot(res, aes(residuals)) + 
  geom_histogram(aes(y = ..density..), bins = 6) + 
  stat_function(fun = dnorm,
                args = list(mean = mean(res$residuals), sd = sd(res$residuals)),
                lwd = 2, col = 'red')
Histograma dos resíduos padronizados

Histograma dos resíduos padronizados

Homoscedasticidade

Também alguns testes de verificação da homoscedasticidade podem ser facilmente aplicados, como o teste de Breusch-Pagan, através do pacote (ZEILEIS; HOTHORN, 2002):

library(lmtest)
bptest(fit)
## 
##  studentized Breusch-Pagan test
## 
## data:  fit
## BP = 6, df = 6, p-value = 0.4

A detecção da heteroscedasticidade, no entanto, pode ser difícil através da simples aplicação de testes (ver ZONATO et al., 2020). A análise dos gráficos dos resíduos vs. valores previstos é mais adequada na maioria das vezes. A linguagem ainda é reconhecida pela alta qualidade dos gráficos que podem ser produzidos com ela. Os gráficos padrão para diagnóstico dos modelos de regressão linear, por exemplo, podem ser vistos na Figura abaixo:

plot(fit, which = 1:6)
Diagnóstico do modelo de regressão adotado.Diagnóstico do modelo de regressão adotado.Diagnóstico do modelo de regressão adotado.Diagnóstico do modelo de regressão adotado.Diagnóstico do modelo de regressão adotado.Diagnóstico do modelo de regressão adotado.

Diagnóstico do modelo de regressão adotado.

Além dos testes já existentes no , procurou-se criar funções que auxiliem na verificação da razoabilidade dos modelos ajustados, conforme solicita a NBR 14.653-02.

Além da verificação da homoscedasticidade, saliente-se, é possível4 também a utilização do modelo com segurança através do emprego de erros robustos (ver ZONATO et al., 2018), o que é possível no , através do pacote (ZEILEIS).

Gráficos do modelo

É possíve elaborar gráficos do modelo através da função plotModel:

plotModel(best_fits, fit = 514)
Gráficos do modelo com outras variáveis em seus valores medianos.

Gráficos do modelo com outras variáveis em seus valores medianos.

É possível adicionar intervalos de confiança (ou predição) e escolher o nível de confiança desejado, como pode ser visto na Figura :

plotModel(best_fits, fit = 514, interval = "confidence", level = 0.80)
Gráficos do modelo com intervalos de predição (80\%).

Gráficos do modelo com intervalos de predição (80%).

Para visualizar o comportamento do modelo no local de avaliação é preciso fornecer o argumento local, onde são fornecidos os valores das características do bem-avaliando. O resultado pode ser visto na Figura , em que o ponto vermelho representa o bem-avaliando, com os intervalos de predição.

Juntamente aos gráficos obtidos, serão impressos no console os valores da elasticidade do modelo no ponto de avaliação, em porcentagem. Estas porcentagens foram calculadas considerando uma mudança de 10% em cada regressor.

Finalmente, é possível, ainda, acrescentar os limites superior e inferior do Campo de Arbítrio do Avaliador, representado pelas linhas tracejadas na Figura , acompanhado ou não do valor arbitrado para o bem-avaliando (em roxo). Note-se também que, para este gráfico, optou-se pela plotagem de ambos os intervalos, de confiança e de predição, através do uso do argumento interval = "both".

plotModel(best_fits, fit = 514, interval = "prediction", level = 0.80,
         local = list(area_total = 205, quartos = 3, suites = 1, garagens = 2,
         dist_b_mar = 250, padrao = 2))
## 0,22%  0,36%  0,044%  0,30%  -0,097%  0,19%
Gráficos do modelo no ponto de previsão de valores.

Gráficos do modelo no ponto de previsão de valores.

plotModel(best_fits, fit = 514, interval = "both", level = 0.80, func = "log", 
        local = list(area_total = 205, quartos = 3, suites = 1, garagens = 2, 
                     dist_b_mar = 250, padrao = 2), ca = TRUE, av = 1100000)
## 3,06%  5,03%  0,61%  4,26%  -1,33%  2,59%
Gráficos do modelo no ponto de previsão de valores, acompanhado do valor arbitrado, ambos os intervalos e limites do Campo de Arbítrio.

Gráficos do modelo no ponto de previsão de valores, acompanhado do valor arbitrado, ambos os intervalos e limites do Campo de Arbítrio.

Perceber que neste caso, como os gráficos foram plotados na escala original, as elasticidades são maiores. Isto ocorre porque, no gráfico anterior, as elasticidades foram calculadas na escala logarítmica, que é uma transformação não-linear. Deve-se atentar, portanto, para este fato, haja vista que, em geral, os avaliadores devem estar preocupados com o comportamento dos preços em sua escala original e não na sua escala transformada.

Poder de Predição

A função powerPlot ajusta o gráfico do poder de predição do modelo. Por padrão, a função powerPlot ajusta o poder de predição do modelo de maior \(R^2_{ajustado}\). Porém, como em outras funções, é possível selecionar outros modelos da tabela. Na Figura pode ser visto o gráfico do Poder de Predição para o modelo escolhido.

Existe ainda um argumento que possibilita a inversão dos eixos do gráfico do poder de predição, o que não vai ao encontro do que recomenda a NBR 14.653-02, porém é recomendado pelos estatísticos, dado o fenômeno do encolhimento dos valores ajustados. Basta, para isto, fornecer o argumento axis à função, o que resulta no gráfico da Figura A5.

powerPlot(best_fits, fit = 514)
Poder de Predição: modelo escolhido.

Poder de Predição: modelo escolhido.

powerPlot(best_fits, fit = 514, axis = "inverted")

Uma última opção é o ajuste do gráfico do poder de predição na escala original, conforme Figura B, uma vez que na escala transformada o modelo pode parecer razoável, mas na escala original o resultado pode ficar bem aquém do esperado.

powerPlot(best_fits, fit = 514, func = "log", axis = "inverted")
Poder de Predição na escala transformada (A) e original (B).

Poder de Predição na escala transformada (A) e original (B).

Grau de precisão

As previsões podem ser feitas pela função predict aplicada ao método bestfit. Ao imprimí-las no console, serão mostrados os limites do intervalo escolhido, do campo de arbítrio, bem como a amplitude do intervalo e seu grau de precisão, segundo a NBR 14.653-02.

É possível fornecer parâmetros para a escolha das características dos imóveis a serem previstos através do argumento newdata (não mostrado). Caso não sejam fornecidos novos dados para ajuste, a função automaticamente irá procurar pelo(s) avaliando(s) no próprio conjunto de dados utilizado para ajustar o modelo (dados cuja variável resposta não tenha valores). Neste caso, três dados foram inclusos no conjunto, com as características descritas na tabela .

Características dos avaliandos.
area_total quartos suites garagens dist_b_mar padrao
205 3 1 2 250 1
205 3 1 2 250 2
205 3 1 2 250 3

Além dos valores previstos e os limites do intervalo escolhido, são mostradas a amplitude do intervalo, o grau de precisão, os limites do campo de arbítrio e os limites de valores admissíveis (valores mais restritos entre o Campo de Arbítrio e os limites do intervalo escolhido).

p <- predict(best_fits, fit = 514, interval = "confidence")
p
## Predictions:
##        fit     lwr     upr   AMP G.P. C.A.I.  C.A.S.    L.I.    L.S.
## 51  725778  669022  787348 16.30  III 616911  834644  669022  787348
## 52  961661  924768 1000025  7.83  III 817412 1105910  924768 1000025
## 53 1056237 1011085 1103404  8.74  III 897801 1214672 1011085 1103404
p1 <- predict(best_fits, fit = 514, interval = "prediction")
p1
## Predictions:
##        fit    lwr     upr  AMP G.P. C.A.I.  C.A.S.   L.I.    L.S.
## 51  725778 597151  882110 39.3   II 616911  834644 616911  834644
## 52  961661 802018 1153081 36.5   II 817412 1105910 817412 1105910
## 53 1056237 879978 1267799 36.7   II 897801 1214672 897801 1214672

Arbitragem de valores

Para arbitragem de valores, recomenda-se a utilização do pacote mosaic (PRUIM et al., 2017), visando a produção de gráficos como o da Figura , onde as probabilidades de ocorrência de valores dentro dos limites inferior e superior do intervalo de valores admissíveis são calculadas.

new <- dados[51:53, ]
p <- exp(predict(fit, newdata = new, interval = "prediction", level = 0.80))
ca <- campo_arbitrio(p)

Na Figura , a área central corresponde à área delimitada pelos limites do intervalo de valores admissíveis. No caso apresentado, o intervalo de valores admissíveis está limitado pelo Campo de Arbítrio, que mostrou-se mais restrito do que o intervalo de predição. A probabilidade de ocorrência de valores acima ou abaixo destes limites no mercado estudado é de 24,8% para cada lado.

library(mosaic)
pl1 <- 
  xpnorm(c(max(ca[2, "C.A.I."], p[2, "lwr"]), min(ca[2, "C.A.S."], p[2, "upr"])), 
           mean = p[2, "fit"], sd = s$sigma, 
           return = "plot", system = "gg", digits=3) + 
  theme(legend.position="bottom") + 
  guides(fill=guide_legend(title="Prob."))
pl1
Distribuição de probabilidades dos preços dos imóveis no mercado, dadas as características do bem-avaliando.

Distribuição de probabilidades dos preços dos imóveis no mercado, dadas as características do bem-avaliando.

Parâmetros de outras normas técnicas

É possível, ainda, calcular os indicadores de performance da avaliação em massa, de acordo com a International Association of Assessing Officers (IAAO, 2013), como a Mediana das Razões de Avaliação, o Coeficiente de Dispersão da Mediana (COD) e o Diferencial Relativo do Preço (PRD):

library(broom)
dados <- augment(fit)
iaao_Ratio(exp(dados$.fitted), exp(dados$`log(valor)`))
## Razão das medianas (Median Ratio) =  1,009 
## Nível:  Valor Venal SUPERIOR ao valor de mercado: 
##  necessidade de atualização dos valores venais. 
## 
## COD (Coefficient of Dispersion) =  10,21% 
## Nível:  Equidade de Valor Venal BOA (COD entre 11% e 14%) 
## 
## PRD (Price-Related Differential) =  101,19% 
## Nível:  Tendência REGRESSIVA de Valor Venal 
## DENTRO do intervalo recomendado (98% a 103%) 
## 
## PRB (Price-Related Bias) =  -0,016 
## Intervalo de Confiança:  -0,059  0,027

Conclusão

Como mostrado, a confecção de um pacote pode servir a múltiplas finalidades, desde a sua utilização para o ensino, como visando a reprodutibilidade técnica de análises presentes em artigos e outros textos científicos, ou mesmo visando o auxílio na prática profissional aos profissionais da área.

Obviamente que, por se tratar de software livre, o pacote descrito (appraiseR) não propicia nenhuma garantia ao utilizador profissional, conforme a própria licença de utilização já prevê.

O pacote atualmente encontra-se hospedado em repositório de software em que são bem-vindas críticas, sugestões, contribuições e relatos de mal funcionamento (bugs).

Algumas funcionalidades não foram descritas neste artigo, por questões de limitação de espaço. Mais informações sobre a utilização de outras funções podem ser encontradas no site do pacote.

Desenvolvimento Futuro

O pacote continua em desenvolvimento contínuo. Pretende-se acrescentar funções para facilitar o uso de outros métodos estatísticos na Engenharia de Avaliações, como os modelos mistos, que são úteis para lidar com amostras heterogêneas, como na confecção de plantas de valores genéricos e índices de preços.

Pretende-se ainda elaborar um manual do usuário com fins didáticos e uma espécie de interface gráfica, como um painel de controle, que dispense a necessidade de digitação de códigos em linhas de comando para a utilização do pacote.

Agradecimentos

Fica aqui um agradecimento aos colegas do Grupo de Pesquisa em Engenharia de Avaliações e Perícias da UFSC (GEAP/UFSC), especialmente ao colega Carlos Zilli, pelo auxílio na revisão, além de um agradecimento especial ao colega Augusto Oliveira, da SEFIN do município de Fortaleza, pela contribuição com a elaboração das funções para o cálculo dos indicadores de performance segundo a IAAO e pela utilização e testes do pacote.

Referências

ABNT. NBR 14653-2: Avaliação de bens – parte 2: Imóveis urbanos. Rio de Janeiro: Associação Brasileira de Normas Técnicas, 2011.

CHENG, J.; KARAMBELKAR, B.; XIE, Y. Leaflet: Create interactive web maps with the javascript ’leaflet’ brary. 2019.

DROUBI, L. F. P. Porque deve-se plotar os valores ajustados no eixo das abscissas! droubi.me, nov. 2019. Disponível em: <http://droubi.me/post/porque-deve-se-plotar-os-valores-ajustados-no-eixo-das-abscissas/>. Acesso em: 25/10/2020.

FOX, J.; WEISBERG, S. An R companion to applied regression. Third ed. Thousand Oaks CA: Sage, 2019.

GAVRILOV, I.; PUSEV, R. Normtest: Tests for normality. 2014.

GROSS, J.; LIGGES, U. Nortest: Tests for normality. 2015.

HARRIS, M. Kolmogorov-smirnov plot. Disponível em: <https://rpubs.com/mharris/KSplot>. Acesso em: 7/2/2018.

HOCHHEIM, N. Engenharia de avaliações - módulo básico. Florianópolis: IBAPE - SC, 2015.

IAAO. Standards on ratio studies. Kansas City, Missouri: International Association of Assessing Officers, 2013.

PEBESMA, E. Simple Features for R: Standardized Support for Spatial Vector Data. The R Journal, v. 10, n. 1, p. 439–446, 2018. Disponível em: <https://doi.org/10.32614/RJ-2018-009>..

PRUIM, R.; KAPLAN, D. T.; HORTON, N. J. The mosaic package: Helping students to ’think with data’ using r. The R Journal, v. 9, n. 1, p. 77–102, 2017. Disponível em: <https://journal.r-project.org/archive/2017/RJ-2017-024/index.html>..

RAZALI, N.; WAH, Y. B. Power comparisons of Shapiro-Wilk, Kolmogorov-Smirnov, Lilliefors and Anderson-Darling tests. Journal of Statistical Modeling and Analytics, v. 2, p. 21–33, 2011.

SARKAR, D. Lattice: Multivariate data visualization with r. New York: Springer, 2008.

TRIVELLONI, C. A. P. Método para determinação do valor da localização com uso de técnicas inferenciais e geoestatísticas na avaliação em massa de imóveis, 2005. Doutorado em Engenharia Civil, Centro Tecnológico da Universidade Federal de Santa Catarina.

WICKHAM, H. Ggplot2: Elegant graphics for data analysis. Springer-Verlag New York, 2016.

ZEILEIS, A. Econometric computing with hc and hac covariance matrix estimators. Journal of Statistical Software, v. 11, n. 10, p. 1–17. Disponível em: <https://doi.org/10.18637/jss.v011.i10>..

ZEILEIS, A.; HOTHORN, T. Diagnostic checking in regression relationships. R News, v. 2, n. 3, p. 7–10, 2002. Disponível em: <https://CRAN.R-project.org/doc/Rnews/>..

ZILLI, C. A. Regressão geograficamente ponderada aplicada na avaliação em massa de imóveis urbanos, 2020. Mestrado em Engenharia de Transportes e Gestão Territorial, Centro Tecnológico da Universidade Federal de Santa Catarina.

ZONATO, W.; DROUBI, L. F. P.; HOCHHEIM, N. Pressupostos clássicos dos modelos de regressão linear e suas implica ções sobre as avaliações em massa. In: 13º Congresso Brasileiro de Cadastro Técnico Multifinalitário e Gestão Territorial. Anais…, 2018. Florianópolis: COBRAC.

ZONATO, W.; DROUBI, L. F. P.; HOCHHEIM, N. DETECÇÃO de heterocedasticidade em modelos econométricos para dados em corte: APLICAÇÃO de testes previstos na nbr 14653-2, testes não previstos e recomendações. Revista Avalia SPU, p. 118–129, 2020. Brasília.


  1. Engenheiro Civil e Cientista de Dados. Especialista em Auditoria, Avaliações e Perícias de Engenharia pelo IPOG. É mestrando em Gestão Territorial pela Universidade Federal de Santa Catarina (UFSC). É pesquisador no Grupo de Engenharia de Avaliações e Perícias (GEAP-UFSC), ↩︎

  2. Professor Titular do Departamento de Engenharia Civil da Universidade Federal de Santa Catarina (UFSC), é Engenheiro Civil e Mestre em Engenharia de Produção e Sistemas pela UFSC, Doutor pela Université de Nancy I (França). Ministra/ministrou disciplinas em cursos de graduação, especialização, mestrado e doutorado, entre elas Engenharia de Avaliações (nível básico e avançado), Planejamento Econômico e Financeiro e Planta de Valores Genéricos, ↩︎

  3. No RStudio, a maneira mais fácil de pesquisar os modelos é aplicar a função View à tabela de transformações.↩︎

  4. A NBR 14.653-02 não trata desta possibilidade.↩︎

  5. Neste caso a diferença foi quase nula, mas em modelos com menor grau de ajuste é possível perceber a diferença entre a escolha de plotar os valores ajustados nas abscissas ou nas ordenadas: a escolha de plotar os valores ajustados nas ordenadas pode dar a falsa impressão de que o modelo é viesado (ver DROUBI, 2019).↩︎