This is study on Lorde’s 3 albums, “Pure Heroine” (2013), “Melodrama” (2017), “Solar Power (2021).

I will be looking at if Lorde’s music becomes more positive or negative as her emotions evolve as she grows up and also look at love over time. I will be looking at Lorde’s three albums “Pure Heroine” (2013), “Melodrama” (2017), and “Solar Power” (2021). I chose to look at these with the help of Professor Walsh and my past knowledge on from watching interviews with Lorde. According to https://genius.com/artists/Lorde#, or Genius, Lorde’s most popular album is Pure Heroine. From my previous knowledge of Lorde’s goal not to be the most famous artist, I am curious whether my research will align with the sentiment analysis and be proven true. Looking at “Melodrama” (2017) and “Solar Power” will help strengthen the claim that since her increase of fame from “Pure Heroine” (2013) she has wanted less of the spotlight on her. As of each of her albums grew, her enjoyment and love for being in the spotlight decreased.I’ll look at whether she uses love related words throughout each album and observing the decrease in the use of words like “love” and “light” or other positive words. I will be using JSON filed to get my information for this project provided by Professor Walsh and I will turn them into data files.

First I have to downlaod all the packages I will be using.

I was given each album as a JSON file and had to change them into a datafile in order to analyze and compare the sentiment among each albums 20 most popular words. I will be looking at the change in tone from more positive to more negative and exploring fame from Lorde’s three albums.

Let’s begin with Pure Heroine

setwd("~/Desktop/Lorde")
pureheroine <- fromJSON('Lyrics_PureHeroine.json')
as.data.frame(pureheroine) -> pureheroine_df
pureheroine_df$tracks.song -> lyrics
lyrics %>%
  unnest_tokens(word, lyrics) -> pureheroine  

How many words are in Pure Heroine?

pureheroine %>%
  count() 
##      n
## 1 3784

There are 3784 words.

Of those words, what are the 20 most used words on the album and how often are they seen?

pureheroine %>%
  anti_join(stop_words) %>%
  count(word, sort = TRUE) %>% 
  filter(!word %in% c("tahm", "igh", "chorus", "verse", "1", "2")) %>% 
  head(20) %>%
  knitr::kable()
## Joining, by = "word"
word n
people 34
yeah 30
talking 24
call 22
talk 21
send 16
live 14
love 14
pre 13
teeth 13
rule 12
world 12
em 11
home 10
lyrics 10
baby 9
bridge 9
care 9
friend 9
play 9

The three words that stuck out to me were “people”, “yeah”, and “talking” as they do not really link to any sort of romanticism, which I think this album is more about her youth and exploring materialism, fame and social status.

Lets look at the sentiment behind these words.

 pureheroine %>%
    count(word, sort = TRUE) %>%
    anti_join(stop_words) %>%
    inner_join(get_sentiments("bing")) %>% 
    inner_join(get_sentiments("afinn")) %>% 
    filter(!word %in% c("tahm", "igh", "chorus", "verse", "1", "2")) %>% 
    head(20) %>%
    knitr::kable()
## Joining, by = "word"
## Joining, by = "word"
## Joining, by = "word"
word n sentiment value
love 14 positive 3
fun 4 positive 4
glory 4 positive 2
kill 4 negative -3
pretty 4 positive 1
sweet 4 positive 2
bad 3 negative -3
clean 3 positive 2
contagious 3 negative -1
crazy 3 negative -2
fear 3 negative -2
glad 3 positive 3
happy 3 positive 3
ruins 3 negative -2
scary 3 negative -2
shit 3 negative -4
brave 2 positive 2
cool 2 positive 1
cry 2 negative -1
fine 2 positive 2

What stand out most to me:

Love is seen at the top being seen a lot throughout the album (14 times with a value of 3), with positive sentiment as well as “fun” is only seen 4 times with a value of 4.

I created the dataset “pureheroinesentiment” with the code below and used it to create a graph that would demonstrate that the positive sentiment words are seen frequently throughout the album and are greater than the amount of negative sentiment words.

 pureheroine %>%
    count(word, sort = TRUE) %>%
    anti_join(stop_words) %>%
    inner_join(get_sentiments("bing")) %>% 
    inner_join(get_sentiments("afinn")) %>% 
    filter(!word %in% c("tahm", "igh", "chorus", "verse", "1", "2")) -> pureheroinesentiment
## Joining, by = "word"
## Joining, by = "word"
## Joining, by = "word"

The Graph:

  pureheroinesentiment %>% 
    arrange(desc(n)) %>%
    head(20) %>%
    ggplot(aes(word, value, fill= value)) + geom_col() +
    theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

