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

Hệ số Phồng Phương sai (VIF): Xử lý đa cộng tuyến trong phân tích hồi quy

Tìm hiểu cách phát hiện đa cộng tuyến trong mô hình hồi quy bằng hệ số phồng phương sai (VIF), một công cụ chẩn đoán quan trọng. Hướng dẫn này giải thích cách tính VIF, cách diễn giải các giá trị của nó, và các kỹ thuật xử lý VIF cao để cải thiện độ tin cậy của mô hình hồi quy.
Đã cập nhật 5 thg 6, 2026  · 9 phút đọc

Trong phân tích hồi quy, đa cộng tuyến xảy ra khi các biến độc lập có tương quan với nhau. Điều này khiến việc xác định ảnh hưởng riêng của từng biến dự báo lên biến phụ thuộc trở nên khó khăn. Hệ quả là sai số chuẩn bị phồng lên, từ đó ảnh hưởng đến ý nghĩa thống kê của các hệ số.

Hệ số phồng phương sai (VIF) là một công cụ tuyệt vời để phát hiện đa cộng tuyến, cung cấp những hiểu biết vượt ra ngoài tương quan cặp đơn giản. Hướng dẫn này giải thích VIF hoạt động ra sao, cách tính và diễn giải, cũng như cần làm gì nếu bạn phát hiện các giá trị VIF cao. Những bước này sẽ giúp bạn, với vai trò chuyên gia dữ liệu hay nhà khoa học dữ liệu, cải thiện độ ổn định của mô hình.

Mặc dù VIF là một công cụ chẩn đoán quan trọng và rất đáng để học, nó chỉ là một phần nhỏ trong bộ kỹ năng rộng hơn mà bạn sẽ phát triển trong lộ trình nghề nghiệp Machine Learning Scientist in Python của chúng tôi, vì vậy hãy đăng ký ngay hôm nay.

Hệ số Phồng Phương sai (VIF) là gì?

Được phát triển bởi nhà thống kê Cuthbert Daniel, VIF là một công cụ chẩn đoán được sử dụng rộng rãi trong phân tích hồi quy để phát hiện đa cộng tuyến, vốn được biết là ảnh hưởng đến tính ổn định và khả năng diễn giải của các hệ số hồi quy. Về mặt kỹ thuật, VIF định lượng mức độ phương sai của một hệ số hồi quy bị phồng lên do tương quan giữa các biến dự báo.

Tất cả điều này quan trọng vì những tương quan này khiến khó cô lập tác động riêng của từng biến dự báo lên biến mục tiêu, dẫn đến ước lượng mô hình kém tin cậy hơn. Cũng cần nói rằng, để kể đúng câu chuyện, VIF luôn được tính cho từng biến dự báo trong một mô hình.

Công thức hệ số phồng phương sai

VIF cho một biến dự báo X được tính như sau:

Công thức hệ số phồng phương sai (VIF)

Trong đó:

  • R2 là hệ số xác định thu được khi hồi quy X​ trên tất cả các biến dự báo còn lại.

Tính toán từng bước

Tìm VIF gồm ba bước. Bước đầu là khớp một mô hình hồi quy tuyến tính riêng cho từng biến dự báo so với tất cả biến dự báo khác. Bước hai là lấy giá trị R2 cho mỗi mô hình. Bước cuối là tính VIF bằng công thức ở trên.

Diễn giải các giá trị VIF

