Meine Investitionen bei estateguru waren nicht so erfolgreich, auch wenn mal ein Projekt teileingeholt wurde (von 500 Euro sind 262,72 Euro wieder da), aber insgesamt eignen sich die Daten für eine Datenanalyse.

Estateguru bietet ja die Möglichkeit, die eigenen Portfolio-Daten herunterzuladen, was es mir ermöglicht, mal genauer zu schauen, was eigentlich schief gelaufen ist:
data %>%
group_by(Country, Status) %>%
ggplot(., aes(fill = Status, x = as.factor(Country))) +
geom_bar() +
theme_minimal() +
xlab("Land")
Wie man hier schön sehen kann, habe ich in Deutschland zwar weniger Projekte gehabt als in Estland zum Beispiel, aber hier sind die meisten Projekte ausgefallen. Das ist schon erschreckend. Noch schlimmer sieht es aus, wenn man sich die tatsächlichen Summen ansieht.
data %>%
group_by(Country, Status) %>%
ggplot(., aes(fill = Status, y = `Initial Principal`, x = as.factor(Country))) +
geom_bar(stat = "identity") +
theme_minimal() +
xlab("Land") +
ylab("Darlehensbetrag in Euro")
Gibt es einen Zusammenhang zwischen Interest Rate und dem Status “ausgefallen”, d.h. habe ich in meiner “Gier” zu riskante Kredite übernommen, die sich durch höhere Zinsen auszeichneten? Erst mal visualisieren wir mehrere Variablen:
data %>%
ggplot(., aes(x = `Initial Principal`, y= `Interest Rate`, color = factor(Status))) +
geom_point() +
facet_grid(rows = vars(Country)) +
theme_minimal()

