Esta análise foi feita para a atividade de Laboratório 2 da cadeira de Análise de Dados 2 da UFCG.
Configurando nosso dataset, referente aos dados das eleições para deputado de 2010 e 2006.
eleicoes_06_10 <- read_csv(here("./data/eleicoes_2006_e_2010.csv"),
local=readr::locale("br"),
col_types = cols(ano = col_integer(),
sequencial_candidato = col_character(),
quantidade_doacoes = col_integer(),
quantidade_doadores = col_integer(),
total_receita = col_double(),
media_receita = col_double(),
recursos_de_outros_candidatos.comites = col_double(),
recursos_de_pessoas_fisicas = col_double(),
recursos_de_pessoas_juridicas = col_double(),
recursos_proprios = col_double(),
recursos_de_partido_politico = col_double(),
quantidade_despesas = col_integer(),
quantidade_fornecedores = col_integer(),
total_despesa = col_double(),
media_despesa = col_double(),
votos = col_integer(),
.default = col_character()))
Ajustando os dados para evitar leituras incorretas:
correct <- function(value) {
adjusted <- replace(value,
is.na(value),
median(value, na.rm = TRUE))
return(adjusted)
}
eleicoes_06_10$votos <- correct(eleicoes_06_10$votos)
eleicoes_06_10$total_receita <- correct(eleicoes_06_10$total_receita)
eleicoes_06_10$media_receita <- correct(eleicoes_06_10$media_receita)
eleicoes_06_10$total_despesa <- correct(eleicoes_06_10$total_despesa)
eleicoes_06_10$media_despesa <- correct(eleicoes_06_10$media_despesa)
eleicoes_06_10$recursos_proprios <- correct(eleicoes_06_10$recursos_proprios)
eleicoes_06_10$quantidade_doacoes <- correct(eleicoes_06_10$quantidade_doacoes)
eleicoes_06_10$quantidade_doadores <- correct(eleicoes_06_10$quantidade_doadores)
eleicoes_06_10$quantidade_despesas <- correct(eleicoes_06_10$quantidade_despesas)
eleicoes_06_10$quantidade_fornecedores <- correct(eleicoes_06_10$quantidade_fornecedores)
eleicoes_06_10$recursos_de_pessoas_fisicas <- correct(eleicoes_06_10$recursos_de_pessoas_fisicas)
eleicoes_06_10$recursos_de_partido_politico <- correct(eleicoes_06_10$recursos_de_partido_politico)
eleicoes_06_10$recursos_de_pessoas_juridicas <- correct(eleicoes_06_10$recursos_de_pessoas_juridicas)
eleicoes_06_10$recursos_de_outros_candidatos.comites <- correct(eleicoes_06_10$recursos_de_outros_candidatos.comites)
Nesse caso, é necessário entender qua algumas variáveis não podem ser incluídas no modelo. Levaremos em conta as variáveis categóricas, gerando fatores para as que são possíveis.
eleicoes_06_10$sexo <- as.factor(eleicoes_06_10$sexo)
eleicoes_06_10$grau <- as.factor(eleicoes_06_10$grau)
eleicoes_06_10$estado_civil <- as.factor(eleicoes_06_10$estado_civil)
eleicoes_06_10_clean <- eleicoes_06_10 %>%
select(-sequencial_candidato,
-nome,
-cargo,
-uf,
-ocupacao,
-partido)
eleicoes_06 <- eleicoes_06_10_clean %>%
filter(ano == 2006) %>%
select(-ano)
eleicoes_10 <- eleicoes_06_10_clean %>%
filter(ano == 2010) %>%
select(-ano)
eleicoes_06_10_clean <- eleicoes_06_10_clean %>%
select(-ano)
Criando os modelos para cada ano:
modelo_06 <- lm(votos ~ ., data = eleicoes_06)
summary(modelo_06)
##
## Call:
## lm(formula = votos ~ ., data = eleicoes_06)
##
## Residuals:
## Min 1Q Median 3Q Max
## -229609 -7765 -4269 316 639006
##
## Coefficients: (1 not defined because of singularities)
## Estimate Std. Error t value
## (Intercept) -2344.54018 2854.04594 -0.821
## quantidade_doacoes -81.16645 124.31520 -0.653
## quantidade_doadores 344.76013 134.27772 2.568
## total_receita -0.10483 0.02190 -4.786
## media_receita 1.18178 0.10479 11.278
## recursos_de_outros_candidatos.comites 0.04085 0.02354 1.735
## recursos_de_pessoas_fisicas 0.16117 0.02227 7.238
## recursos_de_pessoas_juridicas 0.07479 0.01821 4.106
## recursos_proprios 0.01125 0.01871 0.601
## recursos_de_partido_politico NA NA NA
## quantidade_despesas -22.28036 9.83209 -2.266
## quantidade_fornecedores -5.84784 13.04464 -0.448
## total_despesa 0.13556 0.01305 10.390
## media_despesa 0.83273 0.41977 1.984
## sexoMASCULINO 3576.19710 1697.55002 2.107
## grauENSINO FUNDAMENTAL INCOMPLETO 173.87759 3935.00516 0.044
## grauENSINO MÉDIO COMPLETO 2285.18281 2575.75139 0.887
## grauENSINO MÉDIO INCOMPLETO -221.33777 4107.14899 -0.054
## grauLÊ E ESCREVE 7934.71063 13107.77656 0.605
## grauSUPERIOR COMPLETO 5268.28286 2381.95860 2.212
## grauSUPERIOR INCOMPLETO 3566.32817 2807.76079 1.270
## estado_civilDIVORCIADO(A) -2416.05028 1841.46343 -1.312
## estado_civilSEPARADO(A) JUDICIALMENTE -1207.23588 2542.75582 -0.475
## estado_civilSOLTEIRO(A) -1088.09107 1464.20827 -0.743
## estado_civilVIÚVO(A) -2462.36999 4409.18550 -0.558
## Pr(>|t|)
## (Intercept) 0.4114
## quantidade_doacoes 0.5139
## quantidade_doadores 0.0103 *
## total_receita 0.000001769467371 ***
## media_receita < 0.0000000000000002 ***
## recursos_de_outros_candidatos.comites 0.0828 .
## recursos_de_pessoas_fisicas 0.000000000000561 ***
## recursos_de_pessoas_juridicas 0.000041118601874 ***
## recursos_proprios 0.5479
## recursos_de_partido_politico NA
## quantidade_despesas 0.0235 *
## quantidade_fornecedores 0.6540
## total_despesa < 0.0000000000000002 ***
## media_despesa 0.0474 *
## sexoMASCULINO 0.0352 *
## grauENSINO FUNDAMENTAL INCOMPLETO 0.9648
## grauENSINO MÉDIO COMPLETO 0.3750
## grauENSINO MÉDIO INCOMPLETO 0.9570
## grauLÊ E ESCREVE 0.5450
## grauSUPERIOR COMPLETO 0.0271 *
## grauSUPERIOR INCOMPLETO 0.2041
## estado_civilDIVORCIADO(A) 0.1896
## estado_civilSEPARADO(A) JUDICIALMENTE 0.6350
## estado_civilSOLTEIRO(A) 0.4575
## estado_civilVIÚVO(A) 0.5766
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 31620 on 3412 degrees of freedom
## Multiple R-squared: 0.5198, Adjusted R-squared: 0.5166
## F-statistic: 160.6 on 23 and 3412 DF, p-value: < 0.00000000000000022
modelo_10 <- lm(votos ~ ., data = eleicoes_10)
summary(modelo_10)
##
## Call:
## lm(formula = votos ~ ., data = eleicoes_10)
##
## Residuals:
## Min 1Q Median 3Q Max
## -214872 -8966 -5717 -1208 1259110
##
## Coefficients: (1 not defined because of singularities)
## Estimate Std. Error t value
## (Intercept) 5000.561102 2812.429116 1.778
## quantidade_doacoes 33.791192 54.008889 0.626
## quantidade_doadores -17.559335 62.633273 -0.280
## total_receita -0.007507 0.009485 -0.791
## media_receita -0.187087 0.053851 -3.474
## recursos_de_outros_candidatos.comites 0.005524 0.006080 0.909
## recursos_de_pessoas_fisicas 0.046215 0.010023 4.611
## recursos_de_pessoas_juridicas -0.004655 0.005551 -0.838
## recursos_proprios -0.030676 0.004974 -6.167
## recursos_de_partido_politico NA NA NA
## quantidade_despesas 13.244731 9.108243 1.454
## quantidade_fornecedores -30.471272 11.120555 -2.740
## total_despesa 0.085623 0.009973 8.586
## media_despesa 0.143830 0.089486 1.607
## sexoMASCULINO 2259.128142 1632.707232 1.384
## grauENSINO FUNDAMENTAL INCOMPLETO -1651.436972 4488.464503 -0.368
## grauENSINO MÉDIO COMPLETO -28.190337 2671.315461 -0.011
## grauENSINO MÉDIO INCOMPLETO -1309.276787 4118.825047 -0.318
## grauLÊ E ESCREVE 46293.012979 7644.068148 6.056
## grauSUPERIOR COMPLETO 5072.342928 2482.955003 2.043
## grauSUPERIOR INCOMPLETO 689.543616 2922.177140 0.236
## estado_civilDIVORCIADO(A) -3376.715682 1974.878361 -1.710
## estado_civilSEPARADO(A) JUDICIALMENTE -4171.562479 3185.752880 -1.309
## estado_civilSOLTEIRO(A) -3745.531781 1484.916728 -2.522
## estado_civilVIÚVO(A) -6211.927331 4426.146028 -1.403
## Pr(>|t|)
## (Intercept) 0.075476 .
## quantidade_doacoes 0.531574
## quantidade_doadores 0.779222
## total_receita 0.428715
## media_receita 0.000518 ***
## recursos_de_outros_candidatos.comites 0.363576
## recursos_de_pessoas_fisicas 0.000004137622 ***
## recursos_de_pessoas_juridicas 0.401838
## recursos_proprios 0.000000000766 ***
## recursos_de_partido_politico NA
## quantidade_despesas 0.145984
## quantidade_fornecedores 0.006169 **
## total_despesa < 0.0000000000000002 ***
## media_despesa 0.108071
## sexoMASCULINO 0.166536
## grauENSINO FUNDAMENTAL INCOMPLETO 0.712945
## grauENSINO MÉDIO COMPLETO 0.991581
## grauENSINO MÉDIO INCOMPLETO 0.750595
## grauLÊ E ESCREVE 0.000000001523 ***
## grauSUPERIOR COMPLETO 0.041131 *
## grauSUPERIOR INCOMPLETO 0.813469
## estado_civilDIVORCIADO(A) 0.087374 .
## estado_civilSEPARADO(A) JUDICIALMENTE 0.190459
## estado_civilSOLTEIRO(A) 0.011695 *
## estado_civilVIÚVO(A) 0.160556
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 37060 on 4016 degrees of freedom
## Multiple R-squared: 0.4439, Adjusted R-squared: 0.4407
## F-statistic: 139.4 on 23 and 4016 DF, p-value: < 0.00000000000000022
Para os valores de p-valor nos dois modelos construídos, precebe-se que y depende de muitas das outras variáveis, mas algumas não são significativas nesse processo. Além disso, o R² é baixo, o que indica que o modelo com todas as variáveis não é tão bom para explicar y.
plot_06 <- ggplot(modelo_06, aes(.fitted, .resid)) + geom_point()
plot_06 <- plot_06 + geom_hline(yintercept=0, col="red")
plot_06 <- plot_06 + xlab("Valores Ajustados") + ylab("Resíduos")
plot_06 <- plot_06 + ggtitle("Resíduos vs Ajustamento") + theme_bw()
plot_06
plot_10 <- ggplot(modelo_10, aes(.fitted, .resid)) + geom_point()
plot_10 <- plot_10 + geom_hline(yintercept=0, col="blue")
plot_10 <- plot_10 + xlab("Valores Ajustados") + ylab("Resíduos")
plot_10 <- plot_10 + ggtitle("Resíduos vs Ajustamento") + theme_bw()
plot_10
É possível identificar tendências nos dois modelos, embora os erros não sejam distribuídos uniformemente nos dois casos.
Analisando o sumário podemos identificar o nível de significãncia das variáveis.
sequencia_candidato, nome, uf, partido, quantidade_doacoes, quantidadade_fornecedores, recursos_proprios, recursos_de_partido_politico, cargo e estado_civil tem pouca influência sobre o resultado do voto nas duas eleições.
Agora utilizaremos um correlograma para identificar as variáveis redundantes:
##
## Attaching package: 'GGally'
## The following object is masked from 'package:dplyr':
##
## nasa
ggcorr(eleicoes_06)
## Warning in ggcorr(eleicoes_06): data in column(s) 'sexo', 'grau',
## 'estado_civil' are not numeric and were ignored
ggcorr(eleicoes_10)
## Warning in ggcorr(eleicoes_10): data in column(s) 'sexo', 'grau',
## 'estado_civil' are not numeric and were ignored
Analisando os gráficos, percebe-se que total_receita, recursos_pessoa_jurídica e total_despesas são redundantes.
Para isso analisamos o sumário dos dois modelos a fim de encontrar as variáveis mais relevantes.
Para prever os votos, percebe-se-se que total_receita, media_receita e recurso_de_pessoas_fisicas são mais significativas.
otimizado_06 <- lm(votos ~ total_receita + media_receita + recursos_de_pessoas_fisicas, eleicoes_06)
summary(otimizado_06)
##
## Call:
## lm(formula = votos ~ total_receita + media_receita + recursos_de_pessoas_fisicas,
## data = eleicoes_06)
##
## Residuals:
## Min 1Q Median 3Q Max
## -280717 -8739 -7584 -1273 650503
##
## Coefficients:
## Estimate Std. Error t value
## (Intercept) 8388.638769 669.772798 12.525
## total_receita 0.078913 0.003344 23.601
## media_receita 0.615930 0.091587 6.725
## recursos_de_pessoas_fisicas 0.152786 0.014098 10.837
## Pr(>|t|)
## (Intercept) < 0.0000000000000002 ***
## total_receita < 0.0000000000000002 ***
## media_receita 0.0000000000205 ***
## recursos_de_pessoas_fisicas < 0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 34410 on 3432 degrees of freedom
## Multiple R-squared: 0.428, Adjusted R-squared: 0.4275
## F-statistic: 856 on 3 and 3432 DF, p-value: < 0.00000000000000022
Analisando os resíduos:
plot_otimizado_06 <- ggplot(otimizado_06, aes(.fitted, .resid)) + geom_point()
plot_otimizado_06 <- plot_otimizado_06 + geom_hline(yintercept=0, col="red")
plot_otimizado_06 <- plot_otimizado_06 + xlab("Valores Ajustados") + ylab("Resíduos")
plot_otimizado_06 <- plot_otimizado_06 + ggtitle("Resíduos vs Ajustamento") + theme_bw()
plot_otimizado_06
Para 2006, é possível ver uma distribuição não aleatória de residuos.
Para prever os votos, percebe-se-se que total_receita, media_receita e recurso_de_pessoas_fisicas são mais significativas.
otimizado_10 <- lm(votos ~ total_receita + media_receita + recursos_de_pessoas_fisicas, eleicoes_10)
summary(otimizado_10)
##
## Call:
## lm(formula = votos ~ total_receita + media_receita + recursos_de_pessoas_fisicas,
## data = eleicoes_10)
##
## Residuals:
## Min 1Q Median 3Q Max
## -230341 -8620 -7853 -3663 1309732
##
## Coefficients:
## Estimate Std. Error t value
## (Intercept) 8813.795569 670.745440 13.140
## total_receita 0.052267 0.001562 33.458
## media_receita -0.064782 0.042015 -1.542
## recursos_de_pessoas_fisicas 0.068261 0.009266 7.366
## Pr(>|t|)
## (Intercept) < 0.0000000000000002 ***
## total_receita < 0.0000000000000002 ***
## media_receita 0.123
## recursos_de_pessoas_fisicas 0.000000000000211 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 38350 on 4036 degrees of freedom
## Multiple R-squared: 0.4015, Adjusted R-squared: 0.4011
## F-statistic: 902.6 on 3 and 4036 DF, p-value: < 0.00000000000000022
Analisando os resíduos:
plot_otimizado_10 <- ggplot(otimizado_10, aes(.fitted, .resid)) + geom_point()
plot_otimizado_10 <- plot_otimizado_10 + geom_hline(yintercept=0, col="blue")
plot_otimizado_10 <- plot_otimizado_10 + xlab("Valores Ajustados") + ylab("Resíduos")
plot_otimizado_10 <- plot_otimizado_10 + ggtitle("Resíduos vs Ajustamento") + theme_bw()
plot_otimizado_10
Em 2010, também é possível ver uma distribuição não aleatória de residuos.
Em 2006, o RSE era 31620, com o modelo otimizado passou a ser 34410. O R² era 0.5166, passou a ser 0.4275. No caso de 2010, o RSE era 37060, com o modelo otimizado passou a ser 38350. O R² era 0.4407, passou ser 0.4011.
modelo_final <- lm(votos ~ ., data = eleicoes_06_10_clean)
summary(modelo_final)
##
## Call:
## lm(formula = votos ~ ., data = eleicoes_06_10_clean)
##
## Residuals:
## Min 1Q Median 3Q Max
## -346132 -10502 -6243 -846 1279363
##
## Coefficients: (1 not defined because of singularities)
## Estimate Std. Error t value
## (Intercept) 2854.746423 2105.066552 1.356
## quantidade_doacoes -80.533704 48.451294 -1.662
## quantidade_doadores 134.928675 55.916600 2.413
## total_receita -0.042665 0.007831 -5.448
## media_receita 0.144436 0.047120 3.065
## recursos_de_outros_candidatos.comites 0.017436 0.005749 3.033
## recursos_de_pessoas_fisicas 0.094933 0.008534 11.124
## recursos_de_pessoas_juridicas 0.040923 0.004767 8.585
## recursos_proprios -0.004265 0.004561 -0.935
## recursos_de_partido_politico NA NA NA
## quantidade_despesas 14.078539 6.668226 2.111
## quantidade_fornecedores -38.532198 8.310766 -4.636
## total_despesa 0.095243 0.007923 12.022
## media_despesa -0.082546 0.084481 -0.977
## sexoMASCULINO 3411.082170 1235.990571 2.760
## grauENSINO FUNDAMENTAL INCOMPLETO -814.373190 3151.679995 -0.258
## grauENSINO MÉDIO COMPLETO 1815.722410 1963.038042 0.925
## grauENSINO MÉDIO INCOMPLETO -985.178511 3070.370421 -0.321
## grauLÊ E ESCREVE 39987.370904 6662.166785 6.002
## grauSUPERIOR COMPLETO 7679.069180 1816.930638 4.226
## grauSUPERIOR INCOMPLETO 3350.052739 2143.299632 1.563
## estado_civilDIVORCIADO(A) -3471.939959 1429.550496 -2.429
## estado_civilSEPARADO(A) JUDICIALMENTE -2109.418498 2134.104574 -0.988
## estado_civilSOLTEIRO(A) -3880.767083 1099.220665 -3.530
## estado_civilVIÚVO(A) -5425.602224 3294.711612 -1.647
## Pr(>|t|)
## (Intercept) 0.175099
## quantidade_doacoes 0.096523 .
## quantidade_doadores 0.015844 *
## total_receita 0.00000005252 ***
## media_receita 0.002183 **
## recursos_de_outros_candidatos.comites 0.002430 **
## recursos_de_pessoas_fisicas < 0.0000000000000002 ***
## recursos_de_pessoas_juridicas < 0.0000000000000002 ***
## recursos_proprios 0.349747
## recursos_de_partido_politico NA
## quantidade_despesas 0.034781 *
## quantidade_fornecedores 0.00000360534 ***
## total_despesa < 0.0000000000000002 ***
## media_despesa 0.328552
## sexoMASCULINO 0.005798 **
## grauENSINO FUNDAMENTAL INCOMPLETO 0.796110
## grauENSINO MÉDIO COMPLETO 0.355019
## grauENSINO MÉDIO INCOMPLETO 0.748321
## grauLÊ E ESCREVE 0.00000000204 ***
## grauSUPERIOR COMPLETO 0.00002402968 ***
## grauSUPERIOR INCOMPLETO 0.118087
## estado_civilDIVORCIADO(A) 0.015177 *
## estado_civilSEPARADO(A) JUDICIALMENTE 0.322973
## estado_civilSOLTEIRO(A) 0.000417 ***
## estado_civilVIÚVO(A) 0.099649 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 36390 on 7452 degrees of freedom
## Multiple R-squared: 0.4202, Adjusted R-squared: 0.4184
## F-statistic: 234.8 on 23 and 7452 DF, p-value: < 0.00000000000000022
Identifica-se que apesar de algumas variáveis pontuais possuirem um grau de significância maior, não hou uma grande alteração.
Agora analisaremos a distribuição dos resíduos:
plot_modelo_final <- ggplot(modelo_final, aes(.fitted, .resid)) + geom_point()
plot_modelo_final <- plot_modelo_final + geom_hline(yintercept=0, col="orange")
plot_modelo_final <- plot_modelo_final + xlab("Valores Ajustados") + ylab("Resíduos")
plot_modelo_final <- plot_modelo_final + ggtitle("Resíduos vs Ajustamento") + theme_bw()
plot_modelo_final
***
qqnorm(modelo_final$residuals)
qqline(modelo_final$residuals, col = "orange", lwd = 2, lty = 2)
A distribuição dos resíduos no modelo final não é aleatória nem normal, assim como nos modelos de cada ano.