library(dplyr)
library(ggplot2)
setwd("C:/Users/amode/OneDrive/Documents/Dida 325")
data <- read.csv("final/data.csv")


popularity_range <- range(data$popularity)

print(popularity_range)
[1]   0 100
data$decade <- cut(data$year, breaks = seq(1920, 2020, by = 10),
                   labels = c("1920s", "1930s", "1940s", "1950s", "1960s", 
                              "1970s", "1980s", "1990s", "2000s", "2010s"))

data2 <- data %>%
  group_by(year) %>%
  filter(rank(desc(popularity)) <= n() * 0.1) %>%
  ungroup()
#https://stackoverflow.com/questions/48446816/explain-ungroup-in-dplyr

summary(data2)
      id                name             artists           duration_ms      release_date            year     
 Length:16946       Length:16946       Length:16946       Min.   :  30241   Length:16946       Min.   :1921  
 Class :character   Class :character   Class :character   1st Qu.: 176533   Class :character   1st Qu.:1957  
 Mode  :character   Mode  :character   Mode  :character   Median : 212640   Mode  :character   Median :1978  
                                                          Mean   : 228709                      Mean   :1977  
                                                          3rd Qu.: 259487                      3rd Qu.:1999  
                                                          Max.   :2220135                      Max.   :2020  
                                                                                                             
  acousticness     danceability        energy          instrumentalness       liveness         loudness      
 Min.   :0.0000   Min.   :0.0000   Min.   :0.0000201   Min.   :0.0000000   Min.   :0.0000   Min.   :-41.808  
 1st Qu.:0.0854   1st Qu.:0.4560   1st Qu.:0.2990000   1st Qu.:0.0000000   1st Qu.:0.0941   1st Qu.:-13.313  
 Median :0.4210   Median :0.5770   Median :0.5140000   Median :0.0000437   Median :0.1290   Median : -9.721  
 Mean   :0.4591   Mean   :0.5653   Mean   :0.5094580   Mean   :0.1095927   Mean   :0.1891   Mean   :-10.491  
 3rd Qu.:0.8300   3rd Qu.:0.6860   3rd Qu.:0.7240000   3rd Qu.:0.0102000   3rd Qu.:0.2380   3rd Qu.: -6.571  
 Max.   :0.9960   Max.   :0.9880   Max.   :0.9990000   Max.   :1.0000000   Max.   :0.9930   Max.   : -0.007  
                                                                                                             
  speechiness         tempo           valence            mode             key           popularity    
 Min.   :0.0000   Min.   :  0.00   Min.   :0.0000   Min.   :0.0000   Min.   : 0.000   Min.   :  1.00  
 1st Qu.:0.0337   1st Qu.: 95.03   1st Qu.:0.3480   1st Qu.:0.0000   1st Qu.: 2.000   1st Qu.: 38.00  
 Median :0.0424   Median :115.67   Median :0.5660   Median :1.0000   Median : 5.000   Median : 57.00  
 Mean   :0.0740   Mean   :117.76   Mean   :0.5519   Mean   :0.7041   Mean   : 5.195   Mean   : 50.38  
 3rd Qu.:0.0650   3rd Qu.:135.09   3rd Qu.:0.7650   3rd Qu.:1.0000   3rd Qu.: 8.000   3rd Qu.: 66.00  
 Max.   :0.9630   Max.   :216.30   Max.   :0.9910   Max.   :1.0000   Max.   :11.000   Max.   :100.00  
                                                                                                      
    explicit           decade    
 Min.   :0.00000   1960s  :2018  
 1st Qu.:0.00000   1970s  :2017  
 Median :0.00000   1980s  :2000  
 Mean   :0.07689   2000s  :1992  
 3rd Qu.:0.00000   1990s  :1986  
 Max.   :1.00000   1950s  :1974  
                   (Other):4959  
ggplot(data2, aes(x = year, y = popularity, color = decade)) +
  geom_point() +
  scale_color_manual(values = rainbow(10, start = 0.1, end = 0.9)) +
  xlab("Year") +
  ylab("Popularity") +
  ggtitle("Popularity of Songs by Year and Decade")+
  theme_minimal()



top_popular <- data2 %>%
  group_by(year) %>%
  filter(rank(desc(popularity)) == 1) %>%
  ungroup()
