Chuyển đến nội dung chính

Giới thiệu Phân tích Nhân tố trong Python

Trong hướng dẫn này, bạn sẽ học các kiến thức cơ bản về phân tích nhân tố và cách triển khai trong Python.
· 10 phút đọc

Khám phá cùng AI

Phân tích nhân tố (FA) là một phương pháp phân tích dữ liệu khám phá dùng để tìm ra các nhân tố tiềm ẩn hoặc biến ẩn có ảnh hưởng từ một tập biến quan sát được. Phương pháp này hỗ trợ diễn giải dữ liệu bằng cách giảm số lượng biến. Nó trích xuất phần phương sai chung lớn nhất từ tất cả các biến và đưa chúng vào một điểm số chung.

Phân tích nhân tố được sử dụng rộng rãi trong nghiên cứu thị trường, quảng cáo, tâm lý học, tài chính và nghiên cứu vận hành. Các nhà nghiên cứu thị trường dùng phân tích nhân tố để xác định khách hàng nhạy cảm về giá, xác định các đặc tính thương hiệu ảnh hưởng đến lựa chọn của người tiêu dùng, và hỗ trợ hiểu tiêu chí lựa chọn kênh cho kênh phân phối.

Phân tích Nhân tố

Phân tích nhân tố là một mô hình thống kê tuyến tính. Nó được dùng để giải thích phương sai giữa các biến quan sát và cô đọng một tập biến quan sát vào các biến không quan sát được gọi là nhân tố. Các biến quan sát được mô hình hóa như là tổ hợp tuyến tính của các nhân tố và sai số (Nguồn). Nhân tố hay biến tiềm ẩn gắn với nhiều biến quan sát có các mẫu phản hồi chung. Mỗi nhân tố giải thích một lượng phương sai nhất định của các biến quan sát. Nó giúp diễn giải dữ liệu bằng cách giảm số lượng biến.

Phân tích nhân tố là một phương pháp để khảo sát xem một số biến quan tâm X1, X2,……, Xl có quan hệ tuyến tính với một số lượng nhỏ hơn các nhân tố không quan sát được F1, F2,……, Fk hay không.

Nguồn: Hình này được dựng lại từ một hình tôi tìm thấy trong ghi chú về phân tích nhân tố. Hình cho cái nhìn tổng quan về phân tích nhân tố.

Giả định:

  1. Không có ngoại lệ (outlier) trong dữ liệu.
  2. Cỡ mẫu phải lớn hơn số nhân tố.
  3. Không có đa cộng tuyến hoàn hảo.
  4. Không có hiện tượng đồng phương sai (homoscedasticity) giữa các biến.

Các loại Phân tích Nhân tố

  • Phân tích Nhân tố Khám phá (EFA): Đây là cách tiếp cận phổ biến nhất trong các nhà nghiên cứu xã hội và quản trị. Giả định cơ bản là bất kỳ biến quan sát nào cũng có thể liên hệ trực tiếp với bất kỳ nhân tố nào.
  • Phân tích Nhân tố Khẳng định (CFA): Giả định cơ bản là mỗi nhân tố gắn với một tập biến quan sát cụ thể. CFA xác nhận những gì được kỳ vọng trên cơ sở giả định.

Phân tích Nhân tố hoạt động như thế nào?

Mục tiêu chính của phân tích nhân tố là giảm số lượng biến quan sát và tìm các biến không quan sát được. Những biến không quan sát này giúp nhà nghiên cứu thị trường rút kết luận từ khảo sát. Việc chuyển đổi các biến quan sát thành biến không quan sát có thể thực hiện theo hai bước:

  • Trích xuất Nhân tố: Ở bước này, số lượng nhân tố và phương pháp trích xuất được chọn bằng các phương pháp phân chia phương sai như phân tích thành phần chính và phân tích nhân tố chung.
  • Xoay Nhân tố: Ở bước này, phép xoay tìm cách biến các nhân tố thành các nhân tố không tương quan — mục tiêu chính là cải thiện khả năng diễn giải tổng thể. Có nhiều phương pháp xoay sẵn có như: Varimax, Quartimax và Promax.

Thuật ngữ

Nhân tố là gì?

Nhân tố là một biến tiềm ẩn mô tả mối liên hệ giữa nhiều biến quan sát. Số nhân tố tối đa bằng số biến quan sát. Mỗi nhân tố giải thích một phần phương sai nhất định trong các biến quan sát. Những nhân tố có phương sai thấp nhất sẽ bị loại bỏ. Nhân tố còn được gọi là biến tiềm ẩn, biến ẩn, biến không quan sát được hoặc biến giả định.

Hệ số tải nhân tố là gì?

