A. How many observations do we have in the training dataset?

# Read in the data
NBA = read.csv("NBA_train.csv")
str(NBA)
'data.frame':   835 obs. of  20 variables:
 $ SeasonEnd: int  1980 1980 1980 1980 1980 1980 1980 1980 1980 1980 ...
 $ Team     : chr  "Atlanta Hawks" "Boston Celtics" "Chicago Bulls" "Cleveland Cavaliers" ...
 $ Playoffs : int  1 1 0 0 0 0 0 1 0 1 ...
 $ W        : int  50 61 30 37 30 16 24 41 37 47 ...
 $ PTS      : int  8573 9303 8813 9360 8878 8933 8493 9084 9119 8860 ...
 $ oppPTS   : int  8334 8664 9035 9332 9240 9609 8853 9070 9176 8603 ...
 $ FG       : int  3261 3617 3362 3811 3462 3643 3527 3599 3639 3582 ...
 $ FGA      : int  7027 7387 6943 8041 7470 7596 7318 7496 7689 7489 ...
 $ X2P      : int  3248 3455 3292 3775 3379 3586 3500 3495 3551 3557 ...
 $ X2PA     : int  6952 6965 6668 7854 7215 7377 7197 7117 7375 7375 ...
 $ X3P      : int  13 162 70 36 83 57 27 104 88 25 ...
 $ X3PA     : int  75 422 275 187 255 219 121 379 314 114 ...
 $ FT       : int  2038 1907 2019 1702 1871 1590 1412 1782 1753 1671 ...
 $ FTA      : int  2645 2449 2592 2205 2539 2149 1914 2326 2333 2250 ...
 $ ORB      : int  1369 1227 1115 1307 1311 1226 1155 1394 1398 1187 ...
 $ DRB      : int  2406 2457 2465 2381 2524 2415 2437 2217 2326 2429 ...
 $ AST      : int  1913 2198 2152 2108 2079 1950 2028 2149 2148 2123 ...
 $ STL      : int  782 809 704 764 746 783 779 782 900 863 ...
 $ BLK      : int  539 308 392 342 404 562 339 373 530 356 ...
 $ TOV      : int  1495 1539 1684 1370 1533 1742 1492 1565 1517 1439 ...

Answer: 835 observations

B.Is there any chance that a team winning 38 games can make it to the playoffs? Why?

# How many wins to make the playoffs?
table(NBA$W, NBA$Playoffs)
    
      0  1
  11  2  0
  12  2  0
  13  2  0
  14  2  0
  15 10  0
  16  2  0
  17 11  0
  18  5  0
  19 10  0
  20 10  0
  21 12  0
  22 11  0
  23 11  0
  24 18  0
  25 11  0
  26 17  0
  27 10  0
  28 18  0
  29 12  0
  30 19  1
  31 15  1
  32 12  0
  33 17  0
  34 16  0
  35 13  3
  36 17  4
  37 15  4
  38  8  7
  39 10 10
  40  9 13
  41 11 26
  42  8 29
  43  2 18
  44  2 27
  45  3 22
  46  1 15
  47  0 28
  48  1 14
  49  0 17
  50  0 32
  51  0 12
  52  0 20
  53  0 17
  54  0 18
  55  0 24
  56  0 16
  57  0 23
  58  0 13
  59  0 14
  60  0  8
  61  0 10
  62  0 13
  63  0  7
  64  0  3
  65  0  3
  66  0  2
  67  0  4
  69  0  1
  72  0  1

Yes, The table shows exactly 7 teams with 38 wins made the playoffs, while 8 teams with 38 wins did not (about 47% made it)

C. What is the number of wins that can guarantee for any team a presence in the playoffs based on historical data?

Based on the above table At 47 wins, every team made it, but 48 wins, one team still missed the playoffs. So 49 is the true guarantee based on this data.

# Compute Points Difference
NBA$PTSdiff = NBA$PTS - NBA$oppPTS

D. Can you determine (visually) if there is any relationship between the points difference (PTSdiff) and the number of wins (W)?Explain.

