This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

** import the data **

# Load the data
baseball = read.csv("C:/Users/duway/Downloads/baseball.csv")
str(baseball)# check the structure of the data
'data.frame':   1232 obs. of  15 variables:
 $ Team        : chr  "ARI" "ATL" "BAL" "BOS" ...
 $ League      : chr  "NL" "NL" "AL" "AL" ...
 $ Year        : int  2012 2012 2012 2012 2012 2012 2012 2012 2012 2012 ...
 $ RS          : int  734 700 712 734 613 748 669 667 758 726 ...
 $ RA          : int  688 600 705 806 759 676 588 845 890 670 ...
 $ W           : int  81 94 93 69 61 85 97 68 64 88 ...
 $ OBP         : num  0.328 0.32 0.311 0.315 0.302 0.318 0.315 0.324 0.33 0.335 ...
 $ SLG         : num  0.418 0.389 0.417 0.415 0.378 0.422 0.411 0.381 0.436 0.422 ...
 $ BA          : num  0.259 0.247 0.247 0.26 0.24 0.255 0.251 0.251 0.274 0.268 ...
 $ Playoffs    : int  0 1 1 0 0 0 1 0 0 1 ...
 $ RankSeason  : int  NA 4 5 NA NA NA 2 NA NA 6 ...
 $ RankPlayoffs: int  NA 5 4 NA NA NA 4 NA NA 2 ...
 $ G           : int  162 162 162 162 162 162 162 162 162 162 ...
 $ OOBP        : num  0.317 0.306 0.315 0.331 0.335 0.319 0.305 0.336 0.357 0.314 ...
 $ OSLG        : num  0.415 0.378 0.403 0.428 0.424 0.405 0.39 0.43 0.47 0.402 ...

getwd()# check the working directory
[1] "C:/Users/duway/OneDrive/Documentos"
# create a subset of the data with only the columns we need
moneyball = subset(baseball,Year<2002)
str(moneyball)
'data.frame':   902 obs. of  15 variables:
 $ Team        : chr  "ANA" "ARI" "ATL" "BAL" ...
 $ League      : chr  "AL" "NL" "NL" "AL" ...
 $ Year        : int  2001 2001 2001 2001 2001 2001 2001 2001 2001 2001 ...
 $ RS          : int  691 818 729 687 772 777 798 735 897 923 ...
 $ RA          : int  730 677 643 829 745 701 795 850 821 906 ...
 $ W           : int  75 92 88 63 82 88 83 66 91 73 ...
 $ OBP         : num  0.327 0.341 0.324 0.319 0.334 0.336 0.334 0.324 0.35 0.354 ...
 $ SLG         : num  0.405 0.442 0.412 0.38 0.439 0.43 0.451 0.419 0.458 0.483 ...
 $ BA          : num  0.261 0.267 0.26 0.248 0.266 0.261 0.268 0.262 0.278 0.292 ...
 $ Playoffs    : int  0 1 1 0 0 0 0 0 1 0 ...
 $ RankSeason  : int  NA 5 7 NA NA NA NA NA 6 NA ...
 $ RankPlayoffs: int  NA 1 3 NA NA NA NA NA 4 NA ...
 $ G           : int  162 162 162 162 161 162 162 162 162 162 ...
 $ OOBP        : num  0.331 0.311 0.314 0.337 0.329 0.321 0.334 0.341 0.341 0.35 ...
 $ OSLG        : num  0.412 0.404 0.384 0.439 0.393 0.398 0.427 0.455 0.417 0.48 ...

902 rows and 15 columns

#Compute runs difference 
moneyball$RD = moneyball$RS - moneyball$RA
str(moneyball)
'data.frame':   902 obs. of  16 variables:
 $ Team        : chr  "ANA" "ARI" "ATL" "BAL" ...
 $ League      : chr  "AL" "NL" "NL" "AL" ...
 $ Year        : int  2001 2001 2001 2001 2001 2001 2001 2001 2001 2001 ...
 $ RS          : int  691 818 729 687 772 777 798 735 897 923 ...
 $ RA          : int  730 677 643 829 745 701 795 850 821 906 ...
 $ W           : int  75 92 88 63 82 88 83 66 91 73 ...
 $ OBP         : num  0.327 0.341 0.324 0.319 0.334 0.336 0.334 0.324 0.35 0.354 ...
 $ SLG         : num  0.405 0.442 0.412 0.38 0.439 0.43 0.451 0.419 0.458 0.483 ...
 $ BA          : num  0.261 0.267 0.26 0.248 0.266 0.261 0.268 0.262 0.278 0.292 ...
 $ Playoffs    : int  0 1 1 0 0 0 0 0 1 0 ...
 $ RankSeason  : int  NA 5 7 NA NA NA NA NA 6 NA ...
 $ RankPlayoffs: int  NA 1 3 NA NA NA NA NA 4 NA ...
 $ G           : int  162 162 162 162 161 162 162 162 162 162 ...
 $ OOBP        : num  0.331 0.311 0.314 0.337 0.329 0.321 0.334 0.341 0.341 0.35 ...
 $ OSLG        : num  0.412 0.404 0.384 0.439 0.393 0.398 0.427 0.455 0.417 0.48 ...
 $ RD          : int  -39 141 86 -142 27 76 3 -115 76 17 ...
