# Read in data
firstbase = read.csv("firstbasestats.csv")
str(firstbase)
'data.frame': 23 obs. of 15 variables:
$ Player : chr "Freddie Freeman" "Jose Abreu" "Nate Lowe" "Paul Goldschmidt" ...
$ Pos : chr "1B" "1B" "1B" "1B" ...
$ Team : chr "LAD" "CHW" "TEX" "STL" ...
$ GP : int 159 157 157 151 160 140 160 145 146 143 ...
$ AB : int 612 601 593 561 638 551 583 555 545 519 ...
$ H : int 199 183 179 178 175 152 141 139 132 124 ...
$ X2B : int 47 40 26 41 35 27 25 28 40 23 ...
$ HR : int 21 15 27 35 32 20 36 22 8 18 ...
$ RBI : int 100 75 76 115 97 84 94 85 53 63 ...
$ AVG : num 0.325 0.305 0.302 0.317 0.274 0.276 0.242 0.251 0.242 0.239 ...
$ OBP : num 0.407 0.379 0.358 0.404 0.339 0.34 0.327 0.305 0.288 0.319 ...
$ SLG : num 0.511 0.446 0.492 0.578 0.48 0.437 0.477 0.423 0.36 0.391 ...
$ OPS : num 0.918 0.824 0.851 0.981 0.818 0.777 0.804 0.729 0.647 0.71 ...
$ WAR : num 5.77 4.19 3.21 7.86 3.85 3.07 5.05 1.32 -0.33 1.87 ...
$ Payroll.Salary2023: num 27000000 19500000 4050000 26000000 14500000 ...
summary(firstbase)
Player Pos
Length :23 Length :23
N.unique :23 N.unique : 1
N.blank : 0 N.blank : 0
Min.nchar: 9 Min.nchar: 2
Max.nchar:21 Max.nchar: 2
Team GP
Length :23 Min. : 5.0
N.unique :18 1st Qu.:105.5
N.blank : 0 Median :131.0
Min.nchar: 2 Mean :120.2
Max.nchar: 3 3rd Qu.:152.0
Max. :160.0
AB H
Min. : 14.0 Min. : 3.0
1st Qu.:309.0 1st Qu.: 74.5
Median :465.0 Median :115.0
Mean :426.9 Mean :110.0
3rd Qu.:558.0 3rd Qu.:146.5
Max. :638.0 Max. :199.0
X2B HR
Min. : 1.00 Min. : 0.00
1st Qu.:13.50 1st Qu.: 8.00
Median :23.00 Median :18.00
Mean :22.39 Mean :17.09
3rd Qu.:28.00 3rd Qu.:24.50
Max. :47.00 Max. :36.00
RBI AVG
Min. : 1.00 Min. :0.2020
1st Qu.: 27.00 1st Qu.:0.2180
Median : 63.00 Median :0.2420
Mean : 59.43 Mean :0.2499
3rd Qu.: 84.50 3rd Qu.:0.2750
Max. :115.00 Max. :0.3250
OBP SLG
Min. :0.2140 Min. :0.2860
1st Qu.:0.3030 1st Qu.:0.3505
Median :0.3210 Median :0.4230
Mean :0.3242 Mean :0.4106
3rd Qu.:0.3395 3rd Qu.:0.4690
Max. :0.4070 Max. :0.5780
OPS WAR
Min. :0.5000 Min. :-1.470
1st Qu.:0.6445 1st Qu.: 0.190
Median :0.7290 Median : 1.310
Mean :0.7346 Mean : 1.788
3rd Qu.:0.8175 3rd Qu.: 3.140
Max. :0.9810 Max. : 7.860
Payroll.Salary2023
Min. : 720000
1st Qu.: 739200
Median : 4050000
Mean : 6972744
3rd Qu.: 8150000
Max. :27000000
# Linear Regression (one variable)
model1 = lm(Payroll.Salary2023 ~ RBI, data=firstbase)
summary(model1)
Call:
lm(formula = Payroll.Salary2023 ~ RBI, data = firstbase)
Residuals:
Min 1Q Median
-10250331 -5220790 -843455
3Q Max
2386848 13654950
Coefficients:
Estimate Std. Error
(Intercept) -2363744 2866320
RBI 157088 42465
t value Pr(>|t|)
(Intercept) -0.825 0.41883
RBI 3.699 0.00133 **
---
Signif. codes:
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05
‘.’ 0.1 ‘ ’ 1
Residual standard error: 6516000 on 21 degrees of freedom
Multiple R-squared: 0.3945, Adjusted R-squared: 0.3657
F-statistic: 13.68 on 1 and 21 DF, p-value: 0.001331
# Sum of Squared Errors
model1$residuals
1 2 3
13654950.2 10082148.6 -5524939.3
4 5 6
10298631.2 1626214.0 -6731642.8
7 8 9
-5902522.2 -10250330.7 -4711916.8
10 11 12
-532796.1 -6667082.5 -6696203.1
13 14 15
7582148.6 -4916640.9 -1898125.3
16 17 18
-336532.3 -995042.5 -1311618.3
19 20 21
-843454.5 8050721.3 1250336.9
22 23
1847040.4 2926656.0
SSE = sum(model1$residuals^2)
SSE
[1] 8.914926e+14
# Linear Regression (two variables)
model2 = lm(Payroll.Salary2023 ~ AVG + RBI, data=firstbase)
summary(model2)
Call:
lm(formula = Payroll.Salary2023 ~ AVG + RBI, data = firstbase)
Residuals:
Min 1Q Median 3Q
-9097952 -4621582 -33233 3016541
Max
10260245
Coefficients:
Estimate Std. Error
(Intercept) -18083756 9479036
AVG 74374031 42934155
RBI 108850 49212
t value Pr(>|t|)
(Intercept) -1.908 0.0709 .
AVG 1.732 0.0986 .
RBI 2.212 0.0388 *
---
Signif. codes:
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05
‘.’ 0.1 ‘ ’ 1
Residual standard error: 6226000 on 20 degrees of freedom
Multiple R-squared: 0.4735, Adjusted R-squared: 0.4209
F-statistic: 8.994 on 2 and 20 DF, p-value: 0.001636
# Sum of Squared Errors
SSE = sum(model2$residuals^2)
SSE
[1] 7.751841e+14
# Linear Regression (all variables)
model3 = lm(Payroll.Salary2023 ~ HR + RBI + AVG + OBP+ OPS, data=firstbase)
summary(model3)
Call:
lm(formula = Payroll.Salary2023 ~ HR + RBI + AVG + OBP + OPS,
data = firstbase)
Residuals:
Min 1Q Median 3Q
-9611440 -3338119 64016 4472451
Max
9490309
Coefficients:
Estimate Std. Error
(Intercept) -31107858 11738494
HR -341069 552069
RBI 115786 113932
AVG -63824769 104544645
OBP 27054948 131210166
OPS 60181012 95415131
t value Pr(>|t|)
(Intercept) -2.650 0.0168 *
HR -0.618 0.5449
RBI 1.016 0.3237
AVG -0.611 0.5496
OBP 0.206 0.8391
OPS 0.631 0.5366
---
Signif. codes:
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05
‘.’ 0.1 ‘ ’ 1
Residual standard error: 6023000 on 17 degrees of freedom
Multiple R-squared: 0.5811, Adjusted R-squared: 0.4579
F-statistic: 4.717 on 5 and 17 DF, p-value: 0.006951
# Sum of Squared Errors
SSE = sum(model3$residuals^2)
SSE
[1] 6.167793e+14
# Remove HR
model4 = lm(Payroll.Salary2023 ~ RBI + AVG + OBP+OPS, data=firstbase)
summary(model4)
Call:
lm(formula = Payroll.Salary2023 ~ RBI + AVG + OBP + OPS, data = firstbase)
Residuals:
Min 1Q Median 3Q
-9399551 -3573842 98921 3979339
Max
9263512
Coefficients:
Estimate Std. Error
(Intercept) -29466887 11235931
RBI 71495 87015
AVG -11035457 59192453
OBP 86360720 87899074
OPS 9464546 47788458
t value Pr(>|t|)
(Intercept) -2.623 0.0173 *
RBI 0.822 0.4220
AVG -0.186 0.8542
OBP 0.982 0.3389
OPS 0.198 0.8452
---
Signif. codes:
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05
‘.’ 0.1 ‘ ’ 1
Residual standard error: 5919000 on 18 degrees of freedom
Multiple R-squared: 0.5717, Adjusted R-squared: 0.4765
F-statistic: 6.007 on 4 and 18 DF, p-value: 0.00298
firstbase<-firstbase[,-(1:3)]
# Correlations
cor(firstbase$RBI, firstbase$Payroll.Salary2023)
[1] 0.6281239
cor(firstbase$AVG, firstbase$OBP)
[1] 0.8028894
cor(firstbase)
GP
GP 1.0000000
AB 0.9779421
H 0.9056508
X2B 0.8446267
HR 0.7432552
RBI 0.8813917
AVG 0.4430808
OBP 0.4841583
SLG 0.6875270
OPS 0.6504483
WAR 0.5645243
Payroll.Salary2023 0.4614889
AB
GP 0.9779421
AB 1.0000000
H 0.9516701
X2B 0.8924632
HR 0.7721339
RBI 0.9125839
AVG 0.5126292
OBP 0.5026125
SLG 0.7471949
OPS 0.6980141
WAR 0.6211558
Payroll.Salary2023 0.5018820
H
GP 0.9056508
AB 0.9516701
H 1.0000000
X2B 0.9308318
HR 0.7155225
RBI 0.9068893
AVG 0.7393167
OBP 0.6560021
SLG 0.8211406
OPS 0.8069779
WAR 0.7688712
Payroll.Salary2023 0.6249911
X2B
GP 0.8446267
AB 0.8924632
H 0.9308318
X2B 1.0000000
HR 0.5889699
RBI 0.8485911
AVG 0.6613085
OBP 0.5466537
SLG 0.7211259
OPS 0.6966830
WAR 0.6757470
Payroll.Salary2023 0.6450730
HR
GP 0.7432552
AB 0.7721339
H 0.7155225
X2B 0.5889699
HR 1.0000000
RBI 0.8929048
AVG 0.3444242
OBP 0.4603408
SLG 0.8681501
OPS 0.7638721
WAR 0.6897677
Payroll.Salary2023 0.5317619
RBI
GP 0.8813917
AB 0.9125839
H 0.9068893
X2B 0.8485911
HR 0.8929048
RBI 1.0000000
AVG 0.5658479
OBP 0.5704463
SLG 0.8824090
OPS 0.8156612
WAR 0.7885666
Payroll.Salary2023 0.6281239
AVG
GP 0.4430808
AB 0.5126292
H 0.7393167
X2B 0.6613085
HR 0.3444242
RBI 0.5658479
AVG 1.0000000
OBP 0.8028894
SLG 0.7254274
OPS 0.7989005
WAR 0.7855945
Payroll.Salary2023 0.5871543
OBP
GP 0.4841583
AB 0.5026125
H 0.6560021
X2B 0.5466537
HR 0.4603408
RBI 0.5704463
AVG 0.8028894
OBP 1.0000000
SLG 0.7617499
OPS 0.8987390
WAR 0.7766375
Payroll.Salary2023 0.7025979
SLG
GP 0.6875270
AB 0.7471949
H 0.8211406
X2B 0.7211259
HR 0.8681501
RBI 0.8824090
AVG 0.7254274
OBP 0.7617499
SLG 1.0000000
OPS 0.9686752
WAR 0.8611140
Payroll.Salary2023 0.6974086
OPS
GP 0.6504483
AB 0.6980141
H 0.8069779
X2B 0.6966830
HR 0.7638721
RBI 0.8156612
AVG 0.7989005
OBP 0.8987390
SLG 0.9686752
OPS 1.0000000
WAR 0.8799893
Payroll.Salary2023 0.7394981
WAR
GP 0.5645243
AB 0.6211558
H 0.7688712
X2B 0.6757470
HR 0.6897677
RBI 0.7885666
AVG 0.7855945
OBP 0.7766375
SLG 0.8611140
OPS 0.8799893
WAR 1.0000000
Payroll.Salary2023 0.8086359
Payroll.Salary2023
GP 0.4614889
AB 0.5018820
H 0.6249911
X2B 0.6450730
HR 0.5317619
RBI 0.6281239
AVG 0.5871543
OBP 0.7025979
SLG 0.6974086
OPS 0.7394981
WAR 0.8086359
Payroll.Salary2023 1.0000000
#Removing AVG
model5 = lm(Payroll.Salary2023 ~ RBI + OBP+OPS, data=firstbase)
summary(model5)
Call:
lm(formula = Payroll.Salary2023 ~ RBI + OBP + OPS, data = firstbase)
Residuals:
Min 1Q Median 3Q
-9465449 -3411234 259746 4102864
Max
8876798
Coefficients:
Estimate Std. Error
(Intercept) -29737007 10855411
RBI 72393 84646
OBP 82751360 83534224
OPS 7598051 45525575
t value Pr(>|t|)
(Intercept) -2.739 0.013 *
RBI 0.855 0.403
OBP 0.991 0.334
OPS 0.167 0.869
---
Signif. codes:
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05
‘.’ 0.1 ‘ ’ 1
Residual standard error: 5767000 on 19 degrees of freedom
Multiple R-squared: 0.5709, Adjusted R-squared: 0.5031
F-statistic: 8.426 on 3 and 19 DF, p-value: 0.000913
model6 = lm(Payroll.Salary2023 ~ RBI + OBP, data=firstbase)
summary(model6)
Call:
lm(formula = Payroll.Salary2023 ~ RBI + OBP, data = firstbase)
Residuals:
Min 1Q Median 3Q Max
-9045497 -3487008 139497 4084739 9190185
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -28984802 9632560 -3.009 0.00693
RBI 84278 44634 1.888 0.07360
OBP 95468873 33385182 2.860 0.00969
(Intercept) **
RBI .
OBP **
---
Signif. codes:
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 5625000 on 20 degrees of freedom
Multiple R-squared: 0.5703, Adjusted R-squared: 0.5273
F-statistic: 13.27 on 2 and 20 DF, p-value: 0.0002149
# Read in test set
firstbaseTest = read.csv("firstbasestats_test.csv")
str(firstbaseTest)
'data.frame': 2 obs. of 15 variables:
$ Player : chr "Matt Olson" "Josh Bell"
$ Pos : chr "1B" "1B"
$ Team : chr "ATL" "SD"
$ GP : int 162 156
$ AB : int 616 552
$ H : int 148 147
$ X2B : int 44 29
$ HR : int 34 17
$ RBI : int 103 71
$ AVG : num 0.24 0.266
$ OBP : num 0.325 0.362
$ SLG : num 0.477 0.422
$ OPS : num 0.802 0.784
$ WAR : num 3.29 3.5
$ Payroll.Salary2023: num 21000000 16500000
# Make test set predictions
predictTest = predict(model6, newdata=firstbaseTest)
predictTest
1 2
10723186 11558647
# Compute R-squared
SSE = sum((firstbaseTest$Payroll.Salary2023 - predictTest)^2)
SST = sum((firstbaseTest$Payroll.Salary2023 - mean(firstbase$Payroll.Salary2023))^2)
1 - SSE/SST
[1] 0.5477734
LS0tCnRpdGxlOiAiQWN0aXZpdHk1IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3J9CiMgUmVhZCBpbiBkYXRhCmZpcnN0YmFzZSA9IHJlYWQuY3N2KCJmaXJzdGJhc2VzdGF0cy5jc3YiKQpzdHIoZmlyc3RiYXNlKQpgYGAKCgoKYGBge3J9CnN1bW1hcnkoZmlyc3RiYXNlKQpgYGAKCgoKYGBge3J9CiMgTGluZWFyIFJlZ3Jlc3Npb24gKG9uZSB2YXJpYWJsZSkKbW9kZWwxID0gbG0oUGF5cm9sbC5TYWxhcnkyMDIzIH4gUkJJLCBkYXRhPWZpcnN0YmFzZSkKc3VtbWFyeShtb2RlbDEpCmBgYAoKCgpgYGB7cn0KIyBTdW0gb2YgU3F1YXJlZCBFcnJvcnMKbW9kZWwxJHJlc2lkdWFscwpgYGAKCgoKYGBge3J9ClNTRSA9IHN1bShtb2RlbDEkcmVzaWR1YWxzXjIpClNTRQpgYGAKCgoKYGBge3J9CiMgTGluZWFyIFJlZ3Jlc3Npb24gKHR3byB2YXJpYWJsZXMpCm1vZGVsMiA9IGxtKFBheXJvbGwuU2FsYXJ5MjAyMyB+IEFWRyArIFJCSSwgZGF0YT1maXJzdGJhc2UpCnN1bW1hcnkobW9kZWwyKQpgYGAKCgoKYGBge3J9CiMgU3VtIG9mIFNxdWFyZWQgRXJyb3JzClNTRSA9IHN1bShtb2RlbDIkcmVzaWR1YWxzXjIpClNTRQpgYGAKCgoKYGBge3J9CiMgTGluZWFyIFJlZ3Jlc3Npb24gKGFsbCB2YXJpYWJsZXMpCm1vZGVsMyA9IGxtKFBheXJvbGwuU2FsYXJ5MjAyMyB+IEhSICsgUkJJICsgQVZHICsgT0JQKyBPUFMsIGRhdGE9Zmlyc3RiYXNlKQpzdW1tYXJ5KG1vZGVsMykKYGBgCgoKCmBgYHtyfQojIFN1bSBvZiBTcXVhcmVkIEVycm9ycwpTU0UgPSBzdW0obW9kZWwzJHJlc2lkdWFsc14yKQpTU0UKCmBgYAoKCgpgYGB7cn0KIyBSZW1vdmUgSFIKbW9kZWw0ID0gbG0oUGF5cm9sbC5TYWxhcnkyMDIzIH4gUkJJICsgQVZHICsgT0JQK09QUywgZGF0YT1maXJzdGJhc2UpCnN1bW1hcnkobW9kZWw0KQpgYGAKCgoKYGBge3J9CmZpcnN0YmFzZTwtZmlyc3RiYXNlWywtKDE6MyldCmBgYAoKCgpgYGB7cn0KIyBDb3JyZWxhdGlvbnMKY29yKGZpcnN0YmFzZSRSQkksIGZpcnN0YmFzZSRQYXlyb2xsLlNhbGFyeTIwMjMpCmBgYAoKCgpgYGB7cn0KY29yKGZpcnN0YmFzZSRBVkcsIGZpcnN0YmFzZSRPQlApCmBgYAoKCgpgYGB7cn0KY29yKGZpcnN0YmFzZSkKYGBgCgoKCmBgYHtyfQojUmVtb3ZpbmcgQVZHCm1vZGVsNSA9IGxtKFBheXJvbGwuU2FsYXJ5MjAyMyB+IFJCSSArIE9CUCtPUFMsIGRhdGE9Zmlyc3RiYXNlKQpzdW1tYXJ5KG1vZGVsNSkKYGBgCgoKCmBgYHtyfQptb2RlbDYgPSBsbShQYXlyb2xsLlNhbGFyeTIwMjMgfiBSQkkgKyBPQlAsIGRhdGE9Zmlyc3RiYXNlKQpzdW1tYXJ5KG1vZGVsNikKYGBgCgoKCgpgYGB7cn0KIyBSZWFkIGluIHRlc3Qgc2V0CmZpcnN0YmFzZVRlc3QgPSByZWFkLmNzdigiZmlyc3RiYXNlc3RhdHNfdGVzdC5jc3YiKQpzdHIoZmlyc3RiYXNlVGVzdCkKYGBgCgoKCmBgYHtyfQojIE1ha2UgdGVzdCBzZXQgcHJlZGljdGlvbnMKcHJlZGljdFRlc3QgPSBwcmVkaWN0KG1vZGVsNiwgbmV3ZGF0YT1maXJzdGJhc2VUZXN0KQpwcmVkaWN0VGVzdApgYGAKCgoKYGBge3J9CiMgQ29tcHV0ZSBSLXNxdWFyZWQKU1NFID0gc3VtKChmaXJzdGJhc2VUZXN0JFBheXJvbGwuU2FsYXJ5MjAyMyAtIHByZWRpY3RUZXN0KV4yKQpTU1QgPSBzdW0oKGZpcnN0YmFzZVRlc3QkUGF5cm9sbC5TYWxhcnkyMDIzIC0gbWVhbihmaXJzdGJhc2UkUGF5cm9sbC5TYWxhcnkyMDIzKSleMikKMSAtIFNTRS9TU1QKYGBgCgo=