学习笔记-数据挖掘(时间序列)-时间序列ARIMA建模

本文介绍了使用R语言进行时间序列建模,重点讲解了STL分解和ARIMA模型的处理流程。通过STL分解将时间序列分为趋势、周期和随机波动三部分。接着详细阐述了ARIMA模型的建模步骤,包括order函数、ddply()函数等,并展示了如何对purchase和redeem序列进行建模。最后,讨论了模型的局限性,指出未考虑节假日等因素可能影响预测准确性。
摘要由CSDN通过智能技术生成

时间序列建模

时间序列的各种变化都可以归纳成四大类因素综合 时间序列的各种变化都可以归纳成四大类因素综合 影响

  • 长期 趋势 (trend (trend ):会 导致序列出现明显的长期 导致序列出现明显的长期 趋势
  • 循环 波动 (circle (circle ):会 导致序列呈现出周期性 导致序列呈现出周期性 波动
  • 季节性 变化 (season (season): 会导致序列呈现出和季节变化相关的稳定周期波动 导致序列呈现出和季节变化相关的稳定周期波动 .
  • 随机 波动 (immediate (immediate): 纯随机、与时间无关

季节变动视为 一种特殊的循环 波动

STL分解

  • 最常用的分解方法,可将时间序列分为三类:
    • 没有趋势、也周期的序列(水平型时间) 没有趋势、也周期的序列(水平型时间)
    • 只有趋势、没周期的序列(斜坡型时间;可分段) 只有趋势、没周期的序列(斜坡型时间;可分段)
    • 有趋势、周期的序列(含和时间)
  • 将时间序列分解为周期项(季节项) C t C_t Ct+趋势项 T t T_t Tt+随机项 I t I_t It

ARIMA模型

在这里插入图片描述

ARIMA处理流程

在这里插入图片描述

ARIMA建模流程

在这里插入图片描述

options(warn=-1)#忽视所有警告

导入所需要的的包

library(plyr)
library(dplyr)
library(forecast)
library(data.table)
library(tseries)
user_balance=read.csv("user_balance_table.csv")#读取数据
#将数据中的日期转化为日期格式,原本是整数型,先将转化为字符串,最后转化为日期格式
user_balance$report_date=as.Date(as.character(user_balance$report_date),format="%Y%m%d")

temp=order(user_balance$report_date)
user_balance=user_balance[temp,]#按照日期排序

data=ddply(user_balance,.(report_date),function(D){ colwise(sum)(D[,c(-1,-2)])})
#function(D){ colwise(sum)(D[,c(-1,-2)])} 定义了一个函数 对D的除去第一行第二行求和

train_data = data[274:396,]#2014年3月到7月的数据
test_data = data[397:427,]#2014年8月数据
order函数

order()函数返回的值表示位置,依次对应的是向量的最小值、次小值、第三小值……最大值等(位置索引)

data <- c(5,6,8,2,9,3)

order(data)

返回值# 4 6 1 2 3 5(最小值在第4位,第二小得值在第6位)

data[order(data)]=sort(data)

ddply()函数

ddply()函数位于plyr包,用于对data.frame进行分组统计 ddply(.data, .variables, .fun = NULL, …) 参数注释:

  • .data:函数处理的数据框;
  • .variables:要进行拆分的变量名称,传递变量的格式是: .(col_name),就是把进行分组的变量名包含在.()中;
  • .fun:应用到每行的函数
  • …:传递到fun的其他参数
as.Data()函数

as.Data(x, “input_format”),其中x是字符型数据,input_format则是读入日期的适当格式。

  • %d 数字表示的日期(0-31) 例如01-31
  • %a 缩写的星期名 例如Mon
  • %A 非缩写的星期名 例如Monday
  • %m 月份(00-12) 例如00-12
  • %b 缩写的月份 例如Jan
  • %B 非缩写的月份 例如January
  • %y 两位数的年份 例如07
  • %Y 四位数的年份 例如2007
  • 默认的日期格式为yyyy-mm-dd
get_score<- function(purchase_pred,redeem_pred,purchase_true,redeem_true,h=0.3){
  out = data.frame(purchase_pred ,redeem_pred,purchase_true,redeem_true )
  
  out$purchase_mape = abs(out$purchase_pred-out$purchase_true)/
    out$purchase_true
  out$redeem_mape = abs(out$redeem_pred-out$redeem_true)/
    out$redeem_true
  
  score = sum(exp(-out$purchase_mape/h)*10)* 0.45 + 
    sum(exp(-out$redeem_mape/h)*10)* 0.55 
  return(score)
}

得分函数
purchase_mape=每日申购相对误差(真实值 Z i Z_{i} Zi,预测值 Z i ^ \hat{Z_{i}}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>