Apresentação

Baseado no estudo “Gender Differences In Mate Selection: Evidence From A Speed Dating Experiment”, temos dados descrevendo 5000 encontros relâmpagos de 4 minutos envolvendo 310 jovens americanos. O Speed Dating consiste em um encontro rápido onde as mulheres ficam sentadas e os pretendentes “pulam” de mesa em mesa para ver, se no fim das contas, o casal tem um match considerando seus interesses e demais detalhes.

Tomando como base um conjunto de variáveis explicartivas, o objetivo deste relatório é responder: **“Que fatores nos dados têm efeito relevante na chance do casal ter um match?”.

dados = read_csv(here("speed-dating/speed-dating2.csv"),
                  col_types = cols(.default = col_double(), 
                                   field = col_character(),
                                   from = col_character(),
                                   career = col_character(),
                                   dec = col_character()
                                   )) %>% 
  mutate(dec = as.factor(dec), 
         gender = as.factor(gender))

Dados

Os participantes tinham vários encontros de 4 minutos por noite. Após cada um, preenchiam fichas avaliando aqueles com quem se encontraram. Cada linha nos dados representa um desses encontros.

As variáveis utilizadas são:

Análise Exploratória dos Dados

Visão geral dos dados utilizados

skimr::skim(dados)
Data summary
Name dados
Number of rows 4918
Number of columns 44
_______________________
Column type frequency:
character 3
factor 2
numeric 39
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
field 20 1.00 3 51 0 148 0
from 36 0.99 2 58 0 172 0
career 46 0.99 2 77 0 218 0

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
gender 0 1 FALSE 2 1: 2464, 0: 2454
dec 0 1 FALSE 2 no: 2873, yes: 2045

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
iid 0 1.00 274.67 183.91 1.00 88.00 273.00 431.00 552.0 ▇▁▅▅▅
order 0 1.00 9.26 5.67 1.00 4.00 9.00 14.00 22.0 ▇▆▅▃▂
pid 10 1.00 274.98 183.97 1.00 88.00 273.00 431.00 552.0 ▇▁▅▅▅
int_corr 72 0.99 0.19 0.31 -0.73 -0.03 0.21 0.43 0.9 ▁▅▇▇▂
samerace 0 1.00 0.41 0.49 0.00 0.00 0.00 1.00 1.0 ▇▁▁▁▆
age_o 61 0.99 25.79 3.35 18.00 23.00 25.00 28.00 39.0 ▃▇▆▁▁
age 52 0.99 25.78 3.35 18.00 23.00 25.00 28.00 39.0 ▃▇▆▁▁
race 20 1.00 2.73 1.22 1.00 2.00 2.00 4.00 6.0 ▇▁▃▁▁
sports 36 0.99 6.40 2.57 1.00 5.00 7.00 8.00 10.0 ▂▅▆▇▆
tvsports 36 0.99 4.53 2.82 1.00 2.00 4.00 7.00 10.0 ▇▆▅▅▃
exercise 36 0.99 6.12 2.33 1.00 5.00 6.00 8.00 10.0 ▂▃▇▇▃
dining 36 0.99 7.69 1.79 1.00 7.00 8.00 9.00 10.0 ▁▁▃▇▇
museums 36 0.99 6.88 2.08 0.00 6.00 7.00 8.00 10.0 ▁▂▃▇▅
art 36 0.99 6.59 2.29 0.00 5.00 7.00 8.00 10.0 ▁▃▅▇▅
hiking 36 0.99 5.77 2.56 0.00 4.00 6.00 8.00 10.0 ▃▆▇▇▅
gaming 36 0.99 4.02 2.67 0.00 2.00 4.00 6.00 14.0 ▇▇▅▁▁
clubbing 36 0.99 5.73 2.45 0.00 4.00 6.00 8.00 10.0 ▃▅▆▇▃
reading 36 0.99 7.64 2.02 1.00 7.00 8.00 9.00 13.0 ▁▂▇▇▁
tv 36 0.99 5.29 2.45 1.00 3.00 6.00 7.00 10.0 ▅▅▇▇▂
theater 36 0.99 6.72 2.25 0.00 5.00 7.00 8.00 10.0 ▁▃▅▇▆
movies 36 0.99 7.98 1.67 0.00 7.00 8.00 9.00 10.0 ▁▁▂▇▇
concerts 36 0.99 6.82 2.10 0.00 6.00 7.00 8.00 10.0 ▁▂▆▇▅
music 36 0.99 7.78 1.84 1.00 7.00 8.00 9.00 10.0 ▁▁▃▇▇
shopping 36 0.99 5.48 2.57 1.00 3.00 6.00 7.00 10.0 ▆▅▇▆▅
yoga 36 0.99 4.21 2.71 0.00 2.00 4.00 6.00 10.0 ▇▅▅▃▂
attr 118 0.98 6.06 1.95 0.00 5.00 6.00 7.00 10.0 ▁▃▇▇▂
sinc 161 0.97 7.05 1.81 0.00 6.00 7.00 8.00 10.0 ▁▁▅▇▃
intel 166 0.97 7.27 1.59 0.00 6.00 7.00 8.00 10.0 ▁▁▃▇▃
fun 197 0.96 6.29 1.98 0.00 5.00 6.00 8.00 10.0 ▁▂▇▇▂
amb 421 0.91 6.70 1.83 0.00 6.00 7.00 8.00 10.0 ▁▂▇▇▃
shar 643 0.87 5.32 2.16 0.00 4.00 5.00 7.00 10.0 ▂▅▇▅▁
like 122 0.98 6.05 1.85 0.00 5.00 6.00 7.00 10.0 ▁▂▇▇▂
prob 156 0.97 5.02 2.17 0.00 4.00 5.00 7.00 10.0 ▃▅▇▅▁
match_es 460 0.91 3.17 2.36 0.00 2.00 3.00 4.00 10.0 ▇▆▂▁▁
attr3_s 2874 0.42 7.08 1.55 3.00 7.00 7.00 8.00 10.0 ▂▂▇▇▂
sinc3_s 2874 0.42 7.99 1.52 3.00 7.00 8.00 9.00 10.0 ▁▁▃▆▇
intel3_s 2874 0.42 8.21 1.22 4.00 8.00 8.00 9.00 10.0 ▁▁▂▇▇
fun3_s 2874 0.42 7.57 1.63 3.00 7.00 8.00 9.00 10.0 ▁▂▇▇▇
amb3_s 2874 0.42 7.59 1.78 3.00 7.00 8.00 9.00 10.0 ▂▂▅▃▇

