Ajuste dos dados

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...

A estrutura dos dados

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)
Data summary
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 ▇▁▁▁▆

Histogramas das variáveis independentes

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))

A distribuição das variáveis

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.

Uma representação da variável “dec”

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))

O Modelo com todas as variáveis

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.

O Modelo agora com exponencial

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

Descrevendo os efeitos das variáveis (attr, like, prob e shar)

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