Análise Preditiva - Estudo de Caso

Lições na linguagem R

Author
Affiliation

Luiz Antônio Gouveia de Oliveira

Faculdade SENAC DF

Published

15/11/2023

1. Pacotes necessários

Vamos instalar e carregar todos os pacotes necessários para este projeto:

Code
   # Testa se o pacote "pacman" está instalado. Se necessário, faz a instalação
if(!require(pacman)) install.packages("pacman")

pacman::p_load(tidyverse,   # Família de pacotes para manipulação de dados
               moderndive, 
               skimr, 
               ISLR,
               gridExtra)

options(scipen = 999)

2. Contextualização do caso

Por que alguns professores e instrutores de universidades e faculdades recebem notas altas nas avaliações de ensino dos alunos, enquanto outros recebem notas mais baixas? Existem diferenças nas avaliações de ensino entre professores/instrutores de diferentes grupos demográficos? Poderia haver um impacto devido aos preconceitos dos alunos?

Todas essas questões interessam aos gestores de universidades/faculdades, pois as avaliações docentes estão entre os diversos critérios considerados para determinar quais professores e instrutores serão promovidos.

3. Questão de pesquisa

Pesquisadores da Universidade do Texas em Austin, Texas (UT Austin) tentaram responder à seguinte questão de pesquisa: quais fatores explicam as diferenças nas pontuações de avaliação do ensino dos(as) professores(as)/instrutores(as)? Para tanto, eles coletaram informações sobre professores/instrutores e cursos em 463 cursos de nível superior.

4. Modelo conceitual da análise preditiva

Neste projeto, consideraremos um modelo em que nossa variável de resultado será a nota de ensino recebida pelo(a) professor(a)/instrutor(a) e incluiremos duas variáveis explicativas diferentes: idade e gênero (masculino ou feminino).

A partir desse modelo, podemos estabelecer algumas hipóteses:

  • será que os(as) professores(as)/instrutores(as) mais velhos recebem melhores avaliações de ensino dos alunos?

  • Ou será que os(as) professores(as)/instrutores(as) mais jovens recebem melhores avaliações?

  • Existem diferenças nas avaliações dadas pelos alunos para professores/instrutores de gêneros diferentes?

Responderemos a essas questões modelando a relação entre essas variáveis por meio de regressão múltipla, onde temos uma variável numérica de resultado y (a nota de ensino do(a) professor(a)/instrutor(a)) e duas variáveis explicativas:

  • uma variável explicativa numérica X1 (a idade do(a) professor(a)); e
  • uma variável explicativa categórica X2 (o gênero (binário) do(a) professor(a)).

Matematicamente, nosso modelo é descrito abaixo:

y = \(\alpha\) + \(\beta\)1X1 + \(\beta\)2X2 + \(\epsilon\)

onde:

\(\alpha\) é o intercepto do modelo

\(\beta\)1 é o coeficiente de determinação da variável X1 (idade)

\(\beta\)2 é o coeficiente de determinação da variável X2 (gênero)

\(\epsilon\) é um termo de erro que expressa a aleatoriedade do modelo

Podemos também apresentar nosso modelo da seguinte forma:

nota = \(\alpha\) + \(\beta\)1 . idade + \(\beta\)2 . gênero + \(\epsilon\)

5. Análise exploratória dos dados

Lembre-se de que os dados sobre os 463 cursos da UT Austin podem ser encontrados na base de dados evals incluído no pacote moderndive. Entretanto, para simplificar, vamos selecionar apenas o subconjunto de variáveis que consideraremos neste projeto e salvar esses dados em uma nova base de dados chamado evals_proj.

Para facilitar a interpretação da base de dados, vamos traduzir os nomes das variáveis para o português.

Para tanto, vamos aplicar o comando rename:

Code
evals_proj <- evals_proj %>%
  rename("Nota do(a) professor(a)" = "score", "Idade do(a) professor(a)" = "age", "Gênero do(a) professor(a)" = "gender")

write.csv(evals_proj, "/Users/MAC/Downloads/avalia_prof.csv", row.names = TRUE)

Lembre-se das três etapas comuns em uma análise exploratória de dados:

  • Observando os valores dos dados brutos;
  • Calculando estatísticas resumidas;
  • Criando a visualizações de dados.

5.1 Observando os valores dos dados brutos

