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.
# 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.
# 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.
# 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.
A variável Salário é quantitativa contínua. Vamos
analisar sua distribuição antes de dicotomizá-la.
# 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.
# 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.
# 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.
# 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.
# 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).
# 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.
# 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%.
# 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.
# 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.
# 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.
skim# Análise detalhada com a função skim
skim(dados)
| 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.
# 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.
# 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).
# 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.
# 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.
# 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.
# 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.
# 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.
# 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.
# 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
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
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.
# 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.
# 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.
# 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.
# 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.
# 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.
# 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.
# 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.
# 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.
# 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.
# 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.
# 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.
# 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.
# 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.
# 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.
# 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.
# 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.