#https://www.r-bloggers.com/2022/07/how-to-rank-by-group-in-r/
ggplot(top_popular, aes(x = year, y = popularity, color = decade)) +
  geom_line() +
  geom_point() +
  scale_color_manual(values = rainbow(10, start = 0.1, end = 0.9)) +
  labs(x = "Year", y = "Popularity", title = "Popularity of the Most Popular Songs by Year and Decade")+
  theme_minimal()



top_duration <- data2 %>%
  group_by(year) %>%
  filter(rank(desc(duration_ms)) == 1) %>%
  ungroup()

ggplot(top_duration, aes(x = year, y = duration_ms, color = decade)) +
  geom_line() +
  geom_point() +
  scale_color_manual(values = rainbow(10, start = 0.1, end = 0.9)) +
  labs(x = "Year", y = "Duaration (ms)", title = "Duartion of the Most Popular Songs by Year and Decade")+
  theme_minimal()



top_tempo <- data2 %>%
  group_by(year) %>%
  filter(rank(desc(tempo)) == 1) %>%
  ungroup()

ggplot(top_tempo, aes(x = year, y = tempo, color = decade)) +
  geom_line() +
  geom_point() +
  scale_color_manual(values = rainbow(10, start = 0.1, end = 0.9)) +
  labs(x = "Year", y = "Tempo", title = "Tempo of the Most Popular Songs by Year and Decade")+
  theme_minimal()



top_speechiness <- data2 %>%
  group_by(year) %>%
  filter(rank(desc(speechiness)) == 1) %>%
  ungroup()

ggplot(top_speechiness, aes(x = year, y = speechiness, color = decade)) +
  geom_line() +
  geom_point() +
  scale_color_manual(values = rainbow(10, start = 0.1, end = 0.9)) +
  labs(x = "Year", y = "Speechiness", title = "Speechiness of the Most Popular Songs by Year and Decade")+
  theme_minimal()



ggplot(data2, aes(x = year, y = speechiness, color = decade)) +
  geom_jitter(width = 0.5) +
  scale_color_manual(values = rainbow(10, start = 0.1, end = 0.9)) +
  xlab("Year") +
  ylab("Speechiness") +
  ggtitle("Speechiness of Songs by Year and Decade")+
  theme_minimal()


ggplot(data2, aes(x = year, y = duration_ms, color = decade)) +
  geom_point() +
  scale_color_manual(values = rainbow(10, start = 0.1, end = 0.9)) +
  xlab("Year") +
  ylab("Duration (ms)") +
  ggtitle("Duration of Songs by Year and Decade")+
  theme_minimal()



ggplot(data2, aes(x = year, y = tempo, color = decade)) +
  geom_jitter(width = 0.5) +
  scale_color_manual(values = rainbow(10, start = 0.1, end = 0.9)) +
  xlab("Year") +
  ylab("Tempo (bps)") +
  ggtitle("Tempo of Songs by Year and Decade")+
  theme_minimal()


set.seed(210191)

split <- 0.80

rows <- nrow(data2)

train.entries <- sample(rows, rows * split)

data2.train <- data2[train.entries, ]

data2.valid <- data2[-train.entries, ]


model <- lm(popularity ~ year+ duration_ms + tempo + speechiness, data = data2.train)

summary(model)

Call:
lm(formula = popularity ~ year + duration_ms + tempo + speechiness, 
    data = data2.train)

Residuals:
    Min      1Q  Median      3Q     Max 
-34.259  -6.827  -0.939   6.281  39.213 

Coefficients:
                   Estimate      Std. Error  t value             Pr(>|t|)    
(Intercept) -1448.582646427     6.982888161 -207.447 < 0.0000000000000002 ***
year            0.756762556     0.003559008  212.633 < 0.0000000000000002 ***
duration_ms     0.000006470     0.000001012    6.392       0.000000000169 ***
tempo           0.015136120     0.002991576    5.060       0.000000425680 ***
speechiness    -8.907985506     0.862268090  -10.331 < 0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 10.43 on 13551 degrees of freedom
Multiple R-squared:  0.7779,    Adjusted R-squared:  0.7778 
F-statistic: 1.186e+04 on 4 and 13551 DF,  p-value: < 0.00000000000000022
model <- step(model, trace = 0)

summary(model)

Call:
lm(formula = popularity ~ year + duration_ms + tempo + speechiness, 
    data = data2.train)

Residuals:
    Min      1Q  Median      3Q     Max 
-34.259  -6.827  -0.939   6.281  39.213 

Coefficients:
                   Estimate      Std. Error  t value             Pr(>|t|)    
