My Notes

統計学とかR(R言語)とかPython3の覚え書きとか走り書きとか。 座右の銘にしたい: All work and no play makes Jack a dull boy.

アイスクリーム統計学 第4章 単回帰をR(R言語)で (書籍なら、タイトルは『統計学がわかる 【回帰分析・因子分析編】 (ファーストブック)』

Rコード

# アイスクリーム統計学 ch04




#
# 単回帰分析
#




# 去年の夏のデータ 土日を除いた平日
データ番号 <- c(1:20)
最高気温 <- c(33, 33, 34, 34, 35, 35, 34, 32, 28, 35, 33,
                28, 32, 25, 28, 30, 29, 32, 34, 35)
客数 <- c(382, 324, 338, 317, 341, 360, 339, 329, 218, 402,
            342, 205, 368, 196, 304, 294, 275, 336, 384, 368)

df1 <- data.frame(データ番号 = データ番号,
                最高気温 = 最高気温,
                客数 = 客数)


df1




summary(df1)




# 散布図
par(family = "Osaka")
plot(df1$最高気温, df1$客数,
    pch = 18, col = "blue", cex = 3,
    xlim = c(20, 40), ylim = c(0, 500),
    xlab = "最高気温", ylab = "客数", main = "最高気温と客数の関係")




# 相関係数
cor(df1$最高気温, df1$客数)
round(cor(df1$最高気温, df1$客数), 2)
cor.test(df1$最高気温, df1$客数)




# 単回帰
lm1 <- lm(df1$客数 ~ df1$最高気温, data = df1)
lm1
summary(lm1)
# 回帰直線
abline(lm1, col = "green", lwd = "5")




# 予測
# 最高気温25度の日のお客の数
y切片 <- round(coef(lm1)[[1]], 2)
傾き <- round(coef(lm1)[[2]], 2)
res1 <- 傾き*25 + y切片
res1
round(res1, 2)




# 駅からの距離で客数を予測する
# データは、第1章4節のデータ
# 店舗別8月の平均客数データ(12店舗)
店舗 <- c(1:12)
駅からの距離 <- c(10, 1200, 500, 50, 740, 30, 10, 360, 150, 930, 620, 65) # 単位 : m
平均客数 <- c(795, 213, 465, 694, 403, 782, 769, 561, 692, 361, 385, 723)

df2 <- data.frame(店舗 = 店舗, 駅からの距離 = 駅からの距離, 平均客数 = 平均客数)
df2




# 散布図
par(family = "Osaka")
plot(df2$駅からの距離, df2$平均客数,
    pch = 18, col = "blue", cex = 3,
    xlim = c(0, 1500), ylim = c(0, 1000),
    xlab = "駅からの距離(m)", ylab = "平均客数", main = "駅からの距離による平均客数")




# 相関係数
cor(df2$駅からの距離, df2$平均客数)
round(cor(df2$駅からの距離, df2$平均客数), 2)
cor.test(df2$駅からの距離, df2$平均客数)



# 単回帰
lm2 <- lm(平均客数 ~ 駅からの距離, data = df2)
lm2
summary(lm2)
# 回帰直線
abline(lm2, col = "green", lwd = "5")

R Console

> # アイスクリーム統計学 ch04
> 
> 
> 
> 
> #
> # 単回帰分析
> #
> 
> 
> 
> 
> # 去年の夏のデータ 土日を除いた平日
> データ番号 <- c(1:20)
> 最高気温 <- c(33, 33, 34, 34, 35, 35, 34, 32, 28, 35, 33,
+                 28, 32, 25, 28, 30, 29, 32, 34, 35)
> 客数 <- c(382, 324, 338, 317, 341, 360, 339, 329, 218, 402,
+             342, 205, 368, 196, 304, 294, 275, 336, 384, 368)
> 
> df1 <- data.frame(データ番号 = データ番号,
+                 最高気温 = 最高気温,
+                 客数 = 客数)
> 
> 
> df1
   データ番号 最高気温 客数
1           1       33  382
2           2       33  324
3           3       34  338
4           4       34  317
5           5       35  341
6           6       35  360
7           7       34  339
8           8       32  329
9           9       28  218
10         10       35  402
11         11       33  342
12         12       28  205
13         13       32  368
14         14       25  196
15         15       28  304
16         16       30  294
17         17       29  275
18         18       32  336
19         19       34  384
20         20       35  368
> 
> 
> 
> 
> summary(df1)
   データ番号       最高気温          客数      
 Min.   : 1.00   Min.   :25.00   Min.   :196.0  
 1st Qu.: 5.75   1st Qu.:29.75   1st Qu.:301.5  
 Median :10.50   Median :33.00   Median :337.0  
 Mean   :10.50   Mean   :31.95   Mean   :321.1  
 3rd Qu.:15.25   3rd Qu.:34.00   3rd Qu.:362.0  
 Max.   :20.00   Max.   :35.00   Max.   :402.0  
> 
> 
> 
> 
> # 散布図
> par(family = "Osaka")
> plot(df1$最高気温, df1$客数,
+     pch = 18, col = "blue", cex = 3,
+     xlim = c(20, 40), ylim = c(0, 500),
+     xlab = "最高気温", ylab = "客数", main = "最高気温と客数の関係")
> 
> 
> 
> 
> # 相関係数
> cor(df1$最高気温, df1$客数)
[1] 0.8703519
> round(cor(df1$最高気温, df1$客数), 2)
[1] 0.87
> cor.test(df1$最高気温, df1$客数)

    Pearson's product-moment correlation

data:  df1$最高気温 and df1$客数
t = 7.4987, df = 18, p-value = 6.082e-07
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.6958287 0.9478207
sample estimates:
      cor 
0.8703519 

> 
> 
> 
> 
> # 単回帰
> lm1 <- lm(df1$客数 ~ df1$最高気温, data = df1)
> lm1

Call:
lm(formula = df1$客数 ~ df1$最高気温, data = df1)

Coefficients:
 (Intercept)  df1$最高気温  
     -229.98         17.25  

> summary(lm1)

Call:
lm(formula = df1$客数 ~ df1$最高気温, data = df1)

Residuals:
    Min      1Q  Median      3Q     Max 
-47.969 -17.709  -1.218  17.413  51.031 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)   -229.98      73.79  -3.117  0.00596 ** 
df1$最高気温    17.25       2.30   7.499 6.08e-07 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 29.54 on 18 degrees of freedom
Multiple R-squared:  0.7575, Adjusted R-squared:  0.744 
F-statistic: 56.23 on 1 and 18 DF,  p-value: 6.082e-07

