KTL cơ bảnPhân tích hồi quy

Phân tích ANOVA lặp một chiều

Phân tích One-way repeated measures ANOVA trong thực hành kinh tế lượng

Tóm tắt: Phân tích ANOVA đo lường lặp lại một chiều là kỹ thuật quan trọng trong thực hành kinh tế lượng khi nghiên cứu sự thay đổi của biến phụ thuộc liên tục qua thời gian hoặc các điều kiện khác nhau trên cùng một nhóm đối tượng. Bài hướng dẫn này trình bày chi tiết cách thực hiện phân tích bằng SPSS qua ví dụ thực tế về doanh thu bán hàng điện thoại tại các cửa hàng ở TP.HCM trong ba năm liên tiếp, bao gồm kiểm tra giả thiết, thực hiện phân tích và giải thích kết quả chính xác.

Giới thiệu về phân tích ANOVA đo lường lặp lại một chiều

Phân tích ANOVA đo lường lặp lại một chiều (One-way repeated measures ANOVA) tương tự như phân tích ANOVA một chiều trong thực hành kinh tế lượng. Tuy nhiên, điểm khác biệt quan trọng là các nhóm đối tượng trong ANOVA đo lường lặp lại có mối quan hệ phụ thuộc với nhau.

Chúng ta sử dụng phương pháp này khi các đối tượng cần đo lường chứa giá trị quan sát của từ 3 nhóm có liên quan trở lên. Có hai trường hợp phổ biến trong thực hành kinh tế lượng:

  • Đối tượng khảo sát được đo lường nhiều lần để tăng khả năng chính xác của việc suy rộng cho tổng thể
  • Đối tượng tham gia trả lời câu hỏi cho nhiều nhóm để so sánh

Ví dụ thực tế trong kinh tế Việt Nam

Một giám đốc Marketing muốn đánh giá doanh thu bán hàng (triệu đồng/năm) của mảng điện thoại ở 24 cửa hàng khu vực TP.HCM (ký hiệu 1-24). Số liệu doanh thu điện thoại 24 cửa hàng được thu thập trong ba năm 2011, 2012 và 2013.

  • Biến đo lường: Doanh thu bán hàng (triệu đồng/năm)
  • 3 nhóm quan sát: Năm 2011, năm 2012, năm 2013
  • Đối tượng nghiên cứu: 24 cửa hàng ở TP.HCM
  • Cấu trúc dữ liệu: Mỗi cửa hàng có ba giá trị doanh thu tương ứng ba năm

Câu hỏi nghiên cứu mà vị giám đốc đặt ra là: “Doanh thu điện thoại ở các cửa hàng có sự khác nhau về doanh thu trong 3 năm 2011, 2012 và 2013 hay không?”

Tải xuống dữ liệu mẫu

Giả thiết của phân tích ANOVA đo lường lặp lại một chiều

Để áp dụng phân tích ANOVA đo lường lặp lại một chiều trong thực hành kinh tế lượng, dữ liệu phải thỏa mãn năm giả thiết cơ bản:

  1. Biến liên tục: Biến đo lường là biến liên tục. Tham khảo bài viết các loại thang đo trong phân tích dữ liệu.
  2. Quan sát có liên hệ: Các quan sát của các nhóm có liên hệ với nhau, nghĩa là một đối tượng chỉ ứng với một bộ quan sát.
  3. Không có điểm dị biệt: Không có điểm dị biệt trong tập dữ liệu.
  4. Phân phối chuẩn: Biến phụ thuộc cần đo lường phải có phân phối chuẩn hoặc xấp xỉ phân phối chuẩn.
  5. Sphericity: Phương sai của sai phân giữa các nhóm phải bằng nhau (giả định sphericity).

Xem thêm: kiểm định tham số

Lưu ý quan trọng: Giả thiết sphericity là điều kiện quan trọng nhất và khác biệt so với ANOVA một chiều thông thường. Vi phạm giả thiết này có thể dẫn đến kết quả sai lệch trong phân tích.

Hướng dẫn thực hành chi tiết trên SPSS

Thực hiện phân tích ANOVA đo lường lặp lại một chiều trong SPSS theo các bước chi tiết sau:

Bước 1: Truy cập menu phân tích

