Trabalho Estatística Computacional I

Caio VAOS

2025.2


Introdução

O objetivo deste trabalho é apresentar um exemplo prático do estudo de comparação de médias entre grupos de uma população.

Para isso, será empregado o método de análise de variância (ANOVA), avaliando se diferentes grupos apresentam diferenças estatisticamente significativas em suas médias.

Setup

Pacotes necessários:

  • ggplot2: Abordagem gráfica;

  • tidyverse: Manipulação de bases de dados;

  • DescTools: Para o teste de Levene;

  • qqplotr: Gráfico QQ-plot;

  • kableExtra: Gerar tabelas.

library(ggplot2)
library(tidyverse)
library(DescTools)
library(qqplotr)

1 Bolas de golfe

Uma empresa de equipamentos esportivos está testando quatro diferentes designs de bolas de golfe (Design1, Design2, Design3 e Design4) para avaliar qual delas proporciona maior distância média ao ser golpeada.

Cada design foi testado em 10 arremessos, medindo a distância atingida em metros.

A base de dados pode ser obtida com os seguintes códigos:

Design <- c(
  rep("Design1", 10),
  rep("Design2", 10),
  rep("Design3", 10),
  rep("Design4", 10)
  )
Distance <- c(
  206.32, 207.94, 206.19, 204.45, 209.65, 203.81, 206.75, 205.68, 204.49, 210.86,
  217.08, 221.43, 218.04, 224.13, 211.82, 213.9, 221.28, 229.43, 213.54, 214.51,
  226.77, 224.79, 229.75, 228.51, 221.44, 223.85, 223.97, 234.3, 219.5, 233,
  230.55, 227.95, 231.84, 224.87, 229.49, 231.1, 221.53, 235.45, 228.35, 225.09
  )
golf_data <- data.frame(Design, Distance)

1.1 Análise Descritiva

A Tabela a seguir apresenta um resumo estatístico das distâncias obtidas para cada design avaliado.

golf_data %>%
  group_by(Design) %>%
  summarise(
    n = n(),
    Média = mean(Distance),
    Mediana = median(Distance),
    Variância = var(Distance),
    Mínimo = min(Distance),
    Máximo = max(Distance),
    IQR = IQR(Distance)
  ) %>% 
  kableExtra::kable(
    format = "html",
    caption = "Resumo estatístico por Design",
    digits = 2,
    align = "c"
  ) %>%
  kableExtra::kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center"
  )
Resumo estatístico por Design
Design n Média Mediana Variância Mínimo Máximo IQR
Design1 10 206.61 206.26 5.25 203.81 210.86 2.85
Design2 10 218.52 217.56 30.67 211.82 229.43 7.34
Design3 10 226.59 225.78 23.18 219.50 234.30 5.56
Design4 10 228.62 228.92 16.11 221.53 235.45 5.16

Em seguida, o boxplot é utilizado para comparar visualmente a distribuição das distâncias entre os diferentes designs.

ggplot(golf_data, aes(x = Design, y = Distance)) +
  geom_boxplot(
    fill = "#2FA4E7",
  ) +
  labs(
    title = "Distância por Design",
    x = "",
    y = "Distância (m)"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold",
                              hjust = 0.5,
                              color = "#1C6EA4",
                              size = 16),
    strip.text = element_text(size = 11, face = "bold"),
    axis.text.x = element_text(face = "bold")
  )

Pelo boxplot, percebe-se como os dados estão distribuídos em cada grupo.

Observa-se que os Designs 3 e 4 apresentam distribuições bastante próximas, enquanto os demais designs mostram diferenças claras em relação a eles.

No entanto, apenas a inspeção visual não é suficiente para confirmar essas diferenças; por isso, daremos continuidade à análise estatística para verificar formalmente os padrões observados no gráfico.


1.2 Suposições

1.2.1 Independência

Assume-se que os diferentes designs são independentes entre si, e que as amostras de distância foram coletadas de forma independente.


1.2.2 Normalidade

Para verificar a suposição de normalidade em cada grupo, utilizei três abordagens complementares:

1. Análise gráfica da distribuição (densidade)

Primeiro, observei a densidade de cada grupo para verificar a forma geral da distribuição:

ggplot(golf_data, aes(x = Distance)) +
  geom_density(fill = "#2FA4E7", alpha = 0.6, color = "#1C6EA4", linewidth = 1) +
  facet_wrap(~ Design, scales = "free_y") +
  labs(
    x = "Distância",
    y = "Densidade",
    title = "Distribuição da Distância por Design"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5, color = "#1C6EA4"),
    strip.text = element_text(size = 11, face = "bold"),
    panel.grid.minor = element_blank(),
    panel.grid.major.y = element_blank()
  )