Dưới đây là cách diễn giải giá trị VIF để hiểu mức độ đa cộng tuyến:

  • VIF = 1: Cho thấy không có đa cộng tuyến. Biến dự báo không tương quan với các biến dự báo khác, nên không làm phồng sai số chuẩn hay ảnh hưởng đến độ ổn định của mô hình.
  • VIF trong khoảng 1 đến 5: Gợi ý đa cộng tuyến ở mức vừa. Có một số tương quan với các biến khác, nhưng thường không nghiêm trọng. Tuy nhiên, nên theo dõi các biến này để xem đa cộng tuyến có trở thành vấn đề hay không, đặc biệt nếu các giá trị VIF khác cao.
  • VIF > 5: Có đa cộng tuyến cao. Sai số chuẩn của biến dự báo có thể bị phồng đáng kể, khiến hệ số trở nên kém tin cậy. Cân nhắc thực hiện các bước giảm đa cộng tuyến, như loại bỏ hoặc kết hợp các biến dự báo có tương quan.
  • VIF > 10: Báo hiệu đa cộng tuyến nghiêm trọng. Sai số chuẩn của biến dự báo bị phồng rất mạnh và ước lượng hệ số có khả năng không ổn định. Thường cần có hành động khắc phục, như loại bỏ biến hoặc dùng kỹ thuật điều chuẩn.

Ví dụ, nếu VIF của một biến dự báo là 10, điều đó cho thấy phương sai của hệ số biến đó gấp 10 lần so với khi không có đa cộng tuyến. 

VIF giải thích đa cộng tuyến trong hồi quy như thế nào

Đa cộng tuyến làm tăng sai số chuẩn, khiến việc đánh giá ý nghĩa của từng biến dự báo trở nên khó khăn hơn. Điều này xảy ra vì các biến đồng tuyến mang thông tin tương tự nhau, làm khó việc tách biệt tác động riêng của chúng lên biến kết quả. 

Mặc dù đa cộng tuyến không nhất thiết làm hại khả năng dự báo của mô hình, nó làm giảm độ tin cậy và rõ ràng của các hệ số. Điều này đặc biệt vấn đề khi chúng ta muốn hiểu tác động riêng của từng biến dự báo.

Hệ số phồng phương sai (VIF) đóng vai trò là chỉ số chẩn đoán chính xác để xác định đa cộng tuyến. Khác với các quan sát chung về tương quan, VIF tách biệt tác động tổng hợp của tất cả biến dự báo lên từng biến, làm nổi bật các tương tác có thể không thấy qua tương quan cặp.

Hệ số phồng phương sai trong Python và R

Để có thể áp dụng, hãy cùng đi qua một ví dụ trong cả Python và R với một tập dữ liệu riêng. Chúng ta sẽ tính VIF bằng các gói tự động và cả bằng công thức VIF để xây dựng trực giác. Để luyện tập tốt, tôi đã cố tình tạo một tập dữ liệu mà ở đó chúng ta sẽ phát hiện một giá trị VIF cao cho một biến dù không có tương quan cặp nào quá cao giữa bất kỳ hai biến nào — nên tôi nghĩ đây là một ví dụ thuyết phục. Hãy bắt đầu với tổng quan về tập dữ liệu sẽ dùng.

Tổng quan tập dữ liệu:

Tập dữ liệu giả định này đại diện cho kết quả khảo sát từ một nghiên cứu thực hiện trên 1.000 cửa hàng của một tập đoàn bán lẻ lớn. Khách hàng tại mỗi cửa hàng được yêu cầu đánh giá các khía cạnh về trải nghiệm mua sắm trên thang điểm từ -5 đến +5, trong đó -5 là trải nghiệm rất tiêu cực và +5 là rất tích cực. Điểm trung bình của khách hàng tại mỗi cửa hàng được lấy trên bốn tham số chính:

  • Ambience: Cảm nhận của khách hàng về môi trường cửa hàng, như vệ sinh, bố cục, ánh sáng và bầu không khí tổng thể. 

  • Customer_service: Đánh giá về dịch vụ do nhân viên cung cấp, bao gồm sự hữu ích, thân thiện và khả năng đáp ứng nhu cầu khách hàng.

  • Offers: Đánh giá về các ưu đãi khuyến mãi, giảm giá và các chương trình dành cho khách hàng của cửa hàng.

  • Product_range: Đánh giá về mức độ đa dạng và chất lượng sản phẩm có sẵn trong cửa hàng.

