Pop star, Post Malone is one of the world’s most popular singers. He got his start in 2016 by releasing album, “Stoney”, followed by “Beerbongs & Bentleys”, “Hollywoods Bleeding” and “Twelve Carat Toothache”. Post Malones outstanding albums that have brought him to the Billboard Top Hits time and time again.This data gives insight to album sentiments after his growth in popularity. I hypothesize that although Post Malone is considered to be an upbeat artist, his albums have become increasingly dark over time.

Download Required Packages and Files for Analysis

library(tidyverse)
library(tidytext)
library(textdata)
library(ggthemes)
library(readr)
library(jsonlite)
library(wordcloud2)
stoney <- fromJSON("~/Downloads/Lyrics_Stoney.json")
hollywoodsbleeding <- fromJSON("~/Downloads/Lyrics_HollywoodsBleeding.json")
beerbongsbentleys <- fromJSON("~/Downloads/Lyrics_beerbongsbentleys.json")
twelvecarattoothache <- fromJSON("~/Downloads/Lyrics_twelvecarattoothache.json")

Create Dataframes

as.data.frame(stoney$tracks$song) -> stoney_df
stoney_df %>% 
  mutate(album = "Stoney") ->  stoney_df

as.data.frame(hollywoodsbleeding$tracks$song) -> hollywood_df
hollywood_df %>% 
  mutate(album = "Hollywoods Bleeding") ->  hollywood_df

as.data.frame(beerbongsbentleys$tracks$song) -> beerbongs_df
beerbongs_df %>% 
  mutate(album = "BeerBongs & Bentleys") ->  beerbongs_df

as.data.frame(twelvecarattoothache$tracks$song) -> twelvecarattooth_df
twelvecarattooth_df %>% 
  mutate(album = "Twelve Carat Toothache") ->  twelvecarattooth_df

stoney_df %>% 
  unnest_tokens(word, lyrics) -> stoney_words

beerbongs_df %>% 
  unnest_tokens(word, lyrics) -> beerbongs_words

hollywood_df %>% 
  unnest_tokens(word, lyrics) -> hollywood_words

twelvecarattooth_df %>% 
  unnest_tokens(word, lyrics) -> twelvecarattooth_words

###Most Commons Words per Album

Stoney

stoney_words %>% 
  anti_join(stop_words) %>% 
  count(word, sort = TRUE) %>% 
  filter(!word %in% c("verse", "chorus", "ooh", "uh", "yeah","ayy", "bridge","wanna", "woo", "ha", "whoa", "2", "1", "outro", "skrrt")) %>% 
  head(100) %>% 
  wordcloud2(shape = 'star')
## Joining, by = "word"
stoney_words %>% 
  anti_join(stop_words) %>% 
  count(word, sort = TRUE) %>% 
  filter(!word %in% c("verse", "chorus", "ooh", "uh", "yeah","ayy", "bridge","wanna", "woo", "ha", "whoa", "2", "skrrt")) %>% 
  head(12) %>% 
  ggplot(aes(n, reorder(word,n))) + geom_col()
## Joining, by = "word"

“Stoney”, was the first album released by Post Malone in 2016 by Republic studios. This album consists of hits like ‘Congratulations’ and ‘I Fall Apart’. Across all 4 albums, its clear the most commonly used words are ‘Post’ and ‘Malone’. This however, is not uncommon for musical artists these days. On top of his name, Malone sings lyrics such as ‘feel’, ‘baby’, and ‘cold’ in addition to proclaimed swear words.

Beerbongs & Bentleys

beerbongs_words %>% 
  anti_join(stop_words) %>% 
  count(word, sort = TRUE) %>% 
  filter(!word %in% c("verse", "chorus", "ooh", "uh", "yeah","ayy", "bridge","wanna", "intro", "outro", "oo", "1", "2", "ta", "ohh", "ooo", "21", "skrrt")) %>% 
  head(100) %>% 
  wordcloud2(shape = 'oval')