> # 回帰直線
> abline(lm1, col = "green", lwd = "5")
> 
> 
> 
> 
> # 予測
> # 最高気温25度の日のお客の数
> y切片 <- round(coef(lm1)[[1]], 2)
> 傾き <- round(coef(lm1)[[2]], 2)
> res1 <- 傾き*25 + y切片
> res1
[1] 201.27
> round(res1, 2)
[1] 201.27
> 
> 
> 
> 
> # 駅からの距離で客数を予測する
> # データは、第1章4節のデータ
> # 店舗別8月の平均客数データ(12店舗)
> 店舗 <- c(1:12)
> 駅からの距離 <- c(10, 1200, 500, 50, 740, 30, 10, 360, 150, 930, 620, 65) # 単位 : m
> 平均客数 <- c(795, 213, 465, 694, 403, 782, 769, 561, 692, 361, 385, 723)
> 
> df2 <- data.frame(店舗 = 店舗, 駅からの距離 = 駅からの距離, 平均客数 = 平均客数)
> df2
   店舗 駅からの距離 平均客数
1     1           10      795
2     2         1200      213
3     3          500      465
4     4           50      694
5     5          740      403
6     6           30      782
7     7           10      769
8     8          360      561
9     9          150      692
10   10          930      361
11   11          620      385
12   12           65      723
> 
> 
> 
> 
> # 散布図
> par(family = "Osaka")
> plot(df2$駅からの距離, df2$平均客数,
+     pch = 18, col = "blue", cex = 3,
+     xlim = c(0, 1500), ylim = c(0, 1000),
+     xlab = "駅からの距離(m)", ylab = "平均客数", main = "駅からの距離による平均客数")
> 
> 
> 
> 
> # 相関係数
> cor(df2$駅からの距離, df2$平均客数)
[1] -0.9795221
> round(cor(df2$駅からの距離, df2$平均客数), 2)
[1] -0.98
> cor.test(df2$駅からの距離, df2$平均客数)

    Pearson's product-moment correlation

data:  df2$駅からの距離 and df2$平均客数
t = -15.385, df = 10, p-value = 2.74e-08
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.9944144 -0.9263900
sample estimates:
       cor 
-0.9795221 

> 
> 
> 
> # 単回帰
> lm2 <- lm(平均客数 ~ 駅からの距離, data = df2)
> lm2

Call:
lm(formula = 平均客数 ~ 駅からの距離, data = df2)

Coefficients:
 (Intercept)  駅からの距離  
    755.3496       -0.4761  

> summary(lm2)

Call:
lm(formula = 平均客数 ~ 駅からの距離, data = df2)

Residuals:
    Min      1Q  Median      3Q     Max 
-75.143 -26.590   4.033  31.998  48.461 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  755.34960   17.06123   44.27 8.31e-13 ***
駅からの距離  -0.47614    0.03095  -15.38 2.74e-08 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 41.9 on 10 degrees of freedom
Multiple R-squared:  0.9595, Adjusted R-squared:  0.9554 
F-statistic: 236.7 on 1 and 10 DF,  p-value: 2.74e-08

> # 回帰直線
> abline(lm2, col = "green", lwd = "5")

散布図と回帰直線のスクリーンショット

f:id:my_notes:20170629211056p:plain

f:id:my_notes:20170629211110p:plain

f:id:my_notes:20170629211126p:plain

参考Webサイト

アイスクリーム統計学にようこそ!

書籍

統計学がわかる 【回帰分析・因子分析編】 (ファーストブック)

統計学がわかる 【回帰分析・因子分析編】 (ファーストブック)