使用R語言預測產品銷量


使用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')

# 用線性回歸擬合Sales和TV廣告的關系
> fit=lm(Sales~TV,data=data)
# 查看估算出來的系數
> coef(fit)
(Intercept)          TV 
 7.03259355  0.04753664
# 顯示擬合出來的模型的線
> abline(fit)

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

# 用線性回歸擬合Sales和Radio廣告的關系
> fit1=lm(Sales~Radio,data=data)
# 查看估算出來的系數
> coef(fit1)
(Intercept)       Radio 
  9.3116381   0.2024958
# 顯示擬合出來的模型的線
> abline(fit1)

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

# 用線性回歸擬合Sales和Radio廣告的關系
> fit2=lm(Sales~Newspaper,data=data)
# 查看估算出來的系數
> coef(fit2)
(Intercept)   Newspaper 
 12.3514071   0.0546931
# 顯示擬合出來的模型的線
> abline(fit2)

# 創建散點圖矩陣
> pairs(~Sales+TV+Radio+Newspaper,data=data, main="Scatterplot Matrix")

第一行圖形顯示TVRadioNewspaperSales的影響。縱軸為Sales,橫軸分別為TVRadioNewspaper。從圖中可以看出,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特征后得到了新的模型。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM