Im Rahmen dieser Analyse soll untersucht werden den gegebenen Datensatz mit den Methoden der Explorativen Datenanalyse (EDA) aus Kapitel 2, um die Eignung für Machine Learning zu bewerten.
#
bank_add_full <- read_csv("bank-additional-full.csv",show_col_types = FALSE)
bank_add_full %>%
summarise(across(everything(), ~ sum(is.na(.)))) %>%
pivot_longer(cols = everything(), names_to = "column", values_to = "nan") %>%
ggplot(aes(x = column, y = nan)) +
geom_bar(stat = "identity") +
theme(axis.text.x = element_text(angle = 90, hjust = 1))
Die Spalte “default” enthält am meisten nan Werte und kann daher entfernt werden. Die Spalten “education” und “job” enthalten auch nan Werte, jedoch sind diese nicht so häufig wie in der Spalte “default”. Diese können durch andere Werte / Einträge imputiert ersetzt werden.
# bank_add_full$education in bar plot
bank_add_full %>%
ggplot(aes(x = education)) +
geom_bar() +
theme(axis.text.x = element_text(angle = 90, hjust = 1))
Fazit der Am häufigsten vorkommenden Bildungsstufe ist “university.degree”. Diese kann als Ersatz für die fehlenden Werte in der Spalte “education” verwendet werden. Bei der Spalte “job” ist “admin” am häufigsten vorkommend. Diese kann als Ersatz für die fehlenden Werte in der Spalte “job” verwendet werden. Bei housing und loan sind die Werte “yes” und “no” am häufigsten vorkommend. Diese können als Ersatz für die fehlenden Werte in den Spalten “housing” und “loan” verwendet werden. Bei der Spalte marital kommt die NA sehr oft vor, kann diese Spalte entfernt werden.
# plot häufigkeitsverteilung job, loan, und housing
bank_add_full %>%
pivot_longer(cols = c(job, loan, housing), names_to = "column", values_to = "value") %>%
ggplot(aes(x = value)) +
geom_bar() +
facet_wrap(~column, scales = "free_x") +
theme(axis.text.x = element_text(angle = 90, hjust = 1))
# check if not nan is containes in the data
bank_add_full %>%
summarise(across(everything(), ~ sum(is.na(.)))) %>%
pivot_longer(cols = everything(), names_to = "column", values_to = "nan")
## # A tibble: 19 × 2
## column nan
## <chr> <int>
## 1 age 0
## 2 job 0
## 3 education 0
## 4 housing 0
## 5 loan 0
## 6 contact 0
## 7 month 0
## 8 day_of_week 0
## 9 duration 0
## 10 campaign 0
## 11 pdays 0
## 12 previous 0
## 13 poutcome 0
## 14 emp.var.rate 0
## 15 cons.price.idx 0
## 16 cons.conf.idx 0
## 17 euribor3m 0
## 18 nr.employed 0
## 19 y 0
num_var <- bank_add_full %>%
select_if(is.numeric)
skim(num_var)
Name | num_var |
Number of rows | 41188 |
Number of columns | 10 |
_______________________ | |
Column type frequency: | |
numeric | 10 |
________________________ | |
Group variables | None |
Variable type: numeric
skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
---|---|---|---|---|---|---|---|---|---|---|
age | 0 | 1 | 40.02 | 10.42 | 17.00 | 32.00 | 38.00 | 47.00 | 98.00 | ▅▇▃▁▁ |
duration | 0 | 1 | 258.29 | 259.28 | 0.00 | 102.00 | 180.00 | 319.00 | 4918.00 | ▇▁▁▁▁ |
campaign | 0 | 1 | 2.57 | 2.77 | 1.00 | 1.00 | 2.00 | 3.00 | 56.00 | ▇▁▁▁▁ |
pdays | 0 | 1 | 962.48 | 186.91 | 0.00 | 999.00 | 999.00 | 999.00 | 999.00 | ▁▁▁▁▇ |
previous | 0 | 1 | 0.17 | 0.49 | 0.00 | 0.00 | 0.00 | 0.00 | 7.00 | ▇▁▁▁▁ |
emp.var.rate | 0 | 1 | 0.08 | 1.57 | -3.40 | -1.80 | 1.10 | 1.40 | 1.40 | ▁▃▁▁▇ |
cons.price.idx | 0 | 1 | 93.58 | 0.58 | 92.20 | 93.08 | 93.75 | 93.99 | 94.77 | ▁▆▃▇▂ |
cons.conf.idx | 0 | 1 | -40.50 | 4.63 | -50.80 | -42.70 | -41.80 | -36.40 | -26.90 | ▅▇▁▇▁ |
euribor3m | 0 | 1 | 3.62 | 1.73 | 0.63 | 1.34 | 4.86 | 4.96 | 5.04 | ▅▁▁▁▇ |
nr.employed | 0 | 1 | 5167.04 | 72.25 | 4963.60 | 5099.10 | 5191.00 | 5228.10 | 5228.10 | ▁▁▃▁▇ |
Ergebnisse der obigen Tabelle und Empfehlungen:
# Umsetzung der Empfehlungen
bank_add_full <- bank_add_full %>%
select(-pdays, -previous) %>%
filter(age <= 71) %>%
mutate(duration = if_else(duration > 1217, median(duration, na.rm = TRUE), duration),
campaign = if_else(campaign > 7, median(campaign, na.rm = TRUE), campaign))
# one hot encoding
bank_add_full <- bank_add_full %>%
dummy_columns(char_var, remove_first_dummy = TRUE, remove_selected_columns = TRUE)
Die Daten sind nun an die Anforderungen für Machine Learning angepasst. Numerische Variablen wurden bereinigt und Ausreiser entfernt. Nicht numerische Variablen wurden numerisiert mit one hot encoding.Das Feature eingineering ist abgeschlossen, kann aber bei Bedarf weiter verfeinert werden. Nächste schritte sind die Daten in Trainings- und Testdaten zu unterteilen und die Modelle zu trainieren –> Modell - Selektion.