Psychologie des digitalen Microtargeting

Persönlichkeitseigenschaften in der digitalen Interaktion

Author
Affiliation

Prof. Dr. Armin Eichinger

TH Deggendorf

Published

27.08.2025

1 Cambridge-Analytica & Facebook

Beim Cambridge-Analytica-Skandal 2018 wurde sichtbar, wie Persönlichkeitsmodelle - insbesondere die Big Five – für politisches Microtargeting eingesetzt werden können. Millionen Facebook-Daten wurden genutzt, um Nutzer:innen in Cluster mit ähnlichen Persönlichkeitsprofilen einzuordnen. So ließen sich Botschaften gezielt zuschneiden: Wer z. B. hoch in Neurotizismus war, erhielt eher furchtbasierte Inhalte („Gefahren durch Migration“), während Personen mit hoher Offenheit Botschaften zu Freiheit, Internationalität und Vielfalt sahen. Auch Gewissenhaftigkeit, Extraversion und Verträglichkeit wurden systematisch genutzt, um Emotionen wie Pflichtgefühl, Stolz oder Misstrauen in spezifische Richtungen zu lenken.

Das Beispiel zeigt, wie Clusteranalysen praktisch angewandt werden: Aus Big-Five-Daten werden Gruppen gebildet, die sich in zentralen Dimensionen ähneln, und für jede Gruppe lassen sich passende Interventionen entwickeln.

Im wissenschaftlichen Kontext geht es nicht um politische Manipulation, sondern darum, zu verstehen, wie Persönlichkeitsunterschiede systematisch Verhalten, Wahrnehmung und Präferenzen prägen - und wie die explorative Datenanalyse - also beispielsweise die Clusteranalyse - hilft, solche Muster sichtbar zu machen.

2 Big Five

Die Big Five gelten als das weltweit am besten etablierte Modell zur Beschreibung grundlegender Persönlichkeitsmerkmale. Es unterscheidet fünf breite Dimensionen, die in zahlreichen Kulturen und Sprachen bestätigt wurden: Offenheit für Erfahrungen (kreativ, neugierig vs. traditionell, routiniert), Gewissenhaftigkeit (geordnet, zuverlässig vs. spontan, nachlässig), Extraversion (gesellig, aktiv vs. zurückhaltend, still), Verträglichkeit (kooperativ, mitfühlend vs. wettbewerbsorientiert, kritisch) und Neurotizismus (emotional verletzlich, ängstlich vs. stabil, gelassen). Zusammen beschreiben diese Dimensionen stabile Unterschiede zwischen Menschen, die viele Lebensbereiche beeinflussen – von sozialen Beziehungen über Arbeitsverhalten bis hin zu politischen Einstellungen.

Zur Erfassung der Big Five gibt es zahlreiche Fragebögen unterschiedlicher Länge und Genauigkeit. Für Forschung und Praxis, die wenig Zeit zur Verfügung haben oder Persönlichkeitsmerkmale in größeren Stichproben ökonomisch erheben wollen, wurden Kurzskalen entwickelt. Ein prominentes Beispiel ist das BFI-10 (Big Five Inventory, 10 Items), das die fünf Dimensionen mit jeweils zwei Items misst. Trotz der geringen Länge liefert es brauchbare Informationen über die zentrale Persönlichkeitsstruktur einer Person.

Der/das BFI-10 (hier finden Sie Hintergrundinformation zum BFI-10) eignet sich besonders in explorativen Studien, in denen Persönlichkeit nur eine von mehreren erhobenen Variablen ist, oder wenn Befragte durch zu lange Fragebögen überfordert würden. Zwar ist die Reliabilität aufgrund der Kürze eingeschränkt, dennoch ermöglicht das Instrument eine schnelle Annäherung an die Big-Five-Dimensionen und ist damit gerade in Lehrkontexten, bei Online-Erhebungen oder in groß angelegten Surveys ein nützliches Werkzeug.

3 Items des BFI-10