Os gráficos de densidade fornecem uma primeira indicação visual do comportamento das distribuições.

No entanto, como o tamanho amostral é pequeno, a forma observada pode não refletir adequadamente a distribuição populacional.

2. Comparação com a distribuição normal (QQ-Plot)

Em seguida, utilizei QQ-plots para comparar os quantis amostrais com os quantis teóricos de uma distribuição normal:

ggplot(golf_data, aes(sample = Distance)) +
  stat_qq_band(fill = "#D4E9F7") +
  stat_qq_line(color = "#1C6EA4", linewidth = 1) +
  stat_qq_point(color = "black", size = 2) +
  facet_wrap(~ Design, scales = "free") +
  labs(
    x = "Quantis Teóricos",
    y = "Quantis Amostrais",
    title = "Gráfico QQ por Design"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5, color = "#1C6EA4"),
    strip.text = element_text(size = 11, face = "bold"),
    panel.grid.minor = element_blank()
  )

A maior parte dos pontos se mantém próxima da linha teórica e dentro da margem de erro, indicando boa aderência à distribuição normal.

3. Teste formal de normalidade (Shapiro–Wilk)

Por fim, apliquei o teste de normalidade de Shapiro–Wilk para cada grupo:

by(golf_data$Distance, golf_data$Design, shapiro.test)
## golf_data$Design: Design1
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.93134, p-value = 0.4612
## 
## ------------------------------------------------------------ 
## golf_data$Design: Design2
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.93574, p-value = 0.5067
## 
## ------------------------------------------------------------ 
## golf_data$Design: Design3
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.96582, p-value = 0.8497
## 
## ------------------------------------------------------------ 
## golf_data$Design: Design4
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.98217, p-value = 0.9757

Os valores de p obtidos foram altos (o menor deles igual a 0,46), o que indica que não há evidências estatísticas contra a hipótese de normalidade em nenhum dos grupos.

Portanto, é razoável admitir que as populações podem ser tratadas como normais.


1.2.3 Homocedasticidade

Agora desejo testar a homocedasticidade, isto é, verificar se os grupos possuem variâncias iguais.

Como todos os grupos apresentaram bom ajuste à normalidade, aplico o teste de Bartlett:

bartlett.test(formula = Distance~Design,data = golf_data)
## 
##  Bartlett test of homogeneity of variances
## 
## data:  Distance by Design
## Bartlett's K-squared = 6.2982, df = 3, p-value = 0.09797

Com nível de significância de 5% e valor de p igual a 0.09797, não rejeito a hipótese nula de variâncias iguais. Assim, aceito a homocedasticidade entre os quatro grupos.


1.3 ANOVA

Como todas as suposições foram verificadas (independência, normalidade e homocedasticidade) e validadas, procedo à análise de variância (ANOVA):

ANOVA = aov(formula = Distance~Design,data = golf_data)
summary(ANOVA)
##             Df Sum Sq Mean Sq F value   Pr(>F)    
## Design       3 2991.0   997.0   53.03 2.73e-13 ***
## Residuals   36  676.8    18.8                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

O valor de p obtido \(\approx 2.73 \times e^{-13}\) é muito menor que o nível de significância de 5%. Assim, rejeito a hipótese nula de igualdade das médias entre os designs. Portanto, existe evidência estatística de que ao menos um dos designs apresenta média diferente dos demais.


1.4 Análise de Acompanhamento

Para identificar quais grupos diferem entre si, aplico o teste de comparações múltiplas de Bonferroni:

Bonferroni = pairwise.t.test(x = golf_data$Distance,
                             g = golf_data$Design,
                             p.adjust.method = "bonferroni")
Bonferroni
## 
##  Pairwise comparisons using t tests with pooled SD 
## 
## data:  golf_data$Distance and golf_data$Design 
## 
##         Design1 Design2 Design3
## Design2 2.7e-06 -       -      
## Design3 1.7e-11 0.0011  -      
## Design4 1.1e-12 4.7e-05 1.0000 
## 
## P value adjustment method: bonferroni
df_p <- as.data.frame(Bonferroni$p.value) %>%
  mutate(Group1 = rownames(.)) %>%
  pivot_longer(
    cols = -Group1,
    names_to = "Group2",
    values_to = "p"
  ) %>%
  filter(!is.na(p))

