Introdução

Este documento apresenta uma análise de dados utilizando R, com foco na manipulação, exploração e visualização de dados. O script e os dados utilizados são provenientes da aula introdutória curso Estatística e Otimização para Ciência de Dados e Pesquisa Operacional CDPO da professora Cibele Russo.

1. Carregamento de Pacotes

# Carregar pacotes necessários
pacman::p_load(readxl, dplyr, tidyverse, gt, ggplot2, gridExtra, skimr, reshape2, vcd, caret, stats,fastDummies)

Descrição: Aqui, utilizamos o pacote pacman para carregar múltiplos pacotes de uma só vez. Os pacotes incluem: - readxl: Para leitura de arquivos Excel. - dplyr e tidyverse: Para manipulação de dados. - ggplot2 e gridExtra: Para visualização de dados. - skimr: Para análise descritiva rápida. - reshape2: Para transformação de dados. - vcd: Para visualização de dados categóricos. - caret: Para modelagem preditiva. - stats: Para funções estatísticas básicas.

2. Importação dos Dados

# Carregar dados da web
url <- "https://raw.githubusercontent.com/cibelerusso/Datasets/refs/heads/main/DadoseDecisoes.csv"

# Ler os dados
dados <- read.csv(url, row.names = 1)
dadost <- read.csv(url, row.names = 1)

# Visualizar os dados
View(dados)

Descrição: - Os dados são importados diretamente de um repositório online usando a função read.csv. - row.names = 1 indica que a primeira coluna do arquivo CSV contém os nomes das linhas. - View(dados) abre uma visualização tabular dos dados no RStudio.

3. Verificação das Colunas

# Verificar os nomes das colunas
colnames(dados)
##  [1] "Idade"             "Gênero"            "Departamento"     
##  [4] "Salário"           "Horas_Trabalhadas" "Produtividade"    
##  [7] "Satisfação"        "Tempo_Empresa"     "Cursos_Realizados"
## [10] "Home_Office"

Descrição: - A função colnames(dados) retorna os nomes das colunas do conjunto de dados, permitindo verificar a estrutura dos dados.

4. Análise da Variável Salário

A variável Salário é quantitativa contínua. Vamos analisar sua distribuição antes de dicotomizá-la.

4.1. Boxplot

# Criar o boxplot
boxplot <- ggplot(dados, aes(x = Salário)) +
  geom_boxplot() +
  theme_minimal() +
  theme(axis.title.x = element_blank())  # Remove o título do eixo X
plot(boxplot)

Descrição: - O boxplot mostra a distribuição da variável Salário, destacando a mediana, quartis e possíveis outliers. - theme_minimal() aplica um tema limpo ao gráfico. - theme(axis.title.x = element_blank()) remove o título do eixo X para melhorar a visualização.

4.2. Histograma

# Criar o histograma
histograma <- ggplot(dados, aes(x = Salário)) +
  geom_histogram(bins = 20, fill = "blue", alpha = 0.5, color = "black") +
  theme_minimal()

Descrição: - O histograma mostra a distribuição de frequências da variável Salário. - bins = 20 define o número de intervalos (barras) no histograma. - fill = "blue" e alpha = 0.5 definem a cor e a transparência das barras.

4.3. Combinar Gráficos

# Combinar boxplot e histograma
grid.arrange(boxplot, histograma, heights = c(0.3, 1), ncol = 1)

Descrição: - grid.arrange combina os gráficos de boxplot e histograma em uma única visualização. - heights = c(0.3, 1) define a proporção de altura entre os gráficos (30% para o boxplot e 70% para o histograma). - ncol = 1 organiza os gráficos em uma única coluna.

5. Análise Descritiva e Dicotomização da Variável Salário

5.1. Cálculo das Medidas Descritivas

# Calcular média, mediana e moda do salário
mean_salario <- mean(dados$Salário, na.rm = TRUE)
median_salario <- median(dados$Salário, na.rm = TRUE)
mode_salario <- as.numeric(names(sort(table(dados$Salário), decreasing = TRUE)[1]))

Descrição: - Calculamos a média, mediana e moda da variável Salário. - na.rm = TRUE ignora valores ausentes (NA) no cálculo. - A moda é obtida encontrando o valor mais frequente na variável.

5.2. Visualização das Medidas Descritivas

Boxplot com Média, Mediana e Moda