Ma trận tải nhân tố cho thấy mối quan hệ của từng biến với nhân tố nền tảng. Nó biểu diễn hệ số tương quan giữa biến quan sát và nhân tố, đồng thời cho thấy phần phương sai được giải thích bởi các biến quan sát.

Trị riêng (Eigenvalues) là gì?

Trị riêng biểu diễn phần phương sai mà mỗi nhân tố giải thích từ tổng phương sai. Nó còn được gọi là căn đặc trưng.

Độ cộng phương (Communalities) là gì?

Độ cộng phương là tổng bình phương các tải của mỗi biến. Nó đại diện cho phương sai chung. Phạm vi từ 0-1 và giá trị gần 1 thể hiện phương sai lớn hơn.

Xoay nhân tố là gì?

Xoay là công cụ để diễn giải phân tích nhân tố tốt hơn. Xoay có thể trực giao hoặc xiên. Nó phân bổ lại độ cộng phương với mẫu tải rõ ràng.

Chọn Số lượng Nhân tố

Tiêu chuẩn Kaiser là một cách tiếp cận phân tích, dựa trên việc chọn những nhân tố giải thích tỷ lệ phương sai lớn hơn. Trị riêng là tiêu chí tốt để xác định số lượng nhân tố. Thông thường, trị riêng lớn hơn 1 sẽ được coi là tiêu chí chọn đặc trưng.

Cách tiếp cận đồ họa dựa trên biểu diễn trực quan của trị riêng các nhân tố, còn gọi là biểu đồ sườn (scree plot). Biểu đồ này giúp xác định số nhân tố tại điểm đường cong tạo “khuỷu tay”.

Nguồn

Phân tích Nhân tố so với Phân tích Thành phần Chính

  • Các thành phần PCA giải thích lượng phương sai tối đa trong khi phân tích nhân tố giải thích hiệp phương sai trong dữ liệu.
  • Các thành phần PCA hoàn toàn trực giao với nhau, trong khi phân tích nhân tố không yêu cầu các nhân tố phải trực giao.
  • Thành phần PCA là tổ hợp tuyến tính của biến quan sát, trong khi ở FA, các biến quan sát là tổ hợp tuyến tính của biến không quan sát được hay nhân tố.
  • Các thành phần PCA khó diễn giải. Trong FA, các nhân tố nền có thể đặt tên và diễn giải được.
  • PCA là một dạng phương pháp giảm chiều, còn phân tích nhân tố là phương pháp biến tiềm ẩn.
  • PCA là một loại của phân tích nhân tố. PCA mang tính quan sát, còn FA là kỹ thuật mô hình hóa.

Nguồn

Phân tích Nhân tố trong Python với gói factor_analyzer

Nhập các thư viện cần thiết

# Import required libraries
import pandas as pd
from sklearn.datasets import load_iris
from factor_analyzer import FactorAnalyzer
import matplotlib.pyplot as plt

Nạp dữ liệu

Hãy thực hiện phân tích nhân tố trên BFI (bộ dữ liệu dựa trên dự án đánh giá tính cách), được thu thập với thang phản hồi 6 mức: 1 Rất Không Chính Xác, 2 Khá Không Chính Xác, 3 Hơi Không Chính Xác, 4 Hơi Chính Xác, 5 Khá Chính Xác, và 6 Rất Chính Xác. Bạn cũng có thể tải bộ dữ liệu này từ liên kết sau: https://vincentarelbundock.github.io/Rdatasets/datasets.html

df= pd.read_csv("bfi.csv")

Tiền xử lý dữ liệu

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()
 A1A2A3A4A5C1C2C3C4C5...N1N2N3N4N5O1O2O3O4O5
02.04.03.04.04.02.03.03.04.04.0...3.04.02.02.03.03.063.04.03.0
12.04.05.02.05.05.04.04.03.04.0...3.03.03.05.05.04.024.03.03.0
25.04.05.04.04.04.05.04.02.05.0...4.05.04.02.03.04.025.05.02.0
34.04.06.05.05.04.04.03.05.05.0...2.05.02.04.01.03.034.03.05.0
42.03.03.04.05.04.04.05.03.02.0...2.03.04.04.03.03.034.03.03.0

5 hàng × 25 cột

Kiểm định mức độ thích hợp

Trước khi thực hiện phân tích nhân tố, bạn cần đánh giá khả năng "phân tích nhân tố" của bộ dữ liệu. Factorability có nghĩa là "chúng ta có thể tìm thấy các nhân tố trong bộ dữ liệu không?". Có hai phương pháp để kiểm tra khả năng phân tích hoặc mức độ đầy đủ của mẫu:

  • Kiểm định Bartlett
  • Kiểm định Kaiser-Meyer-Olkin

