Logo Zephyrnet

Hiểu về chuỗi thời gian với R

Ngày:

Hiểu về chuỗi thời gian với R

Phân tích chuỗi thời gian về cơ bản là một nguồn tài nguyên hữu ích cho bất kỳ doanh nghiệp nào, các nhà khoa học dữ liệu khi tham gia vào lĩnh vực này phải mang theo nền tảng vững chắc về kỹ thuật. Ở đây, chúng tôi phân tách các thành phần logic của chuỗi thời gian bằng cách sử dụng R để hiểu rõ hơn về vai trò của từng thành phần trong loại phân tích này.


By Omar Martinez, Arcalea.

Phân tích chuỗi thời gian có thể là một nguồn tài nguyên cực kỳ hữu ích cho hầu hết mọi doanh nghiệp, do đó, điều cực kỳ quan trọng đối với các nhà khoa học dữ liệu khi tham gia vào lĩnh vực này là phải có nền tảng vững chắc về các khái niệm chính. May mắn thay, một chuỗi thời gian có thể được phân tách thành các phần tử khác nhau và việc phân tách quy trình cho phép chúng ta hiểu từng phần có vai trò trong phân tích như một thành phần logic của toàn bộ hệ thống.

Mặc dù đúng là R đã có nhiều gói mạnh mẽ để phân tích chuỗi thời gian, nhưng mục tiêu của bài viết này là thực hiện phân tích chuỗi thời gian –đặc biệt là để dự báo– bằng cách xây dựng một hàm từ đầu để phân tích từng yếu tố khác nhau trong quy trình.

Các yếu tố của một chuỗi thời gian là gì?

Có một số phương pháp để thực hiện dự báo, nhưng trong bài viết này, chúng tôi sẽ tập trung vào cách tiếp cận chuỗi thời gian nhân, trong đó chúng tôi có các yếu tố sau:

Tính thời vụ: Nó bao gồm các biến thể xảy ra đều đặn, chẳng hạn như hàng quý, vào kỳ nghỉ hè, cuối năm, v.v. Một ví dụ rõ ràng là tỷ lệ chuyển đổi cao hơn đối với tư cách thành viên phòng tập thể dục trong tháng 1 hoặc doanh số bán trò chơi điện tử tăng đột biến vào khoảng thời gian gần đó. những ngày nghỉ lễ.

Khuynh hướng: Nó có thể được phân loại là xu hướng chung của dữ liệu là giảm hoặc tăng trong một thời gian dài hơn, ví dụ: trên thị trường chứng khoán, nói chung, “thị trường gấu” nói chung có thể được đánh dấu bằng sự giảm chung về giá trị cổ phiếu trong một khoảng thời gian. trong khoảng hai năm. Tất nhiên, đây là một sự đơn giản hóa quá mức, nhưng chúng tôi hiểu ý.

Thành phần không đều: Bạn có thể coi thành phần không đều là chuỗi thời gian còn lại sau khi hai thành phần trước đó đã bị loại bỏ. Thành phần không đều tương ứng với sự dao động tần số của chuỗi.

Với các thành phần này, chúng ta có thể tạo một mô hình theo cách sau:

Y i = Si * T i * Ii

Việc triển khai điều này trong R tương đối dễ dàng, vì vậy hãy mở một sổ ghi chép mới và viết một số mã.

Dự báo chuỗi thời gian trong R

Để bắt đầu, hãy tạo khung dữ liệu với dữ liệu chúng ta sẽ phân tích. Giả sử bạn đang xem dữ liệu về doanh số bán hàng theo thời gian và bạn có tổng giá trị doanh số bán hàng theo quý.

x<-seq(1, 20) y<-c(2.8, 2.1, 4, 4.5, 3.8, 3.2, 4.8, 5.4, 4, 3.6, 5.5, 5.8, 4.3, 3.9, 6, 6.4, NA, NA, Dữ liệu NA, NA) <- data.frame(t=x, sales=y) dữ liệu 

Để cung cấp thêm ngữ cảnh, trong đoạn trích trên, chúng tôi đang tạo ra một loạt doanh số bán hàng theo quý trong 5 năm. Lưu ý rằng chúng tôi đã bao gồm bốn "NA", đây là những giá trị mà chúng tôi sẽ dự báo. Bởi vì chúng tôi đang xem xét dữ liệu hàng quý, điều này có nghĩa là chúng tôi sẽ dự báo năm thứ năm.

Bằng cách vẽ biểu đồ dữ liệu, chúng ta có thể có được cái nhìn sâu sắc hơn về tập dữ liệu:

