Quick Setup

library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.4.0      ✔ purrr   1.0.0 
## ✔ tibble  3.1.8      ✔ dplyr   1.0.10
## ✔ tidyr   1.2.1      ✔ stringr 1.5.0 
## ✔ readr   2.1.3      ✔ forcats 0.5.2 
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
getwd()
## [1] "C:/Users/cjlan/OneDrive/Desktop/Sandbox"
setwd("C:/Users/cjlan/OneDrive/Desktop/Sandbox")

SD <- read.csv("Salary_Data.csv")

Quick Cleanup

Find Nulls & Clean
nulls_in_data <- is.na(SD)

null_count <- colSums(nulls_in_data)


SD_cleaned <- SD[complete.cases(SD), ]

#print(null_count)

#Check

nulls_in_data_new <- is.na(SD_cleaned)

null_count_new <- colSums(nulls_in_data_new)
print(null_count_new)
##                 Age              Gender     Education.Level           Job.Title 
##                   0                   0                   0                   0 
## Years.of.Experience              Salary 
##                   0                   0
#View(SD_cleaned)

Avg_salary then filter for list

avg_salary <- mean(SD_cleaned$Salary)

avg_salary
## [1] 115327
Avg_sal_clean <- SD_cleaned %>%
  filter(Salary >= avg_salary)

count(Avg_sal_clean)
##      n
## 1 3315

Visualizations

Salary by Age before descriptive breakdown

library(ggplot2)
library(ggthemes)
## Warning: package 'ggthemes' was built under R version 4.2.3
plot(SD$Age, SD$Salary, main = "Scatter Plot of Salary by Age", xlab = "Age", ylab = "Salary", col = "pink3", pch = 16)

#intuituve results

Create the dataframe so we can knit a table

df2 <- data.frame(Salary <- SD_cleaned$Salary , Age <- SD_cleaned$Age, Gender <- SD_cleaned$Gender)

mean_salary_by_age_gender <- aggregate(Salary ~ Age + Gender, data = df2, FUN = mean)

Table of Mean Salary by Age

library(knitr)
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.2.3
## Warning in !is.null(rmarkdown::metadata$output) && rmarkdown::metadata$output
## %in% : 'length(x) = 3 > 1' in coercion to 'logical(1)'
## 
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
mean_salary_by_age_gender$Age <- as.numeric(mean_salary_by_age_gender$Age)
mean_salary_by_age_gender$Salary <- as.numeric(mean_salary_by_age_gender$Salary)



mean_salary_by_age_gender %>% 
kable(Salary, format = "html") %>%
  kable_styling() %>%
  column_spec(2, bold = TRUE) %>% 
 # column_spec(1, background = "lightblue") %>% 
  row_spec(1:12, color = "black") %>%
  row_spec(0, bold = TRUE, font_size = 16, color = "black", 
           background = "plum") #%>%
Age Gender Salary
21 Female 25000.00
22 Female 30722.00
23 Female 46174.53
24 Female 37552.89
25 Female 64330.79
26 Female 55500.47
27 Female 70025.36
28 Female 88297.30
29 Female 91146.31
30 Female 100924.14
31 Female 109786.04
32 Female 109423.18
33 Female 132461.94
34 Female 124316.88
35 Female 118721.02
36 Female 133427.44
37 Female 127065.56
38 Female 131924.56
39 Female 152786.39
40 Female 149622.18
41 Female 161078.63
42 Female 136413.27
43 Female 160586.23
44 Female 158794.15
45 Female 163025.33
46 Female 163437.05
47 Female 173750.00
48 Female 176430.57
49 Female 183591.03
50 Female 181245.88
51 Female 182531.77
52 Female 188159.11
54 Female 191268.44
55 Female 187557.40
56 Female 203677.00
57 Female 167157.33
58 Female 195000.00
60 Female 183915.50
22 Male 41666.67
23 Male 47541.75
24 Male 68117.48
25 Male 62617.30
26 Male 71054.69
27 Male 81881.74
28 Male 78861.73
29 Male 79139.21
30 Male 100868.88
31 Male 117475.77
32 Male 126254.47
33 Male 119854.42
34 Male 134548.76
35 Male 120463.76
36 Male 134486.18
37 Male 150937.01
38 Male 141347.70
39 Male 113260.00
40 Male 150474.27
41 Male 149658.09
42 Male 164146.34
43 Male 168524.36
44 Male 162037.66
45 Male 172020.97
46 Male 173265.96
47 Male 179215.23
48 Male 199241.16
49 Male 192098.83
50 Male 198853.25
51 Male 213986.41
52 Male 187391.00
53 Male 186685.60
54 Male 191835.22
55 Male 203448.00
56 Male 195000.00
57 Male 196666.67
58 Male 195834.67
60 Male 195000.00
61 Male 200000.00
62 Male 200000.00
23 Other 62852.00
25 Other 69032.00
31 Other 104127.00
37 Other 161393.00
53 Other 166109.00
54 Other 158788.00
  #row_spec(1:10, background = "lightpink1")

NOTE: THE DATASET CONTAINS 3674 MALES AND 3014 FEMALES

Charts - by Age & Gender

SD_cleaned %>% 
  select(Gender, Age, Salary) %>% 
  filter(Gender %in% c("Male", "Female")) %>% 
  ggplot(aes(Age, Salary, color=Gender))+
  geom_jitter(size=2, alpha = 0.5)+
  geom_smooth()+
  facet_wrap(~Gender)+
  labs(x='Age', y='Salary') +
  theme_linedraw()+
  labs(title="Salary & Age by Gender")
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'

by Gender & Years of Experience

Next, lets evaluate gender and salary, this time against years of experience

SD_cleaned %>% 
  select(Gender, Years.of.Experience, Salary) %>% 
  filter(Gender %in% c("Male", "Female")) %>% 
  ggplot(aes(Years.of.Experience, Salary, color=Gender))+
  geom_jitter(size=2, alpha = 0.5)+
  geom_smooth()+
  facet_wrap(~Gender)+
  labs(x='YOE', y='Salary') +
  theme_linedraw()+
  labs(title="Salary & YOE by Gender")
## `geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'