Der BFI-10 besteht aus 10 Items, zwei für jede Dimension der Persönlichkeit.

  1. Ich bin eher zurückhaltend, reserviert (R)
  2. Ich schenke anderen leicht Vertrauen, glaube an das Gute im Menschen
  3. Ich bin bequem, neige zur Faulheit (R)
  4. Ich bin entspannt, lasse mich durch Stress nicht aus der Ruhe bringen (R)
  5. Ich habe nur wenig künstlerisches Interesse (R)
  6. Ich gehe aus mir heraus, bin gesellig
  7. Ich neige dazu, andere zu kritisieren (R)
  8. Ich erledige Aufgaben gründlich
  9. Ich werde leicht nervös und unsicher
  10. Ich habe eine aktive Vorstellungskraft, bin fantasievoll

OCEAN: Zuordnung Persönlichkeitsdimension-Item:

  • Openness - Offenheit: Items 5 und 10
  • Conscientiousness - Gewissenhaftigkeit: Items 3 und 8
  • Extraversion - Extraversion: Items 1 und 6
  • Agreeableness - Verträglichkeit: Items 2 und 7
  • Neuroticism - Neurotizismus: Items 4 und 9

Jede der Dimensionen wird durch ein positiv und ein negativ gepoltes Item erfasst. Die Items 1, 3, 4, 5 und 7 sind negativ gepolt. Für die Antworten der Befragungsperson steht eine fünfstufige Ratingskala von „trifft überhaupt nicht zu“ (1) bis „trifft voll und ganz zu“ (5) zur Verfügung.

Die Items des BFI-10 werden mit einem Likert-artigen Format abgefragt: 1 = stimme überhaupt nicht zu, …, 5 = stimme voll und ganz zu. Eine konkrete Version gibt es hier (Appendix B).

Beachten Sie, dass manche Items umgekehrt gepolt sind, so dass hier ein niedriger Wert für eine hohe Ausprägung der Eigenschaft steht. Vor der Auswertung müssen diese Werte transformiert werden (aus 1 wird 5, aus 4 wird 2 usw.). Überlegen Sie sich, wie das passiert. Vielleicht finden Sie ein allgemeines Schema, das man verwenden kann.

4 Persönlichkeit von Comicfiguren

Ich habe ChatGPT gebeten, den BFI-10 für (zumindest mir) bekannte Comic-Figuren auszufüllen.

Die folgenden Figuren sind dabei: Homer, Marge, Bart, Lisa, Maggie, Grampa Abe, Mr. Burns, Ned Flanders, Milhouse, Krusty (alle aus “Die Simpsons”; natürlich kennen Sie die Simpsons, oder?!); dazu kommen noch: Mickey Mouse, Goofy, Tom, Jerry, Fred Feuerstein (Flinstone), Donald Duck, Road Runner, Rosarote Panther, Bugs Bunny, Tweety

Sie finden die Daten in einem CSV-Format unter diesem Link. Wenn Sie auf den Link klicken, werden die Daten so angezeigt, wie sie in der Datei gespeichert sind; also inklusive der Kommas, die die Zahlen trennen. So sieht die Datei auch aus, wenn Sie sie in einem einfachen Editor öffnen. Wenn Sie sie in Excel öffnen, werden die Kommas als Trennzeichen interpretiert und die Werte stehen in eigenen Zellen.

Sauber in Matrix-Form organisiert sehen die Daten so aus (vorab der R-Code):

# Daten einlesen:
my_data <- read.csv("https://bookdown.org/Armin_E/aufgabe_ca_chatgpt_big5/data/Cartoon_BFI10_Items.csv", sep = ",")

# Alternativ: lokale Daten einlesen (Datei im Unterverzeichnis "data")
my_data <- read.csv("data/Cartoon_BFI10_Items.csv", sep = ",")
#my_data <- read.csv("data/Cartoon_BFI10_Items_ae.csv", sep = ",") # dieser Datensatz enthält meine Daten

# Daten ausgeben:
my_data
        Character Item1 Item2 Item3 Item4 Item5 Item6 Item7 Item8 Item9 Item10
