p{text-align: justify;}
library(readr)
## Warning: pacote 'readr' foi compilado no R versão 4.4.2
dados = read_csv("C:/Users/Helena/Downloads/Salary_Data.csv")
## Rows: 6704 Columns: 6
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (3): Gender, Education Level, Job Title
## dbl (3): Age, Years of Experience, Salary
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
View(dados)
dados <- na.omit(dados)
dados$`Education Level` <- gsub("Bachelor's Degree", "Bachelor's", dados$`Education Level`, ignore.case = TRUE)
dados$`Education Level` <- gsub("Master's Degree", "Master's", dados$`Education Level`, ignore.case = TRUE)
dados$`Education Level` <- gsub("PhD", "phD", dados$`Education Level`, ignore.case = TRUE)
tail(dados)
## # A tibble: 6 × 6
## Age Gender `Education Level` `Job Title` `Years of Experience` Salary
## <dbl> <chr> <chr> <chr> <dbl> <dbl>
## 1 37 Male Bachelor's Junior Sales Repr… 6 75000
## 2 49 Female phD Director of Marke… 20 200000
## 3 32 Male High School Sales Associate 3 50000
## 4 30 Female Bachelor's Financial Manager 4 55000
## 5 46 Male Master's Marketing Manager 14 140000
## 6 26 Female High School Sales Executive 1 35000
mean(dados$Salary, na.rm = TRUE)
## [1] 115329.3
median(dados$Salary, na.rm = TRUE)
## [1] 115000
get_mode <- function(v) {
uniqv <- unique(v)
uniqv[which.max(tabulate(match(v, uniqv)))]
}
get_mode(dados$Salary)
## [1] 140000
sd(dados$Salary, na.rm = TRUE)
## [1] 52789.79
var(dados$Salary, na.rm = TRUE)
## [1] 2786762193
min(dados$Salary, na.rm = TRUE)
## [1] 350
max(dados$Salary, na.rm = TRUE)
## [1] 250000
range(dados$Salary, na.rm = TRUE) # Retorna mínimo e máximo
## [1] 350 250000
diff(range(dados$Salary, na.rm = TRUE)) # Diferença entre mínimo e máximo
## [1] 249650
table(dados$Gender) # Substitua 'Gender' por qualquer variável categórica
##
## Female Male Other
## 3013 3671 14
table(dados$`Education Level`)
##
## Bachelor's High School Master's phD
## 3021 448 1860 1369
prop.table(table(dados$Gender)) * 100 # Percentual
##
## Female Male Other
## 44.9835772 54.8074052 0.2090176
prop.table(table(dados$`Education Level`)) * 100
##
## Bachelor's High School Master's phD
## 45.103016 6.688564 27.769483 20.438937
boxplot(dados$Salary, main = "Boxplot do Salário", ylab = "Salário", col = "lightblue")
outliers <- boxplot.stats(dados$Salary)$out
outliers
## numeric(0)
options(scipen = 999)
modelo = aov(Salary ~ `Education Level`, data=dados)
residuos = residuals(modelo)
library(nortest)
ad.test(residuos)
##
## Anderson-Darling normality test
##
## data: residuos
## A = 24.978, p-value < 0.00000000000000022
set.seed(123)
amostra <- sample(residuos, size = 5000, replace = FALSE)
shapiro.test(amostra)
##
## Shapiro-Wilk normality test
##
## data: amostra
## W = 0.98699, p-value < 0.00000000000000022
kruskal.test(Salary ~ `Education Level`, data=dados)
##
## Kruskal-Wallis rank sum test
##
## data: Salary by Education Level
## Kruskal-Wallis chi-squared = 2822.5, df = 3, p-value <
## 0.00000000000000022
library(dplyr)
##
## Anexando pacote: 'dplyr'
## Os seguintes objetos são mascarados por 'package:stats':
##
## filter, lag
## Os seguintes objetos são mascarados por 'package:base':
##
## intersect, setdiff, setequal, union
dados %>% group_by(`Education Level`) %>% summarise (mediana=median(Salary))
## # A tibble: 4 × 2
## `Education Level` mediana
## <chr> <dbl>
## 1 Bachelor's 80000
## 2 High School 30000
## 3 Master's 130000
## 4 phD 170000
library(ggplot2)
library(readr) # Para leitura de arquivos CSV
library(readxl) # Para leitura de arquivos Excel (caso necessário)
dados <- dados %>%
mutate(
Gender = as.factor(Gender),
`Job Title` = as.factor(`Job Title`),
`Education Level` = as.factor(`Education Level`)
)
p_genero <- ggplot(dados, aes(x = Gender, y = Salary, fill = Gender)) +
geom_boxplot() +
labs(
title = "Discrepâncias Salariais por Gênero",
x = "Gênero",
y = "Salário"
) +
theme_minimal()
p_genero
p_educacao <- ggplot(dados, aes(x = `Education Level`, y = Salary, fill = `Education Level`)) +
geom_boxplot() +
labs(
title = "Discrepâncias Salariais por Nível Educacional",
x = "Nível Educacional",
y = "Salário"
) +
theme_minimal()
p_educacao
library(ggpubr)
ggarrange(p_genero, p_educacao, ncol=1,nrow=2)
library(ggplot2)
library(readr) # Para leitura de arquivos CSV
library(readxl) # Para leitura de arquivos Excel (caso necessário)
library(reshape2) # Para transformação de dados (melt)
## Warning: pacote 'reshape2' foi compilado no R versão 4.4.2
library(dplyr) # Para manipulação de dados
dados_numéricos <- dados %>%
select_if(is.numeric)
matriz_correlacao <- cor(dados_numéricos, use = "complete.obs")
cor_melt <- melt(matriz_correlacao)
p_mapa_calor <- ggplot(cor_melt, aes(x = Var1, y = Var2, fill = value)) +
geom_tile(color = "White") +
geom_text(aes(label = round(value, 2)), color = "black", size = 3) +
scale_fill_gradient2(low = "blue", mid = "White", high = "red", midpoint = 1) +
labs(
title = "Mapa de Calor das Correlações",
x = "",
y = "",
fill = "Correlação"
) +
theme_minimal() +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
axis.text.y = element_text(size = 10)
)
p_mapa_calor
library(ggplot2)
library(readr)
library(dplyr)
p_hist_salario <- ggplot(dados, aes(x = Salary)) +
geom_histogram(binwidth = 10000, fill = "skyblue", color = "black") +
labs(
title = "Histograma de Salários",
x = "Salário",
y = "Frequência"
) +
theme_minimal()
p_hist_salario
p_hist_experiencia <- ggplot(dados, aes(x = `Years of Experience`)) +
geom_histogram(binwidth = 2, fill = "orange", color = "black") +
labs(
title = "Histograma de Anos de Experiência",
x = "Anos de Experiência",
y = "Frequência"
) +
theme_minimal()
p_hist_experiencia
p_disp_salario_experiencia <- ggplot(dados, aes(x =
`Years of Experience`, y = Salary)) + geom_point(aes(color = Gender,
shape = `Education Level`), size = 2) + labs( title = "Dispersão:
Salário vs Experiência", x = "Anos de Experiência", y = "Salário", color
= "Gênero", shape = "Nível Educacional" ) + theme_minimal()
p_disp_salario_experiencia
p_disp_idade_salario <- ggplot(dados, aes(x = Age, y = Salary)) +
geom_point(aes(color = Gender, shape = `Education Level`), size = 2) +
labs( title = "Dispersão: Idade vs Salário", x = "Idade", y = "Salário",
color = "Gênero", shape = "Nível Educacional" ) + theme_minimal()
p_disp_idade_salario
library(ggpubr)
ggarrange(p_hist_salario, p_hist_experiencia, p_disp_salario_experiencia, p_disp_idade_salario,
ncol=2,nrow=2)
library(ggplot2)
library(car)
## Carregando pacotes exigidos: carData
##
## Anexando pacote: 'car'
## O seguinte objeto é mascarado por 'package:dplyr':
##
## recode
library(stats)
library(nortest)
dados_clean <- na.omit(dados[, c("Salary", "Gender")])
model2 <- aov(Salary ~ Gender, data = dados_clean)
summary(model2)
## Df Sum Sq Mean Sq F value Pr(>F)
## Gender 2 303446485976 151723242988 55.33 <0.0000000000000002 ***
## Residuals 6695 18359499920090 2742270339
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
residuals2 <- model2$residuals
ad.test(residuals2)
##
## Anderson-Darling normality test
##
## data: residuals2
## A = 79.064, p-value < 0.00000000000000022
residuals2 <- model2$residuals
set.seed(123)
residuals2 <- sample(residuals2, size = 5000, replace = FALSE)
shapiro.test(residuals2)
##
## Shapiro-Wilk normality test
##
## data: residuals2
## W = 0.96057, p-value < 0.00000000000000022
male_salaries <- dados_clean$Salary[dados_clean$Gender == "Male"]
female_salaries <- dados_clean$Salary[dados_clean$Gender == "Female"]
mann_whitney_test <- wilcox.test(male_salaries, female_salaries, alternative = "two.sided")
mann_whitney_test
##
## Wilcoxon rank sum test with continuity correction
##
## data: male_salaries and female_salaries
## W = 6338161, p-value < 0.00000000000000022
## alternative hypothesis: true location shift is not equal to 0
dados_clean2 <- na.omit(dados[, c("Salary", "Gender")])
dados_clean2 <- subset(dados_clean, Gender %in% c("Male", "Female"))
model <- aov(Salary ~ Gender, data = dados_clean2)
summary(model)
## Df Sum Sq Mean Sq F value Pr(>F)
## Gender 1 301887767297 301887767297 110 <0.0000000000000002 ***
## Residuals 6682 18334053870452 2743797347
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
residuals3 <- model$residuals
set.seed(123)
residuals3 <- sample(residuals3, size = 5000, replace = FALSE)
shapiro.test(residuals2)
##
## Shapiro-Wilk normality test
##
## data: residuals2
## W = 0.96057, p-value < 0.00000000000000022
male_salaries <- dados_clean2$Salary[dados_clean2$Gender == "Male"]
female_salaries <- dados_clean2$Salary[dados_clean2$Gender == "Female"]
mann_whitney_test <- wilcox.test(male_salaries, female_salaries, alternative = "two.sided")
mann_whitney_test
##
## Wilcoxon rank sum test with continuity correction
##
## data: male_salaries and female_salaries
## W = 6338161, p-value < 0.00000000000000022
## alternative hypothesis: true location shift is not equal to 0
average_salaries <- aggregate(Salary ~ Gender, data = dados_clean2, mean)
print(average_salaries)
## Gender Salary
## 1 Female 107889.0
## 2 Male 121395.7
highest_salary_gender <- average_salaries[which.max(average_salaries$Salary), "Gender"]
cat("O gênero com maior média salarial é:", highest_salary_gender, "\n")
## O gênero com maior média salarial é: 2