(Intercept) -1448.582646427     6.982888161 -207.447 < 0.0000000000000002 ***
year            0.756762556     0.003559008  212.633 < 0.0000000000000002 ***
duration_ms     0.000006470     0.000001012    6.392       0.000000000169 ***
tempo           0.015136120     0.002991576    5.060       0.000000425680 ***
speechiness    -8.907985506     0.862268090  -10.331 < 0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 10.43 on 13551 degrees of freedom
Multiple R-squared:  0.7779,    Adjusted R-squared:  0.7778 
F-statistic: 1.186e+04 on 4 and 13551 DF,  p-value: < 0.00000000000000022
data2.train <- data2.train %>%
  mutate(yhat = predict(model, newdata = data2.train)) %>%
  mutate(residual = popularity - yhat)

data2.valid <- data2.valid %>%
  mutate(yhat = predict(model, newdata = data2.valid)) %>%
  mutate(residual = popularity - yhat)


options(scipen = 999)

ggplot(data2.valid, aes(x = yhat, y = residual, color = decade)) +
  geom_jitter(data = filter(data2.valid, yhat <= 2020), width = 2) +
  geom_hline(aes(yintercept = 0), linetype = "dashed", color = "blue") +
  scale_color_manual(values = rainbow(10, start = 0.1, end = 0.9)) +
  xlab("Predicted popularity") +
  ylab("Residuals") +
  ggtitle("Residual Plot")+
  theme_minimal()