1           Homer     2     2     5     3     4     4     3     2     3      2
2           Marge     3     5     2     4     3     3     2     5     2      3
3            Bart     1     2     5     4     3     5     5     1     2      3
4            Lisa     4     5     1     2     1     2     2     5     4      5
5          Maggie     5     3     3     4     3     1     1     2     2      2
6       GrampaAbe     3     2     4     2     3     2     3     2     4      2
7         MrBurns     5     1     2     3     5     1     5     4     2      2
8     NedFlanders     2     5     1     5     2     4     1     5     1      2
9        Milhouse     4     3     3     3     3     2     2     3     4      3
10         Krusty     2     2     5     2     4     5     4     1     4      4
11    MickeyMouse     2     5     2     4     3     5     2     4     2      3
12     DonaldDuck     2     2     3     2     4     3     4     2     5      2
13          Goofy     3     4     3     5     3     4     2     2     2      3
14      BugsBunny     2     3     2     4     2     5     3     3     2      4
15            Tom     3     2     2     3     3     2     4     3     4      2
16          Jerry     2     5     2     4     2     4     2     4     2      3
17     RoadRunner     3     3     3     4     3     4     2     3     2      2
18         Tweety     4     5     2     3     2     3     2     3     3      4
19    PinkPanther     3     4     2     4     2     3     2     3     2      4
20 FredFlintstone     2     3     4     3     3     4     3     2     3      2

5 Aufgabe: Persönlichkeits-Cluster

5.1 Clusteranalyse

Suchen und finden Sie Persönlichkeits-Cluster in unserer Stichprobe. Führen Sie dazu eine Clusteranalyse in R durch (Quarto-Dokument). Verwenden Sie hierarchisches Clustering, euklidische Abstände und das Ward-Verfahren.

5.1.1 Vorgehen Schritt für Schritt

  1. Erstellen Sie ein Quarto-Dokument (Menü: File → New File → Quarto Document…); bitte ohne die Option “Use visual markdown editor”. Geben Sie dem Dokument einen geeigneten Titel und schon mal eine Überschrift. Speichern Sie das Dokument in einem eigenen Verzeichnis geeigneten Namens, das Sie wiederfinden.

  2. Erstellen Sie einen leeren Codeblock (z. B. über Tastaturkürzel: CTRL + ALT + I). Verwenden Sie im Folgenden bitte nur einen Codeblock, der Ihren gesamten Code enthält

  3. Erstellen Sie die Funktion invert, die die entsprechenden Items umpolt. Fügen Sie dazu den folgenden Code in Ihren Codeblock ein. Verstehen Sie, wie die Transformation stattfindet!

# Funktion: Hier wird transformiert
invert <- function(x) 6 - x
  1. Kopieren Sie den gesamten folgenden Codeabschnitt in Ihren Codeblock. Hier wird vor allem die Funktion invert() aufgerufen (für die Items 1, 3, 4, 5, 7). Zudem wird von den je zwei Items einer Persönlichkeitsdimension der Mittelwert berechnet. Mit dem Ergebnis wird eine neue Daten-Matrix (score) erzeugt. Die Spaltenüberschriften sind O, C, E, A, N. Die Matrix wird schließlich ausgegeben. Die Details sind nicht wichtig!
# Mittelwertbildung + invertieren
O  <- rowMeans(cbind(my_data$Item10, invert(my_data$Item5)))
C  <- rowMeans(cbind(my_data$Item8,  invert(my_data$Item3)))
E  <- rowMeans(cbind(my_data$Item6,  invert(my_data$Item1)))
A  <- rowMeans(cbind(my_data$Item2,  invert(my_data$Item7)))
N  <- rowMeans(cbind(my_data$Item9,  invert(my_data$Item4)))   

scores <- data.frame(
  Character = my_data$Character,
  O = O, C = C, E = E, A = A, N = N, 
  row.names = my_data$Character,      # Die Zeilennamen gehören nicht zum DF, werden aber oft als 1. Spalte ausgegeben
  check.names = FALSE
)

scores
  1. Rendern Sie den Code. Das Ergebnis sollte in etwa so aussehen:
                    Character   E   A   C   N   O