Vamos primeiro dar uma olhada nos valores dos dados brutos da base evals_proj usando o visualizador de planilha do RStudio ou usando a função glimpse() do pacote dplyr:

Code
glimpse(evals_proj)
Rows: 463
Columns: 4
$ ID                          <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,…
$ `Nota do(a) professor(a)`   <dbl> 4.7, 4.1, 3.9, 4.8, 4.6, 4.3, 2.8, 4.1, 3.…
$ `Idade do(a) professor(a)`  <int> 36, 36, 36, 36, 59, 59, 59, 51, 51, 40, 40…
$ `Gênero do(a) professor(a)` <fct> female, female, female, female, male, male…

Vamos também exibir uma amostra aleatória de 5 linhas das 463 linhas correspondentes a diferentes cursos na tabela abaixo. Lembre-se: devido à natureza aleatória da amostragem, você provavelmente acabará com um subconjunto diferente de 5 linhas.

Code
evals_proj %>% sample_n(size = 5)
# A tibble: 5 × 4
     ID `Nota do(a) professor(a)` Idade do(a) professor…¹ Gênero do(a) profess…²
  <int>                     <dbl>                   <int> <fct>                 
1   434                       2.8                      62 male                  
2    94                       4                        48 male                  
3   173                       4.2                      39 male                  
4   329                       2.7                      64 male                  
5   140                       4.8                      34 female                
# ℹ abbreviated names: ¹​`Idade do(a) professor(a)`,
#   ²​`Gênero do(a) professor(a)`

5.2 Calculando estatísticas resumidas

Agora que examinamos os valores brutos da nossa base evals_proj e entendemos os dados, vamos calcular algumas estatísticas resumidas. Para tanto, vamos usar a função skim() do pacote skimr, certificando-nos de selecionar apenas as variáveis de interesse em nosso modelo:

Code
evals_proj %>% select(`Nota do(a) professor(a)`, `Idade do(a) professor(a)`, `Gênero do(a) professor(a)`) %>% skim()
Data summary
Name Piped data
Number of rows 463
Number of columns 3
_______________________
Column type frequency:
factor 1
numeric 2
________________________
Group variables None

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
Gênero do(a) professor(a) 0 1 FALSE 2 mal: 268, fem: 195

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Nota do(a) professor(a) 0 1 4.17 0.54 2.3 3.8 4.3 4.6 5 ▁▁▅▇▇
Idade do(a) professor(a) 0 1 48.37 9.80 29.0 42.0 48.0 57.0 73 ▅▆▇▆▁

Observe que:

  • não temos dados faltantes (missing values);
  • existem 268 cursos ministrados por professores/instrutores do sexo masculino e 195 cursos ministrados por professores/instrutoras do sexo feminino;
  • a idade média dos professores/instrutores é de 48,37 anos.

Lembre-se de que cada linha representa um curso específico e que o mesmo professor/instrutor geralmente ministra mais de um curso. Portanto, a idade média dos professores/instrutores únicos pode ser diferente.

Além disso, vamos calcular, a seguir, o coeficiente de correlação entre nossas duas variáveis numéricas: nota e idade do(a) professor(a). Lembre-se de que os coeficientes de correlação só existem entre variáveis numéricas. Observamos que a correlação entre essas variáveis é fraca (apenas 0.107) e apresenta um sinal negativo, ou seja, é inversamente proporcional: quando uma variável aumenta, a outra diminui.

Code
evals_proj %>% 
  get_correlation(formula = `Nota do(a) professor(a)` ~ `Idade do(a) professor(a)`)
# A tibble: 1 × 1
     cor
   <dbl>
1 -0.107

5.3 Criando a visualização dos dados

Vamos agora realizar a última das três etapas comuns em uma análise exploratória de dados: criar visualizações de dados.

Dado que a variável de resultado Nota do(a) professor(a) e a variável explicativa Idade do(a) professor(a) são ambas numéricas, usaremos um gráfico de dispersão para exibir sua relação. Mas como podemos incorporar a variável categórica gênero? Mapeando a variável gênero para a estética da cor, criando assim um gráfico de dispersão colorido.

O código a seguir cria o gráfico de dispersão da pontuação de ensino sobre a pontuação de resultado, mas com cor = gênero adicionado ao mapeamento estético().