## Joining, by = "word"
beerbongs_words %>% 
  anti_join(stop_words) %>% 
  count(word, sort = TRUE)%>%
  filter(!word %in% c("verse", "chorus", "ooh","oo", "yeah", "ayy","uh", "bridge", "ta", "mm", "da", "haha", "woo")) %>% 
  head(12) %>%
  ggplot(aes(n, reorder(word,n))) + geom_col()
## Joining, by = "word"

“Beerbongs & Bentleys” was the second album released from Post Malone in 2018. Songs like ‘Rockstar’ ruled #1 on Billboard Top 100 for several weeks, as well as other tracks like ‘Better Now’, and ‘Psycho’. Here we start to see the rise of Post Malone in this popularity and the lifestyle he picks up while stepping into the spotlight. He sings about women, cars, being spoiled and living the party life, which we see through the top 12 words sung in this album.

Hollywood’s Bleeding

hollywood_words %>% 
  anti_join(stop_words) %>% 
  count(word, sort = TRUE) %>% 
  filter(!word %in% c("verse", "chorus", "ooh", "uh", "yeah","ayy", "bridge","wanna", "intro", "outro", "1", "2", "em")) %>% 
  head(100) %>% 
  wordcloud2(shape = 'star')
## Joining, by = "word"
hollywood_words %>% 
  anti_join(stop_words) %>% 
  count(word, sort = TRUE) %>% 
  filter(!word %in% c("verse", "chorus", "ooh", "yeah", "ayy", "bridge", "blah", "ha", "til", "em", "gonna", "1", "2")) %>% 
  head(12) %>% 
  ggplot(aes(n, reorder(word,n))) + geom_col()
## Joining, by = "word"

Post Malone released “Hollywood’s Bleeding” in 2019, again with skyrocketing hits. Tracks “Sunflowers’, ‘Circles’, and ‘WOW’ reached Billboard Top 100 within weeks of being open for the public. The most common words seen in this album consist of ‘die’, ‘lied’, ‘low’, and ‘bad’.

Twelve Carat Toothache

twelvecarattooth_words %>% 
  anti_join(stop_words) %>% 
  count(word, sort = TRUE) %>% 
  filter(!word %in% c("verse", "chorus", "ooh", "uh", "yeah","ayy", "bridge","wanna", "intro", "outro", "da", "ta", "mm", "na", "lyrics", "ah", "1", "2", "finger")) %>% 
  head(100) %>% 
  wordcloud2(shape = 'oval')
## Joining, by = "word"
twelvecarattooth_words %>% 
  anti_join(stop_words) %>% 
  count(word, sort = TRUE) %>% 
  filter(!word %in% c("verse", "chorus", "ooh", "ooh","yeah", "ayy","uh", "bridge", "ta", "mm", "da", "lyrics", "finger", "pull", "40you", "liveget", "na", "1", "2")) %>% 
  head(12) %>% 
  ggplot(aes(n, reorder(word,n))) + geom_col()
## Joining, by = "word"

The most recent album to be released by post Malone was “Twelve Carat Toothache” in 2022. Along with his name, words like ‘wrapped’, ‘life’, ‘burnin’ and ‘low’ make up a large portion of the album lyrics. None of these tracks have made it to the Billboard Top 100 yet, however were released in June of this year.

Below is an analysis of positive & negative sentiments using the AFINN lexicon, for each album. This lexicon provided a clear representation of how strongly sentiments can reflect.

Stoney

stoney_words %>% 
  anti_join(stop_words) %>% 
  count(word, sort = TRUE) %>% 
  filter(n > 2) %>% 
  inner_join(get_sentiments('afinn')) %>% 
  filter(value < 0) %>% 
  ggplot(aes(reorder(word, n),n, fill = value)) + geom_col() + coord_flip() + theme_economist()
## Joining, by = "word"
## Joining, by = "word"

stoney_words %>% 
  anti_join(stop_words) %>% 
  count(word, sort = TRUE) %>% 
  filter(n > 2) %>% 
  inner_join(get_sentiments('afinn')) %>% 
  filter(value > 0) %>% 
  ggplot(aes(reorder(word, n),n, fill = value)) + geom_col() + coord_flip() + theme_economist()
## Joining, by = "word"
## Joining, by = "word"

The graph displays 11 positive words that frequent the Stoney album. We tracked 24 negative words throughout the album.

Beerbongs & Bentleys

beerbongs_words %>% 
  anti_join(stop_words) %>% 
  count(word, sort = TRUE) %>% 
  filter(n > 2) %>% 
  inner_join(get_sentiments('afinn')) %>% 
  filter(value < 0) %>% 
  ggplot(aes(reorder(word, n),n, fill = value)) + geom_col() + coord_flip() + theme_economist()
## Joining, by = "word"
## Joining, by = "word"

beerbongs_words %>% 
  anti_join(stop_words) %>% 
  count(word, sort = TRUE) %>% 
  filter(n > 2) %>% 
  inner_join(get_sentiments('afinn')) %>% 
  filter(value > 0) %>% 
  ggplot(aes(reorder(word, n),n, fill = value)) + geom_col() + coord_flip() + theme_economist()
## Joining, by = "word"
## Joining, by = "word"

19 positive words and 28 negative words throughout the album “Beerbongs & Bentleys”.

Hollywood’s Bleeding

hollywood_words %>% 
  anti_join(stop_words) %>% 
  count(word, sort = TRUE) %>% 
  filter(n > 2) %>% 
  inner_join(get_sentiments('afinn')) %>% 
  filter(value < 0) %>% 
  ggplot(aes(reorder(word, n),n, fill = value)) + geom_col() + coord_flip() + theme_economist()
## Joining, by = "word"
## Joining, by = "word"

hollywood_words %>% 
  anti_join(stop_words) %>% 
  count(word, sort = TRUE) %>% 
  filter(n > 2) %>% 
  inner_join(get_sentiments('afinn')) %>% 
  filter(value > 0) %>% 
  ggplot(aes(reorder(word, n),n, fill = value)) + geom_col() + coord_flip() + theme_economist()
## Joining, by = "word"
## Joining, by = "word"

11 positive words and 30 negative words throughout the album.

Twelve Carat Toothache

twelvecarattooth_words %>% 
  anti_join(stop_words) %>% 
  count(word, sort = TRUE) %>% 
  filter(n > 2) %>% 
  inner_join(get_sentiments('afinn')) %>% 
  filter(value < 0) %>% 
  ggplot(aes(reorder(word, n),n, fill = value)) + geom_col() + coord_flip() + theme_economist()
## Joining, by = "word"
## Joining, by = "word"

twelvecarattooth_words %>% 
  anti_join(stop_words) %>% 
  count(word, sort = TRUE) %>% 
  filter(n > 2) %>% 
  inner_join(get_sentiments('afinn')) %>% 
  filter(value > 0) %>% 
  ggplot(aes(reorder(word, n),n, fill = value)) + geom_col() + coord_flip() + theme_economist()
## Joining, by = "word"
## Joining, by = "word"

We tracked 13 positively associated words and 24 negatively associated words throughout the album “Twelve Carat Toothache”.

By looking at the most common words and phrases of each album, and by the sentimental association to them, a conclusion can be drawn that there has been little transformation in lyrical sentiment across each album. The 4 albums consistently present more negatively associated terms throughout the music than that of positive words.

My hypothesis reflected a negative evolution in Post Malone’s album lyrics, simultaneous to his rise in popularity. The graphical data presented does not support the argument that Post Malone’s albums have becoming increasingly negative. However, it does support the concept that his lyrics have an overall negative sentiment.