Aplicando um filtro nos dados para eliminar os conteúdos de NA nos campos: “attr”, “fun”, “intel”, “sinc”, “amb”, “schar”, “prob” e “like”. Além de alterar o conteúdo do campo “dec”" que é Yes/No para 1 e 0, respectivamente.
dados = dados %>%
filter(!is.na(attr), !is.na(fun), !is.na(intel), !is.na(sinc), !is.na(amb), !is.na(shar), !is.na(prob), !is.na(like)) %>%
mutate(dec = case_when(.$dec == "no" ~ 0,
.$dec == "yes" ~ 1))
glimpse(dados)
## Observations: 4,101
## Variables: 44
## $ iid <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3...
## $ gender <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
## $ order <dbl> 4, 3, 5, 7, 6, 1, 2, 8, 9, 10, 9, 6, 1, 3, 2, 7, 8, 4, 5, ...
## $ pid <dbl> 11, 12, 14, 15, 16, 17, 18, 19, 20, 11, 12, 13, 14, 15, 16...
## $ int_corr <dbl> 0.14, 0.54, 0.61, 0.21, 0.25, 0.34, 0.50, 0.28, -0.36, 0.2...
## $ samerace <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1...
## $ age_o <dbl> 27, 22, 23, 24, 25, 30, 27, 28, 24, 27, 22, 22, 23, 24, 25...
## $ age <dbl> 21, 21, 21, 21, 21, 21, 21, 21, 21, 24, 24, 24, 24, 24, 24...
## $ field <chr> "Law", "Law", "Law", "Law", "Law", "Law", "Law", "Law", "L...
## $ race <dbl> 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2...
## $ from <chr> "Chicago", "Chicago", "Chicago", "Chicago", "Chicago", "Ch...
## $ career <chr> "lawyer", "lawyer", "lawyer", "lawyer", "lawyer", "lawyer"...
## $ sports <dbl> 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3...
## $ tvsports <dbl> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8...
## $ exercise <dbl> 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7...
## $ dining <dbl> 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10,...
## $ museums <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 5...
## $ art <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5...
## $ hiking <dbl> 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8...
## $ gaming <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4...
## $ clubbing <dbl> 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 5...
## $ reading <dbl> 6, 6, 6, 6, 6, 6, 6, 6, 6, 10, 10, 10, 10, 10, 10, 10, 10,...
## $ tv <dbl> 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8...
## $ theater <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7...
## $ movies <dbl> 10, 10, 10, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 8, 8...
## $ concerts <dbl> 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, 7, 7, 7, 7, 7...
## $ music <dbl> 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 5...
## $ shopping <dbl> 8, 8, 8, 8, 8, 8, 8, 8, 8, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8...
## $ yoga <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7...
## $ attr <dbl> 6, 7, 7, 5, 4, 7, 4, 7, 5, 5, 8, 5, 7, 6, 8, 7, 5, 7, 6, 7...
## $ sinc <dbl> 9, 8, 6, 6, 9, 6, 9, 6, 6, 7, 5, 8, 9, 8, 7, 5, 8, 6, 7, 9...
## $ intel <dbl> 7, 7, 8, 7, 7, 7, 7, 8, 6, 8, 6, 9, 7, 7, 8, 9, 7, 8, 8, 1...
## $ fun <dbl> 7, 8, 7, 7, 4, 4, 6, 9, 8, 4, 6, 6, 6, 9, 3, 6, 5, 9, 7, 7...
## $ amb <dbl> 6, 5, 6, 6, 6, 6, 5, 8, 10, 6, 9, 3, 5, 7, 6, 7, 9, 4, 9, ...
## $ shar <dbl> 5, 6, 8, 6, 4, 7, 6, 8, 8, 3, 6, 4, 7, 8, 2, 9, 5, 5, 8, 9...
## $ like <dbl> 7, 7, 7, 6, 6, 6, 6, 7, 6, 6, 7, 6, 7, 8, 6, 8, 5, 5, 8, 8...
## $ prob <dbl> 6, 5, 6, 6, 5, 5, 7, 7, 6, 4, 3, 7, 8, 6, 5, 7, 6, 6, 7, 7...
## $ match_es <dbl> 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, N...
## $ attr3_s <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
## $ sinc3_s <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
## $ intel3_s <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
## $ fun3_s <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
## $ amb3_s <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
## $ dec <dbl> 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0...
Agora vamos dar uma olhada em toda a estrutura do banco de dados, número de linha, colunas, tipos de dados e métricas para os campos numéricos.
skimr::skim(dados)
| Name | dados |
| Number of rows | 4101 |
| Number of columns | 44 |
| _______________________ | |
| Column type frequency: | |
| character | 3 |
| logical | 5 |
| numeric | 36 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| field | 13 | 1.00 | 3 | 51 | 0 | 145 | 0 |
| from | 28 | 0.99 | 2 | 58 | 0 | 171 | 0 |
| career | 38 | 0.99 | 2 | 77 | 0 | 215 | 0 |
Variable type: logical
| skim_variable | n_missing | complete_rate | mean | count |
|---|---|---|---|---|
| attr3_s | 4101 | 0 | NaN | : |
| sinc3_s | 4101 | 0 | NaN | : |
| intel3_s | 4101 | 0 | NaN | : |
| fun3_s | 4101 | 0 | NaN | : |
| amb3_s | 4101 | 0 | NaN | : |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| iid | 0 | 1.00 | 273.48 | 184.73 | 1.00 | 87.00 | 271.00 | 433.00 | 552.0 | ▇▁▅▅▆ |
| gender | 0 | 1.00 | 0.50 | 0.50 | 0.00 | 0.00 | 0.00 | 1.00 | 1.0 | ▇▁▁▁▇ |
| order | 0 | 1.00 | 9.09 | 5.61 | 1.00 | 4.00 | 8.00 | 13.00 | 22.0 | ▇▆▅▃▂ |
| pid | 8 | 1.00 | 273.74 | 184.24 | 1.00 | 88.00 | 273.00 | 433.00 | 552.0 | ▇▁▅▅▆ |
| int_corr | 52 | 0.99 | 0.19 | 0.31 | -0.73 | -0.03 | 0.21 | 0.43 | 0.9 | ▁▃▇▇▂ |
| samerace | 0 | 1.00 | 0.40 | 0.49 | 0.00 | 0.00 | 0.00 | 1.00 | 1.0 | ▇▁▁▁▆ |
| age_o | 43 | 0.99 | 25.72 | 3.32 | 18.00 | 23.00 | 25.00 | 28.00 | 39.0 | ▃▇▆▁▁ |
| age | 37 | 0.99 | 25.70 | 3.23 | 18.00 | 23.00 | 25.00 | 28.00 | 38.0 | ▃▇▆▁▁ |
| race | 13 | 1.00 | 2.75 | 1.23 | 1.00 | 2.00 | 2.00 | 4.00 | 6.0 | ▇▁▃▁▁ |
| sports | 28 | 0.99 | 6.37 | 2.53 | 1.00 | 5.00 | 7.00 | 8.00 | 10.0 | ▂▃▆▇▆ |
| tvsports | 28 | 0.99 | 4.55 | 2.81 | 1.00 | 2.00 | 4.00 | 7.00 | 10.0 | ▇▆▅▅▃ |
| exercise | 28 | 0.99 | 6.13 | 2.35 | 1.00 | 5.00 | 6.00 | 8.00 | 10.0 | ▂▃▇▇▃ |
| dining | 28 | 0.99 | 7.69 | 1.77 | 1.00 | 7.00 | 8.00 | 9.00 | 10.0 | ▁▁▃▇▇ |
| museums | 28 | 0.99 | 6.89 | 2.11 | 0.00 | 6.00 | 7.00 | 8.00 | 10.0 | ▁▂▃▇▅ |
| art | 28 | 0.99 | 6.59 | 2.33 | 0.00 | 5.00 | 7.00 | 8.00 | 10.0 | ▁▃▅▇▅ |
| hiking | 28 | 0.99 | 5.66 | 2.54 | 0.00 | 4.00 | 6.00 | 8.00 | 10.0 | ▅▆▇▇▅ |
| gaming | 28 | 0.99 | 4.04 | 2.65 | 0.00 | 2.00 | 4.00 | 6.00 | 14.0 | ▇▇▆▁▁ |
| clubbing | 28 | 0.99 | 5.72 | 2.46 | 0.00 | 4.00 | 6.00 | 8.00 | 10.0 | ▃▅▆▇▃ |
| reading | 28 | 0.99 | 7.65 | 2.06 | 1.00 | 7.00 | 8.00 | 9.00 | 13.0 | ▁▁▇▇▁ |
| tv | 28 | 0.99 | 5.32 | 2.47 | 1.00 | 3.00 | 6.00 | 7.00 | 10.0 | ▅▅▇▇▂ |
| theater | 28 | 0.99 | 6.69 | 2.28 | 0.00 | 5.00 | 7.00 | 8.00 | 10.0 | ▁▃▅▇▆ |
| movies | 28 | 0.99 | 7.94 | 1.72 | 0.00 | 7.00 | 8.00 | 9.00 | 10.0 | ▁▁▂▇▇ |
| concerts | 28 | 0.99 | 6.81 | 2.14 | 0.00 | 6.00 | 7.00 | 8.00 | 10.0 | ▁▂▆▇▅ |
| music | 28 | 0.99 | 7.80 | 1.88 | 1.00 | 7.00 | 8.00 | 9.00 | 10.0 | ▁▁▃▇▇ |
| shopping | 28 | 0.99 | 5.51 | 2.59 | 1.00 | 4.00 | 6.00 | 7.00 | 10.0 | ▆▅▇▆▅ |
| yoga | 28 | 0.99 | 4.17 | 2.72 | 0.00 | 2.00 | 3.00 | 6.00 | 10.0 | ▇▅▅▃▂ |
| attr | 0 | 1.00 | 6.05 | 1.94 | 0.00 | 5.00 | 6.00 | 7.00 | 10.0 | ▁▃▇▇▂ |
| sinc | 0 | 1.00 | 7.03 | 1.81 | 0.00 | 6.00 | 7.00 | 8.00 | 10.0 | ▁▁▅▇▃ |
| intel | 0 | 1.00 | 7.25 | 1.59 | 0.00 | 6.00 | 7.00 | 8.00 | 10.0 | ▁▁▃▇▃ |
| fun | 0 | 1.00 | 6.27 | 1.99 | 0.00 | 5.00 | 6.00 | 8.00 | 10.0 | ▁▂▇▇▂ |
| amb | 0 | 1.00 | 6.68 | 1.84 | 0.00 | 5.50 | 7.00 | 8.00 | 10.0 | ▁▂▇▇▃ |
| shar | 0 | 1.00 | 5.30 | 2.16 | 0.00 | 4.00 | 5.00 | 7.00 | 10.0 | ▂▅▇▅▁ |
| like | 0 | 1.00 | 6.03 | 1.86 | 0.00 | 5.00 | 6.00 | 7.00 | 10.0 | ▁▂▇▇▁ |
| prob | 0 | 1.00 | 5.04 | 2.18 | 0.00 | 4.00 | 5.00 | 7.00 | 10.0 | ▃▅▇▅▁ |
| match_es | 348 | 0.92 | 3.10 | 2.40 | 0.00 | 2.00 | 3.00 | 4.00 | 10.0 | ▇▅▂▁▁ |
| dec | 0 | 1.00 | 0.42 | 0.49 | 0.00 | 0.00 | 0.00 | 1.00 | 1.0 | ▇▁▁▁▆ |
Agora vamos análisar as informações dos atributos: “attr”, “fun”, “intel”, “sinc”, “amb”, “schar”, “prob” e “like”, que deram uma nota entre 1 e 10 no formulário. Essas informações são as seguintes:
attr : quão atraente p1 achou p2 sinc : quão sincero p1 achou p2 intel : quão inteligente p1 achou p2 fun : quão divertido p1 achou p2 amb : quão ambicioso p1 achou p2 shar : quanto p1 achou que compartilha interesses e hobbies com p2 like : no geral, quanto p1 gostou de p2 prob : que probabilidade p1 acha que p2 tem de querer se encontrar novamente com p As quantidades para cada resposta foram:
dados %>%
ggplot(aes(attr)) +
geom_bar() +
scale_x_continuous(breaks=seq(0, 10, 1))
dados %>%
ggplot(aes(sinc)) +
geom_bar() +
scale_x_continuous(breaks=seq(0, 10, 1))
dados %>%
ggplot(aes(intel)) +
geom_bar() +
scale_x_continuous(breaks=seq(0, 10, 1))
dados %>%
ggplot(aes(fun)) +
geom_bar() +
scale_x_continuous(breaks=seq(0, 10, 1))
dados %>%
ggplot(aes(amb)) +
geom_bar() +
scale_x_continuous(breaks=seq(0, 10, 1))
dados %>%
ggplot(aes(shar)) +
geom_bar() +
scale_x_continuous(breaks=seq(0, 10, 1))
dados %>%
ggplot(aes(like)) +
geom_bar() +
scale_x_continuous(breaks=seq(0, 10, 1))
dados %>%
ggplot(aes(prob)) +
geom_bar() +
scale_x_continuous(breaks=seq(0, 10, 1))
Diante dos dados apresentados e da análise do histograma das variáveis é possível inferir que essas variáveis se relacionem e possam influenciar no match, visto que essas distribuições das respostas se aproximam de uma distribuição normal.
Vamos também verificar o número de decisões “não” (0 no gráfico) e “sim” (1 no gráfico).
# decisoes (0 = no, 1 = yes)
dados %>%
ggplot(aes(dec)) +
geom_bar() +
scale_x_continuous(breaks=seq(0, 1, by = 1))
Agora vamos fazer a regressão logística múltipla utilizando para analisar todas as variáveis apresentadas nos dados, ou seja, attr, fun, intel, sinc, amb, shar, like e prob e verificar o nível de associação significativa com dec.
Para melhor analisar os coeficientes e seus efeitos vamos plotar os intervalos de confiança do modelo.
modelo1 <- glm(dec ~ attr + fun + intel + sinc + amb + shar + like + prob,
data = dados,
family = "binomial")
tidy(modelo1, conf.int = TRUE)
## # A tibble: 9 x 7
## term estimate std.error statistic p.value conf.low conf.high
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) -6.00 0.271 -22.1 1.34e-108 -6.54 -5.47
## 2 attr 0.433 0.0311 13.9 5.19e- 44 0.372 0.494
## 3 fun 0.123 0.0333 3.70 2.19e- 4 0.0579 0.188
## 4 intel -0.0470 0.0414 -1.14 2.56e- 1 -0.128 0.0339
## 5 sinc -0.235 0.0342 -6.85 7.27e- 12 -0.302 -0.168
## 6 amb -0.213 0.0323 -6.58 4.67e- 11 -0.277 -0.150
## 7 shar 0.156 0.0268 5.82 5.82e- 9 0.104 0.209
## 8 like 0.621 0.0436 14.2 6.46e- 46 0.536 0.707
## 9 prob 0.168 0.0229 7.36 1.86e- 13 0.124 0.213
tidy(modelo1, conf.int = TRUE, conf.level = 0.95)
## # A tibble: 9 x 7
## term estimate std.error statistic p.value conf.low conf.high
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) -6.00 0.271 -22.1 1.34e-108 -6.54 -5.47
## 2 attr 0.433 0.0311 13.9 5.19e- 44 0.372 0.494
## 3 fun 0.123 0.0333 3.70 2.19e- 4 0.0579 0.188
## 4 intel -0.0470 0.0414 -1.14 2.56e- 1 -0.128 0.0339
## 5 sinc -0.235 0.0342 -6.85 7.27e- 12 -0.302 -0.168
## 6 amb -0.213 0.0323 -6.58 4.67e- 11 -0.277 -0.150
## 7 shar 0.156 0.0268 5.82 5.82e- 9 0.104 0.209
## 8 like 0.621 0.0436 14.2 6.46e- 46 0.536 0.707
## 9 prob 0.168 0.0229 7.36 1.86e- 13 0.124 0.213
tidy(modelo1, conf.int = TRUE, conf.level = 0.95) %>%
filter(term != "(Intercept)") %>%
ggplot(aes(term, estimate, ymin = conf.low, ymax = conf.high)) +
geom_errorbar(size = 0.8, width= 0.4) +
geom_point(color = "red", size = 2) +
geom_hline(yintercept = 0, colour = "darkred") +
labs(x = "Variáveis Independentes",
title = "Termos da regressão logística",
y = expression(paste("estimado ", 'b'," (95% de confiança)")))
Diante do gráfico acima podemos fazer algumas inferências, como:
A variável intel apresenta um IC entre -0.12818930 e 0.03394935, ou seja, pode apresentar um valor zero, assim não podemos dizer que a variável tenha relevância significância no modelo. Já as variáveis amb e sinc apresentam uma relevância significativa com efeito negativo sobre a variável dependente dec, pois o seu intervalo de confiança é de -0.27661707 e -0.14977084, para amb e -0.30211481 -0.16782451, para sinc. As demais variáveis, attr, fun, like, prob e shar tem relevância significativa com efeito positivo sobre a variável dependente dec. As quatro variáveis que podemos escolher são: attr, like, prob e shar, pois são as mais impactantes para o modelo. Sendo a variável like, tem o maior impacto no modelo.
Aplicando o exponencial no modelo os valores podem ter uma melhor interpretação das variáveis, segue os valores:
tidy(modelo1, conf.int = TRUE, exponentiate = TRUE)
## # A tibble: 9 x 7
## term estimate std.error statistic p.value conf.low conf.high
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) 0.00248 0.271 -22.1 1.34e-108 0.00145 0.00419
## 2 attr 1.54 0.0311 13.9 5.19e- 44 1.45 1.64
## 3 fun 1.13 0.0333 3.70 2.19e- 4 1.06 1.21
## 4 intel 0.954 0.0414 -1.14 2.56e- 1 0.880 1.03
## 5 sinc 0.791 0.0342 -6.85 7.27e- 12 0.739 0.846
## 6 amb 0.808 0.0323 -6.58 4.67e- 11 0.758 0.861
## 7 shar 1.17 0.0268 5.82 5.82e- 9 1.11 1.23
## 8 like 1.86 0.0436 14.2 6.46e- 46 1.71 2.03
## 9 prob 1.18 0.0229 7.36 1.86e- 13 1.13 1.24
Diante das variáveis que são mais relevantes no modelo (attr, like, prob e shar), podemos concluir que o efeito de aumentar 1 no like, aumenta as chances de o match (variável dec) ser ‘yes’ em 86%. Outra variável que, se aumentada em 1 aumenta as chances de match ser ‘yes’ em 54%, é o attr. As demais temos um aumento de chances de match ser ‘yes’ em 18% e 16%, para as variáveis shar e prob.
attr:aumentar em uma unidade faz com que y seja multiplicado por 1.54
like:aumentar em uma unidade faz com que y seja multiplicado por 1.85
prob:aumentar em uma unidade faz com que y seja multiplicado por 1.18
shar:aumentar em uma unidade faz com que y seja multiplicado por 1.16