Vào menu AnalyzeGeneral Linear ModelRepeated Measures…

Giao diện menu Analyze - General Linear Model - Repeated Measures trong SPSS

Bước 2: Thiết lập cấu trúc đo lường lặp lại

Thiết lập hiển thị cho phần kết quả như sau:

Thiết lập cấu trúc Within-Subject Factor trong ANOVA đo lường lặp lại

  • Thay thế giá trị mặc định factor1 bằng tên biến phân nhóm trong khung Within-Subject Factor Name: Ở ví dụ này, đặt tên là Year
  • Nhập ba vào ô Number of Levels (vì có ba phân nhóm là ba năm 2011, 2012, 2013)
  • Bấm nút Add
  • Ở khung Measure Name, đặt tên cho biến đo lường là DT

Bước 3: Định nghĩa biến đo lường

Bấm nút Define, cửa sổ Repeated Measures hiện ra:

Cửa sổ Define trong phân tích ANOVA đo lường lặp lại một chiều

Chuyển các biến DT2011, DT2012, DT2013 vào khung Within-Subjects Variables (Year) theo đúng thứ tự thời gian.

Lưu ý: Thứ tự của các biến trong khung Within-Subjects Variables rất quan trọng vì nó quyết định cách SPSS diễn giải kết quả phân tích.

Bước 4: Thiết lập đồ thị minh họa

Bấm nút Plots…, cửa sổ Repeated Measures: Profile Plots hiện ra:

Thiết lập đồ thị profile plots trong ANOVA đo lường lặp lại

  • Chuyển biến Year từ khung Factors vào ô Horizontal Axis
  • Bấm nút Add để thêm đồ thị
  • Bấm Continue để quay lại cửa sổ chính

Bước 5: Thiết lập các tùy chọn phân tích

Bấm nút Options…, cửa sổ Repeated Measures: Options hiện ra:

Cửa sổ Options trong phân tích ANOVA đo lường lặp lại

  • Chuyển biến Year từ khung Factor(s) and Factor Interactions vào khung Display Means for
  • Check các tùy chọn: Descriptive statistics, Estimates of effect size, Observed power
  • Trong phần Significance level, giữ nguyên α = 0.05

Sau khi hoàn thành thiết lập, bấm ContinueOK để tiến hành phân tích.

Phân tích và giải thích kết quả

Kết quả phân tích ANOVA đo lường lặp lại một chiều trong thực hành kinh tế lượng được thể hiện qua các bảng sau:

Bảng Within-Subjects Factors

Bảng Within-Subjects Factors cho biết các nhóm của biến phụ thuộc (còn được gọi là “within-subject factor” trong SPSS). Có 3 nhóm được gán nhãn là 1, 2 và 3, tương ứng với năm 2011, 2012 và 2013.

Ghi chú: Các nhãn số này sẽ được sử dụng khi phân tích kết quả ở bảng Pairwise Comparisons.

Bảng thống kê mô tả

Bảng Descriptive Statistics mô tả những thông tin cơ bản về biến phụ thuộc, bao gồm doanh thu trung bình, độ lệch chuẩn và số quan sát ở các cửa hàng trong các năm 2011, 2012, 2013.

Bảng kiểm định đa biến

Bảng Multivariate Tests tính toán giá trị kiểm định theo bốn phương pháp khác nhau:

Bảng Multivariate Tests trong phân tích ANOVA đo lường lặp lại

  • Pillai’s Trace: Kiểm định mạnh nhất khi vi phạm giả thiết
  • Wilks’ Lambda: Kiểm định phổ biến nhất
  • Hotelling’s Trace: Nhạy cảm với giả thiết phân phối chuẩn
  • Roy’s Largest Root: Mạnh nhất khi không vi phạm giả thiết

Kiểm định giả thiết Sphericity

Bảng Mauchly’s Test of Sphericity kiểm chứng giả định về phương sai của các sai lệch:

Bảng Mauchly's Test of Sphericity trong ANOVA đo lường lặp lại

Giá trị kiểm định Mauchly’s W bằng 0.104 với giá trị chi bình phương bằng 49.762 và mức ý nghĩa 0.000 cho thấy dữ liệu vi phạm giả định sphericity.