Code
ggplot(evals_proj, aes(x = `Idade do(a) professor(a)`, y = `Nota do(a) professor(a)`, color = `Gênero do(a) professor(a)`)) +
  geom_point() +
  labs(x = "Idade do(a) professor(a)", y = "Nota do(a) professor(a)", color = "Gênero do(a) professor(a)") +
  geom_smooth(method = "lm", se = TRUE)

Na gráfico acima, observe que o comando ggplot( ) atribui um padrão no esquema de cores vermelho/azul aos pontos e às linhas associadas aos dois tipos de gênero: feminino e masculino. Além disso, a camada geom_smooth(method = “lm”, se = TRUE) ajusta automaticamente uma linha de regressão diferente para cada grupo.

Notamos algumas tendências interessantes: - quase não há docentes mulheres com mais de 60 anos, como evidenciado pela falta de pontos vermelhos acima de x = 60; - embora ambas as linhas de regressão sejam negativamente inclinadas com a idade (ou seja, docentes mais velhos tendem a ter notas mais baixas), a inclinação para a idade das docentes é mais negativo. Em outras palavras, as professoras estão pagando uma penalidade mais severa pela idade avançada do que os docentes do sexo masculino.

6. Modelo de interação e modelo de declives paralelos

Agora, vamos quantificar a relação entre nossa variável de resultado y (a nota de avaliação do(a) professor(a)) e as duas variáveis exploratórias X1 (idade) e X2 (gênero) utilizando um tipo de modelo de regressão múltipla conhecido como modelo de interação.

Particularmente, escreveremos a equação das duas linhas de regressão do gráfico acima utilizando os valores de uma tabela de regressão.

Para tanto, nós geramos a tabela de regressão utilizando uma abordagem de duas etapas: primeiro, nós “ajustamos” o modelo usando a função lm( ) - linear model ou modelo linear - e, então, aplicamos a função get_regression_table().

Observe que, dessa vez, a fórmula do nosso modelo de regressão não será y ~ x, mas y ~ X1 * X2. Em outras palavras, nossas duas variáveis explicativas X1 e X2 são separadas por um sinal de multiplicação (*).

modelo de interação

Code
# Ajustando o modelo de regressão:
modelo_interacao <- lm(`Nota do(a) professor(a)` ~ `Idade do(a) professor(a)` * `Gênero do(a) professor(a)`, data = evals_proj)

# Obtendo a tabela de regressão:
get_regression_table(modelo_interacao)
# A tibble: 4 × 7
  term                    estimate std_error statistic p_value lower_ci upper_ci
  <chr>                      <dbl>     <dbl>     <dbl>   <dbl>    <dbl>    <dbl>
