```{r setup, include=FALSE}
library(flexdashboard)
library(tidyverse)
library(recipes)
library(shiny)
library(caret)
library(ranger)

diamantes <- ggplot2::diamonds

# retirar linhas que estão erradas.
diamantes <- diamantes %>% 
  mutate(
    depth2 = round(2 * z / (x + y), 3)*100, 
    teste = near(depth, depth2, tol = 1)
  ) %>% 
  filter(teste == TRUE) %>% 
  select(-depth2, -teste)

# transformar variaveis em caracter
diamantes <- diamantes %>% 
  mutate_at(vars(cut, color, clarity), as.character)

lasso <- readRDS("../lasso.rds")
rf <- readRDS("../rf.rds")
xgb <- readRDS("../xgb.rds")
```

Column {.sidebar}
-----------------------------------------------------------------------

Preencha as informações abaixo para obter uma estimativa do seu preço:

```{r}
sliderInput("carat", 
            "Quilate:", 
            min = min(diamantes$carat), 
            max = max(diamantes$carat),
            value = mean(diamantes$carat)
            )

selectInput("cut", label = "Corte:",
            choices = unique(diamantes$cut), 
            selected = unique(diamantes$cut)[1])

selectInput("color", label = "Cor:",
            choices = unique(diamantes$color), 
            selected = unique(diamantes$color)[1])

selectInput("clarity", label = "Claridade:",
            choices = unique(diamantes$clarity), 
            selected = unique(diamantes$clarity)[1])

sliderInput("depth", 
            "Profundidade:", 
            min = min(diamantes$depth), 
            max = max(diamantes$depth),
            value = mean(diamantes$depth)
            )

sliderInput("table", 
            "Tabela:", 
            min = min(diamantes$table), 
            max = max(diamantes$table),
            value = mean(diamantes$table)
            )

sliderInput("x", 
            "X:", 
            min = min(diamantes$x), 
            max = max(diamantes$x),
            value = mean(diamantes$x)
            )

sliderInput("y", 
            "Y:", 
            min = min(diamantes$y), 
            max = max(diamantes$y),
            value = mean(diamantes$y)
            )

sliderInput("z", 
            "Z:", 
            min = min(diamantes$z), 
            max = max(diamantes$z),
            value = mean(diamantes$z)
            )

```

Row
-----------------------------------------------------------------------

```{r, include=FALSE}
data <- reactive({
  tibble(
    carat = input$carat,
    cut = input$cut,
    color = input$color,
    clarity = input$clarity,
    depth = input$depth,
    table = input$table,
    x = input$x,
    y = input$y,
    z = input$z
  )
})

predito_lasso <- reactive({predict(lasso, data())})
predito_rf <- reactive({predict(rf, data())})
predito_xgb <- reactive({predict(xgb, data())})
```

### Preço predito pelo LASSO

```{r}
renderValueBox({
  valueBox(
    value = scales::dollar(predito_lasso()),
    icon = "fa-area-chart"
  )
})
```


### Preço predito pelo Random Forest

```{r}
renderValueBox({
  valueBox(
    value = scales::dollar(predito_rf()),
    icon = "fa-area-chart"
  )
})
```

### Preço predito pelo XGBoost

```{r}
renderValueBox({
  valueBox(
    value = scales::dollar(predito_xgb()),
    icon = "fa-area-chart"
  )
})
```

Row {.tabset .tabset-fade}
---------------------------------

### Identificando extrapolações

Com este gráfico é possível verificar se o ponto que você está observando é uma
extrapolação e portanto pode ter previsões pouco confiáveis.

```{r}
renderPlot({
  
  pca <- diamantes %>% 
    filter(cut == input$cut, color == input$color, clarity == input$clarity) %>% 
    select(-price, -cut, -color, -clarity) %>% 
    princomp()
  
  observado <- predict(pca, diamantes) %>% 
    as_tibble() %>% 
    select(Comp.1, Comp.2) %>% 
    mutate(Obs = TRUE)
  
  novo <- predict(pca, data()) %>% 
    as_tibble() %>% 
    select(Comp.1, Comp.2) %>% 
    mutate(Obs = FALSE)
  
  p <- observado %>% 
    ggplot(aes(x = Comp.1, y = Comp.2)) +
    geom_point(color = "grey", alpha = 0.7, size = 0.5) +
    geom_point(data = novo, color = "red", size = 5) +
    theme_minimal()
  
  plot(p)
})
```

### Predito vs Observado

```{r}
p <- diamantes %>% 
  mutate(
    LASSO = predict(lasso, diamantes),
    RF = predict(rf, diamantes),
    XGB = predict(xgb, diamantes)
  ) %>% 
  gather(modelo, predito, LASSO, RF, XGB) %>% 
  ggplot(aes(x = price, y = predito)) +
  geom_point(size = 0.1, alpha = 0.7) +
  facet_wrap(~modelo, ncol = 3) +
  theme_minimal() +
  labs(x = "Observado", y = "Predito")

renderPlot({
  
  linhas <- tibble(
    predito = c(predito_lasso(), predito_rf(), predito_xgb()),
    modelo = c("LASSO", "RF", "XGB")
  )
  
  x <- p + 
    geom_hline(
      data = linhas, 
      aes(yintercept = predito), 
      color = "red", 
      linetype = "dashed"
      )
  plot(x)
})
```

