Sample data
See how many full rows do we have
sum(complete.cases(sample_dirty_dataset))
## [1] 732
nrow(sample_dirty_dataset[complete.cases(sample_dirty_dataset), ])/nrow(sample_dirty_dataset)*100
## [1] 73.2
Visualsing missing data
vis_miss(sample_dirty_dataset)

Correlationbetween missing data
gg_miss_upset(sample_dirty_dataset)

miss_var_summary(sample_dirty_dataset)
## # A tibble: 14 × 3
## variable n_miss pct_miss
## <chr> <int> <num>
## 1 workclass 50 5
## 2 marital_status 50 5
## 3 relationship 50 5
## 4 sex 50 5
## 5 hours_per_week 50 5
## 6 native_country 50 5
## 7 age 0 0
## 8 education 0 0
## 9 education_num 0 0
## 10 occupation 0 0
## 11 race 0 0
## 12 capital_gain 0 0
## 13 capital_loss 0 0
## 14 income 0 0
# Convert the variable dose from a numeric to a factor variable
#tooth$dose <- as.factor(tooth$dose)
# Change box plot line colors by groups
p<-ggplot(sample_dirty_dataset, aes(y=capital_gain)) +
geom_boxplot()
p

Repleacing invalid data with NA
#cr <- correctionRules(expression(
# if (!is.na(capital_gain) && capital_gain <=0){capital_gain = NA}
# else if (!is.na(capital_loss) && capital_loss <=0){capital_loss = NA}
# ))
RULE <- editset(c("capital_loss >= 0", "capital_gain >= 0"))
sample_dirty_dataset[localizeErrors(RULE, sample_dirty_dataset)$adapt] <- NA
Imputing data
sample_dirty_dataset <- mutate(sample_dirty_dataset,
capital_gain = imputate_na(sample_dirty_dataset, capital_gain, method="median"),
capital_loss = imputate_na(sample_dirty_dataset, capital_loss, method = "median"),
hours_per_week = imputate_na(sample_dirty_dataset, hours_per_week, method = "mean"))
sample_dirty_dataset <- sample_dirty_dataset[!(sample_dirty_dataset$age %in% "InvalidAge"),]
sample_dirty_dataset <- sample_dirty_dataset[!(sample_dirty_dataset$occupation %in% "InvalidOccupation"),]
sample_dirty_dataset <- sample_dirty_dataset[!(sample_dirty_dataset$race %in% "InvalidRace"),]
sample_dirty_dataset <- sample_dirty_dataset[!(sample_dirty_dataset$education %in% "InvalidEducation"),]
sample_dirty_dataset <- sample_dirty_dataset[complete.cases(sample_dirty_dataset$native_country), ]
sample_dirty_dataset <- sample_dirty_dataset[complete.cases(sample_dirty_dataset$sex), ]
sample_dirty_dataset <- sample_dirty_dataset[complete.cases(sample_dirty_dataset$workclass), ]
sample_dirty_dataset <- mutate(sample_dirty_dataset, relationship = ifelse(is.na(relationship), "Other-relative", relationship))
sample_dirty_dataset <- mutate(sample_dirty_dataset, marital_status = ifelse(is.na(marital_status), "Never-married", marital_status))
#/sample_dirty_dataset <- mutate(sample_dirty_dataset, education = imputate_na(sample_dirty_dataset, education, education_num, method="knn"))
#sample_dirty_dataset$workclass <- imputate_na(sample_dirty_dataset, workclass, education, method="knn")
Checking for outliers in capital gain
zscore <- abs(scale(sample_dirty_dataset$capital_gain))
plot(zscore, type='n')
abline(h=2, col="red")
text(1:length(sample_dirty_dataset$capital_gain), zscore)

# every score is under 2 so there should be no outliers in capital gain
boxplot(sample_dirty_dataset$capital_loss)

# capital loss has many outliers, but they are not so far from the 25/75 percentile, and are distributed evenly
# so I think there is no need to delete them
Checking for outliers in hours per week
par(mfrow=c(2, 2))
plot(covMcd(sample_dirty_dataset$hours_per_week))

# again we can see that there are no significant outliers in hours_per_week
Binding
sample_dirty_dataset$age <- as.numeric(sample_dirty_dataset$age)
bin <- binning(sample_dirty_dataset$age)
plot(bin)
## Don't know how to automatically pick scale for object of type <table>.
## Defaulting to continuous.

sample_dirty_dataset %>%
mutate(Age_bin = binning(sample_dirty_dataset$age)) %>%
group_by(Age_bin) %>%
summarise(freq = n(),
avg_cap_gain = mean(capital_gain),
avg_cap_loss = mean(capital_loss),
avg_hours_per_week = mean(hours_per_week)) %>%
arrange(desc(freq)) %>%
head(10)
## # A tibble: 10 × 5
## Age_bin freq avg_cap_gain avg_cap_loss avg_hours_per_week
## <bins> <int> <dbl> <dbl> <dbl>
## 1 [18,25] 70 51570. 47976. 47.3
## 2 (38,44] 68 53363. 48195. 47.1
## 3 (50,56] 67 49257. 48959. 51.7
## 4 (44,50] 66 50750. 44275. 52.2
## 5 (25,31] 65 51554. 49596. 52.8
## 6 (69,77] 65 51525. 51456. 47.6
## 7 (77,84] 64 47006. 45950. 50.0
## 8 (63,69] 61 47060. 50361. 50.0
## 9 (31,38] 59 53726. 49229. 47.8
## 10 (56,63] 59 50588. 42543. 42.6