Homer                   Homer 4.0 2.5 1.5 3.0 2.0
Marge                   Marge 3.0 4.5 4.5 2.0 3.0
Bart                     Bart 5.0 1.5 1.0 2.0 3.0
Lisa                     Lisa 2.0 4.5 5.0 4.0 5.0
Maggie                 Maggie 1.0 4.0 2.5 2.0 2.5
GrampaAbe           GrampaAbe 2.5 2.5 2.0 4.0 2.5
MrBurns               MrBurns 1.0 1.0 4.0 2.5 1.5
NedFlanders       NedFlanders 4.0 5.0 5.0 1.0 3.0
Milhouse             Milhouse 2.0 3.5 3.0 3.5 3.0
Krusty                 Krusty 4.5 2.0 1.0 4.0 3.0
MickeyMouse       MickeyMouse 4.5 4.5 4.0 2.0 3.0
DonaldDuck         DonaldDuck 3.5 2.0 2.5 4.5 2.0
Goofy                   Goofy 3.5 4.0 2.5 1.5 3.0
BugsBunny           BugsBunny 4.5 3.0 3.5 2.0 4.0
Tom                       Tom 2.5 2.0 3.5 3.5 2.5
Jerry                   Jerry 4.0 4.5 4.0 2.0 3.5
RoadRunner         RoadRunner 3.5 3.5 3.0 2.0 2.5
Tweety                 Tweety 2.5 4.5 3.5 3.0 4.0
PinkPanther       PinkPanther 3.0 4.0 3.5 2.0 4.0
FredFlintstone FredFlintstone 4.0 3.0 2.0 3.0 2.5
  1. Führen Sie die eigentliche hierarchische CA durch. Dazu transformieren Sie zuerst mit Hilfe der Funktion scale() alle Werte in z-Werte und speichern Sie das Ergebnis in einer Variablen. Die Funktion dist() erzeugt daraus eine Distanzmatrix, Das verwendete Distanzmaß ist euklidisch - also die normale räumliche Entfernung. Die eigentliche (hierarchische - es gibt noch andere, die uns aber nicht interessieren) Clusteranalyse steckt in der Funktion hclust(). Die Methode, um Cluster zu bilden nennt sich nach ihrem Entwickler Ward in der Variante ward.D2. Auch hier gibt es noch weitere. Die Ward-Methode erzeugt relativ gleich große Cluster. Sie wird sehr häufig verwendet.
X_scores_z <- scale(scores[, c("O","C","E","A","N")])
d_scores <- dist(X_scores_z, method = "euclidean")
hc_scores <- hclust(d_scores, method = "ward.D2")
  1. Wenn Sie den eben erzeugten Code rendern, passiert nichts Sichtbares. Damit Sie das Ergebnis der Clusterbildung sehen, geben Sie über die Funktion plot() ein Dendrogramm aus (plot() kann noch viele weitere Dinge anzeigen, nicht nur Dendrogramme). Achten Sie auf den grundlegenden Mechanismus: das Ergebnis der CA steckt in der Variablen hc_scores; plot() stellt den Inhalt der Variablen nur dar (mit ein paar Optionen, die - abgesehen von der Beschriftung - uninteressant sind).
# Dendrogramm
plot(hc_scores, labels = scores$Character, main = "Dendrogramm: Comic-Persönlichkeiten (Big5)",
     xlab = "", sub = "", cex = 0.9, hang = -1)

  1. Welche Cluster gibt es nun? Das hängt von unseren Anforderungen ab und davon, ob wir wenige große oder viele kleine Cluster wollen. Extremwerte sind ein Cluster mit allen Elementen oder ein Cluster für jedes Element.

    Dazu ein paar Testfragen:
  1. Wer ist im zweiten Cluster bei einer 2-Cluster-Lösung?

  2. Welche Figur ist am ehesten ein Ausreißer?

  3. Welche Figuren sind sich laut Dendrogramm am ähnlichsten (haben die geringste räumliche Distanz)?

  4. Wie sieht eine 4-Cluster-Lösung aus?

5.1.2 Profildiagramme

Wir wollen uns nun ansehen, wie sich die einzelnen Cluster voneinander unterscheiden. Dazu erstellen wir sog. Profildiagramme. Für jede Dimension (bei uns: Persönlichkeitsdimension) gibt die Höhe des Balkens an, wie stark im Vergleich zum Durchschnitt ausgeprägt ist.

Diese Darstellung hilft uns enorm, wenn es darum geht, die einzelnen Cluster zu interpretieren.

Den folgenden Code können Sie 1:1 kopieren. Die ersten drei Zeilen können Sie anpassen.

# HIER legen Sie 3 Dinge fest: k, Variable mit den CA-Ergebnis, Variable der z-Matrix
k <- 4                    # Anzahl Cluster
hc_result <- hc_scores    # Variable mit CA-Ergebnis (s.o.)
z_values <- X_scores_z    # Variable mit den z-transformierten Werten (s.o.)