# Criar boxplot com linhas para média, mediana e moda
boxplot3 <- ggplot(dados, aes(x = Salário)) +
  geom_boxplot(fill = "lightblue", color = "black") +
  geom_vline(xintercept = mean_salario, color = "red", linetype = "dashed", linewidth = 1) +  # Média
  geom_vline(xintercept = median_salario, color = "green", linetype = "solid", linewidth = 1) +  # Mediana
  geom_vline(xintercept = mode_salario, color = "blue", linetype = "solid", linewidth = 1) +  # Moda
  theme_minimal() +
  labs(x = "Salário", y = "Densidade")

Descrição: - O boxplot mostra a distribuição do Salário, com linhas verticais para a média (vermelha tracejada), mediana (verde sólida) e moda (azul sólida).

Histograma com Média, Mediana e Moda

# Criar histograma com linhas para média, mediana e moda
histograma3 <- ggplot(dados, aes(x = Salário)) +
  geom_histogram(aes(y = ..density..), bins = 30, fill = "lightblue", color = "black", alpha = 0.5) + 
  geom_density(color = "darkcyan", linewidth = 1) +  # Curva de densidade (KDE)
  geom_vline(xintercept = mean_salario, color = "red", linetype = "dashed", linewidth = 1) +  # Média
  geom_vline(xintercept = median_salario, color = "green", linetype = "solid", linewidth = 1) +  # Mediana
  geom_vline(xintercept = mode_salario, color = "blue", linetype = "solid", linewidth = 1) +  # Moda
  theme_minimal() +
  labs(x = "Salário", y = "Densidade")

Descrição: - O histograma mostra a distribuição de frequências do Salário, com uma curva de densidade (KDE) e linhas verticais para a média, mediana e moda.

Combinação dos Gráficos

# Combinar boxplot e histograma
grid.arrange(boxplot3, histograma3, heights = c(0.3, 1), ncol = 1)
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Descrição: - grid.arrange combina o boxplot e o histograma em uma única visualização, com o boxplot ocupando 30% da altura e o histograma 70%.

5.3. Dicotomização da Variável Salário

# Calcular a mediana do salário
mediana_salario <- median(dados$Salário, na.rm = TRUE)

# Criar a variável categórica 'salariocat'
dados <- dados %>%
  mutate(salariocat = ifelse(Salário >= mediana_salario, "Alto", "Baixo")) %>%
  select(-Salário)  # Remover a coluna original 'Salário'

Descrição: - A variável Salário foi dicotomizada em duas categorias: “Alto” (valores acima ou iguais à mediana) e “Baixo” (valores abaixo da mediana). - A coluna original Salário foi removida do dataframe para evitar redundância.

6. Exploração dos Dados e Estatísticas Descritivas

6.1. Visualização dos Dados

# Visualizar as primeiras linhas dos dados
head(dados)
##   Idade    Gênero Departamento Horas_Trabalhadas Produtividade Satisfação
## 1    34 Masculino           RH                36         84.89      94.33
## 2    39  Feminino       Vendas                48        107.84      98.62
## 3    39 Masculino    Marketing                44         95.66      80.23
## 4    27  Feminino       Vendas                40         88.89      94.63
## 5    41  Feminino       Vendas                37         80.97      86.44
## 6    39  Feminino       Vendas                36         81.80      73.90
##   Tempo_Empresa Cursos_Realizados Home_Office salariocat
## 1             0                 4         Não      Baixo
## 2             4                 9         Sim      Baixo
## 3            11                 6         Sim       Alto
## 4             8                 1         Sim      Baixo
## 5            11                12         Não      Baixo
## 6             2                 4         Não      Baixo

Descrição: - A função head(dados) exibe as primeiras 6 linhas do dataframe, permitindo uma visualização rápida da estrutura dos dados.

6.2. Estatísticas Descritivas

Resumo Estatístico

# Calcular o resumo estatístico
descr <- summary(dados)

# Função para arredondar valores numéricos
round_if_numeric <- function(x) {
  if (is.numeric(x)) {
    return(round(x, 2))
  } else {
    return(x)
  }
}

# Aplicar a função de arredondamento ao resumo estatístico
descr_rounded <- sapply(descr, round_if_numeric)