Cảnh báo: Khi vi phạm giả thiết sphericity (p < 0.05), cần sử dụng các điều chỉnh như Greenhouse-Geisser hoặc Huynh-Feldt để có kết quả chính xác.

Bảng kiểm định hiệu ứng within-subjects

Bảng Tests of Within-Subjects Effects cho thấy sự khác biệt về giá trị trung bình giữa các thời điểm:

Bảng Tests of Within-Subjects Effects trong ANOVA đo lường lặp lại

Các kiểm định cho thấy có sự khác biệt có ý nghĩa thống kê giữa các thời điểm (p < 0.05). Do vi phạm giả thiết sphericity, nên sử dụng kết quả có điều chỉnh.

Bảng kiểm định hiệu ứng between-subjects

Bảng Tests of Between-Subjects Effects thể hiện sự biến thiên giữa các đối tượng:

Bảng Tests of Between-Subjects Effects trong ANOVA đo lường lặp lại

So sánh từng cặp

Bảng Pairwise Comparisons cho thấy sự chênh lệch trung bình từng cặp theo từng thời điểm:

Bảng Pairwise Comparisons trong phân tích ANOVA đo lường lặp lại

Sự chênh lệch từng cặp được thực hiện theo kiểm định Bonferroni post hoc. Kết quả cho thấy:

  • Sự chênh lệch trung bình giữa năm 2011 và năm 2013 có ý nghĩa thống kê (p < 0.05)
  • Doanh thu điện thoại trung bình năm 2011 cao hơn năm 2013 là 356.3 triệu đồng/năm
  • Các so sánh khác cần xem xét dựa trên mức ý nghĩa cụ thể

Đồ thị minh họa

Biểu đồ doanh thu biên thể hiện trực quan sự thay đổi doanh thu qua thời gian:

Đồ thị Profile Plot thể hiện doanh thu trung bình qua 3 năm

Đồ thị cho thấy xu hướng giảm dần của doanh thu trung bình từ năm 2011 đến 2013, với mức giảm rõ rệt nhất vào năm 2013.

Lưu ý quan trọng và khuyến nghị

Các lỗi thường gặp:

  • Không kiểm tra giả thiết sphericity trước khi diễn giải kết quả
  • Sử dụng kết quả chưa điều chỉnh khi vi phạm giả thiết sphericity
  • Nhầm lẫn giữa within-subjectsbetween-subjects effects
  • Không thực hiện kiểm định post hoc khi ANOVA tổng thể có ý nghĩa
  • Cỡ mẫu: Đảm bảo cỡ mẫu đủ lớn để phát hiện hiệu ứng có ý nghĩa
  • Missing data: Xử lý cẩn thận dữ liệu thiếu vì có thể ảnh hưởng đến cấu trúc lặp lại
  • Tính thực tiễn: Xem xét ý nghĩa thực tiễn của sự khác biệt, không chỉ ý nghĩa thống kê
  • Giả thiết phụ: Kiểm tra phân phối chuẩn và điểm dị biệt trước khi phân tích

Xem thêm: Kiểm định tham số trong thực hành kinh tế lượng

Tổng kết

Phân tích ANOVA đo lường lặp lại một chiều là công cụ mạnh mẽ trong thực hành kinh tế lượng để nghiên cứu sự thay đổi của biến phụ thuộc qua thời gian hoặc các điều kiện khác nhau. Qua ví dụ về doanh thu bán hàng điện thoại tại các cửa hàng ở TP.HCM, chúng ta đã học được:

  • Cách thiết lập và thực hiện phân tích trong SPSS
  • Tầm quan trọng của việc kiểm tra giả thiết sphericity
  • Cách diễn giải các bảng kết quả khác nhau
  • Sử dụng so sánh từng cặp để xác định sự khác biệt cụ thể
  • Ứng dụng trong các bài toán kinh tế thực tế

Kết quả nghiên cứu cho thấy có sự khác biệt có ý nghĩa thống kê về doanh thu bán hàng điện thoại giữa các năm 2011-2013, với xu hướng giảm dần qua thời gian. Điều này có thể phản ánh những thay đổi trong thị trường điện thoại di động tại Việt Nam trong giai đoạn này.