#### Code ab hier nicht ändern; uninteressant
cluster_assignments <- cutree(hc_result, k)
#print(cluster_assignments)

# Matrix wird in Dataframe umgewandelt (macht das Spalte-Anhängen leichter)
z_values  <- as.data.frame(z_values )

# Der Dataframe erhält eine neue Spalte "Cluster"
z_values $Cluster <- factor(cluster_assignments)

df <- z_values 

# Mittelwerte für jede Dimension pro Cluster berechnen
cluster_means <- aggregate(. ~ Cluster, data = df, FUN = mean)

# Anzahl der Cluster
num_clusters <- length(unique(df$Cluster))

# Layout für die Plots
par(mfrow = c(1, num_clusters))  # Layout festlegen für die Anzahl der Cluster

# Für jedes Cluster ein Balkendiagramm erstellen
for (i in 1:num_clusters) {
  # Daten für das aktuelle Cluster (ohne Cluster-Spalte)
  data <- as.numeric(cluster_means[i, -1])
  
  # Namen der Attribute für die x-Achse
  names(data) <- names(cluster_means)[-1]
  
  # Balkendiagramm erstellen
  barplot(
    data,
    main = paste("Cluster", cluster_means$Cluster[i]),  # Titel des Diagramms
    ylim = c(-2, 2),  # Skalierung der y-Achse
    col = "lightblue",  # Farbe der Balken
    xlab = "Attribute",  # Bezeichnung der x-Achse
    ylab = "Mittelwert",  # Bezeichnung der y-Achse
    las = 2  # Dreht die x-Achsenbeschriftungen für bessere Lesbarkeit
  )
}

Versuchen Sie, die Figuren der Cluster zu finden, die zu den Profildiagrammen gehören. Die Lösung erhalten Sie, wenn Sie sich die Variable cluster_assignments ausgeben lassen. Einfach im Code print(cluster_assignments) aufrufen; z. B. direkt nach dem Aufruf der Funktion ‘cutree(…)’. Sie erhalten eine Liste der Figuren mit der Nummer ihres Clusters. Lisa hat ihren eigenen Cluster. Welchen?

5.2 Eigene Daten ergänzen

Füllen Sie den Fragebogen selbst aus und ergänzen Sie in der CSV-Datei Ihre Daten um eine Zeile mit Ihren Werten.

Speichern Sie die neue Datei unter einem neuen Dateinamen.

Führen Sie die Analyse mit der neuen Datei durch. In welchem Cluster sind Sie? Machen Sie sich Gedanken, wenn Sie sehr nahe bei Mr. Burns landen …

Vielleicht möchten Sie ja alle Ihre Daten zusammenführen und feststellen, wer mit wem in ähnlichen oder unterschiedlichen Clustern landet. Das lässt sich natürlich leicht anonym durchführen. Geben Sie mir Bescheid, wenn ich da anschieben soll.

5.3 Neuen Fall zuordnen

Eben haben wir den Datenbestand erweitert und R eine neue CA-Lösung rechnen lassen; inklusive des neuen Elements bzw. der neuen Elemente. Das ist recht aufwändig. Der Normalfall ist folgender: Anhand eines großen Datenbestandes können relevante Cluster bestimmt werden. Ein neuer Fall wird anhand der Art seiner nächsten Nachbarn einem bestimmten Cluster zugeordnet. Man nennt das auch die Methode der k-Nearest Neighbors (KNN). Dabei ist die Größe von k frei wählbar. Häufig wird ein Wert von 3 oder 5 verwendet. Das heißt, es werden die 3 oder 5 nächsten Elemente betrachtet. Wenn n groß ist (z. B. \(n > 100\)), kann als Faustregel \(k = \sqrt{n}\) verwendet werden. Der Cluster, der bei diesen Elementen am häufigsten auftritt, bestimmt die Zuordnung des neuen Elements.

Versuchen Sie, sich im folgenden Code zurecht zu finden. Die Details sind uninteressant.

# Library einbinden; enthält die Funktion knn()
library(class)   

# Neue Beobachtung (Zum Beispiel); HIER können Sie Ihre Werte eintragen
newpoint <-  c(2.0, 3.5, 3.5, 1.5, 3.5)

newpoint_scaled <- (newpoint - colMeans(X_scores_z)) / apply(X_scores_z, 2, sd)