# Exibir o resumo arredondado
print(descr_rounded)
##      Min.   :18.00        1st Qu.:24.00        Median :29.00   
##    "Min.   :18.00  "    "1st Qu.:24.00  "    "Median :29.00  " 
##      Mean   :30.55        3rd Qu.:35.00        Max.   :54.00   
##    "Mean   :30.55  "    "3rd Qu.:35.00  "    "Max.   :54.00  " 
##   Length:230           Class :character     Mode  :character   
## "Length:230        " "Class :character  " "Mode  :character  " 
##                 <NA>                 <NA>                 <NA> 
##                   NA                   NA                   NA 
##   Length:230           Class :character     Mode  :character   
## "Length:230        " "Class :character  " "Mode  :character  " 
##                 <NA>                 <NA>                 <NA> 
##                   NA                   NA                   NA 
##      Min.   :30.00        1st Qu.:34.00        Median :38.00   
##    "Min.   :30.00  "    "1st Qu.:34.00  "    "Median :38.00  " 
##      Mean   :38.85        3rd Qu.:44.00        Max.   :48.00   
##    "Mean   :38.85  "    "3rd Qu.:44.00  "    "Max.   :48.00  " 
##     Min.   : 65.74       1st Qu.: 77.12       Median : 87.04   
##   "Min.   : 65.74  "   "1st Qu.: 77.12  "   "Median : 87.04  " 
##     Mean   : 87.85       3rd Qu.: 98.42       Max.   :112.06   
##   "Mean   : 87.85  "   "3rd Qu.: 98.42  "   "Max.   :112.06  " 
##     Min.   : 39.42       1st Qu.: 77.57       Median : 87.73   
##   "Min.   : 39.42  "   "1st Qu.: 77.57  "   "Median : 87.73  " 
##     Mean   : 86.15       3rd Qu.: 96.19       Max.   :100.00   
##   "Mean   : 86.15  "   "3rd Qu.: 96.19  "   "Max.   :100.00  " 
##     Min.   : 0.000       1st Qu.: 1.000       Median : 6.000   
##   "Min.   : 0.000  "   "1st Qu.: 1.000  "   "Median : 6.000  " 
##     Mean   : 6.774       3rd Qu.:11.000       Max.   :30.000   
##   "Mean   : 6.774  "   "3rd Qu.:11.000  "   "Max.   :30.000  " 
##     Min.   : 0.000       1st Qu.: 2.000       Median : 5.000   
##   "Min.   : 0.000  "   "1st Qu.: 2.000  "   "Median : 5.000  " 
##     Mean   : 5.204       3rd Qu.: 8.000       Max.   :20.000   
##   "Mean   : 5.204  "   "3rd Qu.: 8.000  "   "Max.   :20.000  " 
##   Length:230           Class :character     Mode  :character   
## "Length:230        " "Class :character  " "Mode  :character  " 
##                 <NA>                 <NA>                 <NA> 
##                   NA                   NA                   NA 
##   Length:230           Class :character     Mode  :character   
## "Length:230        " "Class :character  " "Mode  :character  " 
##                 <NA>                 <NA>                 <NA> 
##                   NA                   NA                   NA

Descrição: - summary(dados) gera um resumo estatístico das variáveis no dataframe. - A função round_if_numeric arredonda apenas os valores numéricos para 2 casas decimais. - sapply aplica a função de arredondamento a cada elemento do resumo.

Análise Detalhada com skim

# Análise detalhada com a função skim
skim(dados)
Data summary
Name dados
Number of rows 230
Number of columns 10
_______________________
Column type frequency:
character 4
numeric 6
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Gênero 0 1 8 9 0 2 0
Departamento 0 1 2 9 0 4 0
Home_Office 0 1 3 3 0 2 0
salariocat 0 1 4 5 0 2 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Idade 0 1 30.55 8.22 18.00 24.00 29.00 35.00 54.00 ▇▇▅▂▁
Horas_Trabalhadas 0 1 38.85 5.82 30.00 34.00 38.00 44.00 48.00 ▇▇▅▆▇
Produtividade 0 1 87.85 12.24 65.74 77.12 87.04 98.42 112.06 ▆▇▇▇▆
Satisfação 0 1 86.15 12.06 39.42 77.57 87.73 96.19 100.00 ▁▁▂▅▇
Tempo_Empresa 0 1 6.77 5.96 0.00 1.00 6.00 11.00 30.00 ▇▅▂▁▁
Cursos_Realizados 0 1 5.20 4.22 0.00 2.00 5.00 8.00 20.00 ▇▅▃▁▁

Descrição: - A função skim do pacote skimr fornece uma análise detalhada das variáveis, incluindo estatísticas como média, mediana, desvio padrão, valores ausentes e distribuição.

6.3. Agrupamento por Categoria de Salário

Estrutura do Agrupamento

# Agrupar os dados pela coluna 'salariocat'
dados_grouped <- dados %>% 
  group_by(salariocat)

