看书标记【R语言 商务数据分析实战4】

看书标记——关于R语言


【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)  # 计算平均百分比误差