Let’s see how basic sentiment analysis classifies these Christmas hits. Luckily, I already have this code ready to go from my R Ladies Lightning Talk.
tt <- lyrics2 %>%
group_by(track_title) %>%
summarise(meanSentiment = mean(sentiment)) %>%
arrange(desc(meanSentiment)) %>%
head(5)
kable(tt) %>% kable_styling()
| track_title | meanSentiment |
|---|---|
| Silent Night | 0.6897360 |
| Sing Noel | 0.5814179 |
| God Rest Ye Merry Gentlemen | 0.3192399 |
| Hark! The Herald Angels Sing | 0.2859315 |
| O Holy Night | 0.2756963 |

tt <- lyrics2 %>%
group_by(track_title) %>%
summarise(meanSentiment = mean(sentiment)) %>%
arrange(meanSentiment) %>%
head(5)
kable(tt) %>% kable_styling()
| track_title | meanSentiment |
|---|---|
| You’re A Mean One, Mr. Grinch | -0.1200570 |
| This Cold War With You | -0.0752970 |
| To Each His Own | -0.0490823 |
| Come On Into My Arms | -0.0465882 |
| I’ll Break Out Again Tonight | -0.0404023 |

There is a big peak at zero and then plenty of positive sentiment songs, but I would have expected more. However, this is just some basic analysis, so a more sophisticated approach might yield more like we expect.
lyrics3 <- lyrics2 %>%
group_by(track_title) %>%
summarise(meanSentiment = mean(sentiment))
ggplot(lyrics3, aes(meanSentiment)) +
geom_histogram() +
theme_minimal()

tt <- lyrics2 %>%
filter(track_title == "You're A Mean One, Mr. Grinch") %>%
select(sentiment, lyric) %>%
arrange(sentiment) %>%
head(5)
kable(tt) %>% kable_styling()
| sentiment | lyric |
|---|---|
| -0.5833333 | You’re a bad banana with a greasy black peel |
| -0.5833333 | You’re a bad banana with a greasy black peel |
| -0.4472136 | You’re a nasty, wasty skunk |
| -0.4472136 | You nauseate me, Mr. Grinch |
| -0.4472136 | You’re a crooked, jerky jocky |

What makes “Silent Night” so positive? Repetition! Free idea: analyze the repetition of the holiday hits.
tt <- lyrics2 %>%
filter(track_title == "Silent Night") %>%
select(sentiment, lyric) %>%
arrange(desc(sentiment)) %>%
head(5)
kable(tt) %>% kable_styling()
| sentiment | lyric |
|---|---|
| 1.06066 | Sleep in heavenly peace, sleep in heavenly peace |
| 1.06066 | Sleep in heavenly peace, sleep in heavenly peace |
| 1.06066 | Sleep in heavenly peace, sleep in heavenly peace |
| 1.06066 | Sleep in heavenly peace, sleep in heavenly peace |
| 1.06066 | Sleep in heavenly peace, sleep in heavenly peace |
Now let’s compare these songs to the songs on the Stoudt Christmas CD. This CD was lovingly curated by my dad, and I have listened to it every Christmas that I can remember, from in the car driving across Pennsylvania to see family to while decorating the tree. This year I don’t get to hear it played from the real CD at home, so I had to make a Spotify version. Check it out here. Usually I’m all for a good shuffled playlist, but this one has to be listened to in order, because TRADITION.
As soon as I hear those opening lines of Paul McCartney’s “Wonderful Christmastime” I know it’s holiday time!
blogdown::shortcode("youtube", "94Ye-3C1FC8")
{{% youtube "94Ye-3C1FC8" %}}
spotify_client_id <- "" ## put yours here
spotify_client_secret <- "" ## put yours here
access_token <- get_spotify_access_token(client_id = spotify_client_id, client_secret = spotify_client_secret)
stoudtChristmas <- get_playlist_tracks("0bso6lvKInn3myZ65vCSyj", authorization = access_token)
safe_lyrics <- safely(genius_lyrics)
artists <- unlist(lapply(stoudtChristmas$track.artists, function(x) {
x[1, "name"]
}))
track_name <- stoudtChristmas$track.name
lyricsStoudt <- mapply(safe_lyrics, artists, track_name, SIMPLIFY = F)
didItWork <- lapply(lyricsStoudt, function(x) {
x$error
})
sum(unlist(lapply(didItWork, is.null))) ## 14 of 21 have lyrics
setwd("~/Desktop/tidytuesday/week52_2019")
save(lyricsStoudt, file = "lyricsStoudtChristmas.RData")
Unfortunately, this Bruce classic got dropped.
blogdown::shortcode("youtube", "76WFkKp8Tjs")
{{% youtube "76WFkKp8Tjs" %}}
setwd("~/Desktop/tidytuesday/week52_2019")
load(file = "lyricsStoudtChristmas.RData")
test <- lapply(lyricsStoudt, function(x) {
x$result
})
allL <- do.call("rbind", test)
allSentiment <- sentiment(allL$lyric)
allL$id <- 1:nrow(allL)
allL2 <- merge(allSentiment, allL, by.x = "element_id", by.y = "id")
tt <- allL2 %>%
group_by(track_title) %>%
summarise(meanSentiment = mean(sentiment)) %>%
arrange(desc(meanSentiment)) %>%
head(5)
kable(tt) %>% kable_styling()
| track_title | meanSentiment |
|---|---|
| Peace On Earth / Little Drummer Boy | 0.2620499 |
| Christmas Wrapping | 0.2461397 |
| Feliz Navidad | 0.2355009 |
| Rockin’ Around the Christmas Tree | 0.1862966 |
| White Christmas | 0.1810358 |
tt <- allL2 %>%
group_by(track_title) %>%
summarise(meanSentiment = mean(sentiment)) %>%
arrange(meanSentiment) %>%
head(5)
kable(tt) %>% kable_styling()
| track_title | meanSentiment |
|---|---|
| Blue Christmas | 0.0289615 |
| Jingle Bell Rock | 0.0459830 |
| Snoopy’s Christmas | 0.0695365 |
| I Saw Three Ships | 0.0697308 |
| I Saw Mommy Kissing Santa Claus | 0.0698132 |
How does the Stoudt family Christmas album compare? We’re pretty positive (in red) in comparison to all of the hits.
allL3 <- allL2 %>%
group_by(track_title) %>%
summarise(meanSentiment = mean(sentiment))
ggplot(lyrics3, aes(meanSentiment)) +
geom_histogram() +
theme_minimal() +
geom_histogram(data = allL3, aes(meanSentiment), fill = "red")

Happy Holidays!
