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

第一行圖形顯示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特征后得到了新的模型。