1 intercept                  4.88      0.205     23.8    0        4.48     5.29 
2 `Idade do(a) professor…   -0.018     0.004     -3.92   0       -0.026   -0.009
3 `Gênero do(a) professo…   -0.446     0.265     -1.68   0.094   -0.968    0.076
4 `Idade do(a) professor…    0.014     0.006      2.45   0.015    0.003    0.024

Olhando para os resultados da tabela de regressão acima, verifica-se que existem quatro linhas de valores na coluna estimate. Embora não seja evidente, utilizando esses quatro valores nós conseguimos escrever as equações de ambas as linhas de regressão traçadas no gráfico acima.

Observe que a palavra female (feminino) vem - alfabeticamente - a frente da palavra male (masculino). Dessa forma, as professoras formam o grupo de “linha de base” para efeito de comparação dos resultados da interação entre as variáveis explicativas. Vale destacar, ainda, que o valor do intercepto (\(\alpha\)) corresponde ao intercepto apenas das professoras.

A mesma lógica se aplica à variável Idade do(a) professor(a). O valor da inclinação da curva da variável Idade do(a) professor(a) na tabela acima corresponde a tão somente à idade das professoras. Dessa forma, a curva de regressão vermelha no gráfico acima tem um intercepto de 4.883 e uma inclinação para a variável idade das professoras de -0.018. Observe que, para essa base de dados, ao mesmo tempo em que o intercepto tem uma interpretação matemática, por um lado, ele não tem uma interpretação prática, por outro lado. (os docentes não podem ter idade igual a zero)

E quanto ao intercepto e à inclinação para a idade dos docentes do sexo masculino na linha azul do gráfico acima? É aqui que a nossa noção de “compensações” entra em jogo.

Na regressão linear, uma compensação é um preditor “estrutural” cujo coeficiente não é estimado pelo modelo. Em vez disso, o modelo assume que o coeficiente tem o valor 1. Os valores das compensações são então adicionados ao preditor linear da variável sob análise.

No nosso exemplo, o valor de -0,446 para o gênero masculino não é o intercepto para os docentes do sexo masculino, mas sim a “compensação” do intercepto da curva de idade para os docentes do sexo masculino em relação aos docentes do sexo feminino. Assim, o intercepto da curva de idade para os docentes do sexo masculino é dado por: intercepto do modelo de regressão + compensação do gênero masculino = 4,883 + (-0,446) = 4,883 - 0,446 = 4,437.

Da mesma forma, age:gendermale = 0,014 não é a inclinação da curva da idade para os os docentes do sexo masculino, mas sim a “compensação” da inclinação da curva de idade para os docentes do sexo masculino. Portanto, a inclinação da curva da idade para os docentes do sexo masculino é igual à inclinação da curva de idade dos docentes do gênero feminino + a inclinação da curva de idade dos docentes do gênero masculino = −0,018 + 0,014 = −0,004. Assim, a linha de regressão azul no gráfico acima tem intercepto 4,437 e inclinação da curva da idade igual a -0,004. Vamos resumir estes valores na tabela abaixo e focar nos dois declives da curva da idade:

Tabela

Uma vez que a inclinação da curva da idade para as docentes femininas foi de -0.018, isso significa que, na média, cada ano adicional na idade de uma professora implica em 0.018 unidade a menos em sua nota de avaliação. Para os docentes masculinos, entretanto, o decréscimo da nota de avaliação correspondente a cada ano adicional na idade foi de apenas 0.004 unidade. Ou seja: enquanto ambas as inclinações das curvas de idade masculina e feminina são negativas, a inclinação da curva de idade das docentes femininas é ainda mais negativa que a dos homens.

O modelo de interação sugere, portanto, que a variável idade tem mais peso na nota de avaliação dos docentes do sexo feminino do que na nota de avaliação dos docentes do sexo masculino.

Vamos agora escrever a equação para nossas retas de regressão, que podemos usar para calcular nossos valores ajustados (y chapéu) para as notas dos docentes (\(\displaystyle \hat{y}\) = \(\displaystyle \hat{nota do professor}\)).

\(\displaystyle \hat{y}\) = \(\alpha\) + \(\beta\)1 * idade + \(\beta\)masculino * gênero(é homem) + \(\beta\)masculino,idade * idade * gênero (é homem) + \(\epsilon\)

\(\displaystyle \hat{y}\) = 4.883 - 0.018 * idade - 0.446 * gênero(é homem) + 0.014 * gênero(é homem) + \(\epsilon\)

Observe que a variável gênero(é homem) é uma variável dummy, ou seja, ela assume o valor igual a 1 quando o gênero do docente é masculino e zero quando o gênero do docente é feminino.

Vamos juntar tudo isso e calcular o valor ajustado \(\displaystyle \hat{y}\) = \(\displaystyle \hat{nota do professor}\) para docentes do gênero feminino.

Já que para as professoras a variável dummy gênero(é homem) é igual a 0, a equação anterior se torna:

\(\displaystyle \hat{y}\) = 4.484 - 0.009 * idade + 0.191 * 0 + \(\epsilon\)

\(\displaystyle \hat{y}\) = 4.484 - 0.009 * idade + \(\epsilon\)

que é a equação da linha de regressão vermelha no gráfico acima correspondente às professoras.

Da mesma forma, uma vez que para docentes do sexo masculino a função do indicador gênero(é homem) = 1, a equação anterior se torna:

\(\displaystyle \hat{y}\) = 4.484 - 0.009 * idade + 0.191 * 1 + \(\epsilon\)

\(\displaystyle \hat{y}\) = (4.484 + 0.191) - 0.009 * idade + \(\epsilon\)

\(\displaystyle \hat{y}\) = 4.675 - 0.009 * idade + \(\epsilon\)

que é a equação da linha de regressão azul no gráfico anterior, correspondente aos docentes do sexo masculino.

modelo de declives paralelos

Code
# Ajustando o modelo de regressão:
modelo_declives <- lm(`Nota do(a) professor(a)` ~ `Idade do(a) professor(a)` + `Gênero do(a) professor(a)`, data = evals_proj)

# Obtendo a tabela de regressão:
get_regression_table(modelo_declives)
# A tibble: 3 × 7
  term                    estimate std_error statistic p_value lower_ci upper_ci
  <chr>                      <dbl>     <dbl>     <dbl>   <dbl>    <dbl>    <dbl>
1 intercept                  4.48      0.125     35.8    0        4.24     4.73 
2 `Idade do(a) professor…   -0.009     0.003     -3.28   0.001   -0.014   -0.003
3 `Gênero do(a) professo…    0.191     0.052      3.63   0        0.087    0.294

Ótimo! Consideramos um modelo de interação e um modelo de declives paralelos para nossos dados. Vamos comparar as visualizações de ambos os modelos lado a lado no gráfico a seguir:

Code
par(mfrow = c(1,2))

plot1 <- ggplot(evals_proj, aes(x = `Idade do(a) professor(a)`, y = `Nota do(a) professor(a)`, color = `Gênero do(a) professor(a)`)) +
  geom_point() +
  labs(x = "Idade do(a) professor(a)", y = "Nota do(a) professor(a)", color = "Gênero do(a) professor(a)") +
  geom_smooth(method = "lm", se = TRUE) +
  theme(legend.position = "bottom")

plot2 <- ggplot(evals_proj, aes(x = `Idade do(a) professor(a)`, y = `Nota do(a) professor(a)`, color = `Gênero do(a) professor(a)`)) +
  geom_point() +
  geom_parallel_slopes() +
  theme(legend.position = "bottom")

grid.arrange(plot1, plot2, ncol = 2)

7. Valores observados/ajustados e resíduos

Nesta seção calcularemos apenas os valores observados, os valores ajustados e resíduos para o modelo de interação que salvamos com o nome de modelo_interacao.

Digamos que você tenha uma professora que se identifica como mulher e tem 36 anos. Qual valor ajustado \(\displaystyle \hat{y}\) = \(\displaystyle \hat{notado(a)professor(a)}\) nosso modelo renderia?

Digamos que você tenha outro professor que se identifica como homem e tem 59 anos. Qual seria o seu valor ajustado \(\displaystyle \hat{y}\)?

Respondemos a esta questão primeiro visualmente para a professora, encontrando a intersecção da linha de regressão vermelha e da linha vertical em x = idade = 36. Marcamos esse valor com um grande ponto vermelho no gráfico abaixo. Da mesma forma, podemos identificar o valor ajustado \(\displaystyle \hat{y}\) = \(\displaystyle \hat{notado(a)professor(a)}\) para o docente do sexo masculino, encontrando a intersecção da linha de regressão azul e a linha vertical em x = idade = 59. Marcamos este valor com um grande ponto azul no gráfico abaixo.

Code
plot3 <- ggplot(evals_proj, aes(x = `Idade do(a) professor(a)`, y = `Nota do(a) professor(a)`, color = `Gênero do(a) professor(a)`)) +
  geom_point() +
  labs(x = "Idade do(a) professor(a)", y = "Nota do(a) professor(a)", color = "Gênero do(a) professor(a)") +
  geom_smooth(method = "lm", se = TRUE) +
  geom_vline(xintercept = 36, linetype = "solid", 
                color = "red") +
  geom_vline(xintercept = 59, linetype = "solid", 
                color = "blue")

plot3

Mas quais são esses dois valores de \(\displaystyle \hat{y}\) = \(\displaystyle \hat{notado(a)professor(a)}\) precisamente? Podemos utilizar as equações das duas linhas de regressão que calculamos na secção 6, que por sua vez foram baseadas em valores da tabela de regressão na tabela acima:

  • para todas as docentes do sexo feminino: \(\displaystyle \hat{y}\) = \(\displaystyle \hat{notado(a)professor(a)}\) = 4.883 - 0.018 * idade

  • para todas as docentes do sexo masculino: \(\displaystyle \hat{y}\) = \(\displaystyle \hat{notado(a)professor(a)}\) = 4.437 - 0.004 * idade

Assim, nossos valores ajustados seriam: 4.883 − 0.018 * 36 = 4.24 e 4.437 − 0.004 * 59 = 4.20, respectivamente.

Agora, e se quisermos os valores ajustados não apenas para esses dois professores, mas para os professores de todos os 463 cursos incluídos na base de dados evals_proj?

Fazer isso manualmente seria longo e tedioso!

É aqui que a função get_regression_points( ) do pacote moderndive pode ajudar: ela automatizará rapidamente os cálculos acima para todos os 463 cursos. Apresentamos, abaixo, uma prévia apenas das primeiras 10 linhas das 463 observações em nossa base de dados.

Code
pontos_regressao <- get_regression_points(modelo_interacao)
pontos_regressao
# A tibble: 463 × 6
      ID `Nota do(a) professor(a)` Idade do(a) professo…¹ Gênero do(a) profess…²
   <int>                     <dbl>                  <int> <fct>                 
 1     1                       4.7                     36 female                
 2     2                       4.1                     36 female                
 3     3                       3.9                     36 female                
 4     4                       4.8                     36 female                
 5     5                       4.6                     59 male                  
 6     6                       4.3                     59 male                  
 7     7                       2.8                     59 male                  
 8     8                       4.1                     51 male                  
 9     9                       3.4                     51 male                  
10    10                       4.5                     40 female                
# ℹ 453 more rows
# ℹ abbreviated names: ¹​`Idade do(a) professor(a)`,
#   ²​`Gênero do(a) professor(a)`
# ℹ 2 more variables: `Nota do(a) professor(a)_hat` <dbl>, residual <dbl>

Acontece que a professora de 36 anos ministrou os primeiros quatro cursos, enquanto o professor do sexo masculino ministrou os próximos três. Os valores ajustados de \(\displaystyle \hat{y}\) = \(\displaystyle \hat{notado(a)professor(a)}\) resultantes estão na coluna “Nota do(a) professor(a)”.

Além disso, a função get_regression_points( ) também retorna os resíduos y − \(\displaystyle \hat{y}\). Observe, por exemplo, que o primeiro e o quarto cursos ministrados pela professora de 36 anos tiveram resíduos positivos, indicando que as pontuações reais de ensino que receberam dos alunos foram superiores à pontuação ajustada de 4.25. Por outro lado, o segundo e o terceiro cursos ministrados por esse professor tiveram resíduos negativos, indicando que as notas reais de ensino que receberam dos alunos foram inferiores a 4.25.

8. Seleção de modelo usando visualizações

Quando devemos usar um modelo de interação versus um modelo de declives paralelos? Lembre-se de que, nas seções anteriores, ajustamos modelos de interação e de declives paralelos para a variável de resultado y (nota do professor) usando uma variável explicativa numérica x1 (idade) e uma variável explicativa categórica x2 (gênero, registrado como uma variável binária). Comparamos esses modelos nos gráficos a seguir, que exibimos novamente agora:

Code
par(mfrow = c(1,2))

plot1 <- ggplot(evals_proj, aes(x = `Idade do(a) professor(a)`, y = `Nota do(a) professor(a)`, color = `Gênero do(a) professor(a)`)) +
  geom_point() +
  labs(x = "Idade do(a) professor(a)", y = "Nota do(a) professor(a)", color = "Gênero do(a) professor(a)") +
  geom_smooth(method = "lm", se = TRUE) +
  theme(legend.position = "bottom")

plot2 <- ggplot(evals_proj, aes(x = `Idade do(a) professor(a)`, y = `Nota do(a) professor(a)`, color = `Gênero do(a) professor(a)`)) +
  geom_point() +
  geom_parallel_slopes() +
  theme(legend.position = "bottom")

grid.arrange(plot1, plot2, ncol = 2)

Pode-se perguntar: “Por que eu forçaria as linhas a terem inclinações paralelas (como visto no gráfico à direita) quando elas claramente têm inclinações diferentes (como visto no gráfico à esquerda)?”.

A resposta está num princípio filosófico conhecido como “Navalha de Occam”. Segundo esse princípio, “sendo todas as outras coisas iguais, soluções mais simples têm maior probabilidade de serem corretas do que soluções complexas”. Quando vista em uma estrutura de modelagem, a Navalha de Occam pode ser reformulada como “todas as outras coisas sendo iguais, modelos mais simples devem ser preferidos aos complexos”. Em outras palavras, só devemos favorecer o modelo mais complexo se a complexidade adicional for justificada.

Vamos revisitar as equações da reta de regressão para o modelo de interação e de declives paralelos:

Interação: \(\displaystyle \hat{y}\) = \(\displaystyle \hat{notado(a)professor(a)}\) = \(\alpha\) + \(\beta\)idade * idade + \(\beta\)masculino * gênero(é homem) + \(\beta\)masculino,idade * idade * gênero (é homem) + \(\epsilon\)

Declives paralelos: \(\displaystyle \hat{y}\) = \(\displaystyle \hat{notado(a)professor(a)}\) = \(\alpha\) + \(\beta\)idade * idade + \(\beta\)masculino * gênero(é homem) + \(\epsilon\)

O modelo de interação é “mais complexo” porque há um termo de interação \(\beta\)masculino,idade * idade * gênero (é homem) adicional na equação não presente para o modelo de declives paralelos. Ou, vista de forma alternativa, a tabela de regressão para o modelo de interação tem quatro linhas, enquanto a tabela de regressão para o modelo de declives paralelos tem três linhas. A questão é: “Esta complexidade adicional é justificada?”. Neste caso, pode argumentar-se que esta complexidade adicional é justificada, como evidenciado pelo claro padrão em forma de “X” das duas linhas de regressão no gráfico à esquerda.

modelo de interação

Code
# Ajustando o modelo de regressão:
modelo_interacao <- lm(`Nota do(a) professor(a)` ~ `Idade do(a) professor(a)` * `Gênero do(a) professor(a)`, data = evals_proj)

# Obtendo a tabela de regressão:
get_regression_table(modelo_interacao)
# A tibble: 4 × 7
  term                    estimate std_error statistic p_value lower_ci upper_ci
  <chr>                      <dbl>     <dbl>     <dbl>   <dbl>    <dbl>    <dbl>
1 intercept                  4.88      0.205     23.8    0        4.48     5.29 
2 `Idade do(a) professor…   -0.018     0.004     -3.92   0       -0.026   -0.009
3 `Gênero do(a) professo…   -0.446     0.265     -1.68   0.094   -0.968    0.076
4 `Idade do(a) professor…    0.014     0.006      2.45   0.015    0.003    0.024