# KNN mit k = 5
assigned_cluster <- knn(
  train = X_scores_z,                           # Trainingspunkte z-standardisiert (s.o.)
  test = matrix(newpoint_scaled, nrow = 1),     # neue Punkte auch z-standardisiert
  cl = as.factor(cluster_assignments),          # Clusterlabels als Faktor
  k = 5                                         # Zahl der Nachbarn; können Sie ändern
)

# Hier werden alle Labels und der Cluster des neuen Falls ausgegeben
assigned_cluster
[1] 2
Levels: 1 2 3 4
# Zur Orientierung: Die Figuren und ihre Clusternummern (s.o.)
print(cluster_assignments)
         Homer          Marge           Bart           Lisa         Maggie 
             1              2              1              3              2 
     GrampaAbe        MrBurns    NedFlanders       Milhouse         Krusty 
             4              4              2              4              1 
   MickeyMouse     DonaldDuck          Goofy      BugsBunny            Tom 
             2              4              2              2              4 
         Jerry     RoadRunner         Tweety    PinkPanther FredFlintstone 
             2              2              2              2              1 

6 Aufgabe: MDS

Führen Sie eine MDS auf Basis der Persönlichkeitsratings durch. Verwenden Sie die Matrix der Mittelwerte.

Die Funktion dist() kann auf Grundlage der Daten, die wir zu unseren Comic-Charaktere haben, eine Matrix (technisch ist es in R ein Vektor) erstellen, die in ihren Zellen die Abstände der einzelnen Figuren voneinander haben. Wir können also davon ausgehen, dass der Abstand zwischen Lisa und Bart größer ist als zwischen Mickey und Jerry.

Diese Abstände werden in einem fünfdimensionalen Raum berechnet. Auch wenn wir uns das nicht vorstellen können, ist das mathematisch gar kein Problem. Selbst die Formel dazu ist einigermaßen verständlich: \(d(i,j) = \sqrt{\sum_{k=1}^p \bigl(x_{ik} - x_{jk}\bigr)^2}\). Für jede Dimension k wird die Differenz der Figuren quadriert (für alle Kombinationen von Figuren). Alle Quadrate werden addiert. Aus der Summe wird die Wurzel gezogen. Voila!

Das Problem ist nur, wie diese fünfdimensionalen Abstände zweidimensional dargestellt werden sollen. Das macht der MDS-Algorithmus (davon gibt es natürlich wieder verschiedene), der hinter der Funktion cmdsscale() steckt. Wenn Sie die Variable mds ausgeben, erhalten Sie daher auch eine Liste mit x- und y-Koordinaten.

Die Funktion ggplot() - eine sehr mächtige Grafik-Funktion - erzeugt das Diagramm. Sie können hier liehct Farben, Symbolde und Beschriftung ändern. Die Details sind nicht interessant.

Was bedeuten die Achsen? Versuchen Sie, anhand der Lage der Figuren und der Profildiagramme der Cluster einen Bezeichnung zu finden, die natürlich etwas mit den Persönlichkeitsinformationen zu haben muss.

Hinweis

Wichtig: Sie können das Koordinatensystem gedanklich beliebig drehen und verschieben. So könnte beispielsweise eine Achse durch Lisa und Bart gehen. Damit hätten bezüglich der anderen Achse, die mitgedreht wird und daher weiterhin im rechten Winkel zur Lisa-Bart-Achse steht, MrBurns und NedFlanders gegensätzliche Ausprägungen; RoadRunner und Tweety hätten dann fast identische Werte, da sie fast genau auf der Lisa-Bart-Achse liegen. Finden Sie ein Koordinatensystem, das für Sie am meisten Sinn ergibt.

# MDS Berechnung
mds <- cmdscale(d_scores, k = 2, eig = TRUE)
mds_coords <- as.data.frame(mds$points)
colnames(mds_coords) <- c("Dim1", "Dim2")
mds_coords$Character <- scores$Character

## Plot
library(ggplot2)
ggplot(mds_coords, aes(x = Dim1, y = Dim2, label = Character)) +
  geom_point(color = "steelblue", size = 3) +
  geom_text(vjust = -0.5, size = 3) +
  labs(title = "MDS der Cartoon-Charaktere (Big Five)",
       x = "Dimension 1", y = "Dimension 2") +
  theme_minimal()

