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çãoif(!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.
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:
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:
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.
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)
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}\)).
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:
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)
Ó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
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.
# 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:
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)
# 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)
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}\):
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)
# 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)
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.