Điểm chính cần ghi nhớ:

  • ANOVA đo lường lặp lại phù hợp cho dữ liệu có cấu trúc phụ thuộc giữa các quan sát
  • Kiểm tra giả thiết sphericity là bước quan trọng để đảm bảo độ tin cậy
  • Sử dụng điều chỉnh thích hợp khi vi phạm giả thiết
  • So sánh từng cặp giúp xác định sự khác biệt cụ thể giữa các nhóm
  • Đồ thị profile plot hỗ trợ hiểu rõ xu hướng thay đổi qua thời gian

Phụ lục: Code tương đương cho các phần mềm khác

SPSS Syntax

SPSS Syntax (.sps file)


* Phân tích ANOVA đo lường lặp lại một chiều trong SPSS
* Kiểm tra thống kê mô tả
DESCRIPTIVES VARIABLES=DT2011 DT2012 DT2013
  /STATISTICS=MEAN STDDEV MIN MAX.

* Kiểm tra tính chuẩn của dữ liệu
EXAMINE VARIABLES=DT2011 DT2012 DT2013
  /PLOT BOXPLOT STEMLEAF NPPLOT
  /COMPARE GROUPS
  /STATISTICS DESCRIPTIVES
  /CINTERVAL 95
  /MISSING LISTWISE
  /NOTOTAL.

* Thực hiện phân tích ANOVA đo lường lặp lại
GLM DT2011 DT2012 DT2013
  /WSFACTOR=Year 3 Polynomial
  /MEASURE=DT
  /METHOD=SSTYPE(3)
  /PLOT=PROFILE(Year)
  /EMMEANS=TABLES(Year) COMPARE ADJ(BONFERRONI)
  /PRINT=DESCRIPTIVE ETASQ OPOWER
  /CRITERIA=ALPHA(.05)
  /WSDESIGN=Year.

* Kiểm định sphericity riêng biệt (nếu cần)
RELIABILITY
  /VARIABLES=DT2011 DT2012 DT2013
  /SCALE('ALL VARIABLES') ALL
  /MODEL=ALPHA
  /STATISTICS=DESCRIPTIVE SCALE CORR COV
  /SUMMARY=TOTAL.

Stata

Stata Code (.do file)


* Phân tích ANOVA đo lường lặp lại một chiều trong Stata
* Mở dữ liệu
use "anova_lap_1_chieu.dta", clear

* Tạo cấu trúc dữ liệu dài (long format)
reshape long DT, i(id) j(year)

* Đặt nhãn cho biến
label define year_lab 2011 "Năm 2011" 2012 "Năm 2012" 2013 "Năm 2013"
label values year year_lab

* Thống kê mô tả
bysort year: summarize DT

* Kiểm tra phân phối chuẩn
bysort year: swilk DT

* Thực hiện ANOVA đo lường lặp lại
anova DT year id, repeated(year)

* Kiểm định sphericity (sử dụng epsilon)
estat sphericity

* So sánh từng cặp với điều chỉnh Bonferroni
pwcompare year, mcompare(bonferroni) effects

* Vẽ đồ thị profile plot
egen mean_DT = mean(DT), by(year)
twoway line mean_DT year, ///
    title("Doanh thu trung bình theo năm") ///
    xtitle("Năm") ///
    ytitle("Doanh thu trung bình (triệu đồng)") ///
    xlabel(2011 2012 2013) ///
    lwidth(medium) ///
    msymbol(circle) ///
    msize(medium)

* Kiểm tra hiệu ứng kích thước
estat esize

* Tính toán confidence intervals
margins year
marginsplot, ///
    title("Doanh thu trung bình với khoảng tin cậy 95%") ///
    xtitle("Năm") ///
    ytitle("Doanh thu dự đoán (triệu đồng)")

R Programming

R Code (.R file)


# Phân tích ANOVA đo lường lặp lại một chiều trong R
# Cài đặt và load các package cần thiết
if (!require(car)) install.packages("car")
if (!require(ez)) install.packages("ez")
if (!require(reshape2)) install.packages("reshape2")
if (!require(ggplot2)) install.packages("ggplot2")
if (!require(emmeans)) install.packages("emmeans")

library(car)
library(ez)
library(reshape2)
library(ggplot2)
library(emmeans)