ggplot(df_p, aes(Group1, Group2, fill = p)) +
  geom_tile(color = "white") +
  geom_text(aes(
    label = ifelse(
      p < 0.001,
      format(p, scientific = TRUE, digits = 2),
      sprintf("%.4f", p)
    )
  ),
  color = "black", size = 4) +
  scale_fill_gradient(
    low = "#2FA4E7",
    high = "white",
    na.value = "white"
  ) +
  labs(
    title = "Matriz de p-valor (Bonferroni)",
    x = "",
    y = ""
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(
      hjust = 0.5, face = "bold", color = "#1C6EA4"
    ),
    panel.grid = element_blank()
  )

Com base nos valores ajustados de p, observo que:

Todas as combinações de designs diferem significativamente entre si, exceto o par Design 3 vs Design 4, cujo p é 1.


1.5 Conclusão

Com base nos resultados obtidos — incluindo a verificação das suposições, a ANOVA e as comparações múltiplas com ajuste de Bonferroni — conclui-se que:

Os Designs 3 e 4 não diferem significativamente entre si, apresentando médias de distância estatisticamente iguais.

Todos os demais pares de designs apresentam diferenças significativas, indicando que suas médias de distância são distintas.

Portanto, apenas os Designs 3 e 4 podem ser considerados semelhantes em termos de desempenho, enquanto os demais designs exibem comportamentos estatísticos diferentes.


2 Escore dos funcionários

Determinada empresa está interessada em avaliar a produtividade de seus funcionários de acordo com o local de trabalho. Para isso, foram coletadas pontuações de produtividade (Escore) de colaboradores que atuam em três tipos de ambiente de trabalho:

  • Espaço de coworking;

  • Home office; e

  • Híbrido (uma combinação de presencial e remoto).

Cada colaborador recebeu uma pontuação de produtividade baseada em indicadores de desempenho durante um período de avaliação.

Os resultados obtidos foram:

Tipo <- c(
  rep("Coworking", 42),
  rep("Home_office", 42),
  rep("Hibrido", 44)
  )
Escore <- c(
  95.43, 87.46, 94.23, 97.02, 94.64, 71.32,
  93.90, 71.00, 71.56, 87.58, 74.46, 98.80,
  91.68, 74.20, 87.97, 86.68, 88.27, 80.37,
  86.44, 72.77, 52.87, 90.43, 92.90, 74.08,
  95.36, 65.74, 83.31, 80.58, 98.72, 99.98,
  84.59, 87.20, 72.37, 59.57, 78.70, 84.60,
  97.18, 96.85, 78.23, 79.23, 70.49, 66.14,
  62.79,
  64.21, 59.14, 44.01, 78.88, 73.60, 66.38,
  62.46, 82.66, 86.51, 97.06, 63.61, 82.37,
  70.26, 65.00, 63.20, 78.86, 86.76, 61.33,
  68.09, 89.91, 69.05, 54.72, 84.91, 77.74,
  79.97, 65.56, 45.73, 84.07, 69.44, 70.66,
  85.04, 65.64, 63.21, 54.94, 63.95, 81.27,
  60.71, 65.71, 74.84, 72.83, 72.03, 68.62,
  54.28,
  93.09, 71.42, 70.34, 59.75, 61.21, 72.65,
  80.22, 99.59, 86.50, 90.13, 84.61, 85.24,
  62.33, 91.65, 81.74, 97.98, 82.12, 78.21,
  66.00, 74.30, 67.03, 75.72, 84.26, 82.79,
  61.38, 55.22, 85.31, 86.78, 66.29, 76.81,
  71.48, 74.75, 69.44, 76.68, 71.36, 92.43,
  82.00, 85.01, 64.15, 91.37, 84.48, 91.60
  )
Dados_Trabalho <- data.frame(Tipo, Escore)

O objetivo desta análise é investigar se existem diferenas significativas nas médias de produtividade entre os três tipos de ambiente de trabalho.


2.1 Análise Descritiva

A tabela a seguir apresenta um resumo estatístico dos escores obtidos em cada modalidade:

Dados_Trabalho %>%
  group_by(Tipo) %>%
  summarise(
    n = n(),
    Média = mean(Escore),
    Mediana = median(Escore),
    Variância = var(Escore),
    Mínimo = min(Escore),
    Máximo = max(Escore),
    IQR = IQR(Escore)
  ) %>% 
  kableExtra::kable(
    format = "html",
    caption = "Resumo estatístico por modalide de trabalho",
    digits = 2,
    align = "c"
  ) %>%
  kableExtra::kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center"
  )
