Phân rã chuỗi thời gian: Hiểu xu hướng, tính mùa vụ và nhiễu
Tìm hiểu cách tách dữ liệu chuỗi thời gian thành các thành phần có ý nghĩa như xu hướng, mùa vụ và phần dư bằng mô hình cộng và nhân. Tìm hiểu cả phương pháp cổ điển và STL. Khám phá điều chỉnh mùa vụ và thực hành dự báo với các mô hình phân rã.
Phân rã là một trong những chủ đề thú vị hơn trong khoa học dữ liệu. Cốt lõi của phân rã là tách một thứ phức tạp thành các phần đơn giản hơn, dễ diễn giải hơn. Điều này có thể áp dụng cho ma trận, mô hình hoặc tín hiệu.
Vì là một ý tưởng khái quát, nó có thể có nhiều dạng. Trong đại số tuyến tính, có phân rã QR, phân rã trị riêng, phân rã giá trị kỳ dị và phân rã Cholesky, v.v. Ở các lĩnh vực khác, có biến đổi Fourier, phân tích thành phần chính, và thậm chí mô hình chủ đề bằng các phương pháp như LDA. Mức biến thiên trong mô hình hồi quy có thể được phân rã thành các thành phần tổng bình phương: SST, SSR và SSE. Ta thậm chí có thể xem cây quyết định như một dạng phân rã.
Tại đây, chúng ta sẽ điểm lại một chủ đề ưa thích: phân rã chuỗi thời gian. Nếu cuối bài viết bạn thấy hứng thú hơn, hãy tham gia khóa học Dự báo trong R với Giáo sư Rob Hyndman.
Phân rã chuỗi thời gian là gì?
Phân rã chuỗi thời gian là phương pháp tách một chuỗi thời gian thành các thành phần riêng biệt gọi là xu hướng hoặc xu hướng-chu kỳ, tính mùa vụ và phần dư. Mục đích của phân rã chuỗi thời gian là hiểu rõ hơn các mẫu hình cơ bản và nâng cao độ chính xác dự báo.
Các thành phần của một chuỗi thời gian là gì?
Hãy cùng xem các thành phần của chuỗi thời gian. Đây có thể là cách tốt nhất để nắm ý tưởng.
Thành phần xu hướng
Xu hướng của chuỗi thời gian (đúng như tên gọi) là chuyển động dài hạn. Cần nói rằng thành phần xu hướng thường được coi là xu hướng-chu kỳ, trong đó chu kỳ được hiểu là các mẫu hình dài hạn, không đều. Doanh số bán ô tô trước đây được cho là có chu kỳ bảy năm (vì lý do nào đó), mặc dù có lẽ với xu hướng chuyển sang xe điện thì không còn như vậy nữa.
Điều mà người ta thường rút ra từ xu hướng là: Dữ liệu tăng, giảm hay ổn định trong dài hạn? Sự gia tăng nhiệt độ đại dương toàn cầu trong vài thập kỷ qua là một xu hướng rõ ràng (và tệ).
Thành phần mùa vụ
Thành phần mùa vụ sẽ cần giải thích dài hơn một chút vì phức tạp hơn. Thành phần mùa vụ của chuỗi thời gian là các chu kỳ ngắn lặp lại trong dữ liệu xuất hiện theo khoảng thời gian đều đặn. Hãy nghĩ theo ngày, tháng, tuần, quý. Điểm mấu chốt là các khoảng phải tương đối đều. Chẳng hạn, bạn có thể thấy đơn hàng ở quán cà phê có mùa vụ theo tuần nếu mọi người thích pha cà phê ở nhà vào Chủ nhật. (Chúng ta sẽ xem xét câu hỏi về đơn hàng quán cà phê ở phần tiếp theo.)
Điều về tính mùa vụ là nó có thể phức tạp hơn vẻ bề ngoài. Hãy nghĩ xem số tuần trong một năm không phải số nguyên (~52,18). Hoặc các tháng không cách đều: Tháng Hai có 28 (hoặc 29) ngày, còn Tháng Bảy luôn có 31 ngày.
Hơn nữa, vì mỗi năm có hơn 52 tuần một chút và các tháng cũng thay đổi, bạn không thể chia hầu hết tháng thành các tuần một cách đều đặn. Điều này hiển nhiên khi nhìn lịch. Nhưng điều ít hiển nhiên hơn với nhà phân tích dữ liệu là khi bạn xem dữ liệu theo tuần rồi tổng hợp lên theo tháng, bạn có thể thấy những điểm không nhất quán, như tháng Một năm nay có bốn ngày Thứ Hai, nhưng năm sau có năm ngày.
Thành phần phần dư / bất thường / còn lại
Mọi thứ còn lại sau khi loại bỏ xu hướng-chu kỳ và thành phần mùa vụ, ta gọi đúng nghĩa là thành phần phần dư, bao gồm các yếu tố bất thường trong dữ liệu, như một sự kiện lớn, và nhiễu ngẫu nhiên. Trái với suy nghĩ vì tên gọi của nó, thành phần phần dư không phải là thứ vô dụng. Mọi dữ liệu đều có biến thiên không giải thích được, và định lượng độ lớn của biến thiên đó là quan trọng. Thú vị là phần dư thường có dạng phân phối Gaussian trong một chuỗi "ngoan ngoãn", khi đó ta có thể đánh giá các sự kiện thiên nga đen bằng kiểm định giả thuyết.
Mô hình phân rã chuỗi thời gian
Giờ khi đã hiểu các phần cấu thành của chuỗi thời gian, cần nhắc rằng thực ra có hai dạng phân rã chuỗi thời gian tổng quát. Ta sẽ bắt đầu với mô hình cộng.
Phân rã cộng
Đây là công thức cho phân rã cộng:
Lưu ý các dấu cộng. Công thức này nói rằng nếu bạn lấy xu hướng cộng với thành phần mùa vụ, rồi cộng thêm phần dư, bạn sẽ thu lại chuỗi thời gian gốc. Nói chung, ta dùng phân rã cộng khi biến thiên theo mùa là hằng định theo thời gian.
Phân rã nhân
Đây là công thức cho phân rã nhân. Lưu ý các dấu nhân trong phiên bản này.
Ta dùng mô hình nhân khi biến thiên theo mùa tỷ lệ theo xu hướng. Tức là khi bạn thấy kích thước tác động mùa vụ lớn dần khi toàn bộ chuỗi tăng hoặc giảm. Những gì ta mô tả ở đây thực chất là một dạng phương sai không đồng nhất.
Kỹ thuật phân rã chuỗi thời gian
Đến đây, ta đã nói về những gì tạo nên phân rã chuỗi thời gian và hai dạng chính. Tiếp theo, cần bàn về hai phương pháp phổ biến nhất. Mỗi phương pháp đều có thể áp dụng dưới dạng mô hình cộng hoặc nhân.
Phân rã cổ điển
Phân rã cổ điển dễ hiểu hơn. Nó xuất hiện từ những năm 1920 nhưng đến nay vẫn còn phù hợp. Để minh họa phân rã cổ điển, hãy dùng Excel. Phân rã cổ điển, giống STL sẽ trình bày sau, có thể thực hiện theo mô hình cộng hoặc nhân. Ở ví dụ này, ta sẽ tạo phiên bản cộng.
Nếu muốn tự thử, hãy dùng file CSV index_1 trong bộ dữ liệu doanh số cà phê rất thú vị trên Kaggle. Tham khảo, chúng tôi đã tổng hợp và tóm tắt doanh số theo ngày.
Đầu tiên, ta tính xu hướng-chu kỳ. Ta xác định có mùa vụ theo tuần, và có bảy ngày trong một tuần, nên chu kỳ mùa vụ là số lẻ, tức là trung bình trượt cần được căn giữa bằng cửa sổ đối xứng. Tức trung bình trượt 7 ngày. Hãy cẩn thận với căn chỉnh và căn giữa trong bảng Excel.
Tiếp theo, ta tìm chuỗi đã khử xu hướng bằng cách lấy chuỗi gốc trừ đi xu hướng.
Sau đó, để tìm thành phần mùa vụ, ta lấy trung bình các giá trị đã khử xu hướng cho mỗi chu kỳ mùa vụ. Một bổ sung quan trọng: Bạn sẽ thấy thành phần mùa vụ có thể không cộng lại đúng bằng 0. Hãy điều chỉnh điều này bằng chuẩn hóa:
Tính trung bình của thành phần mùa vụ.
Trừ trung bình mùa vụ khỏi mọi giá trị mùa vụ.
Cuối cùng, với phần còn lại, ta trừ xu hướng và chu kỳ mùa vụ khỏi chuỗi gốc.
Nếu thấy chuỗi của ta có tác động mùa vụ thay đổi theo mức dữ liệu, ta sẽ cân nhắc phân rã nhân. Các bước với phân rã nhân gần như tương tự, chỉ khác là dùng phép chia thay vì phép trừ. Cụ thể, ta sẽ tìm chuỗi đã khử xu hướng bằng cách chia chuỗi gốc cho xu hướng-chu kỳ. Sau đó, để tìm phần còn lại, ta sẽ chia chuỗi gốc cho tích của các thành phần xu hướng và mùa vụ. (Ngoài ra, ta có thể lấy log tự nhiên của chuỗi gốc và áp dụng phân rã cộng. Về mặt chức năng là tương đương.)
Phân rã STL
Phân rã STL, viết tắt của seasonal and trend decomposition using LOESS, là phiên bản hiện đại hơn. Khó giải thích hơn, nhưng nhìn chung linh hoạt hơn phương pháp cổ điển. STL hoạt động bằng cách dùng phương pháp gọi là LOESS, vốn khớp các mô hình hồi quy đơn giản cho các đoạn dữ liệu nhỏ chồng lấn. Nó áp dụng hồi quy có trọng số cục bộ này để tách riêng các thành phần xu hướng và mùa vụ.
Phương pháp này khắc phục những nhược điểm cụ thể của phân rã cổ điển, cụ thể là trong phiên bản cổ điển, không có ước lượng xu hướng-chu kỳ hoặc phần còn lại cho các quan sát đầu và cuối. Bạn có thể thấy điều này ở các ô trống trong Excel, tại các hàng 3, 4, 5 và 20, 21, 22 phía trên.
Cũng cần nói rằng xu hướng-chu kỳ theo phân rã cổ điển sẽ làm mượt các mức tăng giảm nhanh, nên có thể bỏ qua những điều quan trọng diễn ra trong chuỗi. Cuối cùng, phân rã cổ điển mặc nhiên cho rằng tồn tại một mẫu mùa vụ, nhưng nếu có đủ dữ liệu, đôi khi ta có thể thấy mẫu mùa vụ thay đổi.
Hãy bắt đầu bằng cách tạo biểu đồ thời gian của chuỗi gốc. Như trước, bước đầu tiên là tổng hợp và tóm tắt bộ dữ liệu Kaggle để có chuỗi ta quan tâm.
coffee_sales_data <- read.csv("/Users/x/Desktop/index_1.csv")
coffee_sales_data <- as.data.frame(coffee_sales_data)Được hỗ trợ bởi
Phân rã STL cũng có một số điểm hạn chế, và nếu bạn quan tâm, chúng tôi đã đưa thông tin đó vào phần Câu hỏi thường gặp.
Phân rã chuỗi thời gian và điều chỉnh mùa vụ
Nhiều khi, tạo một phiên bản dữ liệu đã điều chỉnh mùa vụ là hữu ích. Phân rã chuỗi thời gian giúp thực hiện điều này. Để tạo phiên bản điều chỉnh mùa vụ, ta chỉ cần cộng thành phần xu hướng và phần còn lại. Hoặc ta có thể trừ thành phần mùa vụ khỏi chuỗi gốc; cả hai cách đều cho ra cùng một kết quả.
Chúng tôi nhận thấy bộ dữ liệu này không có tính mùa vụ đặc biệt mạnh, điều đó tự nó cũng thú vị.
Sức mạnh của dữ liệu đã điều chỉnh mùa vụ là giúp ta hiểu một số đặc điểm của chuỗi. Chẳng hạn ta có thể xem xu hướng cơ bản có phải do mùa vụ hay không. Thứ hai, ta có thể xem xét kỹ hơn các hiện tượng bất thường trong dữ liệu. Ta nghĩ chương trình khuyến mãi Thứ Sáu hiệu quả vì đó là Thứ Sáu hay vì đó là khuyến mãi? Với phân rã chuỗi thời gian và điều chỉnh mùa vụ, ta có thể kiểm định những câu hỏi như vậy.
Phân rã chuỗi thời gian và dự báo
Có thể bạn sẽ ngạc nhiên khi biết phân rã chuỗi thời gian cũng hữu ích trong dự báo. Chúng tôi nhìn nhận điều này theo hai cách chính. Thứ nhất, chúng ta muốn hiểu các thành phần chuỗi thời gian để giúp quyết định mô hình dự báo nên dùng. Nếu thấy tính mùa vụ mạnh, ta có thể thiên về các mô hình như san bằng mũ Holt-Winters hoặc các phương pháp ETS, vốn được xây dựng để xử lý cả xu hướng và mùa vụ.
Thứ hai, ta thậm chí có thể dùng dữ liệu đã phân rã như một phần của dự báo, điều này cho ta thêm lựa chọn. Ví dụ, ta có thể chạy một mô hình dự báo phi mùa vụ trên phiên bản dữ liệu đã điều chỉnh mùa vụ. (Ta có thể đưa lại thành phần mùa vụ sau đó.) Điều chỉnh mùa vụ đặc biệt hữu ích khi muốn dùng các mô hình linh hoạt như ARIMA tiêu chuẩn và hồi quy tuyến tính.
Ở đây, chúng ta tạo một mô hình ARIMA đơn giản để dự báo dữ liệu đã điều chỉnh mùa vụ.
season_adjust_data_filtered <- season_adjust_data |>
filter(series =="season_adjust")|>
as_tsibble(index = date)
seasonal_adjust_arima_model <- season_adjust_data_filtered |>
model(
ARIMA(value))
seasonal_adjust_arima_model |>
forecast(h ="14 days")|>
autoplot(season_adjust_data_filtered, color ='#01ef63')+
labs(title ="Forecast of Seasonally Adjusted Coffee Sales",
subtitle ="Simple ARIMA Model",
y ="Money (Seasonally Adjusted)",
x ="Date")Được hỗ trợ bởi
Ta cũng có thể dự báo chuỗi đã điều chỉnh mùa vụ và cộng lại thành phần mùa vụ, về thực chất tạo ra dự báo có mùa vụ. Tất cả có được nhờ phân rã ban đầu.
# Build tagged historical and forecast data
historical_data <- components |>
as_tibble()|>
select(date, money)|>
mutate(source ="historical")
forecast_data <- final_forecast |>
as_tibble()|>
transmute(date, money = money_forecast)|>
mutate(source ="forecast")# Bind and create tsibble
full_data <- bind_rows(historical_data, forecast_data)|>
as_tsibble(index = date, validate =FALSE)# Plot with color by source
full_data |>
ggplot(aes(x = date, y = money, color = source))+
geom_line()+
scale_color_manual(values = c("historical"="#203147",# dark blue for real data"forecast"="#01ef63"# green for forecast))+
labs(
title ="Coffee Sales: Actual and Forecast",
subtitle ="Historical vs Forecast",
y ="Money",
x ="Date")Được hỗ trợ bởi
Lời kết
Tôi hy vọng bạn thích bài viết về phân rã chuỗi thời gian! Hãy nhớ rằng phân rã chỉ là một phần của phân tích chuỗi thời gian, nên để trở thành chuyên gia, hãy ghi danh khóa học Dự báo trong R với Giáo sư Rob Hyndman, người đã góp phần phát triển các gói R mà chúng tôi dùng để dựng hình. Chúng tôi cũng có khóa Trực quan hóa dữ liệu chuỗi thời gian bằng Python nếu bạn thấy các ý tưởng trong bài này thú vị nhưng thích Python hơn, vốn cũng rất phù hợp cho dạng công việc này.
Tác giả
Josef Waples
Tôi là một cây bút và biên tập viên về khoa học dữ liệu, đã có bài đóng góp cho các nghiên cứu đăng trên tạp chí khoa học. Tôi đặc biệt quan tâm đến đại số tuyến tính, thống kê, R và các chủ đề tương tự. Tôi cũng chơi cờ vua khá thường xuyên!
Tôi là một chiến lược gia nội dung, yêu thích việc đơn giản hóa các chủ đề phức tạp. Tôi đã giúp các công ty như Splunk, Hackernoon và Tiiny Host tạo nội dung hấp dẫn và giàu thông tin cho khán giả của họ.
FAQs
Phân rã chuỗi thời gian là gì?⌄
Phân rã chuỗi thời gian là quá trình tách một chuỗi thời gian thành ba thành phần có thể diễn giải: xu hướng, tính mùa vụ và phần dư (hay thành phần bất thường). Xu hướng cho thấy diễn biến dài hạn, thành phần mùa vụ nắm bắt các chu kỳ ngắn lặp lại, và phần dư phản ánh nhiễu ngẫu nhiên hoặc các sự kiện bất ngờ. Phân rã giúp nhà phân tích hiểu cấu trúc dữ liệu tốt hơn và có thể cải thiện dự báo bằng cách mô hình hóa riêng từng thành phần.
Tại sao có giá trị thiếu ở đầu và cuối trong phân rã cổ điển?⌄
Trung bình trượt căn giữa yêu cầu dữ liệu đối xứng quanh mỗi điểm. Với trung bình trượt 7 ngày, bạn không thể tính giá trị căn giữa cho ba ngày đầu hoặc ba ngày cuối. Do đó, phân rã cổ điển không cung cấp ước lượng ở rìa, để lại khoảng trống trong các thành phần xu hướng, mùa vụ và phần dư tại biên.
Khi nào nên dùng phân rã cộng so với phân rã nhân?⌄
Dùng phân rã cộng khi dao động mùa vụ xấp xỉ không đổi theo thời gian.
Dùng phân rã nhân khi thành phần mùa vụ tăng hoặc giảm theo xu hướng, tức là tác động tỷ lệ theo mức dữ liệu. Điều này thường xảy ra trong các chuỗi thời gian có phương sai không đồng nhất (phương sai không hằng số).
Tôi có thể chuyển đổi giữa phân rã cộng và phân rã nhân không?⌄
Có. Cách phổ biến là biến đổi log chuỗi và áp dụng phân rã cộng. Điều này tương đương về mặt toán học với mô hình nhân trên thang đo gốc. Nó có thể đơn giản hóa việc mô hình hóa và ổn định phương sai.
Phần dư từ phân rã có luôn theo phân phối Gaussian không?⌄
Không. Mặc dù phân rã STL giả định phần dư xấp xỉ phân phối chuẩn, điều này không phải lúc nào cũng đúng trong dữ liệu thực tế. Phần dư có thể bị lệch, nhọn hoặc chịu ảnh hưởng của ngoại lệ và đứt gãy cấu trúc. Tuy nhiên, nếu phân rã phù hợp, thành phần còn lại thường giống nhiễu Gaussian.
Nhược điểm của phân rã cổ điển là gì?⌄
Phân rã cổ điển có một số hạn chế:
Hiệu ứng biên: Như đã nêu, không thể ước lượng xu hướng-chu kỳ hoặc phần dư ở đầu hoặc cuối chuỗi.
Mùa vụ cố định: Giả định các mẫu mùa vụ ổn định và không thay đổi theo thời gian.
Nhạy cảm với ngoại lệ: Vì dựa trên trung bình trượt và trung bình đơn giản, nên dễ bị sai lệch bởi các giá trị cực đoan.
Tính linh hoạt hạn chế: Sử dụng các quy tắc làm mượt định sẵn và không thích ứng tốt với các mẫu bất thường.
Điều gì khiến phân rã STL tốt hơn phân rã cổ điển?⌄
STL khắc phục nhiều hạn chế của phân rã cổ điển:
Xử lý mùa vụ không hằng, nơi các mẫu thay đổi theo thời gian.
Cung cấp ước lượng ở biên, tránh thiếu giá trị ở rìa.
Cho phép tham số làm mượt do người dùng chọn, mang lại nhiều kiểm soát mức làm mượt của từng thành phần.
Mạnh với ngoại lệ nhờ các tùy chọn khớp mạnh.
Phân rã STL có hạn chế nào không?⌄
Có. Dù STL linh hoạt hơn, vẫn có vài lưu ý:
STL chỉ hỗ trợ phân rã cộng, không hỗ trợ nhân. Nếu có hành vi nhân, cần biến đổi log.
Yêu cầu tinh chỉnh tham số cho cửa sổ mùa vụ và xu hướng để đạt kết quả tối ưu.
Giả định mùa vụ tuần hoàn, có thể không mô tả tốt các chu kỳ không đều hoặc thay đổi nếu không điều chỉnh.
LOESS trong phân rã STL là gì?⌄
LOESS (Locally Estimated Scatterplot Smoothing) là một dạng hồi quy cục bộ được dùng trong phân rã STL để ước lượng các đường cong mượt trên những tập con của dữ liệu. Thay vì khớp một xu hướng toàn cục duy nhất, LOESS khớp nhiều mô hình hồi quy đơn giản trên các cửa sổ chồng lấn. Các khớp cục bộ này sau đó được kết hợp để tạo ước lượng mượt cho các thành phần xu hướng và mùa vụ. Điều này khiến LOESS đặc biệt hữu ích để nắm bắt các thay đổi dần dần và mẫu bất quy tắc trong dữ liệu chuỗi thời gian.
Trung bình trượt trong phân tích chuỗi thời gian là gì?⌄
Một trung bình trượt là kỹ thuật làm mượt dùng để giảm dao động ngắn hạn và làm nổi bật các xu hướng dài hạn trong dữ liệu chuỗi thời gian. Nó hoạt động bằng cách lấy trung bình các giá trị trong một cửa sổ cố định (như 7 ngày hoặc 12 tháng) "trượt" dọc theo chuỗi. Ví dụ, trung bình trượt 7 ngày làm mượt mỗi điểm bằng cách lấy trung bình với ba ngày trước và sau. Trung bình trượt thường được dùng để ước lượng thành phần xu hướng trong phân rã cổ điển.
Mô hình phân rã là gì?⌄
Mô hình phân rã là cách tách một chuỗi thời gian thành các phần riêng biệt, mỗi phần giải thích một dạng mẫu trong dữ liệu. Các phần này thường bao gồm xu hướng (hướng đi dài hạn), mùa vụ (chu kỳ ngắn lặp lại) và phần dư (nhiễu ngẫu nhiên hoặc sự kiện bất thường). Có hai loại mô hình phân rã chính: cộng, trong đó các phần được cộng lại với nhau, và nhân, trong đó các phần được nhân với nhau. Việc lựa chọn phụ thuộc vào việc mức độ thay đổi theo mùa có giữ nguyên hay tăng theo mức chung của dữ liệu.
Nắm vững các kỹ năng cần thiết để sử dụng Excel, từ việc chuẩn bị dữ liệu, viết công thức đến tạo biểu đồ và đồ thị. Không yêu cầu kinh nghiệm trước đó.
Phân rã là một trong những chủ đề thú vị hơn trong khoa học dữ liệu. Cốt lõi của phân rã là tách một thứ phức tạp thành các phần đơn giản hơn, dễ diễn giải hơn. Điều này có thể áp dụng cho ma trận, mô hình hoặc tín hiệu.
Vì là một ý tưởng khái quát, nó có thể có nhiều dạng. Trong đại số tuyến tính, có phân rã QR, phân rã trị riêng, phân rã giá trị kỳ dị và phân rã Cholesky, v.v. Ở các lĩnh vực khác, có biến đổi Fourier, phân tích thành phần chính, và thậm chí mô hình chủ đề bằng các phương pháp như LDA. Mức biến thiên trong mô hình hồi quy có thể được phân rã thành các thành phần tổng bình phương: SST, SSR và SSE. Ta thậm chí có thể xem cây quyết định như một dạng phân rã.
Tại đây, chúng ta sẽ điểm lại một chủ đề ưa thích: phân rã chuỗi thời gian. Nếu cuối bài viết bạn thấy hứng thú hơn, hãy tham gia khóa học Dự báo trong R với Giáo sư Rob Hyndman.
Phân rã chuỗi thời gian là gì?
Phân rã chuỗi thời gian là phương pháp tách một chuỗi thời gian thành các thành phần riêng biệt gọi là xu hướng hoặc xu hướng-chu kỳ, tính mùa vụ và phần dư. Mục đích của phân rã chuỗi thời gian là hiểu rõ hơn các mẫu hình cơ bản và nâng cao độ chính xác dự báo.
Các thành phần của một chuỗi thời gian là gì?
Hãy cùng xem các thành phần của chuỗi thời gian. Đây có thể là cách tốt nhất để nắm ý tưởng.
Thành phần xu hướng
Xu hướng của chuỗi thời gian (đúng như tên gọi) là chuyển động dài hạn. Cần nói rằng thành phần xu hướng thường được coi là xu hướng-chu kỳ, trong đó chu kỳ được hiểu là các mẫu hình dài hạn, không đều. Doanh số bán ô tô trước đây được cho là có chu kỳ bảy năm (vì lý do nào đó), mặc dù có lẽ với xu hướng chuyển sang xe điện thì không còn như vậy nữa.
Điều mà người ta thường rút ra từ xu hướng là: Dữ liệu tăng, giảm hay ổn định trong dài hạn? Sự gia tăng nhiệt độ đại dương toàn cầu trong vài thập kỷ qua là một xu hướng rõ ràng (và tệ).
Thành phần mùa vụ
Thành phần mùa vụ sẽ cần giải thích dài hơn một chút vì phức tạp hơn. Thành phần mùa vụ của chuỗi thời gian là các chu kỳ ngắn lặp lại trong dữ liệu xuất hiện theo khoảng thời gian đều đặn. Hãy nghĩ theo ngày, tháng, tuần, quý. Điểm mấu chốt là các khoảng phải tương đối đều. Chẳng hạn, bạn có thể thấy đơn hàng ở quán cà phê có mùa vụ theo tuần nếu mọi người thích pha cà phê ở nhà vào Chủ nhật. (Chúng ta sẽ xem xét câu hỏi về đơn hàng quán cà phê ở phần tiếp theo.)
Điều về tính mùa vụ là nó có thể phức tạp hơn vẻ bề ngoài. Hãy nghĩ xem số tuần trong một năm không phải số nguyên (~52,18). Hoặc các tháng không cách đều: Tháng Hai có 28 (hoặc 29) ngày, còn Tháng Bảy luôn có 31 ngày.
Hơn nữa, vì mỗi năm có hơn 52 tuần một chút và các tháng cũng thay đổi, bạn không thể chia hầu hết tháng thành các tuần một cách đều đặn. Điều này hiển nhiên khi nhìn lịch. Nhưng điều ít hiển nhiên hơn với nhà phân tích dữ liệu là khi bạn xem dữ liệu theo tuần rồi tổng hợp lên theo tháng, bạn có thể thấy những điểm không nhất quán, như tháng Một năm nay có bốn ngày Thứ Hai, nhưng năm sau có năm ngày.
Thành phần phần dư / bất thường / còn lại
Mọi thứ còn lại sau khi loại bỏ xu hướng-chu kỳ và thành phần mùa vụ, ta gọi đúng nghĩa là thành phần phần dư, bao gồm các yếu tố bất thường trong dữ liệu, như một sự kiện lớn, và nhiễu ngẫu nhiên. Trái với suy nghĩ vì tên gọi của nó, thành phần phần dư không phải là thứ vô dụng. Mọi dữ liệu đều có biến thiên không giải thích được, và định lượng độ lớn của biến thiên đó là quan trọng. Thú vị là phần dư thường có dạng phân phối Gaussian trong một chuỗi "ngoan ngoãn", khi đó ta có thể đánh giá các sự kiện thiên nga đen bằng kiểm định giả thuyết.
Mô hình phân rã chuỗi thời gian
Giờ khi đã hiểu các phần cấu thành của chuỗi thời gian, cần nhắc rằng thực ra có hai dạng phân rã chuỗi thời gian tổng quát. Ta sẽ bắt đầu với mô hình cộng.
Phân rã cộng
Đây là công thức cho phân rã cộng:
Lưu ý các dấu cộng. Công thức này nói rằng nếu bạn lấy xu hướng cộng với thành phần mùa vụ, rồi cộng thêm phần dư, bạn sẽ thu lại chuỗi thời gian gốc. Nói chung, ta dùng phân rã cộng khi biến thiên theo mùa là hằng định theo thời gian.
Phân rã nhân
Đây là công thức cho phân rã nhân. Lưu ý các dấu nhân trong phiên bản này.
Ta dùng mô hình nhân khi biến thiên theo mùa tỷ lệ theo xu hướng. Tức là khi bạn thấy kích thước tác động mùa vụ lớn dần khi toàn bộ chuỗi tăng hoặc giảm. Những gì ta mô tả ở đây thực chất là một dạng phương sai không đồng nhất.
Kỹ thuật phân rã chuỗi thời gian
Đến đây, ta đã nói về những gì tạo nên phân rã chuỗi thời gian và hai dạng chính. Tiếp theo, cần bàn về hai phương pháp phổ biến nhất. Mỗi phương pháp đều có thể áp dụng dưới dạng mô hình cộng hoặc nhân.
Phân rã cổ điển
Phân rã cổ điển dễ hiểu hơn. Nó xuất hiện từ những năm 1920 nhưng đến nay vẫn còn phù hợp. Để minh họa phân rã cổ điển, hãy dùng Excel. Phân rã cổ điển, giống STL sẽ trình bày sau, có thể thực hiện theo mô hình cộng hoặc nhân. Ở ví dụ này, ta sẽ tạo phiên bản cộng.
Nếu muốn tự thử, hãy dùng file CSV
index_1trong bộ dữ liệu doanh số cà phê rất thú vị trên Kaggle. Tham khảo, chúng tôi đã tổng hợp và tóm tắt doanh số theo ngày.Đầu tiên, ta tính xu hướng-chu kỳ. Ta xác định có mùa vụ theo tuần, và có bảy ngày trong một tuần, nên chu kỳ mùa vụ là số lẻ, tức là trung bình trượt cần được căn giữa bằng cửa sổ đối xứng. Tức trung bình trượt 7 ngày. Hãy cẩn thận với căn chỉnh và căn giữa trong bảng Excel.
Tiếp theo, ta tìm chuỗi đã khử xu hướng bằng cách lấy chuỗi gốc trừ đi xu hướng.
Sau đó, để tìm thành phần mùa vụ, ta lấy trung bình các giá trị đã khử xu hướng cho mỗi chu kỳ mùa vụ. Một bổ sung quan trọng: Bạn sẽ thấy thành phần mùa vụ có thể không cộng lại đúng bằng 0. Hãy điều chỉnh điều này bằng chuẩn hóa:
Tính trung bình của thành phần mùa vụ.
Trừ trung bình mùa vụ khỏi mọi giá trị mùa vụ.
Cuối cùng, với phần còn lại, ta trừ xu hướng và chu kỳ mùa vụ khỏi chuỗi gốc.
Nếu thấy chuỗi của ta có tác động mùa vụ thay đổi theo mức dữ liệu, ta sẽ cân nhắc phân rã nhân. Các bước với phân rã nhân gần như tương tự, chỉ khác là dùng phép chia thay vì phép trừ. Cụ thể, ta sẽ tìm chuỗi đã khử xu hướng bằng cách chia chuỗi gốc cho xu hướng-chu kỳ. Sau đó, để tìm phần còn lại, ta sẽ chia chuỗi gốc cho tích của các thành phần xu hướng và mùa vụ. (Ngoài ra, ta có thể lấy log tự nhiên của chuỗi gốc và áp dụng phân rã cộng. Về mặt chức năng là tương đương.)
Phân rã STL
Phân rã STL, viết tắt của seasonal and trend decomposition using LOESS, là phiên bản hiện đại hơn. Khó giải thích hơn, nhưng nhìn chung linh hoạt hơn phương pháp cổ điển. STL hoạt động bằng cách dùng phương pháp gọi là LOESS, vốn khớp các mô hình hồi quy đơn giản cho các đoạn dữ liệu nhỏ chồng lấn. Nó áp dụng hồi quy có trọng số cục bộ này để tách riêng các thành phần xu hướng và mùa vụ.
Phương pháp này khắc phục những nhược điểm cụ thể của phân rã cổ điển, cụ thể là trong phiên bản cổ điển, không có ước lượng xu hướng-chu kỳ hoặc phần còn lại cho các quan sát đầu và cuối. Bạn có thể thấy điều này ở các ô trống trong Excel, tại các hàng 3, 4, 5 và 20, 21, 22 phía trên.
Cũng cần nói rằng xu hướng-chu kỳ theo phân rã cổ điển sẽ làm mượt các mức tăng giảm nhanh, nên có thể bỏ qua những điều quan trọng diễn ra trong chuỗi. Cuối cùng, phân rã cổ điển mặc nhiên cho rằng tồn tại một mẫu mùa vụ, nhưng nếu có đủ dữ liệu, đôi khi ta có thể thấy mẫu mùa vụ thay đổi.
Hãy bắt đầu bằng cách tạo biểu đồ thời gian của chuỗi gốc. Như trước, bước đầu tiên là tổng hợp và tóm tắt bộ dữ liệu Kaggle để có chuỗi ta quan tâm.
Tiếp theo, ta phân rã chuỗi thành các thành phần xu hướng, mùa vụ và phần còn lại. Ô trên cùng của đồ thị phân rã hiển thị chuỗi gốc, dù hơi bị nén.
Lưu ý rằng, không giống phân rã cổ điển, dataframe trả về không có khoảng trống ở đầu hoặc cuối.
Phân rã STL cũng có một số điểm hạn chế, và nếu bạn quan tâm, chúng tôi đã đưa thông tin đó vào phần Câu hỏi thường gặp.
Phân rã chuỗi thời gian và điều chỉnh mùa vụ
Nhiều khi, tạo một phiên bản dữ liệu đã điều chỉnh mùa vụ là hữu ích. Phân rã chuỗi thời gian giúp thực hiện điều này. Để tạo phiên bản điều chỉnh mùa vụ, ta chỉ cần cộng thành phần xu hướng và phần còn lại. Hoặc ta có thể trừ thành phần mùa vụ khỏi chuỗi gốc; cả hai cách đều cho ra cùng một kết quả.
Chúng tôi nhận thấy bộ dữ liệu này không có tính mùa vụ đặc biệt mạnh, điều đó tự nó cũng thú vị.
Sức mạnh của dữ liệu đã điều chỉnh mùa vụ là giúp ta hiểu một số đặc điểm của chuỗi. Chẳng hạn ta có thể xem xu hướng cơ bản có phải do mùa vụ hay không. Thứ hai, ta có thể xem xét kỹ hơn các hiện tượng bất thường trong dữ liệu. Ta nghĩ chương trình khuyến mãi Thứ Sáu hiệu quả vì đó là Thứ Sáu hay vì đó là khuyến mãi? Với phân rã chuỗi thời gian và điều chỉnh mùa vụ, ta có thể kiểm định những câu hỏi như vậy.
Phân rã chuỗi thời gian và dự báo
Có thể bạn sẽ ngạc nhiên khi biết phân rã chuỗi thời gian cũng hữu ích trong dự báo. Chúng tôi nhìn nhận điều này theo hai cách chính. Thứ nhất, chúng ta muốn hiểu các thành phần chuỗi thời gian để giúp quyết định mô hình dự báo nên dùng. Nếu thấy tính mùa vụ mạnh, ta có thể thiên về các mô hình như san bằng mũ Holt-Winters hoặc các phương pháp ETS, vốn được xây dựng để xử lý cả xu hướng và mùa vụ.
Thứ hai, ta thậm chí có thể dùng dữ liệu đã phân rã như một phần của dự báo, điều này cho ta thêm lựa chọn. Ví dụ, ta có thể chạy một mô hình dự báo phi mùa vụ trên phiên bản dữ liệu đã điều chỉnh mùa vụ. (Ta có thể đưa lại thành phần mùa vụ sau đó.) Điều chỉnh mùa vụ đặc biệt hữu ích khi muốn dùng các mô hình linh hoạt như ARIMA tiêu chuẩn và hồi quy tuyến tính.
Ở đây, chúng ta tạo một mô hình ARIMA đơn giản để dự báo dữ liệu đã điều chỉnh mùa vụ.
Ta cũng có thể dự báo chuỗi đã điều chỉnh mùa vụ và cộng lại thành phần mùa vụ, về thực chất tạo ra dự báo có mùa vụ. Tất cả có được nhờ phân rã ban đầu.
Lời kết
Tôi hy vọng bạn thích bài viết về phân rã chuỗi thời gian! Hãy nhớ rằng phân rã chỉ là một phần của phân tích chuỗi thời gian, nên để trở thành chuyên gia, hãy ghi danh khóa học Dự báo trong R với Giáo sư Rob Hyndman, người đã góp phần phát triển các gói R mà chúng tôi dùng để dựng hình. Chúng tôi cũng có khóa Trực quan hóa dữ liệu chuỗi thời gian bằng Python nếu bạn thấy các ý tưởng trong bài này thú vị nhưng thích Python hơn, vốn cũng rất phù hợp cho dạng công việc này.