Problema de Negócio: Previsão de Despesas Hospitalares

Para esta análise, vamos usar um conjunto de dados simulando despesas médicas hipotéticas para um conjunto de pacientes espalhados por 4 regiões do Brasil.

Esse dataset possui 1.338 observações e 7 variáveis.

Etapa 1 - Coletando os dados

despesas <-read.csv("despesas.csv")
head(despesas)
##   idade   sexo  bmi filhos fumante   regiao   gastos
## 1    19 mulher 27.9      0     sim  sudeste 16884.92
## 2    18  homem 33.8      1     nao      sul  1725.55
## 3    28  homem 33.0      3     nao      sul  4449.46
## 4    33  homem 22.7      0     nao nordeste 21984.47
## 5    32  homem 28.9      0     nao nordeste  3866.86
## 6    31 mulher 25.7      0     nao      sul  3756.62

Visualizar as variaveis

str(despesas)
## 'data.frame':    1338 obs. of  7 variables:
##  $ idade  : int  19 18 28 33 32 31 46 37 37 60 ...
##  $ sexo   : chr  "mulher" "homem" "homem" "homem" ...
##  $ bmi    : num  27.9 33.8 33 22.7 28.9 25.7 33.4 27.7 29.8 25.8 ...
##  $ filhos : int  0 1 3 0 0 0 1 3 2 0 ...
##  $ fumante: chr  "sim" "nao" "nao" "nao" ...
##  $ regiao : chr  "sudeste" "sul" "sul" "nordeste" ...
##  $ gastos : num  16885 1726 4449 21984 3867 ...

Médias de tedência Central da variável Gasto

summary(despesas$gastos)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1122    4740    9382   13270   16640   63770
hist(despesas$gastos, main = "Histograma", xlab = "Gastos")

### Tabela de Contigência das Regiões

table(despesas$regiao)
## 
## nordeste    norte  sudeste      sul 
##      325      324      325      364

### Explorando relacionamento entre as variaveis: Matriz de Correlação

cor(despesas[c("idade", "bmi", "filhos", "gastos")])
##            idade        bmi     filhos     gastos
## idade  1.0000000 0.10934101 0.04246900 0.29900819
## bmi    0.1093410 1.00000000 0.01264471 0.19857626
## filhos 0.0424690 0.01264471 1.00000000 0.06799823
## gastos 0.2990082 0.19857626 0.06799823 1.00000000

Nenhuma das correlações na matriz é considerada forte, mas existem algumas associações interessantes. Por exemplo, a idade e o bmi (IMC) parecem ter uma correlação positiva fraca, o que significa que com o aumento da idade, a massa corporal tende a aumentar. Há também uma correlação positiva moderada entre a idade e os gastos, além do número de filhos e os gastos. Estas associações implicam que, à media que idade, massa corporal e número de filhos aumenta, o custo esperado do seguro saúde sobe.

Visualizando relacionamento entre as variáveis: Scatterplot Perceba que não existe um claro relacionamento entre as variáveis

pairs(despesas[c("idade", "bmi", "filhos", "gastos")])

ScatterPlot Matrix (forma Colorida)

#install.packages("psych")
library(psych)

Este grafico fornece mais informções sobre o relacionamento entre as variaveis

pairs.panels(despesas[c("idade", "bmi", "filhos", "gastos")])

## Treinar o Modelo

# o uso do ~ é para fazer a separação do dado esquerdo targuet e do lado direito do do ~ as preditoras 

modelo <- lm(gastos ~ idade + filhos + bmi + sexo + fumante + regiao, data = despesas)

Similar ao item anterior

#é a mesma coisa que a de cima, a diferença que substituimos por .. os valores 
modelo <- lm(gastos ~ ., data = despesas)
modelo
## 
## Call:
## lm(formula = gastos ~ ., data = despesas)
## 
## Coefficients:
##   (Intercept)          idade     sexomulher            bmi         filhos  
##      -12425.7          256.8          131.4          339.3          475.7  
##    fumantesim    regiaonorte  regiaosudeste      regiaosul  
##       23847.5          352.8         -606.5         -682.8
#lm é utilizado para criar os modelos de regressão 

## Prevendo Despesas Médicas

Aqui verificamos os gastos previstos pelo modelo que devem ser iguais aos dados de treino

#?predict
previsao <- predict(modelo)
class(previsao)
## [1] "numeric"
head(previsao)
##         1         2         3         4         5         6 
## 25292.740  3458.281  6706.619  3751.868  5598.626  3704.606

Prevendo os Gastos com Dados de Teste

Para isso pegaremos outro dataset de teste

despesateste <- read.csv("despesas-teste.csv")
head(despesateste)
##   idade   sexo  bmi filhos fumante   regiao
## 1    52 mulher 26.6      0     nao nordeste
## 2    27  homem 27.1      0     nao      sul
## 3    26 mulher 29.9      1     nao      sul
## 4    24 mulher 22.2      0     nao      sul
## 5    34 mulher 33.7      1     nao  sudeste
## 6    53 mulher 33.3      0     nao    norte
previsao2 <- predict(modelo, despesateste)
View(previsao2)
head(previsao2)
##          1          2          3          4          5          6 
## 10086.3947  3020.9027  4321.1161   719.2169  7741.4208 12969.2660

Avaliando a Performance do MOdelo

Mais detalhes sobre o modelo