### A wordcloud will help visualize just how freqently the positive sentiment words are seen on “Pure Heroine”.

 pureheroine %>% 
    count(word, sort = TRUE) %>% 
    anti_join(stop_words) %>% 
    filter(!word %in% c("tahm", "igh", "chorus", "verse", "1", "2")) %>% 
    wordcloud2()
## Joining, by = "word"

People, talking, yeah and call stand out among the other words within the word cloud.

“Melodrama”

First I just need to make the JSON file into a datafile

melodrama <- fromJSON('Lyrics_Melodrama.json')
as.data.frame(melodrama) -> melodrama_df
melodrama_df$tracks.song -> lyrics
lyrics %>%
  unnest_tokens(word, lyrics) -> melodrama

How many words are on Melodrama?

melodrama %>% 
  count()
##      n
## 1 3842

3842 words on Melodrama, that is about the same as Pure Heroine.

melodrama %>%
  count(word, sort = TRUE) %>% 
  anti_join(stop_words) %>%
  filter(!word %in% c("tahm", "igh", "chorus", "verse", "1", "2")) %>% 
  head(20) %>%
  knitr::kable()
## Joining, by = "word"
word n
boom 40
love 25
light 21
mind 16
supercut 16
green 15
bet 14
call 14
waiting 14
homemade 13
shit 13
blowing 12
dance 12
dark 12
dynamite 12
em 12
head 12
melodrama 12
perfect 12
pre 12

The words that stuck out to me were “boom”, “love” and “light” as boom is a bit more of a negative word but love and light are more positive. Based on the information provided that Boom is the most used word in the album and knowing that it most likely has a negative sentiment will help me infer that whenever “Boom” is used throughout the album the songs will be more sad, angry, gloomy etc.

Let’s look at the sentiment of “Melodrama”:

melodrama %>%
  count(word, sort = TRUE) %>%
  anti_join(stop_words) %>%
  inner_join(get_sentiments("bing")) %>% 
  inner_join(get_sentiments("afinn")) %>% 
  filter(!word %in% c("tahm", "igh", "chorus", "verse", "1", "2")) %>% 
  head(20) %>%
  knitr::kable()
## Joining, by = "word"
## Joining, by = "word"
## Joining, by = "word"
word n sentiment value
love 25 positive 3
shit 13 negative -4
perfect 12 positive 3
hard 9 negative -1
liar 9 negative -3
blind 4 negative -1
awesome 3 positive 4
crush 3 negative -1
fuck 3 negative -4
lost 3 negative -3
ashamed 2 negative -2
blame 2 negative -2
bother 2 negative -2
crazy 2 negative -2
die 2 negative -3
mess 2 negative -2
missed 2 negative -2
pretend 2 negative -1
sick 2 negative -2
sweet 2 positive 2

The first four words stuck out to me. It is clear to see that the positive sentiment words, love (value= 3) and perfect (value= 3) have higher sentiment, and that the negative words, shit (value= -4) and hard (value= -1), are very strong. This makes me wonder: when Lorde was writing the album, did her feelings on love change? Was she feeling reminiscent while producing this album? These words and their sentiment clearly show that while the album is sadder based on the title, there are some positive aspects to it.

Using the code below, I created a data set for the 20 most popular words and their sentiment.

melodrama %>%
  count(word, sort = TRUE) %>%
  anti_join(stop_words) %>%
  inner_join(get_sentiments("bing")) %>% 
  inner_join(get_sentiments("afinn")) %>% 
  filter(!word %in% c("tahm", "igh", "chorus", "verse", "1", "2")) -> melodramasentiment
## Joining, by = "word"
## Joining, by = "word"
## Joining, by = "word"

The graph

melodramasentiment %>%
  arrange(desc(n)) %>%
  ggplot(aes(n, sentiment, fill= sentiment)) + geom_col() +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

This is the Melodrama word cloud which helps visualize this!

melodrama %>% 
  count(word, sort = TRUE) %>% 
  anti_join(stop_words) %>% 
  filter(!word %in% c("tahm", "igh", "chorus", "verse", "1", "2")) %>% 
    wordcloud2()
## Joining, by = "word"

“Solar Power”

This is Lorde’s third album, like the first two albums, I had to create a data file from a JSON file.

solarpower <- fromJSON('Lyrics_SolarPower.json')
as.data.frame(solarpower) -> solarpower_df
solarpower_df$tracks.song -> lyrics
lyrics %>%
  unnest_tokens(word, lyrics) -> solarpower
solarpower %>% 
  count()
##      n
## 1 2972

There are 2972 words on this album. Let’s see what the 20 most popular words on “Solarpower” were.