Resumo estatístico por modalide de trabalho
Tipo n Média Mediana Variância Mínimo Máximo IQR
Coworking 42 83.21 85.52 135.44 52.87 99.98 19.54
Hibrido 44 77.46 77.51 132.85 54.28 99.59 16.02
Home_office 42 70.69 69.25 134.90 44.01 97.06 16.39

Em seguida, utilizamos o boxplot para comparar visualmente a distribuição dos escores entre os três ambientes de trabalho:

ggplot(Dados_Trabalho, aes(x = Tipo, y = Escore)) +
  geom_boxplot(
    fill = "#2FA4E7",
  ) +
  labs(
    title = "Escore por Modalidade de Trabalho",
    x = "",
    y = "Escore"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold",
                              hjust = 0.5,
                              color = "#1C6EA4",
                              size = 16),
    strip.text = element_text(size = 11, face = "bold"),
    axis.text.x = element_text(face = "bold")
  )

Com base no boxplot, observa-se:

o grupo Home office apresenta valores mais baixos, enquanto o grupo Coworking tende a apresentar escores mais elevados. Já o grupo Híbrido situa-se entre os dois.

No entanto, a inspeção visual não é suficiente para concluir se as médias diferem estatisticamente. Portanto, daremos continuidade à análise estatística formal.


2.2 Suposições

2.2.1 Independência

Assume-se que as observações são independentes dentro de cada grupo e que as modalidades de trabalho também são independentes entre si.


2.2.2 Normalidade

Para verificar a suposição de normalidade em cada grupo, foram utilizadas três abordagens complementares:

1. Análise gráfica da distribuição (densidade)

Primeiro, observei a densidade de cada grupo para verificar a forma geral da distribuição:

ggplot(Dados_Trabalho, aes(x = Escore)) +
  geom_density(fill = "#2FA4E7", alpha = 0.6, color = "#1C6EA4", linewidth = 1) +
  facet_wrap(~ Tipo, scales = "free_y") +
  labs(
    x = "Escore",
    y = "Densidade",
    title = "Distribuição do Escore por Ambiente"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5, color = "#1C6EA4"),
    strip.text = element_text(size = 11, face = "bold"),
    panel.grid.minor = element_blank(),
    panel.grid.major.y = element_blank()
  )

Os gráficos de densidade fornecem uma primeira indicação visual do comportamento das distribuições.

2. Comparação com a distribuição normal (QQ-Plot)

Em seguida, utilizei QQ-plots para comparar os quantis amostrais com os quantis teóricos de uma distribuição normal:

ggplot(Dados_Trabalho, aes(sample = Escore)) +
  stat_qq_band(fill = "#D4E9F7") +
  stat_qq_line(color = "#1C6EA4", linewidth = 1) +
  stat_qq_point(color = "black", size = 2) +
  facet_wrap(~ Tipo, scales = "free") +
  labs(
    x = "Quantis Teóricos",
    y = "Quantis Amostrais",
    title = "Gráfico QQ por Ambiente"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5, color = "#1C6EA4"),
    strip.text = element_text(size = 11, face = "bold"),
    panel.grid.minor = element_blank()
  )

No grupo Coworking observa-se uma dispersão dos pontos em relação à linha de referência, indicando divergência da normalidade. Já nos grupos Home office e Híbrido, os pontos apresentam alinhamento mais próximo ao esperado para uma distribuição normal.

3. Teste formal de normalidade (Shapiro–Wilk)

Por fim, apliquei o teste de normalidade de Shapiro–Wilk para cada modalidade:

by(Dados_Trabalho$Escore, Dados_Trabalho$Tipo, shapiro.test)
## Dados_Trabalho$Tipo: Coworking
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.95185, p-value = 0.07525
## 
## ------------------------------------------------------------ 
## Dados_Trabalho$Tipo: Hibrido
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.97839, p-value = 0.5704
## 
## ------------------------------------------------------------ 
## Dados_Trabalho$Tipo: Home_office
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.978, p-value = 0.5851

Os valores de p obtidos para os grupos Home office e Híbrido foram aceitáveis, indicando ausência de evidências contra a normalidade. Já o grupo Coworking apresentou p mais baixo, de 0.07525, que ainda assim é maior que o nível de significância de 5%.

Portanto, considerando todas as evidências assumo a normalidade dos três grupos.


2.2.3 Homocedasticidade