# Đọc dữ liệu
data <- read.csv("anova_lap_1_chieu.csv")

# Tạo cấu trúc dữ liệu dài
data_long <- melt(data, 
                  id.vars = "id",
                  measure.vars = c("DT2011", "DT2012", "DT2013"),
                  variable.name = "year",
                  value.name = "DT")

# Đặt lại nhãn cho biến year
data_long$year <- factor(data_long$year, 
                        levels = c("DT2011", "DT2012", "DT2013"),
                        labels = c("2011", "2012", "2013"))

# Thống kê mô tả
aggregate(DT ~ year, data = data_long, 
          FUN = function(x) c(mean = mean(x), 
                             sd = sd(x), 
                             n = length(x)))

# Kiểm tra phân phối chuẩn
by(data_long$DT, data_long$year, shapiro.test)

# Thực hiện ANOVA đo lường lặp lại
anova_result <- ezANOVA(data = data_long,
                        dv = DT,
                        wid = id,
                        within = year,
                        detailed = TRUE,
                        type = 3)

print(anova_result)

# Kiểm định sphericity (Mauchly's test)
print(anova_result$`Mauchly's Test for Sphericity`)

# Điều chỉnh sphericity nếu cần
if (anova_result$`Mauchly's Test for Sphericity`$p < 0.05) {
  print("Vi phạm giả thiết sphericity - sử dụng điều chỉnh")
  print(anova_result$`Sphericity Corrections`)
}

# So sánh từng cặp
model <- aov(DT ~ year + Error(id/year), data = data_long)
emm <- emmeans(model, ~ year)
pairs(emm, adjust = "bonferroni")

# Vẽ đồ thị profile plot
ggplot(data_long, aes(x = year, y = DT, group = 1)) +
  stat_summary(fun = mean, geom = "point", size = 3) +
  stat_summary(fun = mean, geom = "line", aes(group = 1), size = 1) +
  stat_summary(fun.data = mean_se, geom = "errorbar", width = 0.1) +
  labs(title = "Doanh thu trung bình theo năm",
       x = "Năm",
       y = "Doanh thu trung bình (triệu đồng)") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

# Boxplot để kiểm tra phân phối
ggplot(data_long, aes(x = year, y = DT)) +
  geom_boxplot(fill = "lightblue", alpha = 0.7) +
  geom_jitter(width = 0.2, alpha = 0.5) +
  labs(title = "Phân phối doanh thu theo năm",
       x = "Năm",
       y = "Doanh thu (triệu đồng)") +
  theme_minimal()

# Tính effect size
eta_squared <- anova_result$ANOVA$SSn[1] / 
               (anova_result$ANOVA$SSn[1] + anova_result$ANOVA$SSd[1])
print(paste("Eta squared:", round(eta_squared, 3)))

Python

Python Code (.py file)


# Phân tích ANOVA đo lường lặp lại một chiều trong Python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
from scipy.stats import f_oneway
from statsmodels.stats.anova import AnovaRM
from statsmodels.stats.multicomp import pairwise_tukeyhsd
import warnings
warnings.filterwarnings('ignore')

# Đọc dữ liệu
data = pd.read_csv('anova_lap_1_chieu.csv')

# Tạo cấu trúc dữ liệu dài
data_long = pd.melt(data, 
                    id_vars=['id'],
                    value_vars=['DT2011', 'DT2012', 'DT2013'],
                    var_name='year',
                    value_name='DT')

# Đặt lại nhãn cho biến year
data_long['year'] = data_long['year'].map({
    'DT2011': '2011',
    'DT2012': '2012', 
    'DT2013': '2013'
})

# Thống kê mô tả
desc_stats = data_long.groupby('year')['DT'].agg(['mean', 'std', 'count'])
print("Thống kê mô tả:")
print(desc_stats)

# Kiểm tra phân phối chuẩn
print("\nKiểm định Shapiro-Wilk cho từng năm:")
for year in data_long['year'].unique():
    subset = data_long[data_long['year'] == year]['DT']
    stat, p_value = stats.shapiro(subset)
    print(f"Năm {year}: W = {stat:.4f}, p = {p_value:.4f}")