Kiểm định Bartlett về tính cầu kiểm tra việc các biến quan sát có tương quan với nhau hay không bằng cách so sánh ma trận tương quan quan sát với ma trận đơn vị. Nếu kiểm định cho kết quả không có ý nghĩa thống kê, bạn không nên áp dụng phân tích nhân tố.

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)

Trong kiểm định Bartlett này, p-value bằng 0. Kiểm định có ý nghĩa thống kê, cho thấy ma trận tương quan quan sát được không phải là ma trận đơn vị.

Kiểm định Kaiser-Meyer-Olkin (KMO) đo lường mức độ phù hợp của dữ liệu cho phân tích nhân tố. Nó xác định mức độ đầy đủ cho từng biến quan sát và cho toàn bộ mô hình. KMO ước tính tỷ lệ phương sai giữa tất cả các biến quan sát. Tỷ lệ thấp hơn phù hợp hơn cho phân tích nhân tố. Giá trị KMO nằm trong khoảng 0 đến 1. Giá trị nhỏ hơn 0,6 được coi là không đủ.

from factor_analyzer.factor_analyzer import calculate_kmo
kmo_all,kmo_model=calculate_kmo(df)

kmo_model

0.8486452309468382

KMO tổng thể cho dữ liệu của chúng ta là 0,84, rất tốt. Giá trị này cho thấy bạn có thể tiếp tục với kế hoạch phân tích nhân tố.

Chọn Số lượng Nhân tố

Để chọn số lượng nhân tố, bạn có thể dùng tiêu chuẩn Kaiser và biểu đồ sườn. Cả hai đều dựa trên trị riêng.

# 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
05.134311
12.751887
22.142702
31.852328
41.548163
51.073582
60.839539
70.799206
80.718989
90.688089
100.676373
110.651800
120.623253
130.596563
140.563091
150.543305
160.514518
170.494503
180.482640
190.448921
200.423366
210.400671
220.387804
230.381857
240.262539

Ở đây, bạn có thể thấy chỉ có 6 nhân tố có trị riêng lớn hơn 1. Điều này có nghĩa là chúng ta cần chọn 6 nhân tố (hoặc biến không quan sát được).

# 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()

Phương pháp biểu đồ sườn vẽ một đường cho mỗi nhân tố và trị riêng của nó. Số trị riêng lớn hơn 1 được coi là số lượng nhân tố.

Ở đây, bạn có thể thấy chỉ có 6 nhân tố có trị riêng lớn hơn 1. Điều này có nghĩa là chúng ta cần chọn 6 nhân tố (hoặc biến không quan sát được).

Thực hiện Phân tích Nhân tố

# Create factor analysis object and perform factor analysis
fa = FactorAnalyzer()
fa.analyze(df, 6, rotation="varimax")
fa.loadings
 Factor1Factor2Factor3Factor4Factor5Factor6
A10.0407830.0952200.048734-0.113057-0.5309870.161216
A20.2355380.0331310.1337140.0637340.661141-0.006244
A30.343008-0.0096210.1213530.0339900.6059330.160106
A40.219717-0.0815180.235140-0.1253380.4045940.086356
A50.414458-0.1496160.1063820.0309770.4696980.236519
C10.077248-0.0043580.5545820.1901240.0075110.095035
C20.0383700.0683300.6745450.0875930.0570550.152775
C30.031867-0.0399940.551164-0.0113380.1012820.008996
C4-0.0662410.216283-0.638475-0.143846-0.1026170.318359
C5-0.1808120.284187-0.5448380.025837-0.0599550.132423
E1-0.5904510.0222800.053915-0.071205-0.1308510.156583
E2-0.6845780.233624-0.088497-0.045561-0.1167160.115065
E30.556774-0.0008950.1033900.2411800.1793960.267291
E40.658395-0.1367880.113798-0.1078080.2411430.158513
E50.5075350.0344900.3098130.2008210.0788040.008747
N10.0680110.805806-0.051264-0.074977-0.174849-0.096266
N20.0229580.789832-0.0374770.006726-0.141134-0.139823
N3-0.0656870.725081-0.059039-0.010664-0.0191840.062495
N4-0.3450720.578319-0.1621740.0629160.0004030.147551
N5-0.1616750.523097-0.025305-0.1618920.0901250.120049
O10.225339-0.0200040.1332010.4794770.0051780.218690
O2-0.0019820.156230-0.086047-0.4966400.0439890.134693
O30.3259540.0118510.0938800.5661280.0766420.210777
O4-0.1777460.207281-0.0056710.3492270.1336560.178068
O5-0.0142210.063234-0.047059-0.576743-0.0575610.135936
  • Nhân tố 1 có tải nhân tố cao cho E1, E2, E3, E4 và E5 (Hướng ngoại)
  • Nhân tố 2 có tải nhân tố cao cho N1, N2, N3, N4 và N5 (Bất ổn cảm xúc)
  • Nhân tố 3 có tải nhân tố cao cho C1, C2, C3, C4 và C5 (Tận tâm)
  • Nhân tố 4 có tải nhân tố cao cho O1, O2, O3, O4 và O5 (Cởi mở)
  • Nhân tố 5 có tải nhân tố cao cho A1, A2, A3, A4 và A5 (Dễ chịu)
  • Nhân tố 6 không có tải cao nào cho bất kỳ biến nào và khó diễn giải. Sẽ tốt hơn nếu chúng ta chỉ lấy năm nhân tố.