modelo de declives paralelos

Code
# Ajustando o modelo de regressão:
modelo_declives <- lm(`Nota do(a) professor(a)` ~ `Idade do(a) professor(a)` + `Gênero do(a) professor(a)`, data = evals_proj)

# Obtendo a tabela de regressão:
get_regression_table(modelo_declives)
# A tibble: 3 × 7
  term                    estimate std_error statistic p_value lower_ci upper_ci
  <chr>                      <dbl>     <dbl>     <dbl>   <dbl>    <dbl>    <dbl>
1 intercept                  4.48      0.125     35.8    0        4.24     4.73 
2 `Idade do(a) professor…   -0.009     0.003     -3.28   0.001   -0.014   -0.003
3 `Gênero do(a) professo…    0.191     0.052      3.63   0        0.087    0.294

O que nós acabamos de realizar foi uma seleção rudimentar de modelo: escolher qual modelo se ajusta melhor aos dados entre um conjunto de modelos candidatos.

A seleção do modelo que realizamos utilizou o “teste do globo ocular”: olhar qualitativamente as visualizações para escolher um modelo.

Na próxima seção, realizaremos novamente a mesma seleção de modelo, mas desta vez usando uma abordagem numérica por meio do valor R2 (pronuncia-se “R-quadrado”).