# Visualizar a estrutura do agrupamento
dados_grouped
## # A tibble: 230 × 10
## # Groups:   salariocat [2]
##    Idade Gênero    Departamento Horas_Trabalhadas Produtividade Satisfação
##    <int> <chr>     <chr>                    <int>         <dbl>      <dbl>
##  1    34 Masculino RH                          36          84.9       94.3
##  2    39 Feminino  Vendas                      48         108.        98.6
##  3    39 Masculino Marketing                   44          95.7       80.2
##  4    27 Feminino  Vendas                      40          88.9       94.6
##  5    41 Feminino  Vendas                      37          81.0       86.4
##  6    39 Feminino  Vendas                      36          81.8       73.9
##  7    44 Feminino  TI                          48         108.        77.5
##  8    37 Feminino  RH                          40          89.9      100  
##  9    33 Feminino  Marketing                   40          97.1      100  
## 10    31 Masculino Vendas                      33          77.3      100  
## # ℹ 220 more rows
## # ℹ 4 more variables: Tempo_Empresa <int>, Cursos_Realizados <int>,
## #   Home_Office <chr>, salariocat <chr>

Descrição: - group_by(salariocat) agrupa os dados pela variável categórica salariocat (criada anteriormente). - A estrutura do agrupamento é exibida, mostrando como os dados estão organizados.

Estatísticas por Grupo

# Calcular estatísticas por grupo
dados %>%
  group_by(salariocat) %>%
  summarise(
    count = n(),  # Contar o número de registros por categoria
    media_salario = mean_salario,
    mediana_salario = median_salario
  )
## # A tibble: 2 × 4
##   salariocat count media_salario mediana_salario
##   <chr>      <int>         <dbl>           <dbl>
## 1 Alto         115         8030.           5668.
## 2 Baixo        115         8030.           5668.

Descrição: - summarise calcula estatísticas para cada grupo (salariocat), incluindo: - count: Número de observações em cada categoria. - media_salario: Média do salário (calculada anteriormente). - mediana_salario: Mediana do salário (calculada anteriormente).

7. Associação de Variáveis com Salário

7.1. Boxplot de Produtividade por Categoria de Salário

# Boxplot de Produtividade por salariocat
ggplot(dados, aes(x = salariocat, y = Produtividade, fill = salariocat)) +
  geom_boxplot() +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal()

Descrição: - Este gráfico de caixa (boxplot) compara a distribuição da Produtividade entre as categorias de salário (salariocat). - fill = salariocat define a cor das caixas com base na categoria de salário. - scale_fill_brewer(palette = "Set2") aplica uma paleta de cores pré-definida.

7.2. Boxplot de Satisfação por Categoria de Salário

# Boxplot de Satisfação por salariocat
ggplot(dados, aes(x = salariocat, y = Satisfação, fill = salariocat)) +
  geom_boxplot() +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal()

Descrição: - Este gráfico de caixa compara a distribuição da Satisfação entre as categorias de salário (salariocat). - A estrutura é semelhante ao gráfico anterior, mas com a variável Satisfação no eixo Y.

7.3. Boxplot de Produtividade por Categoria de Salário e Gênero

# Boxplot de Produtividade por salariocat e Gênero
ggplot(dados, aes(x = salariocat, y = Produtividade, fill = Gênero)) +
  geom_boxplot() +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal()

Descrição: - Este gráfico de caixa compara a Produtividade entre as categorias de salário (salariocat), separando os resultados por Gênero. - fill = Gênero define a cor das caixas com base no gênero.

7.4. Boxplot de Produtividade por Categoria de Salário e Gênero (Com Rótulos)

# Boxplot de Produtividade por salariocat e Gênero (com rótulos)
ggplot(dados, aes(x = salariocat, y = Produtividade, fill = Gênero)) +
  geom_boxplot() +
  scale_fill_brewer(palette = "Set2") +
  labs(x = "Salário", y = "Produtividade", fill = "Gênero") +
  theme_minimal()

Descrição: - Este gráfico é semelhante ao anterior, mas inclui rótulos personalizados para os eixos X e Y, e para a legenda.

7.5. Boxplot de Satisfação por Categoria de Salário

# Boxplot de Satisfação por salariocat (com fill)
ggplot(dados, aes(y = Satisfação, fill = as.factor(salariocat))) +
  geom_boxplot() +
  scale_fill_brewer(palette = "Set2") +
  labs(y = "Satisfação", fill = "Salário") +
  theme_minimal()

Descrição: - Este gráfico de caixa compara a distribuição da Satisfação entre as categorias de salário (salariocat), com as caixas coloridas de acordo com a categoria de salário.

