Anfoderungen

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.

  1. Umgang mit Missing Values
  2. Numerisieren von nicht numerischen Variablen
  3. Andere Modifikationen / Transformationen

Lies die Daten ein

# 
bank_add_full <- read_csv("bank-additional-full.csv",show_col_types = FALSE)

Feature engineering

Untersuchung fehlender Werte

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

Verteilung der nicht numerischen Variablen

num_var <- bank_add_full %>%
  select_if(is.numeric)
skim(num_var)
Data summary
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:

  • Die Spalte “age” enthält Ausreiser[quantile(num_var$age, 0.99) = 71]. Werte ab 71 können als Ausreiser betrachtet werden. Diese können entfernt werden.
  • Die Spalte “pdays” enthält sehr viele 999 Werte. Diese Spalte kann gedropt werden, da sie keine nützlichen Informationen enthält.
  • Die Spalte “duration” enthält Ausreiser[quantile(num_var$duration, 0.95) = 1271.13]. Werte ab 1217 können als Ausreiser betrachtet werden. Diese können durch den Median ersetzt werden.
  • Die Spalte “campaign” enthält Ausreiser[quantile(num_var$campaign, 0.95) = 7]. Werte ab 7 können als Ausreiser betrachtet werden. Diese können durch den Median ersetzt werden.
  • Die Spalte “previous” enthält über 85% der Werte 0, [quantile(num_var$previous, 0.85) = 0 ]. Diese Spalte kann gedropt werden, da sie keine nützlichen Informationen enthält.
# 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))

Transformationen der nicht numerischen Variablen

# 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.