# plot rd and wins
plot(moneyball$RD, moneyball$W)

#Regression model to predict wins
WinsReg = lm(W ~ RD, data = moneyball)
summary(WinsReg)

Call:
lm(formula = W ~ RD, data = moneyball)

Residuals:
     Min       1Q   Median       3Q      Max 
-14.2662  -2.6509   0.1234   2.9364  11.6570 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 80.881375   0.131157  616.67   <2e-16 ***
RD           0.105766   0.001297   81.55   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.939 on 900 degrees of freedom
Multiple R-squared:  0.8808,    Adjusted R-squared:  0.8807 
F-statistic:  6651 on 1 and 900 DF,  p-value: < 2.2e-16

for one unit increase in RD, the wins will increase by 0.1057661 or 10.57661%

# use the model to compute the predicted wins 100
Wins<-predict(WinsReg, data.frame(RD=100))
Wins
       1 
91.45794 
RunsReg = lm(RS ~ OBP + SLG + BA, data = moneyball)
summary(RunsReg)

Call:
lm(formula = RS ~ OBP + SLG + BA, data = moneyball)

Residuals:
    Min      1Q  Median      3Q     Max 
-70.941 -17.247  -0.621  16.754  90.998 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -788.46      19.70 -40.029  < 2e-16 ***
OBP          2917.42     110.47  26.410  < 2e-16 ***
SLG          1637.93      45.99  35.612  < 2e-16 ***
BA           -368.97     130.58  -2.826  0.00482 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 24.69 on 898 degrees of freedom
Multiple R-squared:  0.9302,    Adjusted R-squared:   0.93 
F-statistic:  3989 on 3 and 898 DF,  p-value: < 2.2e-16

a negative signal can signal a problem with multicollinearity

check correlation

cor(moneyball$BA, moneyball$OBP)
[1] 0.8540549
# run variance inflation factor from scratch
#install.packages("car")
library(car)
Warning: package ‘car’ was built under R version 4.4.3
Loading required package: carData
Warning: package ‘carData’ was built under R version 4.4.3
vif(RunsReg)
     OBP      SLG 
2.856197 2.856197 

when you see greater than 5, it is a sign of multicollinearity

this shows a high correlation between BA and OBP

above these features show a high level of correlation with the runs scored

# use the model to compute the predicted runs
RunsReg = lm(RS ~ OBP + SLG , data = moneyball)
summary(RunsReg)

Call:
lm(formula = RS ~ OBP + SLG, data = moneyball)

Residuals:
    Min      1Q  Median      3Q     Max 
-70.838 -17.174  -1.108  16.770  90.036 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -804.63      18.92  -42.53   <2e-16 ***
OBP          2737.77      90.68   30.19   <2e-16 ***
SLG          1584.91      42.16   37.60   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 24.79 on 899 degrees of freedom
Multiple R-squared:  0.9296,    Adjusted R-squared:  0.9294 
F-statistic:  5934 on 2 and 899 DF,  p-value: < 2.2e-16

almost 92% of the variance in runs scored is explained by the model using OBP and SLG

Create a regression model to predict runs allowed

RAReg = lm(RA ~ OOBP + OSLG, data = moneyball)
summary(RAReg)

Call:
lm(formula = RA ~ OOBP + OSLG, data = moneyball)

Residuals:
    Min      1Q  Median      3Q     Max 
-82.397 -15.178  -0.129  17.679  60.955 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -837.38      60.26 -13.897  < 2e-16 ***
OOBP         2913.60     291.97   9.979 4.46e-16 ***
OSLG         1514.29     175.43   8.632 2.55e-13 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 25.67 on 87 degrees of freedom
  (812 observations deleted due to missingness)
Multiple R-squared:  0.9073,    Adjusted R-squared:  0.9052 
F-statistic: 425.8 on 2 and 87 DF,  p-value: < 2.2e-16

#oobp are the opponent’s on-base percentage and oslg is the opponent’s slugging percentage are both significant predictors of runs allowed #Is t-value is greater than 2, it is significant 9.979 for OOBP and 8.632 for OSLG

vif(RAReg)# check for multicollinearity
    OOBP     OSLG 
2.735629 2.735629 

inclass activty seven