# Check for linear relationship
plot(NBA$PTSdiff, NBA$W)

Answer: Yes, there is a strong, clearly positive, nearly straight-line relationship: as point differential goes up, wins go up right along with it.

E. Here we want to determine what aspects of the game affect the number of wins of a team(WingsReg model). Is the predictor variable points difference (PTSdiff) significant at a 5% significance level?

WinsReg = lm(W ~ PTSdiff, data=NBA)
summary(WinsReg)

Call:
lm(formula = W ~ PTSdiff, data = NBA)

Residuals:
    Min      1Q  Median      3Q     Max 
-9.7393 -2.1018 -0.0672  2.0265 10.6026 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 4.100e+01  1.059e-01   387.0   <2e-16 ***
PTSdiff     3.259e-02  2.793e-04   116.7   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.061 on 833 degrees of freedom
Multiple R-squared:  0.9423,    Adjusted R-squared:  0.9423 
F-statistic: 1.361e+04 on 1 and 833 DF,  p-value: < 2.2e-16

The Yes, overwhelmingly — p-value is < 2e-16 (essentially zero), far below 0.05.

F. We also built a linear model to predict the number of points as a function of some aspects of the game. Is the number of blocks (BLK) significant at a 5% significance level?

PointsReg = lm(PTS ~ X2PA + X3PA + FTA + AST + ORB + DRB + TOV + STL + BLK, data=NBA)
summary(PointsReg)

Call:
lm(formula = PTS ~ X2PA + X3PA + FTA + AST + ORB + DRB + TOV + 
    STL + BLK, data = NBA)

Residuals:
    Min      1Q  Median      3Q     Max 
-527.40 -119.83    7.83  120.67  564.71 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -2.051e+03  2.035e+02 -10.078   <2e-16 ***
X2PA         1.043e+00  2.957e-02  35.274   <2e-16 ***
X3PA         1.259e+00  3.843e-02  32.747   <2e-16 ***
FTA          1.128e+00  3.373e-02  33.440   <2e-16 ***
AST          8.858e-01  4.396e-02  20.150   <2e-16 ***
ORB         -9.554e-01  7.792e-02 -12.261   <2e-16 ***
DRB          3.883e-02  6.157e-02   0.631   0.5285    
TOV         -2.475e-02  6.118e-02  -0.405   0.6859    
STL         -1.992e-01  9.181e-02  -2.169   0.0303 *  
BLK         -5.576e-02  8.782e-02  -0.635   0.5256    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 185.5 on 825 degrees of freedom
Multiple R-squared:  0.8992,    Adjusted R-squared:  0.8981 
F-statistic: 817.3 on 9 and 825 DF,  p-value: < 2.2e-16

Yes, we did. But Model PointsReg is not significant at a 5% significance level. Original 9-variable model, BLK’s p-value is 0.5256, well above 0.05.

G. What has been the maximum number of points in a season? Please see below the result.

max(NBA$PTS)
[1] 10371

H. What is the meaning of the RMSE(Root mean squared error) in the PointsReg model? Are you satisfied with this value?

Yes, satisfied on average, the prediction is off by about 185 points. Context makes this a good result — the average team scores about 8,370 points a season, so a 185-point miss is only about 2.2% relative error.

SSE = sum(PointsReg$residuals^2)
SSE
[1] 28394314
# Compare to the average points scored, for context
mean(NBA$PTS)
[1] 8370.24
# Step 1 - remove Turnovers (TOV): highest p-value in PointsReg, 0.6859
PointsReg2 = lm(PTS ~ X2PA + X3PA + FTA + AST + ORB + DRB + STL + BLK, data=NBA)

# Step 2 - remove Defensive Rebounds (DRB): next highest p-value
PointsReg3 = lm(PTS ~ X2PA + X3PA + FTA + AST + ORB + STL + BLK, data=NBA)