7 Aufgabe: Explorative Faktorenanalyse

Entspricht die Faktorenstruktur dem Modell der Big Five? Führen Sie eine explorative Faktorenanalyse (EFA) durch, um das zu überprüfen.

Achtung

Vorab ein wichtiger Hinweis: Unsere Stichprobe ist eigentlich deutlich zu klein, als dass wir ein solides und stabiles Resultat bei der Anwendung einer Faktorenanalyse erwarten dürften. Lassen Sie sich von etwaigen Warnungen oder Fehlern (z. B. “singuläre Korrelationsmatrix”, “Heywood-Fälle”, …). LAssen Sie sich davon nicht beeindrucken. Wir verwenden die EFA sehr hemdsärmlig, um grob zu prüfen, ob unsere in unseren Daten die Big five zu finden sind.

Wenn wir wissenschaftlich solide nachweisen wollten, dass im Universum der Comic-Figuren ein anderes Persönlichkeitsmodell sinnvoll wäre, müssten wir eine viel größere Stichprobe verwenden. Zudem ist es vermutlich problematisch, dass eine KI die Ratingsa bgegeben hat. Vor allem würden wir dann aber auch keine Kurzform eines Persönlichkeitstests verwenden. Dann würden uns diese Fehlermeldungen und Warnung irritieren und wir müssten uns damit natürlich auseinandersetzen.

Was passiert im Code? Der Ausgangspunkt unserer Analyse ist die ursprüngliche Datenmatrix, die in der Variablen my_data steckt.

Über die Funktion invert() erzeugen wir korrekt gepolte Daten, die in die Variable items_poled kommen.
Die Funktion KMO() implementiert das so. Kaiser-Meyer-Olkin-Kriterium. Für uns relevant: Wir hätten gerne Werte größer als 0.5; sowohl als Wert für die einzelnen Items (Measure of sampling adequacy), als auch als Gesamtbewertung des Datensatzes (das eigentliche KMO-Kriterium).

Der Datensatz, den ich gerade auswerte, schneidet erwartungsgemäß nicht besonders ab. Vor allem Item 1 und 10 sind schwach. Die Gründe für eine niedrige MSQ sind vielfälitg. Sowohl eine zu hohe Korrelation der Items einer Dimension (Multikollinearität) als auch eine zu geringe Korrelation kann dazu führen.

Der Bartlett-Test (aus der Bibliothek psych) testet, ob zwischen den Items überhaupt Zusammenhänge bestehen. Die Teststatistik is \(\chi²\). Der p-Wert gibt an, ob das Ergebnis signifikant (also überzufällig ist). Hier wollen wir, dass das Ergebnis signifikant ist. Das heißt, es gibt Korrelationen zwischen unseren Items. Das ist hier der Fall.

Wie viele Faktoren oder Dimesionen sollten wir verwenden? Da wir ein fünfdimensionales Persönlichkeitsmodell anwenden liegt fünf nahe. Bessere Argumente liefert eine sog. Parallelanalyse. Die Handreichung ist wie folgt: Wir betrachten die rote und die blaue Linie. Wie viele blaue Datenpunkte von links liegen über der roten Linie (uns sind nicht deutlich kleiner als 1)? Das ist unsere Zahl. Im Satz unter der Darstellung gibt R auch nochmal explizit eine Empfehlung. In meinem Fall lauten beide Empfehlungen: Drei Dimensionen.

Es spricht nicht dagegen, zwei Analysen zu rechnen; einmal mit drei und einmal mit fünf Dimensionen. Da wir aber eine gut abgesichterte Theorie für die fünf Dimensionen haben, belasse ich es im Folgenden dabei.

Die eigentliche EFA rechnet die Funktion fa(). Über die Option nfactors geben wir die Anzahl der Faktoren an. Die Option rotate = "varimax"legt eine rechtwinklige Rotation des Koordinatensystems fest (so ähnlich, wie wir es bei der MDS gemacht haben). Die Option fm = "fa" legt als Verfahren eine Faktorenanalyse fest. Es gäbe auch noch pa für eine sog. Hauptkomponentenanalyse. Die ignorieren wir aber.