Descritivo dos Dados

Antes de criarmos o modelo, vamos observar algumas informações relacionadas aos dados coletados do público que participa do Speed Dating - gênero, idade e raça.

# Gênero
 dados %>%
  group_by(gender) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = gender, y = n)) +
  geom_bar(stat = "identity") + 
  labs(title = "Gênero dos Participantes do Speed Dating", x = "", y = "Número de participantes") +
  scale_x_discrete(labels = c('Feminino', 'Masculino'))

# Gênero e Idade
dados %>%
  group_by(gender, age) %>%
  summarise(n = n()) %>%
  na.omit() %>%
  ggplot(aes(x = age, y = n, fill = gender)) +
  geom_bar(stat = "identity") + 
  labs(title = "Idade e Gênero dos Participantes do Speed Dating", x = "Idade", y = "Número de participantes", fill = "Gênero") +
  scale_fill_discrete(labels = c("Feminino", "Masculino"))
## `summarise()` has grouped output by 'gender'. You can override using the
## `.groups` argument.

# Raça e Gênero
dados %>%
  group_by(race, gender) %>%
  na.omit() %>%
  summarise(n = n()) %>%
  ggplot(aes(x = as.factor(race), y = n, fill = gender)) +
  geom_bar(stat = "identity") + 
  scale_x_discrete(labels = c("1" = "Black/African American", "2" ="European/Caucasian-American", "3" = "Latino/Hispanic American", "4" = "Asian/Pacific \n Islander/Asian-American", "5" = "Native American", "6" = "Other")) +
  labs(title = "Raça e Gênero dos Participantes do Speed Dating", x = "Raça", 
       y = "Número de participantes", fill = "Gênero") +
  scale_fill_discrete(labels = c("Feminino", "Masculino")) + coord_flip()