solarpower %>%
  count(word, sort = TRUE) %>%
  anti_join(stop_words) %>%
  filter(!word %in% c("tahm", "igh", "chorus", "verse", "1", "2")) %>% 
  head(20) %>%
  knitr::kable()
## Joining, by = "word"
word n
girl 20
love 20
secrets 17
time 17
pre 14
ah 13
breathe 13
solar 13
lyrics 12
olar 12
tune 12
sun 11
california 10
feel 10
path 9
fallen 8
kinda 8
fruit 7
power 7
baby 6

The top 3 words are “girl” “love” and “secrets”. “Girl” and “love” are words with a more positive tone to them and typically reflect happier emotions. “Secrets” gives a more negative connotation and when used in a song could give a more mysterious attitude. According to the Wikipedia page for Solarpower https://en.wikipedia.org/wiki/Solar_Power_(album) this album focused on Lorde’s lifestyle out of the spotlight so secrets could refer to her personal life that is not talked about in the public.

This is the sentiment analysis of “Solar Power” most popular words:

solarpower %>%
  count(word, sort = TRUE) %>% 
  anti_join(stop_words) %>%
  inner_join(get_sentiments("bing")) %>% 
  inner_join(get_sentiments("afinn")) %>% 
  filter(!word %in% c("tahm", "igh", "chorus", "verse", "1", "2")) %>% 
  head(20) %>%
  knitr::kable()
## Joining, by = "word"
## Joining, by = "word"
## Joining, by = "word"
word n sentiment value
love 20 positive 3
fallen 8 negative -2
cool 6 positive 1
die 2 negative -3
hard 2 negative -1
hurt 2 negative -2
loved 2 positive 3
pain 2 negative -2
perfect 2 positive 3
sad 2 negative -2
strange 2 negative -1
wrong 2 negative -2
beautiful 1 positive 3
bliss 1 positive 3
bright 1 positive 1
broken 1 negative -1
cheater 1 negative -3
clean 1 positive 2
crazy 1 negative -2
euphoria 1 positive 3

“Love” (with a sentiment of 3), “fallen” (with a sentiment of -2), and “cool” (with a sentiment of 1) are the three most popular sentiment words within the album. This could be a drawing on Lorde’s time spent out of the spotlight and withdrawn from fame. Taking some time for herself in her homeland made her realized, that she wishes to withdraw herself from the culture of fame. Could this come from all the public attention her last album got in light of her breakup or does she just want to withdraw from fame.

Here is some code which helped to compile a graph of the amount of times the 20 most popular words are seen. This helps to visualize the sentiment analysis.

solarpower %>%
  count(word, sort = TRUE) %>%
  anti_join(stop_words) %>%
  inner_join(get_sentiments("bing")) %>% 
  inner_join(get_sentiments("afinn")) %>% 
  filter(!word %in% c("tahm", "igh", "chorus", "verse", "1", "2")) -> solarpowersentiment
## Joining, by = "word"
## Joining, by = "word"
## Joining, by = "word"

The graph:

solarpowersentiment %>%
  head(20) %>%
  arrange(desc(n)) %>%
  ggplot(aes(word, n, fill= n)) + geom_col() +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

“Love” and “fallen” are the biggest outliers among the data… specifically “love” which is seen 20 times.

Look at the word cloud for Solar Power too:

solarpower %>% 
  count(word, sort = TRUE) %>% 
  anti_join(stop_words) %>% 
  filter(!word %in% c("tahm", "igh", "chorus", "verse", "1", "2")) %>% 
  wordcloud2()
## Joining, by = "word"

Lastly, I want to compare all three albums just to see how the mood changes over the 3 year span they were created in. I created code to get the mean sentiment value of the words on all three albums with the code below.

mean(pureheroinesentiment$value)->pureheroinemean
mean(melodramasentiment$value)->melodramamean
mean(solarpowersentiment$value)->solarpowermean

The mean value for the albums were: “Pure Heroine”= NA, “Melodrama”= -1.038462, “Solar Power”= 0.05405405 R Studio gave me NA for Pure Heroine and told me it was not numeric or logical.

album <- c('PureHeroine', 'Melodrama', 'SolarPower')
year <- c(2013, 2017, 2021)
meanvalue <- c("-0.4150943", "-1.038462", "0.05405405")
allmeans<- data.frame(album, year, meanvalue)

I then put the two sentiment value means that were given, and I was able to create a graph that would compare the mean sentiment values among the two albums which is shown below.

allmeans%>%
  arrange(desc(meanvalue))%>%
  ggplot(aes(album, meanvalue, fill= meanvalue)) + geom_col() +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))