Biến mục tiêu, Performance, đo lường hiệu suất tổng thể của mỗi cửa hàng. Tuy nhiên, nó không liên quan từ góc độ VIF. Bạn có thể tải tập dữ liệu tại đây

Hệ số phồng phương sai trong Python

Chúng ta sẽ bắt đầu bằng cách tính các giá trị VIF bằng các gói Python. Bước đầu là tải tập dữ liệu và các thư viện cần thiết. 

from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from statsmodels.stats.outliers_influence import variance_inflation_factor
from statsmodels.tools.tools import add_constant

datacamp_retail_data = pd.read_csv(' vif_data.csv')
datacamp_retail_data.head()

Đoạn mã trên sẽ tải dữ liệu và hiển thị năm bản ghi đầu tiên. 

Bước tiếp theo, chúng ta có thể chạy ma trận tương quan để kiểm tra tương quan cặp.

Đoạn mã dưới đây chọn bốn cột và lưu chúng vào một DataFrame mới gọi là correl_data. Sau đó tính ma trận tương quan cặp bằng hàm .corr(). Kết quả được lưu trong đối tượng corr_matrix, là một bảng thể hiện hệ số tương quan giữa từng cặp cột đã chọn. 

Ma trận sau đó được trực quan hóa bằng hàm heatmap() của Seaborn, hiển thị mỗi hệ số tương quan dưới dạng một ô mã màu, trong đó màu xanh biểu thị tương quan âm và màu đỏ biểu thị tương quan dương, dựa trên bản đồ màu coolwarm

correl_data = datacamp_retail_data[['Ambience', 'Customer_service', 'Offers', 'Product_range']]

# Compute the pairwise correlation matrix
corr_matrix = correl_data.corr()

# Visualize the correlation matrix
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('Pairwise Correlation Matrix')
plt.show()

Kết quả:

Tương quan giữa các biến. Ảnh: Tác giả

  Tương quan giữa các biến. Ảnh: Tác giả

Biểu đồ cung cấp tóm tắt trực quan về mối quan hệ giữa các biến trong correl_data. Giá trị tương quan nằm trong khoảng từ -1 đến 1, trong đó giá trị gần 1 cho thấy tương quan dương mạnh, gần -1 cho thấy tương quan âm mạnh, và quanh 0 gợi ý không có tương quan. Rõ ràng là không có tương quan cặp mạnh giữa các biến, không giá trị nào thậm chí lớn hơn 0,6. 

Bước tiếp theo là tính giá trị VIF cho các biến dự báo. Đoạn mã dưới đây tính giá trị cho từng biến dự báo trong tập dữ liệu để kiểm tra đa cộng tuyến. 

Trước hết, xác định X bằng cách loại bỏ cột mục tiêu Performance và thêm hằng số chặn. Sau đó, tạo một DataFrame, datacamp_vif_data, để lưu tên các biến dự báo và giá trị VIF của chúng. Sử dụng vòng lặp, tiếp theo tính VIF cho từng biến dự báo với hàm variance_inflation_factor(), trong đó VIF cao hơn cho thấy có đa cộng tuyến. 

# Define the predictor variables
X = datacamp_retail_data.drop(columns=['Performance'])

# Add a constant to the model (intercept)
X = add_constant(X)