9. Seleção de modelo usando R-quadrado

Nesta seção, imitaremos a seleção do modelo que acabamos de realizar usando o “teste do globo ocular” (qualitativo), mas desta vez usando uma abordagem numérica e quantitativa. Especificamente, usaremos a estatística resumida R2 (pronuncia-se “R-quadrado”), também chamada de “coeficiente de determinação”.

R2 é a proporção da variação da variável de resultado y (nota do professor) que é explicada pelo nosso modelo, onde o poder explicativo do nosso modelo está embutido nos valores ajustados \(\displaystyle \hat{y}\):

\[\begin{equation*} R^2 = \frac{Var(\displaystyle \hat{y})}{Var(y)} \end{equation*}\]

R2 pode ser interpretado da seguinte forma:

  • Valores de R2 = 0 nos dizem que nosso modelo explica 0% da variação em y. Digamos que ajustamos um modelo aos dados da nota do professor e obtivemos R2 = 0. Isso indica que a combinação de variáveis explicativas x que usamos e a forma do modelo que escolhemos (interação ou inclinações paralelas) não nos dizem nada sobre as notas médias dos professores. O modelo não se ajusta bem;

  • Valores de R2 = 1 nos dizem que nosso modelo explica 100% da variação em y. Digamos que ajustamos um modelo aos dados da nota do professor e obtivemos R2 = 1. Isso indica que a combinação das variáveis explicativas x que usamos e a forma do modelo que escolhemos (interação ou declives paralelos) nos dizem tudo o que precisamos saber sobre as notas médias dos professores.

