Load Packages and Data
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
library(readr)
library(reshape2)
data <- read_csv(file.choose())
## Rows: 154648 Columns: 9
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (6): Name, JobTitle, AgencyID, AgencyName, HireDate, FiscalYear
## dbl (3): ID, AnnualSalary, GrossPay
##
## ℹ 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.
Column Names
names(data)
## [1] "ID" "Name" "JobTitle" "AgencyID" "AgencyName"
## [6] "HireDate" "AnnualSalary" "GrossPay" "FiscalYear"
Descriptive Statistics
summary(data)
## ID Name JobTitle AgencyID
## Min. : 1 Length :154648 Length :154648 Length :154648
## 1st Qu.: 38663 N.unique : 37980 N.unique : 2436 N.unique : 1506
## Median : 77325 N.blank : 0 N.blank : 0 N.blank : 0
## Mean : 77325 Min.nchar: 5 Min.nchar: 3 Min.nchar: 2
## 3rd Qu.:115986 Max.nchar: 37 Max.nchar: 30 Max.nchar: 6
## Max. :154648
##
## AgencyName HireDate AnnualSalary GrossPay
## Length :154648 Length :154648 Min. : 0 Min. : -1349
## N.unique : 1295 N.unique : 6761 1st Qu.: 31137 1st Qu.: 30338
## N.blank : 0 N.blank : 0 Median : 45475 Median : 49010
## Min.nchar: 5 Min.nchar: 22 Mean : 48679 Mean : 51741
## Max.nchar: 30 Max.nchar: 22 3rd Qu.: 66086 3rd Qu.: 71820
## NAs : 310 Max. :275000 Max. :373111
## NAs :8479
## FiscalYear
## Length :154648
## N.unique : 10
## N.blank : 0
## Min.nchar: 6
## Max.nchar: 6
##
##
mean(data$AnnualSalary)
## [1] 48678.95
median(data$AnnualSalary)
## [1] 45475
range(data$AnnualSalary)
## [1] 0 275000
length(unique(data$AgencyName))
## [1] 1295
Visualization 1: Histogram of Annual Salary
ggplot(data, aes(x = AnnualSalary)) +
geom_histogram(binwidth = 5000, fill = "steelblue", color = "white")

Visualization 2: Boxplot of Salary by Agency
top_agencies <- data %>%
count(AgencyName, sort = TRUE) %>%
slice_head(n = 10)
filtered <- data %>% filter(AgencyName %in% top_agencies$AgencyName)
ggplot(filtered, aes(x = AgencyName, y = AnnualSalary)) +
geom_boxplot(fill = "orange") +
coord_flip()

Visualization 3: Top 10 Job Titles
top_jobs <- data %>%
count(JobTitle, sort = TRUE) %>%
slice_head(n = 10)
ggplot(top_jobs, aes(x = reorder(JobTitle, n), y = n)) +
geom_col(fill = "purple") +
coord_flip()

Visualization 4: Salary vs Gross Pay
ggplot(data, aes(x = GrossPay, y = AnnualSalary)) +
geom_point(alpha = 0.4, color = "darkgreen")
## Warning: Removed 8479 rows containing missing values or values outside the scale range
## (`geom_point()`).

Visualization 5: Correlation Heatmap
num_vars <- data %>% select(AnnualSalary, GrossPay)
corr <- cor(num_vars, use = "complete.obs")
melted <- melt(corr)
ggplot(melted, aes(Var1, Var2, fill = value)) +
geom_tile() +
scale_fill_gradient2(low = "red", high = "blue", mid = "white")