# Calculate VIF for each feature
datacamp_vif_data = pd.DataFrame()
datacamp_vif_data['Feature'] = X.columns
datacamp_vif_data['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
print(datacamp_vif_data)

Kết quả:

Kết quả hiển thị các giá trị VIF. Ảnh: Tác giả

Kết quả hiển thị các giá trị VIF. Ảnh: Tác giả

Kết quả này cho thấy giá trị VIF cho từng biến dự báo, phản ánh mức độ đa cộng tuyến trong tập dữ liệu. Hàng const đại diện cho hằng số chặn, với VIF xấp xỉ 1, nghĩa là không có đa cộng tuyến. Trong số các biến dự báo, Product_range có VIF cao nhất (5,94), cho thấy cần có biện pháp khắc phục. Tất cả biến dự báo còn lại có VIF dưới 3, chỉ ra đa cộng tuyến thấp. 

Cách tính VIF thủ công

Cách khác là tính các giá trị riêng lẻ bằng cách hồi quy từng biến độc lập đối với các biến dự báo còn lại.  

Cụ thể, với mỗi đặc trưng trong retail_data, ta đặt đặc trưng đó làm biến phụ thuộc (y) và các đặc trưng còn lại làm biến độc lập (X). Sau đó khớp một mô hình hồi quy tuyến tính để dự đoán y từ X, và giá trị R-squared của mô hình được dùng để tính VIF theo công thức đã thảo luận ở phần đầu.

Tiếp đó, từng đặc trưng và giá trị VIF tương ứng được lưu trong một từ điển (vif_manual), rồi chuyển thành DataFrame (vif_manual_df) để hiển thị. 

datacamp_retail_data = retail_data.drop(columns=['Performance'])

# Manual VIF Calculation
vif_manual = {}

for feature in retail_data.columns:
    # Define the target variable (current feature) and predictors (all other features)
    y = datacamp_retail_data[feature]
    X = datacamp_retail_data.drop(columns=[feature])

    # Fit the linear regression model
    model = LinearRegression().fit(X, y)

    # Calculate R-squared
    r_squared = model.score(X, y)

    # Calculate VIF
    vif = 1 / (1 - r_squared)
    vif_manual[feature] = vif

# Convert the dictionary to a DataFrame for better display
vif_manual_df = pd.DataFrame(list(vif_manual.items()), columns=['Feature', 'VIF'])
print(vif_manual_df)

 Kết quả:

Kết quả hiển thị các giá trị VIF. Ảnh: Tác giả

Kết quả hiển thị các giá trị VIF. Ảnh: Tác giả

Kết quả cho thấy mỗi đặc trưng cùng với giá trị VIF của nó, giúp xác định các vấn đề đa cộng tuyến tiềm ẩn. Bạn có thể thấy kết quả rõ ràng giống như ở trên; và cách diễn giải cũng vậy, đó là biến Product_range đang thể hiện đa cộng tuyến.

Hệ số phồng phương sai trong R

Trong phần này, chúng ta sẽ lặp lại bài tập về hệ số phồng phương sai như ở phần Python, đặc biệt cho các nhà phát triển làm việc với ngôn ngữ R. Chúng ta bắt đầu bằng cách tải tập dữ liệu và các thư viện cần thiết.

library(tidyverse)
library(car)
library(corrplot)

data <- read.csv('vif_data.csv')
str(data)

Kết quả:

Bước tiếp theo là tính ma trận tương quan cặp và trực quan hóa nó với heatmap. Các hàm cor()corrplot giúp chúng ta thực hiện tác vụ này.

# Remove the target column
predictors_data <- data[, !(names(data) %in% "Performance")]

# Calculate the correlation matrix
correlation_matrix <- cor(predictors_data)

# Plot the correlation heatmap
# Load necessary libraries
library(ggplot2)
library(reshape2)
melted_corr_matrix <- melt(correlation_matrix)

# Plot the heatmap with ggplot2
ggplot(data = melted_corr_matrix, aes(x = Var1, y = Var2, fill = value)) +
  geom_tile(color = "white") +
  scale_fill_gradient2(low = "blue", high = "red", mid = "white", 
                       midpoint = 0, limit = c(-1, 1), space = "Lab", 
                       name="Correlation") +
  theme_minimal() + # Minimal theme for a clean look
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) +
  labs(x = "", y = "") + # Remove axis labels
  geom_text(aes(Var1, Var2, label = round(value, 2)), color = "black", size = 4) +
  theme(axis.text=element_text(size=15))

Kết quả:

Tương quan giữa các biến. Ảnh: Tác giả

Tương quan giữa các biến. Ảnh: Tác giả