dữ liệu %>% ggplot(aes(x=t, y=sale))+ geom_line(col = 'light blue' )+ geom_point()+ xlab( 'Time' )+ ylab( 'Sales' )+ theme_minimal() 

Trong cốt truyện, chúng tôi nhận được cảnh báo, nhưng chúng tôi không cần phải lo lắng về điều này vì đó là do chúng tôi thiếu các giá trị trên tập dữ liệu.

Bằng cách nhìn vào cốt truyện, công bằng mà nói rằng chúng ta có thể nhanh chóng phát hiện ra một xu hướng và dường như có yếu tố mùa vụ. Nhìn chung, chúng ta thấy doanh số bán hàng trong quý 2 có xu hướng giảm, sau đó sang quý 3 có sự tăng trưởng đáng kể và cuối cùng, chúng ta có thể nhận thấy mức tăng khiêm tốn trong quý 4.

Bây giờ, nếu chúng ta hỏi ai đó có một số kiến ​​thức thống kê, làm cách nào chúng ta có thể tạo mô hình để dự đoán các giá trị trên tập dữ liệu này? Theo trực giác, một số người có thể nói rằng chúng ta có thể mô hình hóa điều này bằng hồi quy tuyến tính. Quả thực, đó là một cách tiếp cận mà chúng tôi có thể thực hiện nhưng có một số vấn đề với cách tiếp cận đó. Để thể hiện thay vì chỉ nói, chúng ta hãy xem điều đó sẽ như thế nào.

ggplot(data, aes(x=t, y=sale), col= 'light blue' )+ geom_point()+ stat_smooth(method= "lm" ,col= "red" ) 

Vậy vấn đề với điều đó là gì? Nếu nhìn vào biểu đồ trước, chúng ta có thể thấy rõ rằng dữ liệu bị ảnh hưởng bởi cả yếu tố xu hướng và mùa vụ. Do đó, nếu sử dụng mô hình tuyến tính, chúng tôi sẽ không nắm bắt được tất cả những thay đổi đó. Mặc dù chúng tôi có vẻ tương đối phù hợp nhưng chúng tôi chắc chắn có thể làm tốt hơn bằng cách xem xét những thay đổi ở cấp địa phương và xu hướng chung. Theo địa phương, ý tôi là mỗi năm đều có những biến động riêng nên chúng ta có thể nắm bắt những thông tin đó để cải thiện mô hình.

Để nắm bắt được cả xu hướng và sự thay đổi theo mùa, bước đầu tiên chúng ta có thể làm là tính toán di chuyển trung bình (cục bộ) có thể giúp chúng tôi phân tích các điểm dữ liệu bằng cách tạo một chuỗi giá trị trung bình của các tập hợp con khác nhau của tập dữ liệu đầy đủ, trong trường hợp này là mỗi năm, điều này có nghĩa là chúng tôi chỉ có thể tính trung bình động cho bất kỳ trường hợp nào mà chúng tôi có ít nhất bốn điểm dữ liệu.

Đây là giao diện của nó trong R:

df <- data Y <- 2 # 2 là vị trí cột "bán hàng" của chúng ta trong khung dữ liệu k <- 4 # k bằng kích thước của tập hợp con #Array với tất cả các giá trị thô của mảng 'Y' <- df[, Y] #Mảng trống để lưu trữ các giá trị của đường trung bình động MM<-rep(NA , length(arr)) chỉ mục <- k-1 for (i in c(1:length(arr))) { if (i <= length(arr) -k+ 1 ){ block <- Mean(arr[seq(i, i+(k-1))]) MM[index] <- chỉ mục khối <- chỉ mục+ 1 } } MM 

Cái nào sẽ cho chúng ta mảng sau:

Lưu ý rằng đối với một số giá trị đầu tiên, chúng ta có “NA”, điều này là do chúng ta cần ít nhất bốn giá trị (k) để tính giá trị trung bình. Để làm rõ điều này, hãy nghĩ về chỉ số của từng quan sát, khi đó chúng ta sẽ có kết quả như thế này:

ý nghĩa (1,2) <- không đủ
ý nghĩa (1,2,3) <- không đủ
trung bình (1,2,3,4) <- thỏa mãn 'k'

Trong đó các con số là chỉ số của từng quan sát.

Hãy xem biểu đồ trước sẽ trông như thế nào với các đường trung bình động được bao gồm:

dfOut <- data.frame(df, MM=MM) dfOut %>% ggplot(aes(x=t, y=sale))+ geom_line(col = 'light blue')+ geom_point()+ geom_line(aes(x =t, y=MM), col = 'orange')+ geom_point(aes(x=t, y=MM), col = 'orange')+ xlab('Time')+ ylab('Sales')+ theme_minimal () 

Đúng như dự đoán, đường trung bình động (đường màu cam) dường như đang “nắm bắt” xu hướng tăng doanh số bán hàng, nhưng chúng tôi vẫn chưa tính đến tính thời vụ. Nếu sửa đổi mã ở trên, chúng tôi có thể sử dụng đường trung bình động và giá trị doanh số từ tập dữ liệu để tính toán tính thời vụ cho từng quan sát và nối nó vào khung dữ liệu của chúng tôi.

df <- data Y <- 2 #2 là vị trí của cột "bán hàng" của chúng tôi trong khung dữ liệu k <- 4 #k bằng kích thước của tập hợp con #Array với tất cả các giá trị thô của 'Y' arr < - df[, Y] #Empty mảng để lưu trữ các giá trị của các đường trung bình động MM<-rep( NA , length(arr)) SI <- Rep( NA , length(arr)) chỉ mục <- k-1 for (i trong c( 1:length(arr))){ if (i <= length(arr) -k+1){ block <- Mean(arr[seq(i, i+(k-1))]) MM[index ] <- block SI[index] <- arr[index]/block #Seasonality + Irregular Component index <- index+1 } } dfOut <- data.frame(df, MM=MM, SI=SI) #Seasonality varY< -c() for (j in c(1:k)){ varX <- seq(j, length(arr), by=k) varY <- c(varY,mean(dfOut[varX, 4], na. rm=T)) } varY<- Rep(varY, k+1) dfOut <- data.frame(dfOut, S=varY) dfOut 

Đoạn mã trên cập nhật khung dữ liệu với các giá trị cho đường trung bình động (MM), tính thời vụ + thành phần không đều (SI) và tính thời vụ của chính nó (S).

Chúng ta có thể dễ dàng vẽ các giá trị của “S” bằng đoạn mã sau:

dfOut %>% ggplot(aes(x=t, y=S))+ geom_line(col= "light blue")+ geom_point(col="black")+ xlab('Time')+ ylab('Seasonality') + theme_minimal() 

Lưu ý rằng trong cả khung dữ liệu và biểu đồ, chúng ta đều có các giá trị thời vụ trong khoảng thời gian 5 năm đầy đủ. Hơn nữa, vì chúng tôi chỉ xem xét tính thời vụ nên chúng tôi dường như đã “làm phẳng” chuỗi này.

Theo đó, với thông tin này, chúng ta cũng có thể “phi mùa vụ hóa” chuỗi thời gian. Để làm điều này, chúng ta chỉ cần chia giá trị bán hàng (Y) cho giá trị thời vụ (S).

 #Deseasonality dfOut <- data.frame(dfOut, DES=(dfOut[, 2]/dfOut[, 5])) #Y/S dfOut %>% ggplot(aes(x=t, y=DES))+ geom_line (col="light blue")+ geom_point(col="black")+ xlab('Time')+ ylab('DES')+ theme_minimal()

Một lần nữa, hãy lưu ý rằng chúng ta không có giá trị cho năm thứ năm, nhưng bạn có nhớ mô hình tuyến tính mà chúng ta đã làm trước đây không? Chà, bây giờ chúng ta đã có cách tự mình tính toán tính thời vụ, chúng ta thực sự có thể sử dụng mô hình tuyến tính để dự đoán các giá trị “không theo mùa vụ” cho năm thứ năm và sau đó nhân các giá trị đó với hệ số mùa vụ mà chúng ta đã tính toán.

 #Mô hình mô hình tuyến tính <- lm(công thức = DES ~ t, dfOut) #Predictions f <- dự đoán(object = model, newdata = data.frame(t=dfOut[, 1 ])) dfOut <- data.frame(dfOut , f=f) #Tính toán dự đoán mới cho các dự đoán theo mùa <- dfOut[, 7]*dfOut[, ] dfOut <- data.frame(dfOut, dự đoán = dự đoán)

Trong khung dữ liệu, chúng ta có thể thấy rằng các dự đoán thực sự gần với giá trị bán hàng thực tế và điều này là do chúng ta hiện đang tính toán tất cả các thành phần của một phân tích chuỗi thời gian thích hợp.