f a baseball team scores 763 runs and allows 614 runs, how many games do we expect the team to win?

Using the linear regression model constructed during the lecture, enter the number of games we expect the team to win:

# use the model to compute the predicted runs
Num_wins=88.88 + 0.1057661*(763-614)
Wins<-predict(WinsReg, data.frame(RD=763-614))
# w=81 + 0.1057661*100
Wins
       1 
96.64045 

The team is expected to win 97 games with 763 runs scored and 614 runs allowed difference of 149

```

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkN0cmwrU2hpZnQrRW50ZXIqLiANCg0KKiogaW1wb3J0IHRoZSBkYXRhICoqDQpgYGB7cn0NCiMgTG9hZCB0aGUgZGF0YQ0KYmFzZWJhbGwgPSByZWFkLmNzdigiQzovVXNlcnMvZHV3YXkvRG93bmxvYWRzL2Jhc2ViYWxsLmNzdiIpDQpzdHIoYmFzZWJhbGwpIyBjaGVjayB0aGUgc3RydWN0dXJlIG9mIHRoZSBkYXRhDQpgYGANCmBgYHtyfQ0KDQpnZXR3ZCgpIyBjaGVjayB0aGUgd29ya2luZyBkaXJlY3RvcnkNCmBgYA0KDQpgYGB7cn0NCiMgY3JlYXRlIGEgc3Vic2V0IG9mIHRoZSBkYXRhIHdpdGggb25seSB0aGUgY29sdW1ucyB3ZSBuZWVkDQptb25leWJhbGwgPSBzdWJzZXQoYmFzZWJhbGwsWWVhcjwyMDAyKQ0Kc3RyKG1vbmV5YmFsbCkNCmBgYA0KDQojIDkwMiByb3dzIGFuZCAxNSBjb2x1bW5zDQoNCg0KYGBge3J9DQojQ29tcHV0ZSBydW5zIGRpZmZlcmVuY2UgYW5kIGFkZCBpdCB0byB0aGUgZGF0YWZyYW1lIGFzIGEgbmV3IGNvbHVtbiBSRA0KbW9uZXliYWxsJFJEID0gbW9uZXliYWxsJFJTIC0gbW9uZXliYWxsJFJBDQpzdHIobW9uZXliYWxsKQ0KYGBgDQoNCg0KDQoNCmBgYHtyfQ0KIyBwbG90IHJkIGFuZCB3aW5zDQpwbG90KG1vbmV5YmFsbCRSRCwgbW9uZXliYWxsJFcpDQpgYGANCg0KYGBge3J9DQojUmVncmVzc2lvbiBtb2RlbCB0byBwcmVkaWN0IHdpbnMNCldpbnNSZWcgPSBsbShXIH4gUkQsIGRhdGEgPSBtb25leWJhbGwpDQpzdW1tYXJ5KFdpbnNSZWcpDQpgYGANCg0KDQojIyMgZm9yIG9uZSB1bml0IGluY3JlYXNlIGluIFJELCB0aGUgd2lucyB3aWxsIGluY3JlYXNlIGJ5IDAuMTA1NzY2MSBvciAxMC41NzY2MSUNCg0KDQoNCmBgYHtyfQ0KIyB1c2UgdGhlIG1vZGVsIHRvIGNvbXB1dGUgdGhlIHByZWRpY3RlZCB3aW5zIDEwMA0KV2luczwtcHJlZGljdChXaW5zUmVnLCBkYXRhLmZyYW1lKFJEPTEwMCkpDQojIHc9ODEgKyAwLjEwNTc2NjEqMTAwDQpXaW5zDQpgYGANCg0KYGBge3J9DQpSdW5zUmVnID0gbG0oUlMgfiBPQlAgKyBTTEcgKyBCQSwgZGF0YSA9IG1vbmV5YmFsbCkNCnN1bW1hcnkoUnVuc1JlZykNCmBgYA0KDQojIGEgbmVnYXRpdmUgc2lnbmFsIGNhbiBzaWduYWwgYSBwcm9ibGVtIHdpdGggbXVsdGljb2xsaW5lYXJpdHkNCg0KDQojIGNoZWNrIGNvcnJlbGF0aW9uDQpgYGB7cn0NCmNvcihtb25leWJhbGwkQkEsIG1vbmV5YmFsbCRPQlApDQpgYGANCmBgYHtyfQ0KIyBydW4gdmFyaWFuY2UgaW5mbGF0aW9uIGZhY3RvciBmcm9tIHNjcmF0Y2gNCiNpbnN0YWxsLnBhY2thZ2VzKCJjYXIiKQ0KYGBgDQoNCmBgYHtyfQ0KI2xpYnJhcnkoY2FyKQ0KYGBgDQpgYGB7cn0NCiMgY2hlY2sgZm9yIG11bHRpY29sbGluZWFyaXR5IHVzaW5nIHRoZSB2YXJpYW5jZSBpbmZsYXRpb24gZmFjdG9yDQp2aWYoUnVuc1JlZykNCmBgYA0KIyB3aGVuIHlvdSBzZWUgZ3JlYXRlciB0aGFuIDUsIGl0IGlzIGEgc2lnbiBvZiBtdWx0aWNvbGxpbmVhcml0eQ0KDQojIyB0aGlzIHNob3dzIGEgaGlnaCBjb3JyZWxhdGlvbiBiZXR3ZWVuIEJBIGFuZCBPQlANCg0KDQojIGFib3ZlIHRoZXNlIGZlYXR1cmVzIHNob3cgYSBoaWdoIGxldmVsIG9mIGNvcnJlbGF0aW9uIHdpdGggdGhlIHJ1bnMgc2NvcmVkDQoNCmBgYHtyfQ0KIyB1c2UgdGhlIG1vZGVsIHRvIGNvbXB1dGUgdGhlIHByZWRpY3RlZCBydW5zDQpSdW5zUmVnID0gbG0oUlMgfiBPQlAgKyBTTEcgLCBkYXRhID0gbW9uZXliYWxsKQ0Kc3VtbWFyeShSdW5zUmVnKQ0KYGBgDQoNCiMgYWxtb3N0IDkyJSBvZiB0aGUgdmFyaWFuY2UgaW4gcnVucyBzY29yZWQgaXMgZXhwbGFpbmVkIGJ5IHRoZSBtb2RlbCB1c2luZyBPQlAgYW5kIFNMRw0KDQoNCiMgQ3JlYXRlIGEgcmVncmVzc2lvbiBtb2RlbCB0byBwcmVkaWN0IHJ1bnMgYWxsb3dlZCANCmBgYHtyfQ0KUkFSZWcgPSBsbShSQSB+IE9PQlAgKyBPU0xHLCBkYXRhID0gbW9uZXliYWxsKQ0Kc3VtbWFyeShSQVJlZykNCmBgYA0KDQojb29icCBhcmUgdGhlIG9wcG9uZW50J3Mgb24tYmFzZSBwZXJjZW50YWdlIGFuZCBvc2xnIGlzIHRoZSBvcHBvbmVudCdzIHNsdWdnaW5nIHBlcmNlbnRhZ2UgYXJlIGJvdGggc2lnbmlmaWNhbnQgcHJlZGljdG9ycyBvZiBydW5zIGFsbG93ZWQNCiNJcyB0LXZhbHVlIGlzIGdyZWF0ZXIgdGhhbiAyLCBpdCBpcyBzaWduaWZpY2FudCAgOS45NzkgZm9yIE9PQlAgYW5kIDguNjMyIGZvciBPU0xHDQoNCmBgYHtyfQ0KdmlmKFJBUmVnKSMgY2hlY2sgZm9yIG11bHRpY29sbGluZWFyaXR5DQpgYGANCg0KIyMjIGluY2xhc3MgYWN0aXZ0eSBzZXZlbg0KDQojIyMgZiBhIGJhc2ViYWxsIHRlYW0gc2NvcmVzIDc2MyBydW5zIGFuZCBhbGxvd3MgNjE0IHJ1bnMsIGhvdyBtYW55IGdhbWVzIGRvIHdlIGV4cGVjdCB0aGUgdGVhbSB0byB3aW4/DQojIyMgVXNpbmcgdGhlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIGNvbnN0cnVjdGVkIGR1cmluZyB0aGUgbGVjdHVyZSwgZW50ZXIgdGhlIG51bWJlciBvZiBnYW1lcyB3ZSBleHBlY3QgdGhlIHRlYW0gdG8gd2luOg0KDQpgYGB7cn0NCiMgdXNlIHRoZSBtb2RlbCB0byBjb21wdXRlIHRoZSBwcmVkaWN0ZWQgcnVucw0KTnVtX3dpbnM9ODguODggKyAwLjEwNTc2NjEqKDc2My02MTQpDQpXaW5zPC1wcmVkaWN0KFdpbnNSZWcsIGRhdGEuZnJhbWUoUkQ9NzYzLTYxNCkpDQojIHc9ODEgKyAwLjEwNTc2NjEqMTAwDQpXaW5zDQoNCmBgYA0KDQojIyMgVGhlIHRlYW0gaXMgZXhwZWN0ZWQgdG8gd2luIDk3IGdhbWVzIHdpdGggNzYzIHJ1bnMgc2NvcmVkIGFuZCA2MTQgcnVucyBhbGxvd2VkIGRpZmZlcmVuY2Ugb2YgMTQ5DQoNCg0KDQoNCg0KDQoNCg0KYGBgDQoNCg0K