Rõ ràng từ heatmap tương quan là không có tương quan cặp mạnh giữa các biến, không giá trị nào thậm chí lớn hơn 0,6. Giờ chúng ta sẽ tính các giá trị VIF và xem có điều gì đáng lo ngại không. Dòng mã sau thực hiện tác vụ đó. 

# Fit a regression model
model <- lm(Performance ~ Ambience + Customer_service + Offers + Product_range, data = data)

# Calculate VIF
vif(model)

Kết quả:

Từ kết quả, chúng ta thấy rằng trong số các biến dự báo, chỉ biến Product_range có giá trị VIF lớn hơn 5, gợi ý đa cộng tuyến cao cần có biện pháp khắc phục. 

Cách tính VIF thủ công

Cách khác để tính VIF là tính giá trị VIF cho từng biến riêng lẻ bằng cách hồi quy từng biến độc lập đối với các biến dự báo còn lại.  

Điều này được thực hiện trong đoạn mã dưới đây, sử dụng hàm sapply() trên từng biến dự báo, trong đó mỗi biến được đặt làm biến phụ thuộc trong một mô hình hồi quy tuyến tính với các biến còn lại là biến độc lập. 

Giá trị R-squared từ mỗi mô hình sau đó được dùng để tính các giá trị VIF bằng công thức của nó. Cuối cùng, kết quả vif_values hiển thị VIF cho từng biến dự báo, giúp xác định vấn đề đa cộng tuyến.

# VIF calculation for each predictor manually
predictors <- c("Ambience", "Customer_service", "Offers", "Product_range")

vif_values <- sapply(predictors, function(pred) {
    formula <- as.formula(paste(pred, "~ ."))
    model <- lm(formula, data = data[, predictors])
    1 / (1 - summary(model)$r.squared)
})

print(vif_values)

Kết quả:

Chúng ta nhận được cùng một kết quả và rõ ràng biến Product_range với giá trị VIF cao trên 5 cần can thiệp. 

VIF so với ma trận tương quan và các phương pháp khác

Tóm lại, đây là các phương pháp phổ biến để phát hiện đa cộng tuyến:

  • Giá trị VIF cao: Giá trị VIF cao là một chỉ dấu rõ ràng của đa cộng tuyến. Khi các giá trị này vượt ngưỡng nhất định, chúng cho thấy một biến dự báo có liên hệ chặt chẽ với các biến dự báo khác, có thể ảnh hưởng đến độ ổn định, độ tin cậy và hiệu năng của mô hình.
  • Ma trận tương quan: Bằng cách xem xét ma trận tương quan, bạn có thể thấy tương quan cặp giữa các biến dự báo. Tương quan cặp cao gợi ý đa cộng tuyến giữa các biến cụ thể đó. Tuy nhiên, phương pháp này chỉ phát hiện mối quan hệ tuyến tính trực tiếp giữa hai biến và có thể bỏ sót đa cộng tuyến liên quan đến tương tác phức tạp giữa nhiều biến.
  • Thay đổi hệ số: Nếu các hệ số của biến dự báo thay đổi đáng kể khi bạn thêm hoặc bớt các biến khác khỏi mô hình, đây có thể là dấu hiệu của đa cộng tuyến. Những dao động như vậy cho thấy một số biến dự báo có thể chia sẻ thông tin chung, khiến khó xác định tác động riêng của từng biến lên kết quả.

Trong số các phương pháp này, VIF đặc biệt hữu ích vì nó có thể phát hiện đa cộng tuyến ngay cả khi tương quan cặp thấp, như chúng ta đã thấy trong ví dụ của mình. Điều này khiến VIF trở thành công cụ toàn diện hơn.

Một số ý tưởng bổ sung để xử lý giá trị VIF cao

