Machine Learning Verfahren zur Vorhersage der Mathematikleistung in Klasse 10

Autor*innen: Dr. David Bednorz

Diesen Beitrag jetzt diskutieren und bewerten.

In meinem Beispiel habe ich mich entschieden Variablen aus den PISA Plus-Campus File auszuwählen die interessant sein könnten, um die Mathematikleistung in Klasse 10 mit ML-Verfahren vorherzusagen. In der Gesamtabbildung sind vier Plots dargestellt. Die oberen Plots zeigen die Vorhersage der Mathematikleistung in Klasse 10 ohne die Variable Mathematikleistung in Klasse 9 und im unteren Bereich mit der Variable Mathematikleistung in Klasse 9. Die zwei Plots auf der linken Seite der Gesamtabbildungen stellen den Zusammenhang der vorhergesagten und der beobachteten Mathematikleistung in Klasse 10 dar. Auf der rechten Seite sind zwei Plots dargestellt, die die Wichtigkeit der einzelnen Variablen in einem Balkendiagramm darstellen. Für die Erstellung der Abbildungen wurde das R-Paket ggplot2 und ggpubr genutzt.

---

Zunächst wurden Variablen als Prädiktoren ausgewählt. Für die Variablen für die es notwendig war, wurden Skalen gebildet und die Datentabelle gebaut die für das weitere Verfahren genutzt wurde. Anschließend wurden 70 % der Daten aus der Tabelle als Trainingsdaten verwendet und ein ML Algorithmus jeweils mit und ohne die Mathematikleistung aus Klasse 9 angewendet, um die Mathematikleistungen in Klasse 10 vorherzusagen.

Da das R-Skript relativ umfangreich ist, wird eine kurze Erläuterung gegeben und nur die Aspekte des Skripts dargestellt, die genutzt wurden um die Darstellung anzufertigen.

Im Anschluss wurden die Plots angefertigt:

set.seed(0505)
library(tidymodels)
library(readr)
library(vip)
library(ranger)
library(ggpubr)
library(gridExtra)
library(viridis)
library(viridisLite)

# variable importance plot
import_plot <- final_fit %>%
     pluck(".workflow", 1) %>%
     pull_workflow_fit() %>%
     vip(num_features = 10)

# spec settings for ggplot2
import_plot2 <- import_plot %>% ggplot(aes(x=Importance, y= reorder(Variable, +Importance), fill=Variable)) + geom_bar(stat="identity", show.legend = FALSE) + xlab("Importance") + ylab("Predictors") + scale_fill_viridis_d() + theme_light()

# plot of observed versus predicted math achievement with class 9 math achievement
pred_plot <- preds %>%
     ggplot(aes(x = Math_Achievement_Class10, y = .pred, color = diff)) +
     geom_abline(slope = 1, intercept = 0) +
     xlim(-4, 4) +
     ylim(-4, 4) +
     xlab("Observed") +
     ylab("Predicted") +
     labs(caption = "The black line represents predictions that match observed values.") +
     scale_color_viridis("Deviance") +
     geom_point()+
     theme_light()

# variable importance plot without class 9 math achievement
import_plot_non9 <- final_fit_non9 %>%
     pluck(".workflow", 1) %>%
     pull_workflow_fit() %>%
     vip(num_features = 10)

# spec settings for ggplot2
import_plot_non9_2 <- import_plot_non9 %>% ggplot(aes(x=Importance, y= reorder(Variable, +Importance), fill=Variable)) + geom_bar(stat="identity", show.legend = FALSE) + xlab("Importance") + ylab("Predictors") + scale_fill_viridis_d() + theme_light()

# plot of observed versus predicted math achievement without class 9 math achievement
pred_plot_non9 <- preds_non9 %>%
     ggplot(aes(x = Math_Achievement_Class10, y = .pred, color = diff)) +
     geom_abline(slope = 1, intercept = 0) +
     xlim(-4, 4) +
     ylim(-4, 4) +
     xlab("Observed") +
     ylab("Predicted") +
     labs(caption = "The black line represents predictions that match observed values.") +
     scale_color_viridis("Deviance") +
     geom_point()+
     theme_light()

#One plot for all
plot_all <- ggarrange(pred_plot_non9, import_plot_non9_2, pred_plot, import_plot_2, ncol=2, nrow=2) + theme_bw() + ggtitle("Machine learning prediction of math achievement in class 10 in PISA 2013", subtitle = "Differences between prediction with and without math achievement of class 9 in PISA 2012 as predictor")