Agora desejo testar a homocedasticidade, isto é, verificar se os grupos possuem variâncias iguais.

Utilizo o teste de Levene, que é mais adequado quando há suspeita de violação da normalidade em algum dos grupos, pois ele é mais robusto a desvios da normalidade do que o teste de Bartlett.

LeveneTest(formula = Escore~Tipo,data = Dados_Trabalho)
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value Pr(>F)
## group   2  0.0397 0.9611
##       125

O teste apresentou um valor de p igual a 0.9611, indicando forte evidência a favor da homogeneidade das variâncias.

Assim, conclui-se que as variâncias dos três grupos podem ser consideradas iguais.


2.3 ANOVA

Com todas as suposições verificadas — independência, normalidade (ainda que com pequena ressalva no grupo Coworking, mas tolerável para ANOVA devido à sua robustez) e homocedasticidade — dou continuidade à análise de variância.

ANOVA = aov(formula = Escore~Tipo,data = Dados_Trabalho)
summary(ANOVA)
##              Df Sum Sq Mean Sq F value   Pr(>F)    
## Tipo          2   3299  1649.3   12.27 1.36e-05 ***
## Residuals   125  16796   134.4                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

O valor de p obtido \(\approx 1.36 \times e^{-5}\) é menor que o nível de significância de 5%. Assim, rejeito a hipótese nula de igualdade das médias entre os escores das modalidades de trabalho. Portanto, existe evidência estatística de que ao menos uma das modalidades apresenta média diferente das demais.


2.4 Análise de Acompanhamento

Para identificar quais grupos diferem entre si, aplico o teste de comparações múltiplas de Tukey HSD:

tuk <- TukeyHSD(ANOVA)
tuk
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = Escore ~ Tipo, data = Dados_Trabalho)
## 
## $Tipo
##                             diff       lwr        upr     p adj
## Hibrido-Coworking      -5.750087 -11.68148  0.1813094 0.0595474
## Home_office-Coworking -12.518810 -18.51878 -6.5188402 0.0000070
## Home_office-Hibrido    -6.768723 -12.70012 -0.8373269 0.0209989

Com base nos valores ajustados de p, observo que:

todos têm médias diferentes, exceto o par Híbrido–Coworking, que apresenta um p-valor pequeno, porém ainda maior que o nível de significância adotado.

tuk_df <- as.data.frame(tuk$Tipo) |> mutate( contrast = rownames(tuk$Tipo), contrast = factor(contrast, levels = rev(contrast)) )
ggplot(tuk_df, aes(x = diff, y = contrast)) +
  geom_vline(xintercept = 0, linetype = "dashed", color = "gray50") +
  geom_errorbarh(
    aes(xmin = lwr, xmax = upr),
    height = 0.25,
    color = "#1C6EA4",
    linewidth = 1
  ) +
  geom_point(size = 3, color = "#2FA4E7") +
  geom_text(
    aes(label = contrast, y = as.numeric(contrast) + 0.25),
    x = min(tuk_df$lwr) - 0.02 * diff(range(tuk_df$diff)),
    hjust = 0,
    size = 4,
    color = "black"
  ) +
  scale_y_discrete(position = "right") +
  labs(
    title = "Intervalos de Confiança – Teste de Tukey HSD",
    x = "Diferença entre Médias",
    y = ""
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(
      face = "bold",
      hjust = 0.5,
      color = "#1C6EA4",
      size = 16
    ),
    axis.text.y = element_blank(),
    axis.ticks.y = element_blank(),
    panel.grid.minor = element_blank()
  )

A partir desse gráfico, observo que apenas o par Híbrido–Coworking possui um intervalo de confiança que inclui o valor 0, indicando ausência de diferença significativa entre as médias destes dois ambientes. Para os demais pares, os intervalos não cruzam o zero, confirmando diferenças estatisticamente significativas.


2.5 Conclusão

Com base nos resultados obtidos — incluindo a verificação das suposições, a ANOVA e as comparações múltiplas de Tukey — conclui-se que:

Apenas o par Híbrido–Coworking apresenta médias estatisticamente iguais. Embora o p-valor seja relativamente pequeno, ele ainda é maior que o nível de significância adotado, indicando ausência de diferença significativa entre esses dois ambientes.

Para os demais pares de comparação, os testes apontaram diferenças estatisticamente significativas nas médias de produtividade, reforçando que o tipo de ambiente de trabalho influencia o desempenho dos colaboradores na maior parte dos casos analisados.