Hãy thực hiện phân tích nhân tố với 5 nhân tố.

# Create factor analysis object and perform factor analysis using 5 factors
fa = FactorAnalyzer()
fa.analyze(df, 5, rotation="varimax")
fa.loadings
 Factor1Factor2Factor3Factor4Factor5
A10.0404650.1111260.022798-0.077931-0.428166
A20.2137160.0295880.1390370.0621390.626946
A30.3178480.0093570.1093310.0561960.650743
A40.204566-0.0664760.230584-0.1127000.435624
A50.393034-0.1221130.0878690.0667080.537087
C10.0701840.0104160.5458240.2095840.038878
C20.0332700.0895740.6487310.1154340.102782
C30.023907-0.0308550.557036-0.0051830.111578
C4-0.0649840.240410-0.633806-0.107535-0.037498
C5-0.1763950.290318-0.5624670.036822-0.047525
E1-0.5748350.0428190.033144-0.058795-0.104813
E2-0.6787310.244743-0.102483-0.042010-0.112517
E30.5368160.0241800.0830100.2808770.257906
E40.646833-0.1156140.102023-0.0734220.306101
E50.5040690.0361450.3128990.2137390.090354
N10.0789230.786807-0.045997-0.084704-0.216363
N20.0273010.754109-0.030568-0.010304-0.193744
N3-0.0614300.731721-0.067084-0.004217-0.027712
N4-0.3453880.590602-0.1789020.0752250.005886
N5-0.1612910.537858-0.037309-0.1497690.100931
O10.213005-0.0022240.1150800.5049070.061550
O20.0045600.175788-0.099729-0.4689250.081809
O30.3109560.0267360.0768730.5960070.126889
O4-0.1911960.220582-0.0219060.3690120.155475
O5-0.0053470.085401-0.062730-0.533778-0.010384
# Get variance of each factors
fa.get_factor_variance()
 Factor1Factor2Factor3Factor4Factor5
SS Loadings2.4730902.7096332.0411061.5221531.844498
Proportion Var0.0989240.1083850.0816440.0608860.073780
Cumulative Var0.0989240.2073090.2889530.3498390.423619

Tổng cộng 42% phương sai tích lũy được giải thích bởi 5 nhân tố.

Ưu và nhược điểm của Phân tích Nhân tố

Phân tích nhân tố khám phá các bộ dữ liệu lớn và tìm ra các liên kết qua lại. Nó giảm các biến quan sát thành một vài biến không quan sát được hoặc xác định các nhóm biến có liên hệ, giúp các nhà nghiên cứu thị trường cô đọng bối cảnh thị trường và tìm ra mối quan hệ ẩn giữa khẩu vị, sở thích và ảnh hưởng văn hóa của người tiêu dùng. Ngoài ra, nó giúp cải thiện bảng câu hỏi cho các khảo sát trong tương lai. Các nhân tố giúp việc diễn giải dữ liệu trở nên tự nhiên hơn.

Kết quả của phân tích nhân tố có thể gây tranh cãi. Việc diễn giải có thể gây tranh luận vì có thể có nhiều cách diễn giải từ cùng một tập nhân tố. Sau khi xác định và đặt tên các nhân tố, cần có kiến thức miền.

Kết luận

Chúc mừng bạn đã hoàn thành hướng dẫn này!

Trong hướng dẫn này, bạn đã học được phân tích nhân tố là gì, các loại phân tích nhân tố, cách phân tích nhân tố hoạt động, thuật ngữ cơ bản, cách chọn số lượng nhân tố, so sánh giữa phân tích thành phần chính và phân tích nhân tố, triển khai trong Python bằng gói FactorAnalyzer, cùng ưu và nhược điểm của phân tích nhân tố.

Tôi mong nhận được phản hồi hoặc câu hỏi của bạn. Bạn có thể đặt câu hỏi bằng cách để lại bình luận và tôi sẽ cố gắng trả lời.

Nếu bạn muốn tìm hiểu thêm về các nhân tố trong Python, hãy học khóa Unsupervised Learning in Python của DataCamp.

Chủ đề

Liên quan