7.6. Boxplot de Produtividade por Categoria de Salário e Departamento

# Boxplot de Produtividade por salariocat e Departamento
ggplot(dados, aes(x = salariocat, y = Produtividade, fill = Departamento)) +
  geom_boxplot() +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal() +
  theme(legend.position = "bottom")

Descrição: - Este gráfico de caixa compara a Produtividade entre as categorias de salário (salariocat), separando os resultados por Departamento. - fill = Departamento define a cor das caixas com base no departamento. - theme(legend.position = "bottom") move a legenda para a parte inferior do gráfico.

8. Associação entre Variáveis Qualitativas

8.1. Associação entre Salário e Gênero

Tabela de Contingência

# Criar a tabela de contingência entre salariocat e Gênero
tabela_dupla <- table(dados$salariocat, dados$Gênero)

# Transformar a tabela em um data frame
df_tabela_dupla <- as.data.frame(tabela_dupla)

Descrição: - A função table cria uma tabela de contingência entre as variáveis salariocat e Gênero. - as.data.frame converte a tabela em um dataframe para facilitar a visualização e manipulação.

Gráfico de Barras (Agrupado)

# Gráfico de barras agrupado
ggplot(df_tabela_dupla, aes(x = Var1, y = Freq, fill = Var2)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(x = "Salário", y = "Frequência", fill = "Gênero") +
  theme_minimal() +
  theme(legend.title = element_text())

Descrição: - Este gráfico de barras agrupadas compara a frequência de salariocat (Salário) para cada Gênero. - position = "dodge" coloca as barras lado a lado para facilitar a comparação.

Gráfico de Barras (Empilhado)

# Gráfico de barras empilhado
ggplot(df_tabela_dupla, aes(x = Freq, y = Var1, fill = Var2)) +
  geom_bar(stat = "identity", position = "stack") +
  labs(x = "Frequência", y = "Salário", fill = "Gênero") +
  theme_minimal() +
  theme(legend.title = element_text())

Descrição: - Este gráfico de barras empilhadas mostra a distribuição de Gênero dentro de cada categoria de salariocat.

8.2. Associação entre Departamento, Gênero e Salário

Tabela de Contingência Tripla

# Criar a tabela de contingência tripla
tabela_tripla <- table(dados$Departamento, dados$Gênero, dados$salariocat)

# Normalizar a tabela por linha
tabela_tripla_normalizada <- prop.table(tabela_tripla, margin = 1)

# Transformar a tabela em um data frame
df_tabela_tripla <- as.data.frame(tabela_tripla_normalizada)

Descrição: - A função table cria uma tabela de contingência tripla entre Departamento, Gênero e salariocat. - prop.table normaliza a tabela por linha (cada linha soma 100%). - as.data.frame converte a tabela em um dataframe para visualização.

Visualização da Tabela Normalizada

# Exibir a tabela normalizada
print(df_tabela_tripla)
##         Var1      Var2  Var3       Freq
## 1  Marketing  Feminino  Alto 0.20408163
## 2         RH  Feminino  Alto 0.13333333
## 3         TI  Feminino  Alto 0.29729730
## 4     Vendas  Feminino  Alto 0.04838710
## 5  Marketing Masculino  Alto 0.36734694
## 6         RH Masculino  Alto 0.15555556
## 7         TI Masculino  Alto 0.52702703
## 8     Vendas Masculino  Alto 0.16129032
## 9  Marketing  Feminino Baixo 0.20408163
## 10        RH  Feminino Baixo 0.44444444
## 11        TI  Feminino Baixo 0.12162162
## 12    Vendas  Feminino Baixo 0.35483871
## 13 Marketing Masculino Baixo 0.22448980
## 14        RH Masculino Baixo 0.26666667
## 15        TI Masculino Baixo 0.05405405
## 16    Vendas Masculino Baixo 0.43548387

Descrição: - A tabela normalizada é exibida, mostrando a proporção de cada combinação de Departamento, Gênero e salariocat.

Gráfico de Barras Empilhado (Tripla)

# Criar uma nova variável combinando Departamento e Gênero
df_tabela_tripla$Departamento_Gênero <- paste(df_tabela_tripla$Var1, df_tabela_tripla$Var2, sep = " - ")

# Gráfico de barras empilhado
ggplot(df_tabela_tripla, aes(x = Freq, y = Departamento_Gênero, fill = Var3)) +
  geom_bar(stat = "identity", position = "stack") +
  labs(x = "Frequência", y = "Departamento e Gênero", fill = "Salário") +
  theme_minimal() +
  theme(legend.title = element_text())

Descrição: - Este gráfico de barras empilhadas mostra a distribuição de salariocat para cada combinação de Departamento e Gênero.

8.3. Gráfico de Mosaico

# Gráfico de mosaico
mosaic(~ Departamento + salariocat, data = dados,
       main = "Distribuição de salários por Departamento",
       xlab = "Departamento",
       ylab = "Home Office",
       shade = TRUE)  # Adiciona cores para destacar diferenças

# Ajustar margens e tamanho do texto
par(mar = c(5, 4, 4, 2) + 0.1)  # Margens
par(cex.main = 1.5, cex.lab = 1.2)  # Tamanho do título e rótulos

Descrição: - O gráfico de mosaico mostra a relação entre Departamento e salariocat, com cores destacando as diferenças. - shade = TRUE adiciona cores para facilitar a interpretação visual.

9. Associação entre Variáveis Quantitativas

9.1. Gráfico de Dispersão Simples

# Ajustar o tamanho da figura
options(repr.plot.width = 10, repr.plot.height = 6)

# Criar o gráfico de dispersão
ggplot(dados, aes(x = Produtividade, y = Satisfação)) +
  geom_point(color = "blue", alpha = 1) +
  labs(title = "Dispersão de Satisfação por Produtividade", 
       x = "Produtividade", 
       y = "Satisfação") +
  theme_minimal() +
  theme(plot.title = element_text(size = 16),
        axis.title.x = element_text(size = 14),
        axis.title.y = element_text(size = 14)) +
  theme(panel.grid.major = element_line(linetype = "dashed", color = "grey", size = 0.5),
        panel.grid.minor = element_line(linetype = "dashed", color = "grey", size = 0.25))
## Warning: The `size` argument of `element_line()` is deprecated as of ggplot2 3.4.0.
## ℹ Please use the `linewidth` argument instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Descrição: - Este gráfico de dispersão mostra a relação entre Produtividade e Satisfação. - geom_point adiciona os pontos ao gráfico, com cor azul e transparência ajustada. - theme_minimal aplica um tema limpo, e theme personaliza o tamanho do título e dos rótulos dos eixos.

9.2. Gráfico de Dispersão com Reta de Regressão

# Ajustar o contexto do gráfico
theme_set(theme_minimal(base_size = 15))

# Criar o gráfico de dispersão com linha de regressão
ggplot(dados, aes(x = Produtividade, y = Satisfação, color = Gênero)) +
  geom_point(size = 3) +
  geom_smooth(method = "lm", se = TRUE) +
  labs(title = "Dispersão de Satisfação por Produtividade",
       x = "Produtividade",
       y = "Satisfação",
       color = "Gênero") +
  theme(plot.title = element_text(size = 16),
        axis.title.x = element_text(size = 14),
        axis.title.y = element_text(size = 14))
## `geom_smooth()` using formula = 'y ~ x'

Descrição: - Este gráfico de dispersão inclui uma linha de regressão para cada gênero (Gênero). - geom_smooth(method = "lm", se = TRUE) adiciona a linha de regressão linear e a banda de confiança. - color = Gênero diferencia os pontos e as linhas por gênero.

9.3. Gráfico de Dispersão com Reta de Regressão e Facetas por Departamento

# Ajustar o contexto do gráfico
theme_set(theme_minimal(base_size = 15))

# Criar o gráfico de dispersão com linha de regressão e facetas por departamento
ggplot(dados, aes(x = Produtividade, y = Satisfação, color = Gênero)) +
  geom_point(size = 3) +
  geom_smooth(method = "lm", se = TRUE) +
  facet_wrap(~ Departamento) +
  labs(title = "Dispersão de Satisfação por Produtividade",
       x = "Produtividade",
       y = "Satisfação",
       color = "Gênero") +
  theme(plot.title = element_text(size = 16),
        axis.title.x = element_text(size = 14),
        axis.title.y = element_text(size = 14))
## `geom_smooth()` using formula = 'y ~ x'

Descrição: - Este gráfico de dispersão inclui facetas para cada Departamento, mostrando a relação entre Produtividade e Satisfação separadamente para cada departamento. - facet_wrap(~ Departamento) divide o gráfico em painéis para cada departamento.

9.4. Gráfico de Dispersão com Reta de Regressão e Facetas por Salário

# Ajustar o contexto do gráfico
theme_set(theme_minimal(base_size = 15))

# Criar o gráfico de dispersão com linha de regressão e facetas por salário
ggplot(dados, aes(x = Produtividade, y = Satisfação, color = Gênero)) +
  geom_point(size = 3) +
  geom_smooth(method = "lm", se = TRUE) +
  facet_wrap(~ salariocat) +
  labs(title = "Dispersão de Satisfação por Produtividade",
       x = "Produtividade",
       y = "Satisfação",
       color = "Gênero") +
  theme(plot.title = element_text(size = 16),
        axis.title.x = element_text(size = 14),
        axis.title.y = element_text(size = 14))
## `geom_smooth()` using formula = 'y ~ x'

Descrição: - Este gráfico de dispersão inclui facetas para cada categoria de salário (salariocat), mostrando a relação entre Produtividade e Satisfação separadamente para cada categoria de salário. - facet_wrap(~ salariocat) divide o gráfico em painéis para cada categoria de salário.

10. Inferência Estatística: Comparação de Produtividade entre Grupos de Salário

10.1. Visualização dos Dados

# Gráfico de caixa da Produtividade por categoria de salário
ggplot(dados, aes(x = as.factor(salariocat), y = Produtividade)) +
  geom_boxplot() +
  labs(title = "Distribuição da Produtividade por Salário",
       x = "Salário",
       y = "Produtividade") +
  theme_minimal() +
  theme(plot.title = element_text(size = 16),
        axis.title.x = element_text(size = 14),
        axis.title.y = element_text(size = 14))

Descrição: - Este gráfico de caixa (boxplot) compara a distribuição da Produtividade entre as categorias de salário (salariocat). - as.factor(salariocat) garante que a variável salariocat seja tratada como categórica.

10.2. Teste de Normalidade (Shapiro-Wilk)

# Filtrar os dados por categoria de salário
produtividade_s1 <- dados[dados$salariocat == 'Alto', 'Produtividade']
produtividade_s0 <- dados[dados$salariocat == 'Baixo', 'Produtividade']

# Teste de normalidade (Shapiro-Wilk)
shapiro_s1 <- shapiro.test(produtividade_s1)
shapiro_s0 <- shapiro.test(produtividade_s0)

# Exibir os resultados
cat('Teste de normalidade (Shapiro-Wilk) - salário Alto: p-value =', round(shapiro_s1$p.value, 3), '\n')
## Teste de normalidade (Shapiro-Wilk) - salário Alto: p-value = 0.002
cat('Teste de normalidade (Shapiro-Wilk) - salário Baixo: p-value =', round(shapiro_s0$p.value, 3), '\n')
## Teste de normalidade (Shapiro-Wilk) - salário Baixo: p-value = 0

Descrição: - O teste de Shapiro-Wilk verifica se a Produtividade segue uma distribuição normal em cada grupo de salário. - Um p-value < 0.05 indica que a normalidade foi rejeitada.

10.3. Teste de Hipóteses para Comparação de Médias

# Escolher o teste com base na normalidade
if (shapiro_s1$p.value < 0.05 | shapiro_s0$p.value < 0.05) {
  cat("A normalidade foi rejeitada, utilizando o teste de Mann-Whitney.\n")
  teste <- wilcox.test(produtividade_s1, produtividade_s0)
} else {
  cat("A normalidade não foi rejeitada, utilizando o teste t de Student.\n")
  teste <- t.test(produtividade_s1, produtividade_s0)
}
## A normalidade foi rejeitada, utilizando o teste de Mann-Whitney.
# Exibir os resultados do teste de hipóteses
cat('Estatística de teste:', teste$statistic, '\n')
## Estatística de teste: 8723.5
cat('p-value:', round(teste$p.value, 3), '\n')
## p-value: 0
# Interpretação do resultado
if (teste$p.value < 0.05) {
  cat("Rejeitamos H0, o que indica que a produtividade é diferente nos grupos de salário alto e baixo.\n")
} else {
  cat("Não rejeitamos H0, o que indica que a produtividade pode ser considerada equivalente nos dois grupos.\n")
}
## Rejeitamos H0, o que indica que a produtividade é diferente nos grupos de salário alto e baixo.

Descrição: - Se a normalidade for rejeitada, usamos o teste de Mann-Whitney (não paramétrico) para comparar as medianas. - Caso contrário, usamos o teste t de Student (paramétrico) para comparar as médias. - Um p-value < 0.05 indica que há diferença significativa entre os grupos.

11. Modelo de Regressão Logística

11.1. Preparação dos Dados

Criar Variáveis Dummy

# Criar variáveis dummy para variáveis categóricas
dados_modelo <- dados %>%
  dummy_cols(select_columns = c("Gênero", "Departamento", "Home_Office", "salariocat"))

# Selecionar as variáveis preditoras
X <- dados_modelo %>%
  select(Gênero_Masculino, Departamento_Marketing, Departamento_TI, 
         Departamento_Vendas, Produtividade, Home_Office_Sim)

# Selecionar a variável dependente
y <- dados_modelo$salariocat_Alto

# Adicionar uma coluna de constantes (intercepto) às variáveis preditoras
X <- cbind(Intercepto = 1, X)

# Converter X e y para inteiros
X <- X %>% mutate(across(everything(), as.integer))
y <- as.integer(y)

Descrição: - dummy_cols cria variáveis dummy para as variáveis categóricas (Gênero, Departamento, Home_Office, salariocat). - select seleciona as variáveis preditoras. - cbind(Intercepto = 1, X) adiciona uma coluna de intercepto ao dataframe X. - mutate(across(everything(), as.integer)) converte todas as colunas para o tipo inteiro.

11.2. Divisão dos Dados em Treino e Teste

# Dividir os dados em treino (70%) e teste (30%)
set.seed(42)  # Definir semente para reprodutibilidade
split <- createDataPartition(y, p = 0.7, list = FALSE)
X_train <- X[split, ]
X_test <- X[-split, ]
y_train <- y[split]
y_test <- y[-split]

Descrição: - createDataPartition divide os dados em conjuntos de treino e teste, mantendo a proporção da variável dependente y. - set.seed(42) garante que a divisão seja reproduzível.

11.3. Ajuste do Modelo de Regressão Logística

# Ajustar o modelo de regressão logística
model <- glm(y_train ~ ., data = as.data.frame(X_train), family = binomial())

# Resumo do modelo
summary(model)
## 
## Call:
## glm(formula = y_train ~ ., family = binomial(), data = as.data.frame(X_train))
## 
## Coefficients: (1 not defined because of singularities)
##                         Estimate Std. Error z value Pr(>|z|)    
## (Intercept)            -10.92868    2.74118  -3.987 6.70e-05 ***
## Intercepto                    NA         NA      NA       NA    
## Gênero_Masculino         1.49003    0.44279   3.365 0.000765 ***
## Departamento_Marketing   0.89330    0.60369   1.480 0.138947    
## Departamento_TI          2.60450    0.62441   4.171 3.03e-05 ***
## Departamento_Vendas     -0.75153    0.62853  -1.196 0.231811    
## Produtividade            0.11101    0.03296   3.368 0.000758 ***
## Home_Office_Sim         -0.99246    0.74339  -1.335 0.181859    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 224.58  on 161  degrees of freedom
## Residual deviance: 149.21  on 155  degrees of freedom
## AIC: 163.21
## 
## Number of Fisher Scoring iterations: 5

Descrição: - glm ajusta um modelo de regressão logística, onde y_train é a variável dependente e X_train são as variáveis preditoras. - family = binomial() especifica que estamos usando regressão logística. - summary(model) exibe os coeficientes do modelo, valores-p e outras estatísticas.

11.4. Predição e Avaliação do Modelo

# Fazer predições no conjunto de teste
y_pred <- predict(model, newdata = as.data.frame(X_test), type = "response")

# Classificar as predições com base em um ponto de corte de 0.5
y_pred_class <- ifelse(y_pred > 0.5, 1, 0)

# Calcular a acurácia do modelo
accuracy <- mean(y_pred_class == y_test)
print(paste("Acurácia do modelo:", round(accuracy, 4)))
## [1] "Acurácia do modelo: 0.7206"

Descrição: - predict gera probabilidades preditas para o conjunto de teste. - ifelse(y_pred > 0.5, 1, 0) classifica as probabilidades em 0 ou 1 com base no ponto de corte de 0.5. - mean(y_pred_class == y_test) calcula a acurácia do modelo.

11.5. Interpretação dos Coeficientes (Odds Ratio)

# Calcular o Odds Ratio para os coeficientes do modelo
exp(1.0370)
## [1] 2.820742
exp(3.0516)
## [1] 21.14916
exp(0.0780)
## [1] 1.081123

Descrição: - O Odds Ratio é calculado como exp(coeficiente). - Ele indica como as chances do evento (neste caso, salariocat_Alto) mudam com o aumento de uma unidade na variável preditora, mantendo as outras constantes. - exp(1.0370): Odds Ratio para uma variável específica. - exp(3.0516): Odds Ratio para outra variável. - exp(0.0780): Odds Ratio para mais uma variável.