Na prática, entretanto, valores de R2 = 1 quase nunca ocorrem. Pense nisso no contexto das notas médias dos(as) professores(as). Há um número infinito de fatores que influenciam por que certos(as) professores(as) têm boas notas médias, enquanto outros(as) não têm. A ideia de que um modelo estatístico concebido pelo homem possa captar toda a heterogeneidade de todos(as) os(as) professores(as) beira a arrogância. Contudo, mesmo que tais modelos não sejam perfeitos, podem ainda assim revelar-se úteis na determinação da política educacional. Um princípio geral de modelagem que devemos ter em mente é uma citação famosa do eminente estatístico George Box: “Todos os modelos estão errados, mas alguns são úteis”.

Vamos repetir os cálculos acima para os modelos de interação e de declives paralelos e compará-los:

modelo de interação

Code
# Ajustando o modelo de regressão:
modelo_interacao <- lm(`Nota do(a) professor(a)` ~ `Idade do(a) professor(a)` * `Gênero do(a) professor(a)`, data = evals_proj)

# Obtendo a tabela de regressão:
get_regression_table(modelo_interacao)
# A tibble: 4 × 7
  term                    estimate std_error statistic p_value lower_ci upper_ci
  <chr>                      <dbl>     <dbl>     <dbl>   <dbl>    <dbl>    <dbl>