Kết hợp mọi thứ lại với nhau, chúng ta có được chức năng sau:

 MultForecast<- function (k, df, Y){ #Array với tất cả các giá trị thô của 'Y' arr <- df[, Y] #Empty mảng để lưu trữ các giá trị của các đường trung bình động MM <- Rep(NA, length(arr)) SI <- Rep(NA, length(arr)) chỉ mục <- k-1 #Tính đường trung bình động + SI cho (i in c( 1:length(arr))){ if (i <= length (arr) -k+1){ block <- Mean(arr[seq(i, i+(k-1))]) MM[index] <- block SI[index] <- arr[index]/block #Seasonality + Chỉ số thành phần không đều <- index+1 } } dfOut <- data.frame(df, MM=MM, SI=SI) #Seasonality varY<-c() for (j in c( 1:k)){ varX < - seq(j, length(arr), by=k) varY <- c(varY, Mean(dfOut[varX, 4], na.rm=T)) } varY<- Rep(varY, k+1) dfOut <- data.frame(dfOut, S=varY) #Deseasonality dfOut <- data.frame(dfOut, DES=(dfOut[ , 2]/dfOut[, 5])) #Mô hình mô hình tuyến tính <- lm(công thức = DES ~ t, dfOut) #Predictions f <- dự đoán(object = model, newdata = data.frame(t=dfOut[, 1])) dfOut <- data.frame(dfOut, f=f) #Tính toán dự đoán mới cho tính thời vụ dự đoán <- dfOut[, 7]*dfOut[, 5] #Final data frame dfOut <- data.frame(dfOut, dự đoán = dự đoán) trả về (dfOut) }

Nếu chúng ta cung cấp giá trị “k”, khung dữ liệu và chỉ mục của cột “Y” cho hàm, chúng ta sẽ có được mô hình cuối cùng với các giá trị dự báo mới. Với dữ liệu đó, cuối cùng chúng ta có thể tiến hành nhiệm vụ thú vị là vẽ đồ thị cho mô hình với các giá trị dự đoán.

 dfOut <- MultForecast(4, data, 2) dfOut %>% ggplot(aes(x=t, y=sale))+ geom_line(col = 'light blue')+ geom_point()+ geom_line(aes(x=t , y=dự đoán), col = 'orange')+ geom_point(aes(x=t, y=predictions), col = 'orange')+ xlab('Time')+ ylab('Sales')+ theme_minimal()

Bằng cách so sánh mô hình này với mô hình hồi quy tuyến tính (ban đầu) trước đó, chúng ta có thể thấy rằng chúng ta chắc chắn đã tìm thấy dữ liệu phù hợp hơn nhiều.

Một điều bạn nên cân nhắc là trong trường hợp này, chúng tôi đã chọn giá trị “k” là 4 để tính toán các đường trung bình động Tuy nhiên, dựa trên những gì có ý nghĩa đối với dữ liệu, nhiệm vụ này có thể trở nên không tầm thường và có thể yêu cầu khám phá sâu rộng tùy thuộc vào nội dung mà tập dữ liệu của bạn thể hiện.

Hơn nữa, cách tiếp cận chuỗi thời gian nhân lên có thể không hiệu quả khi có những thay đổi ngẫu nhiên trong xu hướng. Ví dụ: việc sử dụng dữ liệu để dự báo số ca nhiễm COVID-19 có thể cho kết quả sai lệch vì mô hình chỉ xem xét dữ liệu lịch sử. Bởi vì có những nỗ lực tích cực nhằm làm phẳng đường cong và thay đổi xu hướng nên nhiệm vụ trở nên phức tạp hơn. Ngoài ra, có thể có các sự kiện ngẫu nhiên và nhiều biến số khác có thể gây ra sự thay đổi xu hướng. Nhiều thay đổi trong số này sẽ không được mô hình nhận ra trước.

Tin tốt là có nhiều cách để mở rộng và cải thiện phân tích này cũng như rất nhiều nguồn tài nguyên tuyệt vời về chủ đề này, chẳng hạn như cuốn sách “Nguyên tắc và thực hành dự báo” của Rob J Hyndman. Tuy nhiên, hy vọng rằng bằng cách thực hiện một cách có hệ thống từng bước của phân tích chuỗi thời gian, bạn đã có được trực giác cơ bản đằng sau lĩnh vực phân tích dữ liệu cực kỳ phức tạp này.

Bạn có thể tìm thấy mã từ bài viết trên GitHub.

Liên quan:

Nguồn: https://www.kdnuggets.com/2020/07/under Hiểu-time-series-r.html

tại chỗ_img

Tin tức mới nhất

tại chỗ_img