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")