Kurs
Die Faktorenanalyse (FA) ist ein exploratives Verfahren der Datenanalyse, mit dem einflussreiche zugrunde liegende Faktoren bzw. latente Variablen aus einer Menge beobachteter Variablen identifiziert werden. Sie unterstützt die Dateninterpretation, indem sie die Anzahl der Variablen reduziert. Dabei wird die maximale gemeinsame Varianz aus allen Variablen extrahiert und in einem gemeinsamen Score zusammengeführt.
Faktorenanalyse wird breit in Marktforschung, Werbung, Psychologie, Finanzen und Operations Research eingesetzt. Marktforscher nutzen sie, um preissensible Kundinnen und Kunden zu identifizieren, Markenmerkmale zu erkennen, die die Wahl beeinflussen, und die Kriterien der Kanalwahl für den Vertrieb besser zu verstehen.
Faktorenanalyse
Die Faktorenanalyse ist ein lineares statistisches Modell. Sie erklärt die Varianz unter beobachteten Variablen und verdichtet sie zu unbeobachteten Variablen, den sogenannten Faktoren. Beobachtete Variablen werden als lineare Kombination aus Faktoren und Fehlert ermen modelliert (Quelle). Ein Faktor bzw. eine latente Variable ist mit mehreren beobachteten Variablen verknüpft, die ähnliche Antwortmuster aufweisen. Jeder Faktor erklärt einen bestimmten Anteil der Varianz der beobachteten Variablen. Er unterstützt die Interpretation, indem er die Anzahl der Variablen reduziert.
Die Faktorenanalyse prüft, ob mehrere interessierende Variablen X1, X2, …, Xl linear mit einer kleineren Zahl unbeobachteter Faktoren F1, F2, …, Fk zusammenhängen.
Quelle: Diese Abbildung wurde nach einer Grafik aus Notizen zur Faktorenanalyse nachgestellt. Sie vermittelt einen Gesamtüberblick über die Faktorenanalyse.
Annahmen:
- Es gibt keine Ausreißer in den Daten.
- Die Stichprobengröße sollte größer als die Anzahl der Faktoren sein.
- Keine perfekte Multikollinearität.
- Keine Homoskedastizität zwischen den Variablen.
Arten der Faktorenanalyse
- Explorative Faktorenanalyse (EFA): Der gängigste Ansatz in den Sozial- und Wirtschaftswissenschaften. Grundannahme: Jede beobachtete Variable kann potenziell mit jedem Faktor zusammenhängen.
- Konfirmatorische Faktorenanalyse (CFA): Grundannahme: Jeder Faktor ist einem bestimmten Set beobachteter Variablen zugeordnet. CFA prüft, ob das erwartete Modell zu den Daten passt.
Wie funktioniert die Faktorenanalyse?
Ziel der Faktorenanalyse ist es, die Anzahl beobachteter Variablen zu reduzieren und unbeobachtete Variablen zu finden. Diese latenten Variablen helfen Marktforscherinnen und -forschern, Umfragen zu interpretieren. Die Umwandlung beobachteter in unbeobachtete Variablen erfolgt in zwei Schritten:
- Faktorextraktion: In diesem Schritt werden Anzahl der Faktoren und das Extraktionsverfahren anhand von Varianzzerlegungsmethoden wie Hauptkomponentenanalyse und gemeinsamer Faktorenanalyse gewählt.
- Faktorenrotation: In diesem Schritt werden die Faktoren rotiert, um unkorrelierte bzw. klarere Faktoren zu erhalten — Ziel ist eine bessere Interpretierbarkeit. Häufige Rotationsmethoden sind z. B. Varimax, Quartimax und Promax.
Begriffe
Was ist ein Faktor?
Ein Faktor ist eine latente Variable, die die Zusammenhänge zwischen mehreren beobachteten Variablen beschreibt. Die maximale Anzahl an Faktoren entspricht der Anzahl der beobachteten Variablen. Jeder Faktor erklärt einen Teil der Varianz der beobachteten Variablen. Faktoren mit sehr geringer erklärter Varianz werden verworfen. Synonyme sind latente, verborgene, unbeobachtete oder hypothetische Variablen.
Was sind Faktorladungen?
Die Faktorladungsmatrix zeigt die Beziehung jeder Variable zu den zugrunde liegenden Faktoren. Sie enthält die Korrelationskoeffizienten zwischen beobachteter Variable und Faktor und damit auch, wie viel Varianz die beobachteten Variablen erklären.
Was sind Eigenwerte?
Eigenwerte geben an, wie viel Varianz jeder Faktor von der Gesamtvarianz erklärt. Sie heißen auch charakteristische Wurzeln.
Was sind Kommunalitäten?
Kommunalitäten sind die Summe der quadrierten Ladungen je Variable. Sie repräsentieren die gemeinsame Varianz. Der Wert liegt zwischen 0 und 1; je näher an 1, desto mehr Varianz wird erklärt.
Was ist Faktorenrotation?
Rotation ist ein Werkzeug für eine bessere Interpretation. Sie kann orthogonal oder schiefwinklig (oblique) sein und verteilt die Kommunalitäten so um, dass ein klareres Ladungsmuster entsteht.
Auswahl der Faktoranzahl
Das Kaiser-Kriterium ist ein analytischer Ansatz: Faktoren mit einem größeren Anteil erklärter Varianz werden ausgewählt. Der Eigenwert ist ein gutes Kriterium für die Bestimmung der Faktoranzahl. Üblicherweise werden Faktoren mit einem Eigenwert größer als 1 beibehalten.
Der grafische Ansatz basiert auf der Visualisierung der Eigenwerte in einem Scree-Plot. Der Knick in der Kurve zeigt, wie viele Faktoren sinnvoll sind.
Faktorenanalyse vs. Principal Component Analysis
- PCA-Komponenten erklären die maximale Varianz, während die Faktorenanalyse die Kovarianz in den Daten erklärt.
- PCA-Komponenten sind zueinander orthogonal, die Faktorenanalyse erfordert keine Orthogonalität.
- PCA-Komponenten sind lineare Kombinationen der beobachteten Variablen; bei FA sind die beobachteten Variablen lineare Kombinationen der latenten Variablen/Faktoren.
- PCA-Komponenten sind oft schwer zu interpretieren. In der FA sind die zugrunde liegenden Faktoren benennbar und interpretierbar.
- PCA ist ein Verfahren zur Dimensionsreduktion, die Faktorenanalyse ein Verfahren für latente Variablen.
- PCA kann als Sonderfall der Faktorenanalyse gesehen werden. PCA ist beobachtungsbasiert, FA ein Modellierungsansatz.
Faktorenanalyse in Python mit dem Paket factor_analyzer
Benötigte Bibliotheken importieren
# Import required libraries
import pandas as pd
from sklearn.datasets import load_iris
from factor_analyzer import FactorAnalyzer
import matplotlib.pyplot as plt
Daten laden
Wir führen die Faktorenanalyse am BFI-Datensatz (Persönlichkeitsfragebogen) durch, erhoben auf einer 6-Punkte-Skala: 1 Sehr unzutreffend, 2 Eher unzutreffend, 3 Leicht unzutreffend, 4 Leicht zutreffend, 5 Eher zutreffend, 6 Sehr zutreffend. Du kannst den Datensatz unter folgendem Link herunterladen: https://vincentarelbundock.github.io/Rdatasets/datasets.html
df= pd.read_csv("bfi.csv")
Daten vorverarbeiten
df.columns
Index(['A1', 'A2', 'A3', 'A4', 'A5', 'C1', 'C2', 'C3', 'C4', 'C5', 'E1', 'E2',
'E3', 'E4', 'E5', 'N1', 'N2', 'N3', 'N4', 'N5', 'O1', 'O2', 'O3', 'O4',
'O5', 'gender', 'education', 'age'],
dtype='object')
# Dropping unnecessary columns
df.drop(['gender', 'education', 'age'],axis=1,inplace=True)
# Dropping missing values rows
df.dropna(inplace=True)
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 2436 entries, 0 to 2799
Data columns (total 25 columns):
A1 2436 non-null float64
A2 2436 non-null float64
A3 2436 non-null float64
A4 2436 non-null float64
A5 2436 non-null float64
C1 2436 non-null float64
C2 2436 non-null float64
C3 2436 non-null float64
C4 2436 non-null float64
C5 2436 non-null float64
E1 2436 non-null float64
E2 2436 non-null float64
E3 2436 non-null float64
E4 2436 non-null float64
E5 2436 non-null float64
N1 2436 non-null float64
N2 2436 non-null float64
N3 2436 non-null float64
N4 2436 non-null float64
N5 2436 non-null float64
O1 2436 non-null float64
O2 2436 non-null int64
O3 2436 non-null float64
O4 2436 non-null float64
O5 2436 non-null float64
dtypes: float64(24), int64(1)
memory usage: 494.8 KB
df.head()
| A1 | A2 | A3 | A4 | A5 | C1 | C2 | C3 | C4 | C5 | ... | N1 | N2 | N3 | N4 | N5 | O1 | O2 | O3 | O4 | O5 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2.0 | 4.0 | 3.0 | 4.0 | 4.0 | 2.0 | 3.0 | 3.0 | 4.0 | 4.0 | ... | 3.0 | 4.0 | 2.0 | 2.0 | 3.0 | 3.0 | 6 | 3.0 | 4.0 | 3.0 |
| 1 | 2.0 | 4.0 | 5.0 | 2.0 | 5.0 | 5.0 | 4.0 | 4.0 | 3.0 | 4.0 | ... | 3.0 | 3.0 | 3.0 | 5.0 | 5.0 | 4.0 | 2 | 4.0 | 3.0 | 3.0 |
| 2 | 5.0 | 4.0 | 5.0 | 4.0 | 4.0 | 4.0 | 5.0 | 4.0 | 2.0 | 5.0 | ... | 4.0 | 5.0 | 4.0 | 2.0 | 3.0 | 4.0 | 2 | 5.0 | 5.0 | 2.0 |
| 3 | 4.0 | 4.0 | 6.0 | 5.0 | 5.0 | 4.0 | 4.0 | 3.0 | 5.0 | 5.0 | ... | 2.0 | 5.0 | 2.0 | 4.0 | 1.0 | 3.0 | 3 | 4.0 | 3.0 | 5.0 |
| 4 | 2.0 | 3.0 | 3.0 | 4.0 | 5.0 | 4.0 | 4.0 | 5.0 | 3.0 | 2.0 | ... | 2.0 | 3.0 | 4.0 | 4.0 | 3.0 | 3.0 | 3 | 4.0 | 3.0 | 3.0 |
5 Zeilen × 25 Spalten
Eignungstest
Bevor du eine Faktorenanalyse durchführst, solltest du die "Faktorisierbarkeit" deines Datensatzes prüfen. Faktorisierbarkeit bedeutet: Können wir in den Daten Faktoren finden? Zwei gängige Verfahren zur Prüfung der Eignung bzw. Stichprobenadäquanz sind:
- Bartlett-Test
- Kaiser-Meyer-Olkin-Test
Der Bartlett-Test auf Sphärizität prüft anhand der Korrelationsmatrix gegen die Einheitsmatrix, ob die beobachteten Variablen überhaupt miteinander korrelieren. Fällt der Test nicht signifikant aus, sollte keine Faktorenanalyse angewandt werden.
from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity
chi_square_value,p_value=calculate_bartlett_sphericity(df)
chi_square_value, p_value
(18146.065577234807, 0.0)
Im Bartlett-Test ist der p-Wert 0. Der Test ist hochsignifikant und zeigt, dass die beobachtete Korrelationsmatrix keine Einheitsmatrix ist.
Kaiser-Meyer-Olkin- (KMO-)Test misst die Eignung der Daten für die Faktorenanalyse. Er bewertet die Adäquanz für jede beobachtete Variable und für das Gesamtmodell. KMO schätzt den Anteil der Varianz, der durch gemeinsame Faktoren erklärt wird. Ein höherer Anteil ist günstiger. KMO-Werte liegen zwischen 0 und 1; Werte unter 0,6 gelten als unzureichend.
from factor_analyzer.factor_analyzer import calculate_kmo
kmo_all,kmo_model=calculate_kmo(df)
kmo_model
0.8486452309468382
Der gesamte KMO für unsere Daten beträgt 0,84 — ein ausgezeichneter Wert. Du kannst also mit der geplanten Faktorenanalyse fortfahren.
Anzahl der Faktoren bestimmen
Zur Bestimmung der Faktoranzahl kannst du das Kaiser-Kriterium und den Scree-Plot nutzen. Beide basieren auf Eigenwerten.
# Create factor analysis object and perform factor analysis
fa = FactorAnalyzer()
fa.analyze(df, 25, rotation=None)
# Check Eigenvalues
ev, v = fa.get_eigenvalues()
ev
| Original_Eigenvalues | |
|---|---|
| 0 | 5.134311 |
| 1 | 2.751887 |
| 2 | 2.142702 |
| 3 | 1.852328 |
| 4 | 1.548163 |
| 5 | 1.073582 |
| 6 | 0.839539 |
| 7 | 0.799206 |
| 8 | 0.718989 |
| 9 | 0.688089 |
| 10 | 0.676373 |
| 11 | 0.651800 |
| 12 | 0.623253 |
| 13 | 0.596563 |
| 14 | 0.563091 |
| 15 | 0.543305 |
| 16 | 0.514518 |
| 17 | 0.494503 |
| 18 | 0.482640 |
| 19 | 0.448921 |
| 20 | 0.423366 |
| 21 | 0.400671 |
| 22 | 0.387804 |
| 23 | 0.381857 |
| 24 | 0.262539 |
Hier sind nur für 6 Faktoren die Eigenwerte größer als 1. Das heißt, wir sollten 6 Faktoren (latente Variablen) auswählen.
# Create scree plot using matplotlib
plt.scatter(range(1,df.shape[1]+1),ev)
plt.plot(range(1,df.shape[1]+1),ev)
plt.title('Scree Plot')
plt.xlabel('Factors')
plt.ylabel('Eigenvalue')
plt.grid()
plt.show()
Der Scree-Plot zeigt pro Faktor seinen Eigenwert. Die Anzahl der Eigenwerte > 1 wird als Anzahl der Faktoren herangezogen.
Hier sind nur für 6 Faktoren die Eigenwerte größer als 1. Das heißt, wir sollten 6 Faktoren (latente Variablen) auswählen.
Faktorenanalyse durchführen
# Create factor analysis object and perform factor analysis
fa = FactorAnalyzer()
fa.analyze(df, 6, rotation="varimax")
fa.loadings
| Factor1 | Factor2 | Factor3 | Factor4 | Factor5 | Factor6 | |
|---|---|---|---|---|---|---|
| A1 | 0.040783 | 0.095220 | 0.048734 | -0.113057 | -0.530987 | 0.161216 |
| A2 | 0.235538 | 0.033131 | 0.133714 | 0.063734 | 0.661141 | -0.006244 |
| A3 | 0.343008 | -0.009621 | 0.121353 | 0.033990 | 0.605933 | 0.160106 |
| A4 | 0.219717 | -0.081518 | 0.235140 | -0.125338 | 0.404594 | 0.086356 |
| A5 | 0.414458 | -0.149616 | 0.106382 | 0.030977 | 0.469698 | 0.236519 |
| C1 | 0.077248 | -0.004358 | 0.554582 | 0.190124 | 0.007511 | 0.095035 |
| C2 | 0.038370 | 0.068330 | 0.674545 | 0.087593 | 0.057055 | 0.152775 |
| C3 | 0.031867 | -0.039994 | 0.551164 | -0.011338 | 0.101282 | 0.008996 |
| C4 | -0.066241 | 0.216283 | -0.638475 | -0.143846 | -0.102617 | 0.318359 |
| C5 | -0.180812 | 0.284187 | -0.544838 | 0.025837 | -0.059955 | 0.132423 |
| E1 | -0.590451 | 0.022280 | 0.053915 | -0.071205 | -0.130851 | 0.156583 |
| E2 | -0.684578 | 0.233624 | -0.088497 | -0.045561 | -0.116716 | 0.115065 |
| E3 | 0.556774 | -0.000895 | 0.103390 | 0.241180 | 0.179396 | 0.267291 |
| E4 | 0.658395 | -0.136788 | 0.113798 | -0.107808 | 0.241143 | 0.158513 |
| E5 | 0.507535 | 0.034490 | 0.309813 | 0.200821 | 0.078804 | 0.008747 |
| N1 | 0.068011 | 0.805806 | -0.051264 | -0.074977 | -0.174849 | -0.096266 |
| N2 | 0.022958 | 0.789832 | -0.037477 | 0.006726 | -0.141134 | -0.139823 |
| N3 | -0.065687 | 0.725081 | -0.059039 | -0.010664 | -0.019184 | 0.062495 |
| N4 | -0.345072 | 0.578319 | -0.162174 | 0.062916 | 0.000403 | 0.147551 |
| N5 | -0.161675 | 0.523097 | -0.025305 | -0.161892 | 0.090125 | 0.120049 |
| O1 | 0.225339 | -0.020004 | 0.133201 | 0.479477 | 0.005178 | 0.218690 |
| O2 | -0.001982 | 0.156230 | -0.086047 | -0.496640 | 0.043989 | 0.134693 |
| O3 | 0.325954 | 0.011851 | 0.093880 | 0.566128 | 0.076642 | 0.210777 |
| O4 | -0.177746 | 0.207281 | -0.005671 | 0.349227 | 0.133656 | 0.178068 |
| O5 | -0.014221 | 0.063234 | -0.047059 | -0.576743 | -0.057561 | 0.135936 |
- Faktor 1 hat hohe Ladungen für E1, E2, E3, E4 und E5 (Extraversion).
- Faktor 2 hat hohe Ladungen für N1, N2, N3, N4 und N5 (Neurotizismus).
- Faktor 3 hat hohe Ladungen für C1, C2, C3, C4 und C5 (Gewissenhaftigkeit).
- Faktor 4 hat hohe Ladungen für O1, O2, O3, O4 und O5 (Offenheit).
- Faktor 5 hat hohe Ladungen für A1, A2, A3, A4 und A5 (Verträglichkeit).
- Faktor 6 weist keine klar hohen Ladungen auf und ist schwer interpretierbar. Es ist sinnvoll, nur fünf Faktoren zu verwenden.
Lass uns die Faktorenanalyse mit 5 Faktoren durchführen.
# Create factor analysis object and perform factor analysis using 5 factors
fa = FactorAnalyzer()
fa.analyze(df, 5, rotation="varimax")
fa.loadings
| Factor1 | Factor2 | Factor3 | Factor4 | Factor5 | |
|---|---|---|---|---|---|
| A1 | 0.040465 | 0.111126 | 0.022798 | -0.077931 | -0.428166 |
| A2 | 0.213716 | 0.029588 | 0.139037 | 0.062139 | 0.626946 |
| A3 | 0.317848 | 0.009357 | 0.109331 | 0.056196 | 0.650743 |
| A4 | 0.204566 | -0.066476 | 0.230584 | -0.112700 | 0.435624 |
| A5 | 0.393034 | -0.122113 | 0.087869 | 0.066708 | 0.537087 |
| C1 | 0.070184 | 0.010416 | 0.545824 | 0.209584 | 0.038878 |
| C2 | 0.033270 | 0.089574 | 0.648731 | 0.115434 | 0.102782 |
| C3 | 0.023907 | -0.030855 | 0.557036 | -0.005183 | 0.111578 |
| C4 | -0.064984 | 0.240410 | -0.633806 | -0.107535 | -0.037498 |
| C5 | -0.176395 | 0.290318 | -0.562467 | 0.036822 | -0.047525 |
| E1 | -0.574835 | 0.042819 | 0.033144 | -0.058795 | -0.104813 |
| E2 | -0.678731 | 0.244743 | -0.102483 | -0.042010 | -0.112517 |
| E3 | 0.536816 | 0.024180 | 0.083010 | 0.280877 | 0.257906 |
| E4 | 0.646833 | -0.115614 | 0.102023 | -0.073422 | 0.306101 |
| E5 | 0.504069 | 0.036145 | 0.312899 | 0.213739 | 0.090354 |
| N1 | 0.078923 | 0.786807 | -0.045997 | -0.084704 | -0.216363 |
| N2 | 0.027301 | 0.754109 | -0.030568 | -0.010304 | -0.193744 |
| N3 | -0.061430 | 0.731721 | -0.067084 | -0.004217 | -0.027712 |
| N4 | -0.345388 | 0.590602 | -0.178902 | 0.075225 | 0.005886 |
| N5 | -0.161291 | 0.537858 | -0.037309 | -0.149769 | 0.100931 |
| O1 | 0.213005 | -0.002224 | 0.115080 | 0.504907 | 0.061550 |
| O2 | 0.004560 | 0.175788 | -0.099729 | -0.468925 | 0.081809 |
| O3 | 0.310956 | 0.026736 | 0.076873 | 0.596007 | 0.126889 |
| O4 | -0.191196 | 0.220582 | -0.021906 | 0.369012 | 0.155475 |
| O5 | -0.005347 | 0.085401 | -0.062730 | -0.533778 | -0.010384 |
# Get variance of each factors
fa.get_factor_variance()
| Factor1 | Factor2 | Factor3 | Factor4 | Factor5 | |
|---|---|---|---|---|---|
| SS Loadings | 2.473090 | 2.709633 | 2.041106 | 1.522153 | 1.844498 |
| Proportion Var | 0.098924 | 0.108385 | 0.081644 | 0.060886 | 0.073780 |
| Cumulative Var | 0.098924 | 0.207309 | 0.288953 | 0.349839 | 0.423619 |
In Summe erklären die 5 Faktoren 42% der Varianz.
Vor- und Nachteile der Faktorenanalyse
Die Faktorenanalyse untersucht große Datensätze und findet verbundene Zusammenhänge. Sie reduziert beobachtete Variablen auf wenige latente Variablen oder identifiziert Gruppen zusammenhängender Variablen. So lassen sich Marktsituationen verdichten und verborgene Beziehungen in Geschmack, Präferenzen und kulturellem Einfluss der Konsumentinnen und Konsumenten aufdecken. Außerdem hilft sie, Fragebögen für künftige Erhebungen zu verbessern. Faktoren erleichtern eine natürliche Interpretation der Daten.
Die Ergebnisse der Faktorenanalyse sind teils umstritten. Interpretationen können variieren, weil sich ein und dieselben Faktoren unterschiedlich deuten lassen. Nach der Identifikation und Benennung der Faktoren ist Domänenwissen gefragt.
Fazit
Glückwunsch, du hast das Ende dieses Tutorials erreicht!
Du hast gelernt, was Faktorenanalyse ist, welche Arten es gibt, wie sie funktioniert, zentrale Begriffe, wie du die Anzahl der Faktoren bestimmst, den Vergleich zwischen Principal Component Analysis und Faktorenanalyse, die Umsetzung in Python mit dem Paket FactorAnalyzer sowie die Vor- und Nachteile der Methode.
Ich freue mich auf Feedback und Fragen. Stell sie gerne in den Kommentaren, und ich gebe mein Bestes, sie zu beantworten.
Wenn du mehr über Faktoren in Python lernen möchtest, schau dir den DataCamp-Kurs Unsupervised Learning in Python an.