1 intercept                  4.88      0.205     23.8    0        4.48     5.29 
2 `Idade do(a) professor…   -0.018     0.004     -3.92   0       -0.026   -0.009
3 `Gênero do(a) professo…   -0.446     0.265     -1.68   0.094   -0.968    0.076
4 `Idade do(a) professor…    0.014     0.006      2.45   0.015    0.003    0.024
Code
get_regression_summaries(modelo_interacao)
# A tibble: 1 × 9
  r_squared adj_r_squared   mse  rmse sigma statistic p_value    df  nobs
      <dbl>         <dbl> <dbl> <dbl> <dbl>     <dbl>   <dbl> <dbl> <dbl>
1     0.051         0.045 0.280 0.529 0.531      8.29       0     3   463

modelo de declives paralelos

Code
# Ajustando o modelo de regressão:
modelo_declives <- lm(`Nota do(a) professor(a)` ~ `Idade do(a) professor(a)` + `Gênero do(a) professor(a)`, data = evals_proj)

# Obtendo a tabela de regressão:
get_regression_table(modelo_declives)
# A tibble: 3 × 7
  term                    estimate std_error statistic p_value lower_ci upper_ci
  <chr>                      <dbl>     <dbl>     <dbl>   <dbl>    <dbl>    <dbl>
1 intercept                  4.48      0.125     35.8    0        4.24     4.73 
2 `Idade do(a) professor…   -0.009     0.003     -3.28   0.001   -0.014   -0.003
3 `Gênero do(a) professo…    0.191     0.052      3.63   0        0.087    0.294
Code
get_regression_summaries(modelo_declives)
# A tibble: 1 × 9
  r_squared adj_r_squared   mse  rmse sigma statistic p_value    df  nobs
      <dbl>         <dbl> <dbl> <dbl> <dbl>     <dbl>   <dbl> <dbl> <dbl>
1     0.039         0.035 0.284 0.533 0.534      9.34       0     2   463

Observe como os valores de R2 são muito diferentes! Em outras palavras, uma vez que a complexidade adicional do modelo de interação em relação ao modelo de declives paralelos melhora nosso valor R2 em uma quantidade relativamente grande (0,051 versus 0,039, o que representa um aumento de cerca de 31,5% a favor do modelo de interação), pode-se argumentar que a complexidade adicional do modelo de interação vale a pena, pois é capaz de explicar 51% da variação da nota média dos docentes avaliados.