Wir sehen auf jeden Fall den einen Outlier, wo ich 2.500 Euro investiert hatte bei ca. 11 Prozent. Es sieht auch so aus, dass vor allem bei den höheren Zinssätzen Ausfälle sind, nur nicht bei den deutschen Projekten, da habe ich sie überall. So ganz passt das aber nicht, da man in manche Projekte über mehrere Stages investieren konnte:
data %>%
mutate(`Loan Code` = str_remove(`Loan Code`, "-.*")) %>%
group_by(`Loan Code`) %>%
mutate(principal_complete = sum(`Initial Principal`), median_interest = median(`Interest Rate`)) %>%
select(`Loan Code`, Status, Country, median_interest, principal_complete) %>%
arrange(`Loan Code`) %>%
unique() %>%
ggplot(., aes(x = principal_complete, y= median_interest, color = factor(Status))) +
geom_point() +
facet_grid(rows = vars(Country)) +
theme_minimal()
Anscheinend war ich in Deutschland besonders mutig, weil ich dachte, dass Kredite dort sicherer sind, und bin daher mehrmals über die mir selbst gesetzte Grenze von 500 Euro pro Projekt gegangen. Einen statistisch signifikanten Unterschied auszurechnen wäre die Aufgabe. Fangen wir aber erst mal anders an:
data %>%
filter(Status == "Repaid" | Status == "In Default") %>%
group_by(Status) %>%
summarize(mean_interest = mean(`Interest Rate`), median_interest = median(`Interest Rate`))
## # A tibble: 2 × 3
## Status mean_interest median_interest
## <chr> <dbl> <dbl>
## 1 In Default 10.7 10.5
## 2 Repaid 10.0 10
Der Shapiro-Wilk-Test hilft uns, um die Normalität der Daten zu überprüfen.
repaid <- filter(data, Status == "Repaid")$`Interest Rate`
in_default <- filter(data, Status == "In Default")$`Interest Rate`
shapiro_test_repaid <- shapiro.test(repaid)
shapiro_test_in_default <- shapiro.test(in_default)
cat("P-value for Repaid group:", shapiro_test_repaid$p.value, "\n")
cat("P-value for In Default group:", shapiro_test_in_default$p.value, "\n")
P-value for Repaid group: 1.143358e-08
P-value for In Default group: 6.078673e-05
Die p-Werte sind signifikant (unter 0,05), was darauf hinweist, dass die Daten nicht normalverteilt sind. Darum der Mann-Whitney-U-Test verwendet, ein nichtparametrischer Test, um die Zinssätze der beiden Gruppen zu vergleichen.
wilcox_test <- wilcox.test(repaid, in_default, alternative = "two.sided")
cat("P-value for Mann-Whitney U test:", wilcox_test$p.value, "\n")
P-value for Mann-Whitney U test: 6.66547e-08
Der p-Wert ist signifikant, also unter 0,05, was darauf hinweist, dass es einen signifikanten Unterschied in den Zinssätzen zwischen den zurückgezahlten und den in Verzug geratenen Darlehen gibt. Dies ist nun über das ganze Portfolio geschehen. Wie sieht das pro Land aus?
countries <- unique(data$Country)
# Function to analyze each country
analyze_country <- function(country) {
cat("Analyse für", country, ":\n")
# Filter data by country and status
data_df <- data %>% filter(Country == country) %>% filter(Status %in% c("Repaid", "In Default"))
# Check if there is enough data for both categories
if (nrow(data_df) > 0 & length(unique(data_df$Status)) > 1) {
repaid <- data_df %>% filter(Status == "Repaid") %>% select(`Interest Rate`) %>% unlist()
in_default <- data_df %>% filter(Status == "In Default") %>% select(`Interest Rate`) %>% unlist()
test <- wilcox.test(repaid, in_default, exact = FALSE)
cat("Mann-Whitney U Test-Ergebnis: W =", test$statistic, ", p-value =", test$p.value, "\n\n")
} else {
cat("Nicht genug Daten für die Analyse.\n\n")
}
}
# Analyze each country
for (country in countries) {
analyze_country(country)
}
Analyse für Estonia :
Mann-Whitney U Test-Ergebnis: W = 77 , p-value = 0.02871484
Analyse für Germany :
Mann-Whitney U Test-Ergebnis: W = 101 , p-value = 0.5058534
Analyse für Lithuania :
Mann-Whitney U Test-Ergebnis: W = 224.5 , p-value = 3.126943e-06
Analyse für Finland :
Mann-Whitney U Test-Ergebnis: W = 54 , p-value = 0.8649381
Analyse für Spain :
Nicht genug Daten für die Analyse.
Analyse für Portugal :
Nicht genug Daten für die Analyse.
Analyse für Latvia :
Mann-Whitney U Test-Ergebnis: W = 12 , p-value = 0.04383209
Tatsächlich ist der Unterschied in Deutschland nicht signifikant. Ich war hier also doch nicht so gierig, wie ich dachte 🙂
Was, wenn ich in alle Kredite nur 50 Euro investiert hätte und nicht manchmal sehr viel mehr? Wie stünde ich heute da?
data$fantasy = 50
data %>%
mutate(`Loan Code` = str_remove(`Loan Code`, "-.*")) %>%
group_by(`Loan Code`) %>%
mutate(principal_complete = sum(`Initial Principal`), median_interest = median(`Interest Rate`)) %>%
select(`Loan Code`, Status, Country, median_interest, principal_complete, fantasy) %>%
arrange(`Loan Code`) %>%
unique() %>%
group_by(Status) %>%
summarize(fifty_only = sum(fantasy), real_numbers = sum(principal_complete)) %>%
mutate(percentages_fifty = 100 * (fifty_only / sum(fifty_only)), percentages_real = 100 * (real_numbers / sum(real_numbers))) %>%
select(-fifty_only, -real_numbers)
## # A tibble: 6 × 3
## Status percentages_fifty percentages_real
## <chr> <dbl> <dbl>
## 1 Fully Recovered 2.33 1.25
## 2 Funded 34.6 30.7
## 3 In Default 16.3 27.1
## 4 Late 1.66 3.91
## 5 Partially Recovered 0.332 0.899
## 6 Repaid 44.9 36.1
Hier sieht man schon sehr deutlich, dass ich mit meiner Strategie, bei einigen Projekten mehr auszugeben, auf die Nase geknallt bin. Es wäre besser gewesen, ausgewogener und diversifizierter zu investieren.