Die Funktion print() gibt schließlich die Zuordnung der Items zu den Dimensionen/Faktoren aus. Die Faktoren sind in Spalten angeordnet und haben die Überschriften MR1 bis MR5 (bei mir). Die Zahlen heißen Faktorladungen der Items auf den Faktoren. Sie bedeuten, wir gut Item und Faktor zusammenpassen. Ich lasse über die Option cut nur Werte größer als 0.4 anzeigen.

Das Ergebnis (vgl. Standardized loadings) ist gar nicht schlecht. Wir sehen, dass meist zwei Items besonders hoch auf einem Faktor laden (Check: Sind es überhaupt die eichtigen Items?!). MAnche Items laden aber auf mehr als einem Faktor. Daher haben manche Faktoren auch mehr als zwei Items, die auf ihnen laden. Nicht perfekt, aber ziemlich gut.

############# FA

# Ausgangspunkt ist die ursprüngliche Datenmatrixmy_data
 
## ---- Items korrekt polen ----
items_poled <- data.frame(
  Item1 = invert(my_data$Item1),  
  Item2 = my_data$Item2,    
  Item3 = invert(my_data$Item3), 
  Item4 = invert(my_data$Item4), 
  Item5 = invert(my_data$Item5),        
  Item6 = my_data$Item6,    
  Item7 = invert(my_data$Item7),   
  Item8 = my_data$Item8,             
  Item9 = my_data$Item9,             
  Item10 = my_data$Item10   
)


rownames(items_poled) <- my_data$Character

## ---- KMO und Bartlett-Test ----
library(psych)
KMO(items_poled)             
Kaiser-Meyer-Olkin factor adequacy
Call: KMO(r = items_poled)
Overall MSA =  0.49
MSA for each item = 
 Item1  Item2  Item3  Item4  Item5  Item6  Item7  Item8  Item9 Item10 
  0.30   0.78   0.59   0.52   0.51   0.39   0.52   0.54   0.44   0.28 
cortest.bartlett(items_poled) 
$chisq
[1] 151.8973

$p.value
[1] 1.627646e-13

$df
[1] 45
## ---- Parallelanalyse ----
fa.parallel(items_poled, fa = "fa")

Parallel analysis suggests that the number of factors =  3  and the number of components =  NA 
## ---- Explorative Faktorenanalyse ----
fa_result <- fa(items_poled, nfactors = 5, rotate = "varimax", fm = "fa")
print(fa_result, cut = 0.40)
Factor Analysis using method =  minres
Call: fa(r = items_poled, nfactors = 5, rotate = "varimax", fm = "fa")
Standardized loadings (pattern matrix) based upon correlation matrix
         MR1   MR5   MR2   MR4   MR3   h2      u2 com
Item1               0.99             1.00 -0.0010 1.0
Item2   0.50              0.68       0.90  0.1035 2.7
Item3   0.86                         0.91  0.0853 1.5
Item4         0.85                   0.85  0.1514 1.4
Item5                     0.57  0.45 0.68  0.3214 2.8
Item6               0.85             0.87  0.1345 1.4
Item7                     0.93       0.99  0.0119 1.3
Item8   0.86                         0.84  0.1637 1.3
Item9         0.97                   0.99  0.0144 1.1
Item10                          0.98 1.00 -0.0021 1.1

                       MR1  MR5  MR2  MR4  MR3
SS loadings           2.02 1.91 1.88 1.87 1.34
Proportion Var        0.20 0.19 0.19 0.19 0.13
Cumulative Var        0.20 0.39 0.58 0.77 0.90
Proportion Explained  0.22 0.21 0.21 0.21 0.15
Cumulative Proportion 0.22 0.44 0.64 0.85 1.00

Mean item complexity =  1.6
Test of the hypothesis that 5 factors are sufficient.

df null model =  45  with the objective function =  10.24 with Chi Square =  151.9
df of  the model are 5  and the objective function was  0.87 

The root mean square of the residuals (RMSR) is  0.02 
The df corrected root mean square of the residuals is  0.05 

The harmonic n.obs is  20 with the empirical chi square  0.45  with prob <  0.99 
The total n.obs was  20  with Likelihood Chi Square =  9.98  with prob <  0.076 

Tucker Lewis Index of factoring reliability =  0.385
RMSEA index =  0.217  and the 90 % confidence intervals are  0 0.436
BIC =  -5
Fit based upon off diagonal values = 1