# Step 3 - remove Blocks (BLK): last insignificant variable removed
PointsReg4 = lm(PTS ~ X2PA + X3PA + FTA + AST + ORB + STL, data=NBA)

# R-squared barely moves after all three removals (0.8992 -> 0.899),
# confirming none of TOV/DRB/BLK were adding real predictive value
SSE_4 = sum(PointsReg4$residuals^2)
RMSE_4 = sqrt(SSE_4/nrow(NBA))
RMSE_4
[1] 184.493

I. How well did your predictions work on the testing dataset? Report the new R2 and RMSE.

NBA_test = read.csv("NBA_test.csv")

PointsPredictions = predict(PointsReg4, newdata=NBA_test)

# Out-of-sample R-squared
SSE = sum((PointsPredictions - NBA_test$PTS)^2)
SST = sum((mean(NBA$PTS) - NBA_test$PTS)^2)
R2 = 1 - SSE/SST
R2
[1] 0.8127142
# Out-of-sample RMSE
RMSE = sqrt(SSE/nrow(NBA_test))
RMSE
[1] 196.3723

R² = 0.8127 (81.3%) and RMSE = 196.37. Both numbers are only slightly worse than the training numbers (184.5 → 196.4 RMSE) — a small, healthy gap, meaning the model generalizes well to teams it never saw, rather than just memorizing the training data.

In-class activity 13: Wins and Points Difference

Our data shows that a team with 49 wins has never missed the playoffs. What is the expected points difference for a team to make it to the postseason? Use the lecture solution file and more specifically the WingsReg model.

(49 - 41.00) / 0.03259
[1] 245.4741

Answer: Basically, a team needs to outscore its opponents by 246 points across the whole season to be expected to reach 49 wins, which, based on the data, is the win total that has never missed the playoffs.

