使用R语言预测产品销量

通过不同的广告投入,预测产品的销量。因为响应变量销量是一个连续的值,所以这个问题是一个回归问题。数据集共有200个观测值,每一组观测值对应一种市场情况。

数据特征

  • TV:对于一个给定市场的单一产品,用于电视上的广告费用(以千为单位)
  • Radio:用于广告媒体上投资的广告费用
  • Newspaper:用于报纸媒体上的广告费用

响应

  • Sales:对应产品的销量

加载数据

> data <- read.csv("http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv",colClasses=c("NULL",NA,NA,NA,NA))
> head(data)
TV Radio Newspaper Sales
1 230.1 37.8 69.2 22.1
2 44.5 39.3 45.1 10.4
3 17.2 45.9 69.3 9.3
4 151.5 41.3 58.5 18.5
5 180.8 10.8 58.4 12.9
6 8.7 48.9 75.0 7.2
# 显示Sales和TV的关系
> plot(data$TV, data$Sales, col="red", xlab='TV', ylab='sales')

使用R语言预测产品销量-LMLPHP

# 用线性回归拟合Sales和TV广告的关系
> fit=lm(Sales~TV,data=data)
# 查看估算出来的系数
> coef(fit)
(Intercept) TV
7.03259355 0.04753664
# 显示拟合出来的模型的线
> abline(fit)

使用R语言预测产品销量-LMLPHP

# 显示Sales和Radio的关系
> plot(data$Radio, data$Sales, col="red", xlab='Radio', ylab='Sales')

使用R语言预测产品销量-LMLPHP

# 用线性回归拟合Sales和Radio广告的关系
> fit1=lm(Sales~Radio,data=data)
# 查看估算出来的系数
> coef(fit1)
(Intercept) Radio
9.3116381 0.2024958
# 显示拟合出来的模型的线
> abline(fit1)

使用R语言预测产品销量-LMLPHP

# 显示Sales和Newspaper的关系
> plot(data$Newspaper, data$Sales, col="red", xlab='Radio', ylab='Sales')

使用R语言预测产品销量-LMLPHP

# 用线性回归拟合Sales和Radio广告的关系
> fit2=lm(Sales~Newspaper,data=data)
# 查看估算出来的系数
> coef(fit2)
(Intercept) Newspaper
12.3514071 0.0546931
# 显示拟合出来的模型的线
> abline(fit2)

使用R语言预测产品销量-LMLPHP

# 创建散点图矩阵
> pairs(~Sales+TV+Radio+Newspaper,data=data, main="Scatterplot Matrix")

使用R语言预测产品销量-LMLPHP

第一行图形显示TV,Radio,Newspaper对Sales的影响。纵轴为Sales,横轴分别为TV,Radio,Newspaper。从图中可以看出,TV特征和销量是有比较强的线性关系的。

划分训练集和测试集

> trainRowCount <- floor(0.8 * nrow(data))
> set.seed(1)
> trainIndex <- sample(1:nrow(data), trainRowCount)
> train <- data[trainIndex,]
> test <- data[-trainIndex,]
> dim(data)
[1] 200 4
> dim(train)
[1] 160 4
> dim(test)
[1] 40 4

拟合线性回归模型

> model <- lm(Sales~TV+Radio+Newspaper, data=train)
> summary(model)
Call:
lm(formula = Sales ~ TV + Radio + Newspaper, data = train) Residuals:
Min 1Q Median 3Q Max
-8.7734 -0.9290 0.2475 1.2213 2.8971 Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.840243 0.353175 8.042 2.07e-13 ***
TV 0.046178 0.001579 29.248 < 2e-16 ***
Radio 0.189668 0.009582 19.795 < 2e-16 ***
Newspaper -0.001156 0.006587 -0.176 0.861
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 1.745 on 156 degrees of freedom
Multiple R-squared: 0.8983, Adjusted R-squared: 0.8963
F-statistic: 459.2 on 3 and 156 DF, p-value: < 2.2e-16

预测和计算均方根误差

> predictions <- predict(model, test)
> mean((test["Sales"] - predictions)^2)
[1] 2.050666

特征选择

在之前的各变量和销量之间关系中,我们看到Newspaper和销量之间的线性关系比较弱,并且上面模型中Newspaper的系数为负数,现在去掉这个特征,看看线性回归预测的结果的均方根误差。

> model1 <- lm(Sales~TV+Radio, data=train)
> summary(model1)
Call:
lm(formula = Sales ~ TV + Radio, data = train) Residuals:
Min 1Q Median 3Q Max
-8.7434 -0.9121 0.2538 1.1900 2.9009 Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.821417 0.335455 8.411 2.35e-14 ***
TV 0.046157 0.001569 29.412 < 2e-16 ***
Radio 0.189132 0.009053 20.891 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 1.74 on 157 degrees of freedom
Multiple R-squared: 0.8983, Adjusted R-squared: 0.897
F-statistic: 693 on 2 and 157 DF, p-value: < 2.2e-16 > predictions1 <- predict(model1, test)
> mean((test["Sales"] - predictions1)^2)
[1] 2.050226

从上可以看到2.050226<2.050666,将Newspaper这个特征移除后,得到的均方根误差变小了,说明Newspaper不适合作为预测销量的特征,则去掉Newspaper特征后得到了新的模型。

05-12 04:24