summary(modelo)
## 
## Call:
## lm(formula = gastos ~ ., data = despesas)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -11302.7  -2850.9   -979.6   1383.9  29981.7 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   -12425.7     1000.7 -12.418  < 2e-16 ***
## idade            256.8       11.9  21.586  < 2e-16 ***
## sexomulher       131.3      332.9   0.395 0.693255    
## bmi              339.3       28.6  11.864  < 2e-16 ***
## filhos           475.7      137.8   3.452 0.000574 ***
## fumantesim     23847.5      413.1  57.723  < 2e-16 ***
## regiaonorte      352.8      476.3   0.741 0.458976    
## regiaosudeste   -606.5      477.2  -1.271 0.203940    
## regiaosul       -682.8      478.9  -1.426 0.154211    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6062 on 1329 degrees of freedom
## Multiple R-squared:  0.7509, Adjusted R-squared:  0.7494 
## F-statistic: 500.9 on 8 and 1329 DF,  p-value: < 2.2e-16

Coeficiente de Determinção 0.75

Resumo do modelo:

Equação de Regressão

y = a + bx (simples) y = a + b0x0 + b1x1 (múltipla)

Resíduos

Diferença entre os valores observados de uma variável e seus valores previstos Seus resíduos devem se parecer com uma distribuição normal, o que indica que a média entre os valores previstos e os valores observados é próximo de 0 (o que é bom)

Coeficiente - Intercept - a (alfa)

Valor de a na equação de regressão

Coeficientes - Nomes das variáveis - b (beta)

Valor de b na equação de regressão

Obs: A questão é que lm() ou summary() têm diferentes convenções de rotulagem para cada variável explicativa.

Em vez de escrever slope_1, slope_2, …. Eles simplesmente usam o nome da variável em qualquer saída para indicar quais coeficientes pertencem a qual variável.

Erro Padrão

Medida de variabilidade na estimativa do coeficiente a (alfa). O ideal é que este valor seja menor que o valor do coeficiente, mas nem sempre isso irá ocorrer.

Asteriscos

Os asteriscos representam os níveis de significância de acordo com o p-value.

Quanto mais estrelas, maior a significância.

Atenção –> Muitos astericos indicam que é improvável que não exista relacionamento entre as variáveis.

Valor t

Define se coeficiente da variável é significativo ou não para o modelo. Ele é usado para calcular o p-value e os níveis de significância.

p-value

O p-value representa a probabilidade que a variável não seja relevante. Deve ser o menor valor possível. Se este valor for realmente pequeno, o R irá mostrar o valor como notação científica

Significância

São aquelas legendas próximas as suas variáveis

Espaço em branco - ruim Pontos - razoável Asteriscos - bom Muitos asteriscos - muito bom Obs:(Quanto mais estrelas, melhor vai ser as amostras)

Residual Standar Error

Este valor representa o desvio padrão dos resíduos

Degrees of Freedom

É a diferença entre o número de observações na amostra de treinamento e o número de variáveis no seu modelo

R-squared (coeficiente de determinação - R^2)(R elevado ao quadrado) Ajuda a avaliar o nível de precisão do nosso modelo. Quanto maior, melhor, sendo 1 o valor ideal.

F-statistics

É o teste F do modelo. Esse teste obtém os parâmetros do nosso modelo e compara com um modelo que tenha menos parâmetros.

Em teoria, um modelo com mais parâmetros tem um desempenho melhor.

Se o seu modelo com mais parâmetros NÃO tiver perfomance melhor que um modelo com menos parâmetros, o valor do p-value será bem alto.

Se o modelo com mais parâmetros tiver performance melhor que um modelo com menos parâmetros, o valor do p-value será mais baixo.

*** Lembre-se que correlação não implica causalidade ***

Otimizando a Performance do Modelo

Adicionando uma variável com o dobro do valor das idades

# é apenas um experimnento 
#por ter uma variavel muito forte, resolvi dobrar o valor da idade.  
despesas$idade2 <- despesas$idade ^2

Adicionando um indicador para BMI >= 30

#Indicador do índice de massa corporal 
despesas$bmi30 <- ifelse(despesas$bmi >= 30, 1, 0)

Criando o modelo final

# Criando o modelo final
modelo_v2 <- lm(gastos ~ idade + idade2 + filhos + bmi + sexo +
                   bmi30 * fumante + regiao, data = despesas)

Resultado

summary(modelo_v2)
## 
## Call:
## lm(formula = gastos ~ idade + idade2 + filhos + bmi + sexo + 
##     bmi30 * fumante + regiao, data = despesas)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -17297.1  -1656.0  -1262.7   -727.8  24161.6 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       -636.9298  1361.0589  -0.468 0.639886    
## idade              -32.6181    59.8250  -0.545 0.585690    
## idade2               3.7307     0.7463   4.999 6.54e-07 ***
## filhos             678.6017   105.8855   6.409 2.03e-10 ***
## bmi                119.7715    34.2796   3.494 0.000492 ***
## sexomulher         496.7690   244.3713   2.033 0.042267 *  
## bmi30             -997.9355   422.9607  -2.359 0.018449 *  
## fumantesim       13404.5952   439.9591  30.468  < 2e-16 ***
## regiaonorte        279.1661   349.2826   0.799 0.424285    
## regiaosudeste     -942.9958   350.1754  -2.693 0.007172 ** 
## regiaosul         -548.8684   352.1950  -1.558 0.119372    
## bmi30:fumantesim 19810.1534   604.6769  32.762  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4445 on 1326 degrees of freedom
## Multiple R-squared:  0.8664, Adjusted R-squared:  0.8653 
## F-statistic: 781.7 on 11 and 1326 DF,  p-value: < 2.2e-16

R-squared: 0.8664 - Conseguimos uma melhora significativa

Fazer o teste com o novo modelo
despesateste <- read.csv("despesas-teste.csv")
View(despesateste)
previsao <- predict(modelo, despesateste)
class(previsao)
## [1] "numeric"
head(previsao)
##          1          2          3          4          5          6 
## 10086.3947  3020.9027  4321.1161   719.2169  7741.4208 12969.2660