Nếu các giá trị VIF cho thấy đa cộng tuyến cao và bạn không nhất thiết chỉ muốn loại bỏ biến, có một số chiến lược nâng cao khác để giảm đa cộng tuyến:

  1. Lựa chọn đặc trưng: Loại bỏ một trong các biến dự báo có tương quan cao, rồi tính lại VIF để xem liệu nó có giúp đơn giản hóa mô hình và cải thiện ổn định hay không.
  2. Phân tích thành phần chính (PCA): Sử dụng PCA để kết hợp các biến dự báo thành một tập nhỏ hơn các thành phần không tương quan. Cách này biến đổi các biến gốc thành các biến mới độc lập, không tương quan nhưng vẫn nắm bắt phần lớn biến thiên của dữ liệu, giúp xử lý đa cộng tuyến mà không mất thông tin giá trị.
  3. Kỹ thuật điều chuẩn: Áp dụng ridge hoặc lasso, bổ sung các hạng phạt vào mô hình. Các kỹ thuật này giúp giảm đa cộng tuyến bằng cách co nhỏ ảnh hưởng của các biến có tương quan, khiến mô hình ổn định và tin cậy hơn.

Kết luận

Biết cách sử dụng VIF là chìa khóa để xác định và khắc phục đa cộng tuyến, qua đó cải thiện độ chính xác và rõ ràng của các mô hình hồi quy. Thường xuyên kiểm tra các giá trị VIF và áp dụng biện pháp khắc phục khi cần giúp các chuyên gia dữ liệu và nhà phân tích xây dựng những mô hình đáng tin cậy. Cách tiếp cận này đảm bảo tác động của từng biến dự báo là rõ ràng, giúp rút ra kết luận đáng tin và ra quyết định tốt hơn dựa trên kết quả. Hãy tham gia lộ trình nghề nghiệp Machine Learning Scientist in Python của chúng tôi để thực sự hiểu cách xây dựng và sử dụng mô hình. Hơn nữa, hoàn thành chương trình sẽ rất ấn tượng trên hồ sơ xin việc.

Ngoài ra, để học thêm, hãy cân nhắc khám phá các tài nguyên sau từ mục blog và hướng dẫn của DataCamp:


Vikash Singh's photo
Author
Vikash Singh
LinkedIn

Chuyên gia dày dạn kinh nghiệm trong khoa học dữ liệu, trí tuệ nhân tạo, phân tích và chiến lược dữ liệu.

Câu hỏi thường gặp về VIF

Hệ số phồng phương sai (VIF) được dùng để làm gì?

VIF là một kỹ thuật dùng để phát hiện đa cộng tuyến trong các mô hình hồi quy bằng cách định lượng mức độ phương sai của một biến dự báo bị phồng lên do tương quan với các biến dự báo khác.

Đa cộng tuyến trong phân tích hồi quy là gì?

Đa cộng tuyến xảy ra khi hai hoặc nhiều biến dự báo trong một mô hình hồi quy có tương quan cao, khiến khó xác định tác động riêng của từng biến dự báo lên biến mục tiêu.

VIF khác gì so với tương quan cặp?

Tương quan cặp đo lường độ mạnh và chiều hướng của mối quan hệ tuyến tính giữa hai hoặc nhiều biến, trong khi VIF đánh giá mức độ một biến dự báo tương quan với tất cả các biến độc lập khác, khiến nó trở thành thước đo toàn diện hơn về đa cộng tuyến.

Những phương pháp phổ biến để giảm giá trị VIF cao là gì?

Các phương pháp phổ biến gồm loại bỏ hoặc kết hợp các biến đồng tuyến, dùng kỹ thuật giảm chiều như PCA, hoặc áp dụng các phương pháp điều chuẩn như Ridge hoặc Lasso.

Tôi nên kiểm tra VIF trong các mô hình của mình với tần suất thế nào?

Nên kiểm tra VIF bất cứ khi nào thêm biến mới vào mô hình hồi quy, đặc biệt trong phân tích khám phá hoặc khi khả năng diễn giải mô hình là ưu tiên.

Chủ đề

Học cùng DataCamp

Courses

Hồi quy trung cấp với R

4 giờ
34.9K
Xem chi tiếtRight Arrow
Bắt đầu khóa học
Xem thêmRight Arrow