看书标记【R语言 商务数据分析实战4】
【R语言 商务数据分析实战4】
chapter 4
财政收入预测分析
从海量数据中发现隐藏的运行模式,并提供具有决策意义的信息。变量过多会造成相关性过高,若仅用多元线性回归模型结合最小二乘估计得到的解只是局部解,或者多重共线性的出现等,分析结果就失去意义。
数据理解和预处理>>探索特征之间的相关性+用Lasso选取特征并提取>>建立单个特征的灰色(GM(1,1))预测模型和支持向量回归(SVR)预测模型>>预测和评价模型
4.2 任务实现
数据特征的相关性
连续性变量》pearson相关系数
定序变量或不满足正态分布假设的等间隔数据》Spearman秩相关系数
有序分类(等级)变量》Kendall秩相关系数
# 设置工作目录并读取数据
setwd()
datafile <- read.csv("./data/data.csv")
# 计算pearson相关系数,保留两位小数
round(cor(datafile, method = c("pearson")), 2)
用Lasso回归方法选取财政收入预测的关键特征(Lasso回归是一种很好的处理共线性的方法,缺点是当遇到一组高度相关的特征时,Lasso倾向于选择一个特征,进一步的改进可以结合EN等回归算法优化)。
# 设置工作目录并读取数据
setwd()
datafile <- read.csv("./data/data.csv") # 数据读取
library(glmnet) # 加载glmnet包
x <- as.matrix(datafile[, 1:13]) # 转换成矩阵格式
y <- as.matrix(datafile[, 14])
gla <- cv.glmnet(x, y, nfolds = 10)
gla.best <- gla$glmnet.fit # 对应的最佳模型
gla.coef <- coef(gla$glmnet.fit, s = gla$lambda.1se) # 提取模型系数
gla.coef[which(gla.coef != 0)] # 选择的特征
round(gla.coef, 4) # 保留四位小数
new.reg.data <- datafile[, c(3, 5, 7, 14)] # 提取特征
# 保存数据
write.csv(new.reg.data, "./tmp/new_reg_data.csv", row.names = FALSE)
灰色预测和SVR构建财政收入预测模型
灰色预测是一种对含有不确定因素的系统进行预测的方法。灰色预测通过进行关联分析,并对原始数据进行生成处理来寻找系统变动的规律,生成有较强规律性的数据序列,然后建立相应的微分方程模型,从而预测事物未来发展趋势的状况。特点:一切灰色序列都能通过某种灰生成弱化其随机性,显现其规律性。SVR不仅适用于线性模型,很稳定,但是计算量比较大。
# 设置工作目录并读取数据
setwd()
dataFile <- read.csv("./tmp/new_reg_data.csv")
source("./code/gm11.txt") # 加载GM(1,1)源文件
pred1 <- gm11(dataFile$x3, length(dataFile$x3) + 2)
pred2 <- gm11(dataFile$x5, length(dataFile$x5) + 2)
pred3 <- gm11(dataFile$x7, length(dataFile$x7) + 2)
# 将预测数据添加至数据框中
dataFile[21:22, 1] <- pred1
dataFile[21:22, 2] <- pred2
dataFile[21:22, 3] <- pred3
tail(dataFile, 2) # 查看预测数据
library(kernlab) # 加载kernlab包
model.svr <- ksvm(y ~ ., dataFile[1:20, ], type = "eps-svr", kernel = "splinedot")
predict <- predict(model.svr, dataFile[, 1:3]) # 进行预测
# 画出序列预测值、真实值图像
a <- 1994:2015
plot(predict, col = "red", type = "b", pch = 16, xlab = "年份",
ylab = "地方财政收入 / 万元", xaxt = "n")
points(dataFile[1:22, 4], col = 'blue', type = 'b', pch = 4)
legend("topleft", c("地方财政收入预测值", "地方财政收入真实值"),
pch = c(16, 4), bty = "n", col = c("red", "blue"))
axis(1, at = 1:22, labels = a)
dataFile$predict <- predict # 保存结果
pre <- dataFile$predict[1:20] # 预测值
real <- dataFile$y[1:20] # 真实值
# 分别计算R^2,调整的R^2,平均百分比误差
R2 <- 1 - mean((pre - real) ^ 2) / mean((real - mean(real)) ^ 2) # 计算R^2
R.2 <- 1 - (sum((pre - real) ^ 2) / 17) / (sum((real - mean(real)) ^ 2) / 19) #计算调整的R^2
mape <- mean(abs(pre - real) / real) # 计算平均百分比误差