# Thực hiện ANOVA đo lường lặp lại
anova_rm = AnovaRM(data_long, 'DT', 'id', within=['year'])
anova_result = anova_rm.fit()

print("\nKết quả ANOVA đo lường lặp lại:")
print(anova_result.summary())

# Kiểm định sphericity (Mauchly's test) - approximation
def mauchly_test(data_wide):
    """
    Xấp xỉ kiểm định Mauchly cho sphericity
    """
    # Tính ma trận hiệp phương sai
    cov_matrix = np.cov(data_wide.T)
    
    # Tính determinant và trace
    det_cov = np.linalg.det(cov_matrix)
    trace_cov = np.trace(cov_matrix)
    
    # Tính epsilon (Greenhouse-Geisser correction)
    k = len(data_wide.columns)
    epsilon = (trace_cov / k) ** 2 / np.mean(np.diag(cov_matrix))
    
    return epsilon

# Áp dụng kiểm định sphericity
data_wide = data.set_index('id')[['DT2011', 'DT2012', 'DT2013']]
epsilon = mauchly_test(data_wide)
print(f"\nGreenhouse-Geisser epsilon: {epsilon:.4f}")

# So sánh từng cặp (Post-hoc test)
print("\nSo sánh từng cặp (Tukey HSD):")
tukey_result = pairwise_tukeyhsd(data_long['DT'], data_long['year'], alpha=0.05)
print(tukey_result)

# Vẽ đồ thị profile plot
plt.figure(figsize=(10, 6))

# Tính trung bình và standard error
means = data_long.groupby('year')['DT'].mean()
sems = data_long.groupby('year')['DT'].sem()

plt.errorbar(means.index, means.values, yerr=sems.values, 
             marker='o', linewidth=2, markersize=8, capsize=5)
plt.xlabel('Năm')
plt.ylabel('Doanh thu trung bình (triệu đồng)')
plt.title('Doanh thu trung bình theo năm với khoảng tin cậy 95%')
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

# Boxplot
plt.figure(figsize=(10, 6))
sns.boxplot(data=data_long, x='year', y='DT')
plt.xlabel('Năm')
plt.ylabel('Doanh thu (triệu đồng)')
plt.title('Phân phối doanh thu theo năm')
plt.tight_layout()
plt.show()

# Tính effect size (eta squared)
def eta_squared(anova_result):
    """Tính eta squared từ kết quả ANOVA"""
    ss_effect = anova_result.anova_table['sum_sq'].iloc[0]
    ss_total = anova_result.anova_table['sum_sq'].sum()
    return ss_effect / ss_total

eta_sq = eta_squared(anova_result)
print(f"\nEta squared: {eta_sq:.3f}")

# Phân loại effect size
if eta_sq < 0.01:
    effect_size = "nhỏ"
elif eta_sq < 0.06:
    effect_size = "trung bình"
elif eta_sq < 0.14:
    effect_size = "lớn"
else:
    effect_size = "rất lớn"

print(f"Kích thước hiệu ứng: {effect_size}")

# Ma trận tương quan giữa các thời điểm
print("\nMa trận tương quan giữa các năm:")
correlation_matrix = data_wide.corr()
print(correlation_matrix.round(3))

# Heatmap cho ma trận tương quan
plt.figure(figsize=(8, 6))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0)
plt.title('Ma trận tương quan giữa các năm')
plt.tight_layout()
plt.show()

Tài liệu tham khảo

  • IBM SPSS Statistics Documentation: General Linear Model – Repeated Measures
  • Field, A. (2018). Discovering Statistics Using IBM SPSS Statistics. SAGE Publications
  • Tabachnick, B. G., & Fidell, L. S. (2019). Using Multivariate Statistics. Pearson
  • Maxwell, S. E., & Delaney, H. D. (2004). Designing Experiments and Analyzing Data: A Model Comparison Perspective. Lawrence Erlbaum Associates
  • Nguyễn Đình Thọ (2013). Phương pháp nghiên cứu khoa học trong kinh doanh. NXB Lao động – Xã hội
  • Hoàng Trọng & Chu Nguyễn Mộng Ngọc (2008). Phân tích dữ liệu nghiên cứu với SPSS. NXB Hồng Đức
Xem thêm
Back to top button