LS0tCnRpdGxlOiAiSW4tY2xhc3MgYWN0aXZpdHkgMTIgJiAxMyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKQS4gSG93IG1hbnkgb2JzZXJ2YXRpb25zIGRvIHdlIGhhdmUgaW4gdGhlIHRyYWluaW5nIGRhdGFzZXQ/CgpgYGB7cn0KIyBSZWFkIGluIHRoZSBkYXRhCk5CQSA9IHJlYWQuY3N2KCJOQkFfdHJhaW4uY3N2IikKc3RyKE5CQSkKYGBgCkFuc3dlcjogODM1IG9ic2VydmF0aW9ucwoKQi5JcyB0aGVyZSBhbnkgY2hhbmNlIHRoYXQgYSB0ZWFtIHdpbm5pbmcgMzggZ2FtZXMgY2FuIG1ha2UgaXQgdG8gdGhlIHBsYXlvZmZzPyBXaHk/IApgYGB7cn0KIyBIb3cgbWFueSB3aW5zIHRvIG1ha2UgdGhlIHBsYXlvZmZzPwp0YWJsZShOQkEkVywgTkJBJFBsYXlvZmZzKQpgYGAKClllcywgVGhlIHRhYmxlIHNob3dzIGV4YWN0bHkgNyB0ZWFtcyB3aXRoIDM4IHdpbnMgbWFkZSB0aGUgcGxheW9mZnMsIHdoaWxlIDggdGVhbXMgd2l0aCAzOCB3aW5zIGRpZCBub3QgKGFib3V0IDQ3JSBtYWRlIGl0KQoKQy4gV2hhdCBpcyB0aGUgbnVtYmVyIG9mIHdpbnMgdGhhdCBjYW4gZ3VhcmFudGVlIGZvciBhbnkgdGVhbSBhIHByZXNlbmNlIGluIHRoZSBwbGF5b2ZmcyBiYXNlZCBvbiBoaXN0b3JpY2FsIGRhdGE/CgpCYXNlZCBvbiB0aGUgYWJvdmUgdGFibGUgQXQgNDcgd2lucywgZXZlcnkgdGVhbSBtYWRlIGl0LCBidXQgNDggd2lucywgb25lIHRlYW0gc3RpbGwgbWlzc2VkIHRoZSBwbGF5b2Zmcy4gU28gNDkgaXMgdGhlIHRydWUgZ3VhcmFudGVlIGJhc2VkIG9uIHRoaXMgZGF0YS4KYGBge3J9CiMgQ29tcHV0ZSBQb2ludHMgRGlmZmVyZW5jZQpOQkEkUFRTZGlmZiA9IE5CQSRQVFMgLSBOQkEkb3BwUFRTCmBgYAoKCkQuIENhbiB5b3UgZGV0ZXJtaW5lICh2aXN1YWxseSkgaWYgdGhlcmUgaXMgYW55IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBwb2ludHMgZGlmZmVyZW5jZSAoUFRTZGlmZikgYW5kIHRoZSBudW1iZXIgb2Ygd2lucyAoVyk/RXhwbGFpbi4KCmBgYHtyfQojIENoZWNrIGZvciBsaW5lYXIgcmVsYXRpb25zaGlwCnBsb3QoTkJBJFBUU2RpZmYsIE5CQSRXKQpgYGAKQW5zd2VyOiBZZXMsIHRoZXJlIGlzIGEgc3Ryb25nLCBjbGVhcmx5IHBvc2l0aXZlLCBuZWFybHkgc3RyYWlnaHQtbGluZSByZWxhdGlvbnNoaXA6IGFzIHBvaW50IGRpZmZlcmVudGlhbCBnb2VzIHVwLCB3aW5zIGdvIHVwIHJpZ2h0IGFsb25nIHdpdGggaXQuCgpFLiBIZXJlIHdlIHdhbnQgdG8gZGV0ZXJtaW5lIHdoYXQgYXNwZWN0cyBvZiB0aGUgZ2FtZSBhZmZlY3QgdGhlIG51bWJlciBvZiB3aW5zIG9mIGEgdGVhbShXaW5nc1JlZyBtb2RlbCkuIElzIHRoZSBwcmVkaWN0b3IgdmFyaWFibGUgcG9pbnRzIGRpZmZlcmVuY2UgKFBUU2RpZmYpIHNpZ25pZmljYW50IGF0IGEgNSUgc2lnbmlmaWNhbmNlIGxldmVsPwoKYGBge3J9CldpbnNSZWcgPSBsbShXIH4gUFRTZGlmZiwgZGF0YT1OQkEpCnN1bW1hcnkoV2luc1JlZykKYGBgClRoZSBZZXMsIG92ZXJ3aGVsbWluZ2x5IOKAlCBwLXZhbHVlIGlzIDwgMmUtMTYgKGVzc2VudGlhbGx5IHplcm8pLCBmYXIgYmVsb3cgMC4wNS4KCkYuIFdlIGFsc28gYnVpbHQgYSBsaW5lYXIgbW9kZWwgdG8gcHJlZGljdCB0aGUgbnVtYmVyIG9mIHBvaW50cyBhcyBhIGZ1bmN0aW9uIG9mIHNvbWUgYXNwZWN0cyBvZiB0aGUgZ2FtZS4gSXMgdGhlIG51bWJlciBvZiBibG9ja3MgKEJMSykgc2lnbmlmaWNhbnQgYXQgYSA1JSBzaWduaWZpY2FuY2UgbGV2ZWw/CgoKCmBgYHtyfQpQb2ludHNSZWcgPSBsbShQVFMgfiBYMlBBICsgWDNQQSArIEZUQSArIEFTVCArIE9SQiArIERSQiArIFRPViArIFNUTCArIEJMSywgZGF0YT1OQkEpCnN1bW1hcnkoUG9pbnRzUmVnKQpgYGAKWWVzLCB3ZSBkaWQuIEJ1dCBNb2RlbCBQb2ludHNSZWcgaXMgbm90IHNpZ25pZmljYW50IGF0IGEgNSUgc2lnbmlmaWNhbmNlIGxldmVsLiBPcmlnaW5hbCA5LXZhcmlhYmxlIG1vZGVsLCBCTEsncyBwLXZhbHVlIGlzIDAuNTI1Niwgd2VsbCBhYm92ZSAwLjA1LgoKCkcuIFdoYXQgaGFzIGJlZW4gdGhlIG1heGltdW0gbnVtYmVyIG9mIHBvaW50cyBpbiBhIHNlYXNvbj8KUGxlYXNlIHNlZSBiZWxvdyB0aGUgcmVzdWx0LgoKYGBge3J9Cm1heChOQkEkUFRTKQpgYGAKCkguIFdoYXQgaXMgdGhlIG1lYW5pbmcgb2YgdGhlIFJNU0UoUm9vdCBtZWFuIHNxdWFyZWQgZXJyb3IpIGluIHRoZSBQb2ludHNSZWcgbW9kZWw/IEFyZSB5b3Ugc2F0aXNmaWVkIHdpdGggdGhpcyB2YWx1ZT8KClllcywgc2F0aXNmaWVkIG9uIGF2ZXJhZ2UsIHRoZSBwcmVkaWN0aW9uIGlzIG9mZiBieSBhYm91dCAxODUgcG9pbnRzLiBDb250ZXh0IG1ha2VzIHRoaXMgYSBnb29kIHJlc3VsdCDigJQgdGhlIGF2ZXJhZ2UgdGVhbSBzY29yZXMgYWJvdXQgOCwzNzAgcG9pbnRzIGEgc2Vhc29uLCBzbyBhIDE4NS1wb2ludCBtaXNzIGlzIG9ubHkgYWJvdXQgMi4yJSByZWxhdGl2ZSBlcnJvci4KCmBgYHtyfQpTU0UgPSBzdW0oUG9pbnRzUmVnJHJlc2lkdWFsc14yKQpTU0UKYGBgCgoKYGBge3J9CiMgQ29tcGFyZSB0byB0aGUgYXZlcmFnZSBwb2ludHMgc2NvcmVkLCBmb3IgY29udGV4dAptZWFuKE5CQSRQVFMpCgojIFN0ZXAgMSAtIHJlbW92ZSBUdXJub3ZlcnMgKFRPVik6IGhpZ2hlc3QgcC12YWx1ZSBpbiBQb2ludHNSZWcsIDAuNjg1OQpQb2ludHNSZWcyID0gbG0oUFRTIH4gWDJQQSArIFgzUEEgKyBGVEEgKyBBU1QgKyBPUkIgKyBEUkIgKyBTVEwgKyBCTEssIGRhdGE9TkJBKQoKIyBTdGVwIDIgLSByZW1vdmUgRGVmZW5zaXZlIFJlYm91bmRzIChEUkIpOiBuZXh0IGhpZ2hlc3QgcC12YWx1ZQpQb2ludHNSZWczID0gbG0oUFRTIH4gWDJQQSArIFgzUEEgKyBGVEEgKyBBU1QgKyBPUkIgKyBTVEwgKyBCTEssIGRhdGE9TkJBKQoKIyBTdGVwIDMgLSByZW1vdmUgQmxvY2tzIChCTEspOiBsYXN0IGluc2lnbmlmaWNhbnQgdmFyaWFibGUgcmVtb3ZlZApQb2ludHNSZWc0ID0gbG0oUFRTIH4gWDJQQSArIFgzUEEgKyBGVEEgKyBBU1QgKyBPUkIgKyBTVEwsIGRhdGE9TkJBKQoKIyBSLXNxdWFyZWQgYmFyZWx5IG1vdmVzIGFmdGVyIGFsbCB0aHJlZSByZW1vdmFscyAoMC44OTkyIC0+IDAuODk5KSwKIyBjb25maXJtaW5nIG5vbmUgb2YgVE9WL0RSQi9CTEsgd2VyZSBhZGRpbmcgcmVhbCBwcmVkaWN0aXZlIHZhbHVlClNTRV80ID0gc3VtKFBvaW50c1JlZzQkcmVzaWR1YWxzXjIpClJNU0VfNCA9IHNxcnQoU1NFXzQvbnJvdyhOQkEpKQpSTVNFXzQKYGBgCgoKCkkuIEhvdyB3ZWxsIGRpZCB5b3VyIHByZWRpY3Rpb25zIHdvcmsgb24gdGhlIHRlc3RpbmcgZGF0YXNldD8gUmVwb3J0IHRoZSBuZXcgUjIgYW5kIFJNU0UuCgpgYGB7cn0KTkJBX3Rlc3QgPSByZWFkLmNzdigiTkJBX3Rlc3QuY3N2IikKClBvaW50c1ByZWRpY3Rpb25zID0gcHJlZGljdChQb2ludHNSZWc0LCBuZXdkYXRhPU5CQV90ZXN0KQoKIyBPdXQtb2Ytc2FtcGxlIFItc3F1YXJlZApTU0UgPSBzdW0oKFBvaW50c1ByZWRpY3Rpb25zIC0gTkJBX3Rlc3QkUFRTKV4yKQpTU1QgPSBzdW0oKG1lYW4oTkJBJFBUUykgLSBOQkFfdGVzdCRQVFMpXjIpClIyID0gMSAtIFNTRS9TU1QKUjIKCiMgT3V0LW9mLXNhbXBsZSBSTVNFClJNU0UgPSBzcXJ0KFNTRS9ucm93KE5CQV90ZXN0KSkKUk1TRQpgYGAKClLCsiA9IDAuODEyNyAoODEuMyUpIGFuZCBSTVNFID0gMTk2LjM3LiBCb3RoIG51bWJlcnMgYXJlIG9ubHkgc2xpZ2h0bHkgd29yc2UgdGhhbiB0aGUgdHJhaW5pbmcgbnVtYmVycyAoMTg0LjUg4oaSIDE5Ni40IFJNU0UpIOKAlCBhIHNtYWxsLCBoZWFsdGh5IGdhcCwgbWVhbmluZyB0aGUgbW9kZWwgZ2VuZXJhbGl6ZXMgd2VsbCB0byB0ZWFtcyBpdCBuZXZlciBzYXcsIHJhdGhlciB0aGFuIGp1c3QgbWVtb3JpemluZyB0aGUgdHJhaW5pbmcgZGF0YS4KCgoKSW4tY2xhc3MgYWN0aXZpdHkgMTM6IFdpbnMgYW5kIFBvaW50cyBEaWZmZXJlbmNlCgoKT3VyIGRhdGEgc2hvd3MgdGhhdCBhIHRlYW0gd2l0aCA0OSB3aW5zIGhhcyBuZXZlciBtaXNzZWQgdGhlIHBsYXlvZmZzLiBXaGF0IGlzIHRoZSBleHBlY3RlZCBwb2ludHMgZGlmZmVyZW5jZSBmb3IgYSB0ZWFtIHRvIG1ha2UgaXQgdG8gdGhlIHBvc3RzZWFzb24/IFVzZSB0aGUgbGVjdHVyZSBzb2x1dGlvbiBmaWxlIGFuZCBtb3JlIHNwZWNpZmljYWxseSB0aGUgV2luZ3NSZWcgbW9kZWwuCgoKYGBge3J9Cig0OSAtIDQxLjAwKSAvIDAuMDMyNTkKYGBgCgpBbnN3ZXI6IEJhc2ljYWxseSwgYSB0ZWFtIG5lZWRzIHRvIG91dHNjb3JlIGl0cyBvcHBvbmVudHMgYnkgMjQ2IHBvaW50cyBhY3Jvc3MgdGhlIHdob2xlIHNlYXNvbiB0byBiZSBleHBlY3RlZCB0byByZWFjaCA0OSB3aW5zLCB3aGljaCwgYmFzZWQgb24gdGhlIGRhdGEsIGlzIHRoZSB3aW4gdG90YWwgdGhhdCBoYXMgbmV2ZXIgbWlzc2VkIHRoZSBwbGF5b2Zmcy4K