NA
NA
NA
NA
sd(data2.valid$residual)
[1] 10.1326
sd(data2.train$residual)
[1] 10.42366
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpzZXR3ZCgiQzovVXNlcnMvYW1vZGUvT25lRHJpdmUvRG9jdW1lbnRzL0RpZGEgMzI1IikNCmRhdGEgPC0gcmVhZC5jc3YoImZpbmFsL2RhdGEuY3N2IikNCg0KDQpwb3B1bGFyaXR5X3JhbmdlIDwtIHJhbmdlKGRhdGEkcG9wdWxhcml0eSkNCg0KcHJpbnQocG9wdWxhcml0eV9yYW5nZSkNCg0KZGF0YSRkZWNhZGUgPC0gY3V0KGRhdGEkeWVhciwgYnJlYWtzID0gc2VxKDE5MjAsIDIwMjAsIGJ5ID0gMTApLA0KICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIjE5MjBzIiwgIjE5MzBzIiwgIjE5NDBzIiwgIjE5NTBzIiwgIjE5NjBzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTk3MHMiLCAiMTk4MHMiLCAiMTk5MHMiLCAiMjAwMHMiLCAiMjAxMHMiKSkNCg0KZGF0YTIgPC0gZGF0YSAlPiUNCiAgZ3JvdXBfYnkoeWVhcikgJT4lDQogIGZpbHRlcihyYW5rKGRlc2MocG9wdWxhcml0eSkpIDw9IG4oKSAqIDAuMSkgJT4lDQogIHVuZ3JvdXAoKQ0KI2h0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ4NDQ2ODE2L2V4cGxhaW4tdW5ncm91cC1pbi1kcGx5cg0KDQpzdW1tYXJ5KGRhdGEyKQ0KDQpnZ3Bsb3QoZGF0YTIsIGFlcyh4ID0geWVhciwgeSA9IHBvcHVsYXJpdHksIGNvbG9yID0gZGVjYWRlKSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcmFpbmJvdygxMCwgc3RhcnQgPSAwLjEsIGVuZCA9IDAuOSkpICsNCiAgeGxhYigiWWVhciIpICsNCiAgeWxhYigiUG9wdWxhcml0eSIpICsNCiAgZ2d0aXRsZSgiUG9wdWxhcml0eSBvZiBTb25ncyBieSBZZWFyIGFuZCBEZWNhZGUiKSsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCg0KdG9wX3BvcHVsYXIgPC0gZGF0YTIgJT4lDQogIGdyb3VwX2J5KHllYXIpICU+JQ0KICBmaWx0ZXIocmFuayhkZXNjKHBvcHVsYXJpdHkpKSA9PSAxKSAlPiUNCiAgdW5ncm91cCgpDQojaHR0cHM6Ly93d3cuci1ibG9nZ2Vycy5jb20vMjAyMi8wNy9ob3ctdG8tcmFuay1ieS1ncm91cC1pbi1yLw0KZ2dwbG90KHRvcF9wb3B1bGFyLCBhZXMoeCA9IHllYXIsIHkgPSBwb3B1bGFyaXR5LCBjb2xvciA9IGRlY2FkZSkpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcmFpbmJvdygxMCwgc3RhcnQgPSAwLjEsIGVuZCA9IDAuOSkpICsNCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlBvcHVsYXJpdHkiLCB0aXRsZSA9ICJQb3B1bGFyaXR5IG9mIHRoZSBNb3N0IFBvcHVsYXIgU29uZ3MgYnkgWWVhciBhbmQgRGVjYWRlIikrDQogIHRoZW1lX21pbmltYWwoKQ0KDQoNCnRvcF9kdXJhdGlvbiA8LSBkYXRhMiAlPiUNCiAgZ3JvdXBfYnkoeWVhcikgJT4lDQogIGZpbHRlcihyYW5rKGRlc2MoZHVyYXRpb25fbXMpKSA9PSAxKSAlPiUNCiAgdW5ncm91cCgpDQoNCmdncGxvdCh0b3BfZHVyYXRpb24sIGFlcyh4ID0geWVhciwgeSA9IGR1cmF0aW9uX21zLCBjb2xvciA9IGRlY2FkZSkpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcmFpbmJvdygxMCwgc3RhcnQgPSAwLjEsIGVuZCA9IDAuOSkpICsNCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIkR1YXJhdGlvbiAobXMpIiwgdGl0bGUgPSAiRHVhcnRpb24gb2YgdGhlIE1vc3QgUG9wdWxhciBTb25ncyBieSBZZWFyIGFuZCBEZWNhZGUiKSsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCg0KdG9wX3RlbXBvIDwtIGRhdGEyICU+JQ0KICBncm91cF9ieSh5ZWFyKSAlPiUNCiAgZmlsdGVyKHJhbmsoZGVzYyh0ZW1wbykpID09IDEpICU+JQ0KICB1bmdyb3VwKCkNCg0KZ2dwbG90KHRvcF90ZW1wbywgYWVzKHggPSB5ZWFyLCB5ID0gdGVtcG8sIGNvbG9yID0gZGVjYWRlKSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGdlb21fcG9pbnQoKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSByYWluYm93KDEwLCBzdGFydCA9IDAuMSwgZW5kID0gMC45KSkgKw0KICBsYWJzKHggPSAiWWVhciIsIHkgPSAiVGVtcG8iLCB0aXRsZSA9ICJUZW1wbyBvZiB0aGUgTW9zdCBQb3B1bGFyIFNvbmdzIGJ5IFllYXIgYW5kIERlY2FkZSIpKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KDQp0b3Bfc3BlZWNoaW5lc3MgPC0gZGF0YTIgJT4lDQogIGdyb3VwX2J5KHllYXIpICU+JQ0KICBmaWx0ZXIocmFuayhkZXNjKHNwZWVjaGluZXNzKSkgPT0gMSkgJT4lDQogIHVuZ3JvdXAoKQ0KDQpnZ3Bsb3QodG9wX3NwZWVjaGluZXNzLCBhZXMoeCA9IHllYXIsIHkgPSBzcGVlY2hpbmVzcywgY29sb3IgPSBkZWNhZGUpKSArDQogIGdlb21fbGluZSgpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHJhaW5ib3coMTAsIHN0YXJ0ID0gMC4xLCBlbmQgPSAwLjkpKSArDQogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJTcGVlY2hpbmVzcyIsIHRpdGxlID0gIlNwZWVjaGluZXNzIG9mIHRoZSBNb3N0IFBvcHVsYXIgU29uZ3MgYnkgWWVhciBhbmQgRGVjYWRlIikrDQogIHRoZW1lX21pbmltYWwoKQ0KDQoNCmdncGxvdChkYXRhMiwgYWVzKHggPSB5ZWFyLCB5ID0gc3BlZWNoaW5lc3MsIGNvbG9yID0gZGVjYWRlKSkgKw0KICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuNSkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcmFpbmJvdygxMCwgc3RhcnQgPSAwLjEsIGVuZCA9IDAuOSkpICsNCiAgeGxhYigiWWVhciIpICsNCiAgeWxhYigiU3BlZWNoaW5lc3MiKSArDQogIGdndGl0bGUoIlNwZWVjaGluZXNzIG9mIFNvbmdzIGJ5IFllYXIgYW5kIERlY2FkZSIpKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KZ2dwbG90KGRhdGEyLCBhZXMoeCA9IHllYXIsIHkgPSBkdXJhdGlvbl9tcywgY29sb3IgPSBkZWNhZGUpKSArDQogIGdlb21fcG9pbnQoKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSByYWluYm93KDEwLCBzdGFydCA9IDAuMSwgZW5kID0gMC45KSkgKw0KICB4bGFiKCJZZWFyIikgKw0KICB5bGFiKCJEdXJhdGlvbiAobXMpIikgKw0KICBnZ3RpdGxlKCJEdXJhdGlvbiBvZiBTb25ncyBieSBZZWFyIGFuZCBEZWNhZGUiKSsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCg0KZ2dwbG90KGRhdGEyLCBhZXMoeCA9IHllYXIsIHkgPSB0ZW1wbywgY29sb3IgPSBkZWNhZGUpKSArDQogIGdlb21faml0dGVyKHdpZHRoID0gMC41KSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSByYWluYm93KDEwLCBzdGFydCA9IDAuMSwgZW5kID0gMC45KSkgKw0KICB4bGFiKCJZZWFyIikgKw0KICB5bGFiKCJUZW1wbyAoYnBzKSIpICsNCiAgZ2d0aXRsZSgiVGVtcG8gb2YgU29uZ3MgYnkgWWVhciBhbmQgRGVjYWRlIikrDQogIHRoZW1lX21pbmltYWwoKQ0KDQpzZXQuc2VlZCgyMTAxOTEpDQoNCnNwbGl0IDwtIDAuODANCg0Kcm93cyA8LSBucm93KGRhdGEyKQ0KDQp0cmFpbi5lbnRyaWVzIDwtIHNhbXBsZShyb3dzLCByb3dzICogc3BsaXQpDQoNCmRhdGEyLnRyYWluIDwtIGRhdGEyW3RyYWluLmVudHJpZXMsIF0NCg0KZGF0YTIudmFsaWQgPC0gZGF0YTJbLXRyYWluLmVudHJpZXMsIF0NCg0KDQptb2RlbCA8LSBsbShwb3B1bGFyaXR5IH4geWVhcisgZHVyYXRpb25fbXMgKyB0ZW1wbyArIHNwZWVjaGluZXNzLCBkYXRhID0gZGF0YTIudHJhaW4pDQoNCnN1bW1hcnkobW9kZWwpDQoNCg0KbW9kZWwgPC0gc3RlcChtb2RlbCwgdHJhY2UgPSAwKQ0KDQpzdW1tYXJ5KG1vZGVsKQ0KDQpkYXRhMi50cmFpbiA8LSBkYXRhMi50cmFpbiAlPiUNCiAgbXV0YXRlKHloYXQgPSBwcmVkaWN0KG1vZGVsLCBuZXdkYXRhID0gZGF0YTIudHJhaW4pKSAlPiUNCiAgbXV0YXRlKHJlc2lkdWFsID0gcG9wdWxhcml0eSAtIHloYXQpDQoNCmRhdGEyLnZhbGlkIDwtIGRhdGEyLnZhbGlkICU+JQ0KICBtdXRhdGUoeWhhdCA9IHByZWRpY3QobW9kZWwsIG5ld2RhdGEgPSBkYXRhMi52YWxpZCkpICU+JQ0KICBtdXRhdGUocmVzaWR1YWwgPSBwb3B1bGFyaXR5IC0geWhhdCkNCg0KDQpvcHRpb25zKHNjaXBlbiA9IDk5OSkNCg0KZ2dwbG90KGRhdGEyLnZhbGlkLCBhZXMoeCA9IHloYXQsIHkgPSByZXNpZHVhbCwgY29sb3IgPSBkZWNhZGUpKSArDQogIGdlb21faml0dGVyKGRhdGEgPSBmaWx0ZXIoZGF0YTIudmFsaWQsIHloYXQgPD0gMjAyMCksIHdpZHRoID0gMikgKw0KICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gMCksIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsdWUiKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSByYWluYm93KDEwLCBzdGFydCA9IDAuMSwgZW5kID0gMC45KSkgKw0KICB4bGFiKCJQcmVkaWN0ZWQgcG9wdWxhcml0eSIpICsNCiAgeWxhYigiUmVzaWR1YWxzIikgKw0KICBnZ3RpdGxlKCJSZXNpZHVhbCBQbG90IikrDQogIHRoZW1lX21pbmltYWwoKQ0KDQoNCg0KDQpgYGANCg0KYGBge3J9DQpzZChkYXRhMi52YWxpZCRyZXNpZHVhbCkNCg0Kc2QoZGF0YTIudHJhaW4kcmVzaWR1YWwpDQpgYGA=