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)
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
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
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
y = a + bx (simples) y = a + b0x0 + b1x1 (múltipla)
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)
Valor de a na equação de regressão
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.
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.
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.
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.
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
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)
Este valor representa o desvio padrão dos resíduos
É 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.
É 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 ***
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
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