## `summarise()` has grouped output by 'race'. You can override using the
## `.groups` argument.

Como observado, os participantes vão de jovens até adultos (mais concentrados na faixa de 20 a 30 anos), com a maioria sendo mulheres caucasianas.

Criando o modelo

Para investigar quais fatores têm efeito relevante na chance do casal ter match, vamos utilizar a regressão logística. Especialmente, vamos levar em consideração a coluna denominada dec, a qual representa a existência ou não (yes para sucesso e no para fracasso) de match entre os dois participantes do encontro. Esta será a variável de resposta.

Assim, analisando o formulário presente no repositório, podemos utilizar as seguintes variáveis para a criação do modelo:

Agora vamos analisar a correlação entre essas variáveis e a variável de resposta dec.

cor_dados <- dados %>%
  select(order, attr, intel, fun, dec) %>%
  na.omit()
ggpairs(cor_dados)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

De acordo com a matriz de correlação acima, não há indícios de pares de variáveis apresentando correlação muito alta. Assim, podemos selecioná-las para a construção de um modelo de regressão.

O modelo de regressão logística é verificado por:

modelo = glm(dec ~ order + attr + intel + fun, data = cor_dados, family = "binomial")
modelo
## 
## Call:  glm(formula = dec ~ order + attr + intel + fun, family = "binomial", 
##     data = cor_dados)
## 
## Coefficients:
## (Intercept)        order         attr        intel          fun  
##    -5.24456     -0.00559      0.56211     -0.08907      0.32797  
## 
## Degrees of Freedom: 4677 Total (i.e. Null);  4673 Residual
## Null Deviance:       6378 
## Residual Deviance: 4929  AIC: 4939

Como observado acima, os coeficientes de maior impacto no modelo são attr (0.56211) e fun (0.32797).

Vamos agora verificar o resultado do modelo considerando intervalos de confiança.

tidy(modelo, conf.int = TRUE, exponentiate = TRUE, conf.level = .95)
## # A tibble: 5 × 7
##   term        estimate std.error statistic   p.value conf.low conf.high
##   <chr>          <dbl>     <dbl>     <dbl>     <dbl>    <dbl>     <dbl>
## 1 (Intercept)  0.00528   0.231     -22.7   3.33e-114  0.00334   0.00825
## 2 order        0.994     0.00620    -0.902 3.67e-  1  0.982     1.01   
## 3 attr         1.75      0.0255     22.0   1.55e-107  1.67      1.85   
## 4 intel        0.915     0.0281     -3.17  1.54e-  3  0.866     0.967  
## 5 fun          1.39      0.0250     13.1   3.23e- 39  1.32      1.46

Para os atributos escolhidos, a ordem da pessoa no encontro não teve um efeito expressivo. Na verdade, pelo intervalo de confiança de 95% a ordem pode está entre 0,9824 e 1,0065, sendo um efeito pequeno e negativo ou irrisório. Semelhante acontece com a inteligência que com IC de 95% está entre 0,8655 e 0,9665, o efeito pode ser considerado mínimo e negativo. Os atributos que se destacaram foram o senso de humor, que chega a acrescentar até 0,4584 na fórmula do match (o valor estimado é de 1,3881 com IC de 95%[1,322, 1,4584]) e a aparência que neste modelo é o que mais importa com estimativa de 1,7543 e IC de 95%[1,6696, 1,8453].

Ou seja, ser bonito e engraçado conta mais que ser inteligente e o primeiro da fila. Mas ainda há esperanças para todos!

Conclusões

A seguir podemos verificar o quanto que o modelo criado representa sobre os dados:

pR2(modelo)
## fitting null model for pseudo-r2
##           llh       llhNull            G2      McFadden          r2ML 
## -2464.6051992 -3188.7593345  1448.3082705     0.2270959     0.2662595 
##          r2CU 
##     0.3577868

Para regressão logística não há \(R^2\), mas podemos estimar o valor de \(R^2\) para um modelo logístico. Com isso, verificamos através do método de McFadden que o modelo gerado explica apenas 26,41% dos dados, o que pode significar que as variáveis attr e fun podem não influenciar tanto na chance de match com algum participante.