在这里,作为补充知识,为大家讲一下R语言怎么对数据进行分析。现目前,对于我们而言,选择一所合适的大学非常重要,针对于此,我对影响大学平均录取分数线因素进行了分析。
首先我们看看文件里面有些什么属性
然后我们进行读取文件
x<-read.csv("C:/Users/chaeli/Documents/chapter3-data/data/ch11data.csv",head=T)
x
将有录取平均线的院校作为训练样本集
train<-x[which(x$平均线!="无"),]
train
将没有录取平均线的院校作为验证集
test<-x[which(x$平均线=="无"),]
test
将训练样本集中的平均线转换为数值型
train$平均线<-as.numeric(as.character(train$平均线))
查看训练样本集中的平均线情况
summary(train$平均线)
各录取平均线院校的数量,横轴为录取平均分,纵轴为院校的数量
a<-as.data.frame(table(train$平均线))
plot(a,xlab="录取平均分",ylab="院校的数量")
绘制院校的分布柱状图,学习训练集中的不同类型院校的数量
b<-as.data.frame(table(train$类型))
barplot(b$Freq,names.arg=b$Var1,col=rainbow(12),xlab="院校类型",ylab="院校的数量",main="院校分布")
将学校按照985和非985进行分类,并绘制分布柱状图
c<-as.data.frame(table(x$是否985))
barplot(c$Freq,names.arg=c$Var1,xlab="是否为985院校",ylab="院校的数量")
将院校重点学科数量绘制成散点图
d1<-as.data.frame(table(x$重点学科))
plot(d1,xlab="重点学科",ylab="数量")
将院校博士点数量绘制成散点图
d2<-as.data.frame(table(x$博士点))
plot(d2,xlab="博士点",ylab="数量")
#-----------------------------------------------------------------------
针对训练模型,筛选非211,985院校样本
n<-train[which(train$是否985=="否"&train$是否211=="否"),]
n
划分训练和测试数据集(3:1)
set.seed(1)
m<-dim(train)[1]
pre<-sample(m,m*0.75)
pre<-sort(pre)
train1<-n[pre,]
test1<-n[-pre,]
模型训练
train1$所在地<-as.numeric(as.factor(train1$所在地))
train1$隶属<-as.numeric(as.factor(train1$隶属))
train1$重点学科<-as.numeric(train1$重点学科)
train1$平均线<-as.numeric(as.character(train1$平均线))
#train1$是否自主招生<-as.numeric(as.factor(train1$是否自主招生))
fit<-lm(平均线~院士+硕士点+类型+重点学科+博士点+是否自主招生,data=train1)
summary(fit)
#plot(fit)
模型预测
pred<-predict(fit,test1[,c("院士","硕士点","类型","重点学科","博士点","是否自主招生")])
计算MSE
RMSE<-function(t,p)
{
return(sqrt(mean((t-p)^2)))
}
RMSE(test1$平均线,pred)
绘制测试集真实值和预测值曲线
# 将画布分为2行2列
par(mfrow=c(2,2))
plot(1:length(test1$平均线),test1$平均线,type="l",col="blue")
plot(1:length(test1$平均线),pred,type="l",col="red")
绘制测试集真实值和预测值曲线
plot(1:length(test1$平均线),test1$平均线,type="l",col="blue",main="真实值和预测值对比曲线")
lines(1:length(test1$平均线),pred,col="red")
#----------------------------------------------------------------------------------
针对预测模型,筛选非211,985院校样本
n1<-test[which(test$是否985=="否"&test$是否211=="否"),]
n1
模型预测
pred1<-predict(fit,n1[,c("院士","硕士点","类型","重点学科","博士点")])
pred1
#----------------------------------------------------------------------------------
针对训练模型,筛选211院校样本
n2<-train[which(train$是否211=="是"),]
n2
划分训练和测试数据集(3:1)
set.seed(10)
m1<-dim(train)[1]
pre1<-sample(m1,m1*0.75)
pre1<-sort(pre1)
train2<-n2[pre1,]
test2<-n2[-pre1,]
模型训练
train2$所在地<-as.numeric(as.factor(train2$所在地))
train2$隶属<-as.numeric(as.factor(train2$隶属))
train2$重点学科<-as.numeric(train2$重点学科)
train2$平均线<-as.numeric(as.character(train2$平均线))
#train2$是否自主招生<-as.numeric(as.factor(train2$是否自主招生))
fit1<-lm(平均线~院士+硕士点+重点学科+博士点+是否自主招生,data=train2)
summary(fit1)
模型预测
pred2<-predict(fit1,test2[,c("院士","硕士点","重点学科","博士点","是否自主招生")])
计算MSE
RMSE<-function(t,p)
{
return(sqrt(mean((t-p)^2)))
}
RMSE(test2$平均线,pred2)
绘制测试集真实值和预测值曲线
# 将画布分为2行2列
par(mfrow=c(2,2))
plot(1:length(test2$平均线),test2$平均线,type="l",col="blue")
plot(1:length(test2$平均线),pred2,type="l",col="red")
绘制测试集真实值和预测值曲线
plot(1:length(test2$平均线),test2$平均线,type="l",col="blue",main="真实值和预测值对比曲线")
lines(1:length(test2$平均线),pred2,col="red")
#----------------------------------------------------------------------------------
针对预测模型,筛选211院校样本
n3<-test[which(test$是否211=="是"),]
n3
模型预测
pred3<-predict(fit1,n3[,c("院士","硕士点","重点学科","博士点")])
pred3
相关结果:
总结:
困难:
在刚开始的时候,对于数据的处理上面出现了一些问题,因为其中一些数据是非数值型,例如所在地、隶属等属性都是非数值型,所以在预测之前,应该想办法将它们转换为数值型,但是对于类别型数据,比如是否为985等数据,又不能直接简单的转换为数值型,需要将他们先转换为因子变量(最好使用哑变量),再转换为数值型变量;
针对模型训练和模型预测时,刚开始对于待预测数据的选择不太准确,没有保持训练模型和预测模型中属性特征一致,所以导致在预测的时候出现了错误,因此,我们应该让待预测数据中的特征和训练数据中的特征保持一致,这样才能得到真正的预测结果;
在使用最开始的测试集的时候,题目要求将前面所得到的训练模型拿来进行预测,对于这里的理解有点不到位,因为测试集是筛选平均分数线为无的数据,所以没办法拿来训练,直接拿来预测即可,所以也没有计算MSE的必要;
在选择影响因素和随机种子数的时候,也出现了一些差错,因为不同的因素和种子数对于预测结果和均方误差都是不同的,所以我们尝试选择不同的影响因素和随机种子数来得到一个最优的结果。
总结分析:
训练数据模型的时候,选择的数据较多一点或者相关性更强的数据,对于预测结果会更好,得到的测试集均方误差MSE会更小,比如选5个相关性数据得到的均方误差就比选择3个相关性数据得到的均方误差要小一些,因此,我们应该根据实际情况,选择一些可能相关性更强的数据来进行训练和预测,这样得到的精确度也会越高。