-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprogetto.Rmd
More file actions
821 lines (630 loc) · 32 KB
/
progetto.Rmd
File metadata and controls
821 lines (630 loc) · 32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
---
title: "Progetto Fondamenti"
date: "`r Sys.Date()`"
css: stileProgetto.css
output:
rmdformats::readthedown:
highlight: kate
---
```{r setup, include=FALSE}
library(knitr)
library(rmdformats)
## Global options
options(max.print="75")
opts_chunk$set(echo=FALSE,
cache=TRUE,
prompt=FALSE,
tidy=TRUE,
comment=NA,
message=FALSE,
warning=FALSE)
opts_knit$set(width=75)
```
# Introduzione
## Cosa è Spotify?
```{r logo, echo=FALSE, fig.cap="Spotify Logo", out.width = "50%"}
knitr::include_graphics("img/spotifyLogo.png")
```
Spotify è un servizio musicale digitale (gratuito o a pagamento) con il quale è semplice trovare la musica o il podcast giusto per ogni momento, su telefono, computer, tablet e altro ancora.
Ci sono milioni di brani e podcast a portata di mano in ogni momento!
Si possono sfogliare le raccolte di amici, artisti e celebrità o creare delle proprie playlist personali per ogni stato d'animo.
## Come sono cambiati i miei gusti musicali e come questi hanno influenzato gli ascolti su Spotify?
Attività di ascolto divisa in 2 periodi diversi:
* **PRIMO** **PERIODO**: dall’inizio (marzo 2018) a marzo 2020
* **SECONDO** **PERIODO**: da aprile 2020 ad ora (inizio agosto 2021)
# Spotify Audio Analysis
Ogni brano ha delle particolari caratteristiche che lo rendono unico:
- energy: rappresenta una misura percettiva di intensità e attività, le tracce energiche sono veloci e rumorose (0.0 - 1.0)
- valence: descrive la positività musicale trasmessa da un brano; alta valenza = più positive, bassa valenza = più negative (0.0 - 1.0)
```{r caricamento librerie, include=FALSE}
#caricamento librerie
library(jsonlite)
library(lubridate)
library(gghighlight)
library(spotifyr)
library(tidyverse)
library(ggplot2)
library(plotly)
library(dplyr)
library(kableExtra)
library(formattable)
library(genius)
library(fmsb)
# carico get spotify authorization
# stabilisco connessione con Spotify API
id = "00f22c2d4c35499bb29854c73ffdff97"
id_secret = "46d59a3db5514cdd93c1de05365e57c8"
Sys.setenv(SPOTIFY_CLIENT_ID = id)
Sys.setenv(SPOTIFY_CLIENT_SECRET = id_secret)
get_spotify_authorization_code()
access_token <- get_spotify_access_token()
```
```{r lettura dataset e cambio nel giusto orario}
#lettura dataset
#streamHistory <- fromJSON("spotify_data/StreamingHistoryTotal.json", flatten = TRUE)
myLibrary <- fromJSON("spotify_data/secondRequest/YourLibrary.json", flatten = TRUE)
complete <- fromJSON("spotify_data/complete.json", flatten = TRUE)
savedTracks <- myLibrary$tracks
# cambiare ora!!! perchè orario di greenwitch
#tz = a character string that specifies which time zone to parse the date with. The string must be a time zone that is #recognized by the user's OS.
#a <- ymd_hm(streamHistory$endTime, tz = "Etc/GMT+0")
#cambio l'orario con quello del fuso di Roma
#streamHistory2 <- streamHistory %>%
# mutate(endTime = with_tz(a, "Europe/Rome"))
a <- ymd_hms(complete$ts, tz = "Etc/GMT+0")
#cambio l'orario con quello del fuso di Roma
complete <- complete %>%
mutate(ts = with_tz(a, "Europe/Rome")) %>%
arrange(ts)
#cambio i nomi alle colonne/variabili
complete <- complete %>%
rename(endTime = ts) %>%
rename(artistName = master_metadata_album_artist_name) %>%
rename(trackName = master_metadata_track_name) %>%
rename(msPlayed = ms_played) %>%
rename(albumName = master_metadata_album_album_name)
#nuovo df con solo le colonne interessate, in ordine crescente di riproduzione
completeTot <- complete %>%
select(endTime, artistName, trackName, albumName, msPlayed) %>%
arrange(endTime)
```
# I miei dati di ascolto (aggiornati al 15/08/21)
# Attività di ascolto per settimane e ore
## In quali date ho ascoltato più o meno musica su Spotify?
```{r ascolto per date primo periodo}
#mySpotify = streamHistory2 %>%
# as_tibble() %>% #as_tibble() turns an existing object, such as a data frame or matrix, into a so-called tibble
# mutate_at("endTime", ymd_hms) %>% #aggiungo i secondi, cambio solo la colonna che si chiama "endTIme"
# mutate(date = floor_date(endTime, "day") %>% as_date, seconds = msPlayed / 1000, minutes = seconds / 60) %>%
# mutate(artistName = str_replace(artistName, "Sasha Sloan", "Sasha Alex Sloan"))
mySpotify_2 = completeTot %>%
as_tibble() %>% #as_tibble() turns an existing object, such as a data frame or matrix, into a so-called tibble
mutate_at("endTime", ymd_hms) %>% #aggiungo i secondi, cambio solo la colonna che si chiama "endTIme"
mutate(date = floor_date(endTime, "day") %>% as_date,
seconds = msPlayed / 1000,
minutes = seconds / 60)
# date -> prendo la data e basta senza orario, ricavo secondi e minuti suonati
# floor_date prende un oggetto data-ora e lo arrotonda per difetto al valore intero più vicino dell'unità di tempo specificata, nel mio caso per giorno
#primo periodo
oreStreamingUno = mySpotify_2 %>%
filter(date <= "2020-03-24") %>%
group_by(date) %>%
group_by(date = floor_date(date, "week")) %>% # raggruppo per settimane
summarize(ore = sum(minutes) / 60) %>% # sommo i minuti di ogni settimana / 60 = ore
#verb summarise() riduce più valori fino a un singolo riassunto
arrange(date) %>% # metto in ordine di data crescente
ggplot(aes(x = date, y = ore)) +
geom_col(aes(fill = ore)) +
scale_fill_gradient(low = "blue", high = "red") +
ylim(0, 45)+ #limite di 45 cosi vedo bene la differenza con l'altro periodo
labs(x= "data", y= "ore di ascolto") +
ggtitle("Attività di ascolto per settimana da marzo 2018 a marzo 2020 - primo periodo")
ggplotly(oreStreamingUno)
```
```{r ascolto per date secondo periodo}
#secondo periodo
oreStreamingDue = mySpotify_2 %>%
filter(date >= "2020-03-25") %>%
group_by(date) %>%
group_by(date = floor_date(date, "week")) %>% # raggruppo per settimane
summarize(ore = sum(minutes) / 60) %>% # sommo i minuti di ogni settimana / 60 = ore
#verb summarise() riduce più valori fino a un singolo riassunto
arrange(date) %>% # metto in ordine di data crescente
ggplot(aes(x = date, y = ore)) +
geom_col(aes(fill = ore)) +
scale_fill_gradient(low = "blue", high = "red") +
ylim(0, 45)+
labs(x= "data", y= "ore di ascolto") +
ggtitle("Attività di ascolto per settimana da aprile 2020 a luglio 2021 - secondo periodo")
ggplotly(oreStreamingDue)
```
Fun fact: nel secondo grafico il picco maggiore di ore è 40, mentre nel primo è 25: dalla quarantena il mio utilizzo di Spotify è quasi raddoppiato!
# Artisti più ascoltati (oltre 15 ore)
## Quali sono stati gli artisti che ho ascoltato di più sul mio Spotify?
```{r artista ore primo periodo}
#primo periodo
orePiuAscoltateUno <- mySpotify_2 %>%
filter(date <= "2020-03-24") %>%
group_by(artistName) %>%
summarize(minutiAscoltati = sum(minutes), oreAscoltate = minutiAscoltati/60) %>%
filter(minutiAscoltati >= 900) %>%
ggplot(aes(x = artistName, y = oreAscoltate, text = paste("artista: ", artistName, "<br>",
"ore ascoltate: ", round(oreAscoltate, digits = 0)))) +
geom_col(aes(fill = oreAscoltate)) +
scale_fill_gradient(low = "blue", high = "red") +
labs(x= "artista", y= "ore di ascolto") +
ggtitle("Quali sono i miei artisti più ascoltati? (> 15 ore di ascolto) - primo periodo") +
theme(axis.text.x = element_text(angle = 90)) #metto le label in verticale cosi leggo tutto bene
ggplotly(orePiuAscoltateUno, tooltip=c("text"))
```
```{r artista ore secondo periodo}
#secondo periodo
orePiuAscoltateDue <- mySpotify_2 %>%
filter(date >= "2020-03-25") %>%
group_by(artistName) %>%
summarize(minutiAscoltati = sum(minutes), oreAscoltate = minutiAscoltati/60) %>%
filter(minutiAscoltati >= 900) %>%
ggplot(aes(x = artistName, y = oreAscoltate, text = paste("artista: ", artistName, "<br>",
"ore ascoltate: ", round(oreAscoltate, digits = 0)))) +
geom_col(aes(fill = oreAscoltate)) +
scale_fill_gradient(low = "blue", high = "red") +
labs(x= "artista", y= "ore di ascolto") +
ggtitle("Quali sono i miei artisti più ascoltati? (> 15 ore di ascolto) - secondo periodo") +
theme(axis.text.x = element_text(angle = 90))
ggplotly(orePiuAscoltateDue, tooltip=c("text"))
```
Fun fact: nel secondo grafico il picco maggiore di ore è più di 300, mentre nel primo è circa 50: 6 volte di più!
# Attività di ascolto per specifici artisti
## In quali mesi ho ascoltato più o meno musica di un artista in particolare?
```{r specifici artisti primo periodo}
#primo periodo
# metto tutti gli artisti così posso confrontare
oreArtistaUno <- mySpotify_2 %>%
filter(date <= "2020-03-24") %>%
group_by(artistName, date = floor_date(date, "month")) %>% # raggruppo per ascolto mensile
summarize(hours = sum(minutes) / 60) %>% # sommo i minuti di ogni mese / 60 = ore
ggplot(aes(x = date, y = hours, group = artistName)) +
geom_line(aes(color = artistName)) +
geom_point(aes(color = artistName)) +
labs(x= "date", y= "ore di ascolto") +
#ylim(0, 68)+
ggtitle("artisti: The Lumineers, Halsey, Demi Lovato, Khalid (1° p") +
gghighlight(artistName == "The Lumineers" || artistName == "Halsey" || artistName == "Demi Lovato" || artistName == "Khalid" || artistName == "Taylor Swift" || artistName == "Lana Del Rey" || artistName == "Chase Atlantic" || artistName == "Lorde" || artistName == "blink-182" || artistName == "Avril Lavigne" || artistName == "Sasha Alex Sloan")
ggplotly(oreArtistaUno)
```
```{r specifici artisti secondo periodo}
#secondo periodo
# metto tutti gli artisti così posso confrontare
oreArtistaDue <- mySpotify_2 %>%
filter(date >= "2020-03-25") %>%
group_by(artistName, date = floor_date(date, "month")) %>% # raggruppo per ascolto mensile
summarize(hours = sum(minutes) / 60) %>% # sommo i minuti di ogni settimana / 60 = ore
ggplot(aes(x = date, y = hours, group = artistName)) +
geom_line(aes(color = artistName)) +
geom_point(aes(color = artistName)) +
labs(x= "date", y= "ore di ascolto") +
#ylim(0, 68)+
ggtitle("artisti: Taylor Swift, Lana Del Rey, Chase Atlantic, Lorde e blink-182 (2° p") +
gghighlight(artistName == "Taylor Swift" || artistName == "Lana Del Rey" || artistName == "Chase Atlantic" || artistName == "Lorde" || artistName == "blink-182" || artistName == "Avril Lavigne" || artistName == "Sasha Alex Sloan" || artistName == "The Lumineers" || artistName == "Halsey" || artistName == "Demi Lovato" || artistName == "Khalid")
ggplotly(oreArtistaDue)
```
Vedendo questi grafici si può sottolineare come i miei gusti musicali in fatto di artisti sia completamente cambiato dopo la prima quarantena del 2020! Gli artisti che ascoltavo tanto prima ora li ascolto di meno.
# Attività di ascolto per data e ora del giorno
## In che momento ho avuto la maggior parte dell'attività di riproduzione?
```{r ascolto date e giorni primo periodo}
#primo periodo
timeDayUno <- mySpotify_2 %>%
filter(date <= "2020-03-24") %>%
group_by(date, hour = hour(endTime)) %>% # raggruppo per data e ora
summarize(minutiAscoltati = sum(minutes)) %>% # minuti ascoltati
ggplot(aes(x = hour, y = date, fill = minutiAscoltati)) +
geom_tile() +
labs(x= "Ora del giorno", y= "Data") +
ggtitle("Quando c'è stata più attività di riproduzione sul mio Spotify? - primo periodo", "Attività per data e ora del giorno") +
scale_fill_gradient(low = "green", high = "blue", limits = c(0, 70))
timeDayUno
```
```{r ascolto date e giorni secondo periodo}
#secondo periodo
timeDayDue <- mySpotify_2 %>%
filter(date >= "2020-03-25") %>%
group_by(date, hour = hour(endTime)) %>% # raggruppo per data e ora
summarize(minutiAscoltati = sum(minutes)) %>% # minuti ascoltati
ggplot(aes(x = hour, y = date, fill = minutiAscoltati)) +
geom_tile() +
labs(x= "Ora del giorno", y= "Data") +
ggtitle("Quando c'è stata più attività di riproduzione sul mio Spotify? - secondo periodo", "Attività per data e ora del giorno") +
scale_fill_gradient(low = "green", high = "blue", limits = c(0, 70))
timeDayDue
```
# Attività di ascolto per orario della giornata
## A che ora del giorno ho ascoltato più musica?
```{r ascolto nelle ore giorno primo periodo}
#primo periodo
hoursDayUno = mySpotify_2 %>%
filter(date <= "2020-03-24") %>%
group_by(date, ora = hour(endTime), weekday = wday(date, label = TRUE))%>% #wday mi trova il giorno della settimana della data che gli passo, label true per averlo come stringa e non numero
summarize(minutiAscoltati = sum(minutes))%>%
ggplot(aes(x = ora, y = minutiAscoltati, group = date)) +
geom_col(fill = "#66b2ff") +
labs(x= "Ora del giorno", y= "Minuti di ascolto") +
ggtitle("Attività da 0 a 23h - primo periodo")
hoursDayUno
```
```{r ascolto nelle ore giorno secondo periodo}
#secondo periodo
hoursDayDue <- mySpotify_2 %>%
filter(date >= "2020-03-25") %>%
group_by(date, ora = hour(endTime), weekday = wday(date, label = TRUE))%>% #wday mi trova il giorno della settimana della data che gli passo, label true per averlo come stringa e non numero
summarize(minutiAscoltati = sum(minutes), oreAscoltate = minutiAscoltati/60) %>%
ggplot(aes(x = ora, y = minutiAscoltati, group = date)) +
geom_col(fill = "#66b2ff") +
labs(x= "Ora del giorno", y= "Minuti di ascolto") +
ggtitle("Attività da 0 a 23h - secondo periodo")
hoursDayDue
```
La mia attività di ascolto è spalmata in tutto il giorno, soprattutto nel pomeriggio e tarda mattinata.
# Attività di riproduzione per orario del giorno e giorno della settimana
## In quali giorni della settimana ho più attività di ascolto?
```{r ascolto settimana primo periodo}
#primo periodo
giornoUno <- mySpotify_2 %>% # per ogni giorno vedo quanti minuti ho ascoltato e a che ora del giorno
filter(date <= "2020-03-24") %>%
group_by(date, hour = hour(endTime), weekday = wday(date, label = TRUE)) %>%
summarize(minutesListened = sum(minutes))
asd <- giornoUno %>%
group_by(weekday, hour) %>% #raggruppo per giorno della settimana e ora
summarize(minutes = sum(minutesListened)) %>% #sommo i minuti ascoltati
ggplot(aes(x = hour, weekday, fill = minutes)) +
geom_tile() +
scale_fill_gradient(low = "green", high = "blue") +
labs(x= "Ora del giorno", y= "Giorno della settimana") +
ggtitle("In quali giorni della settimana ho più attività di ascolto? - primo periodo")
ggplotly(asd)
```
```{r ascolto settimana secondo periodo}
#secondo periodo
giornoDue <- mySpotify_2 %>% # per ogni giorno vedo quanti minuti ho ascoltato e a che ora del giorno
filter(date >= "2020-03-25") %>%
group_by(date, hour = hour(endTime), weekday = wday(date, label = TRUE)) %>%
summarize(minutesListened = sum(minutes))
asdf <- giornoDue %>%
group_by(weekday, hour) %>% #raggruppo per giorno della settimana e ora
summarize(minutes = sum(minutesListened)) %>% #sommo i minuti ascoltati
ggplot(aes(x = hour, weekday, fill = minutes)) +
geom_tile() +
scale_fill_gradient(low = "green", high = "blue") +
labs(x= "Ora del giorno", y= "Giorno della settimana") +
ggtitle("In quali giorni della settimana ho più attività di ascolto? - secondo periodo")
ggplotly(asdf)
```
## Attività di riproduzione per orario del giorno e giorno della settimana - grafico a linee
```{r linee primo periodo}
#primo periodo
weekDayUno <- giornoUno %>%
group_by(weekday, hour) %>%
summarize(minutes = sum(minutesListened)) %>%
ggplot(aes(x = hour, y = minutes, color = weekday)) +
geom_line() +
labs(x= "Ora del giorno", y= "Minuti di ascolto") +
ggtitle("In quale giorno della settimana e ora del giorno ho ascoltato più musica?", "Line chart - primo periodo")
weekDayUno
lessUno <- giornoUno %>%
group_by(weekday) %>%
summarize(minutes = sum(minutesListened)) %>%
arrange(-minutes)
lessUno
```
```{r linee secondo periodo}
#secondo periodo
weekDayDue <- giornoDue %>%
group_by(weekday, hour) %>%
summarize(minutes = sum(minutesListened)) %>%
ggplot(aes(x = hour, y = minutes, color = weekday)) +
geom_line() +
labs(x= "Ora del giorno", y= "Minuti di ascolto") +
ggtitle("In quale giorno della settimana e ora del giorno ho ascoltato più musica?", "Line chart - secondo periodo")
weekDayDue
lessDue <- giornoDue %>%
group_by(weekday) %>%
summarize(minutes = sum(minutesListened)) %>%
arrange(-minutes)
lessDue
```
Mi sono sorpresa del fatto che la linea tracciata sia simile per tutti i giorni della settimana e come il picco delle 7 di mattina sia scomparso.
# Quali sono le canzoni che ho ascoltato più volte dall'inizio? (>= 80 riproduzioni)
```{r top canzoni}
#mostStreamedSongs = streamHistory2 %>%
mostStreamedSongs = completeTot %>%
filter(msPlayed >= 50000) %>% # devo aver ascoltato la canzone almeno 50 secondi
group_by(trackName, artistName) %>%
count(trackName) %>%
arrange(-n) %>%
filter(n >= 80)
mostStreamedArtist = mostStreamedSongs %>%
group_by(artistName) %>%
count(artistName) %>%
mutate(perc = floor((n/nrow(mostStreamedSongs)) * 100)) %>%
arrange(-n)
#mostStreamedArtist
#provo grafico, nei 2 assi n volte e titolo brano, colore artista
#n come colore?
#y frequenza e x top 50
#x artista, y numerosità
canzoniPiuAscoltate <- mostStreamedSongs %>%
ggplot(aes(x = reorder(trackName, -n), y = n, fill = artistName, text = paste("track Name: ", trackName, "<br>", "artist: ", artistName, "<br>", "n: ", n))) +
geom_col() +
ggtitle("Le mie canzoni più ascoltate dall'inizio! (> 80 volte)")+
theme(axis.text.x = element_blank())+ #tolgo nome brano da asse x
labs(x= "tracce", y= "tot. riproduzioni")
#The unofficial text aesthetic allows you to introduce all the variables you want
#At last I choose what I want to show in the tooltip
ggplotly(canzoniPiuAscoltate, tooltip=c("text"))
```
La canzone che ho ascoltato di più in assoluto è Eastside di Halsey e Khalid, l'ho riprodotta per ben 249 volte!
C'è una vasta gamma di artisti diversi ma sono presenti ben 22 brani di Lana Del Rey.
# Le mie canzoni salvate nella libreria
Oltre a tutte le canzoni che ho riprodotto è presente anche un file con le canzoni che ho salvato nella libreria nel momento della richiesta dei dati.
```{r aggiunta canzoni Lorde}
# aggiungo ultime canzoni di Lorde a mano
savedTracks = savedTracks %>%
add_row(artist = "Lorde", album = "Pure Heroine", track = "Buzzcut Season", uri = "spotify:track:3ShTaJBCOclymogQNzPde7") %>%
add_row(artist = "Lorde", album = "Pure Heroine", track = "Glory And Gore", uri = "spotify:track:0SK9wxN40P6jlcMfTSAe0V") %>%
add_row(artist = "Lorde", album = "Pure Heroine", track = "Still Sane", uri = "spotify:track:0t1D6NQt3uhZnam0yg8Wv3") %>%
add_row(artist = "Lorde", album = "Pure Heroine", track = "White Teeth Teens", uri = "spotify:track:15LzvCtoJWwsrTWJMWUTOv") %>%
add_row(artist = "Lorde", album = "Pure Heroine", track = "A World Alone", uri = "spotify:track:2HLnzsXJ3mD9UWAa3RY89n") %>%
add_row(artist = "Lorde", album = "Pure Heroine", track = "Bravado", uri = "spotify:track:02ZorlDGq0uTnMobHNh4EL") %>%
add_row(artist = "Lorde", album = "Pure Heroine", track = "Million DOllar Bills", uri = "spotify:track:3Lw7lWTJlcqlx8E9HFmByr") %>%
add_row(artist = "Lorde", album = "Pure Heroine", track = "The Love Club", uri = "spotify:track:2yrJ1jWo3HLksJFUqUsZE4") %>%
add_row(artist = "Lorde", album = "Pure Heroine", track = "Biting Down", uri = "spotify:track:45UvXCltvMpEPNLGzG0NYk") %>%
add_row(artist = "Lorde", album = "Pure Heroine", track = "Swingin Party", uri = "spotify:track:7otV7kSzDMo11qLlw8pAtr") %>%
add_row(artist = "Lorde", album = "The Hunger Games: Mockingjay Pt.1 (Original Motion Picture Soundtrack)", track = "Meltdown", uri = "spotify:track:27qvbQ10N5uoqXvYT9MqZt") %>%
add_row(artist = "Lorde", album = "Caracal (Deluxe)", track = "Magnets", uri = "spotify:track:7nRmfGNhHKEEu5o8yFXLXt") %>%
add_row(artist = "Lorde", album = "MTV Unplugged", track = "Don't Take The Money", uri = "spotify:track:25wTebB8ECapFHWRPywpYR") %>%
add_row(artist = "Lorde", album = "Alternate Worlds", track = "Easy", uri = "spotify:track:0rkqMaZsWZzfdz4brrhS14") %>%
add_row(artist = "Lorde", album = "The Hunger Games: Mockingjay Pt.1 (Original Motion Picture Soundtrack)", track = "Yellow Flicker Beat", uri = "spotify:track:0HVINS0AfIuck7csStOEHP")
```
## Artisti con più brani salvati nella libreria
```{r top artisti}
artistiConPiuBrani = savedTracks %>%
group_by(artist) %>%
count(artist) %>%
arrange(-n)
green <- "#1ed760"
yellow <- "#e7e247"
pink <- "#ff6f59"
blue <- "#17bebb"
#fattori vengono utilizzati per lavorare con variabili categoriali, variabili che hanno un insieme fisso e noto di possibili valori.
# artisti con piu brani nella libreria
plotartistiConPiuBrani <- artistiConPiuBrani %>%
filter(n >= 11) %>%
mutate(freq = case_when(n > 100 ~ '> 100 brani', #qui credo i 4 livelli
between(n, 50, 99) ~ '50-99 brani',
between(n, 20, 49) ~ '20-49 brani',
TRUE ~ '< 20 brani')) %>% #creo un factor, lo divido nei 4 livelli visto che n può assumere 4 livelli diversi
mutate(freq = factor(freq, levels = c('> 100 brani', '50-99 brani', '20-49 brani', '< 20 brani'))) %>% #assegno il giusto livello
ggplot(mapping = aes(x = reorder(artist, -n), y = n, fill = freq, text = paste("artista: ", artist, "<br>", "n canzoni : ", n))) +
geom_col() +
scale_fill_manual(values=c(green, yellow, pink, blue)) +
labs(x= "Artista", y= "Numero di canzoni") +
ggtitle("Artisti con più brani salvati nella libreria") +
theme(axis.text.x = element_text(angle = -60))
ggplotly(plotartistiConPiuBrani, tooltip=c("text"))
#taylor complete collection: 267 brani
#lana complete collection: 107 brani
```
# Spotify API e spotifyr
## le mie ultime 5 canzoni ascoltate
```{r ultime five canzoni}
get_my_recently_played(limit = 5) %>%
mutate(artist.name = map_chr(track.artists, function(x) x$name[1]), #map_chr da vettore di caratteri, prendo solo il primo
played_at = as_datetime(played_at)) %>%
select(track.name, artist.name, track.album.name, played_at) %>%
kable() #funzione di knitr per creare tabelle
# funzione map_chr: trasforma l'input applicando una funzione ad ogni elemento e ritorna un vettore della stessa lunghezza dell'input. chr = character vector
```
# Quadrante emotivo dei miei artisti più ascoltati nel mese di luglio
```{r top artisti mese}
shortTermArtists <- get_my_top_artists_or_tracks(type = 'artists', time_range = 'short_term', limit = 11) %>%
select(name, genres, popularity) %>%
rowwise %>%
mutate(genres = paste(genres, collapse = ', ')) %>%
ungroup
#devo salvarli in un file csv perchè i dati vengono modificati
#shortTermArtists
#write.csv(shortTermArtists,"shortTermArtists.csv", row.names = FALSE)
shortTermA <- read.csv("shortTermArtists.csv")
shortTermA <- as_tibble(shortTermA)
shortTermA
```
```{r quadrante emotivo top cantanti}
# prendo discografia dei top 8 cantanti del mese
favArtist1 <- get_artist_audio_features(artist= "Taylor Swift")
favArtist2 <- get_artist_audio_features(artist= "Lorde", include_groups = c("album", "single"))
favArtist3 <- get_artist_audio_features(artist= "Lana Del Rey")
favArtist4 <- get_artist_audio_features(artist= "Tove Lo")
favArtist5 <- get_artist_audio_features(artist= "Sasha Alex Sloan", include_groups = c("album", "single", "appears_on"))
favArtist6 <- get_artist_audio_features(artist= "Avril Lavigne")
favArtist7 <- get_artist_audio_features(artist= "Chase Atlantic", include_groups = c("album", "single"))
favArtist8 <- get_artist_audio_features(artist= "HAIM")
#per certi includo anche i singoli e le canzoni in cui compaiono
#CAMBIARE E TOGLIERE GLI ALBUM INUTILI!!! TENERE SOLO QUELLI IMPORTANTI -> seleziono quelli che mi interessano con which in c(nomi album)
#prendo solo gli album utili per tay, tolgo le release in piu tipo gli speciali o gli ep
favArtist1 <- favArtist1[which(favArtist1$album_name %in% c("1989 (Deluxe)","evermore (deluxe version)", "Fearless (Platinum Edition)", "Fearless (Taylor's Version)", "folklore (deluxe version)", "Lover", "Red (Deluxe Edition)", "reputation", "Speak Now (Deluxe Package)", "Taylor Swift")),]
#prendo le canzoni uniche, non ripetute
favArtist1 <- favArtist1 %>%
distinct(track_name, .keep_all = TRUE) # per tenere anche le altre colonne, di default tiene solo track_name
#prendo solo gli album utili per lorde
favArtist2 <- favArtist2[which(favArtist2$album_name %in% c("Solar Power", "Melodrama", "Pure Heroine (Extended)", "Yellow Flicker Beat (From The Hunger Games: Mockingjay Part 1)")),]
#prendo le canzoni uniche, non ripetute
favArtist2 <- favArtist2 %>%
distinct(track_name, .keep_all = TRUE)
#prendo solo gli album utili per lana
favArtist3 <- favArtist3[which(favArtist3$album_name %in% c("Born To Die – Paradise Edition (Special Version)", "Chemtrails Over The Country Club", "Honeymoon", "Lust For Life", "Norman Fucking Rockwell!", "Ultraviolence (Deluxe)")),]
#prendo le canzoni uniche, non ripetute
favArtist3 <- favArtist3 %>%
distinct(track_name, .keep_all = TRUE)
#prendo solo gli album utili per tove lo
favArtist4 <- favArtist4[which(favArtist4$album_name %in% c("Sunshine Kitty", "BLUE LIPS (lady wood phase II)", "Lady Wood", "Queen Of The Clouds")),]
#prendo le canzoni uniche, non ripetute
favArtist4 <- favArtist4 %>%
distinct(track_name, .keep_all = TRUE)
#prendo solo gli album utili per sasha sloan
favArtist5 <- favArtist5[which(favArtist5$album_name %in% c("Only Child", "Love Runs Out (feat. G-Eazy & Sasha Alex Sloan)", "barcelona", "when was it over? (feat. Sam Hunt)", "Self Portrait", "Loser", "sad girl")),]
#prendo le canzoni uniche, non ripetute
favArtist5 <- favArtist5 %>%
distinct(track_name, .keep_all = TRUE)
#avril è okay ma prendo le canzoni uniche
favArtist6 <- favArtist6 %>%
distinct(track_name, .keep_all = TRUE)
#prendo solo gli album utili per i chase atlantic
favArtist7 <- favArtist7[which(favArtist7$album_name %in% c("Dalliance", "Nostalgia", "Paradise EP", "Part One", "Self Portrait", "Part Two", "Part Three", "DON'T TRY THIS", "Chase Atlantic", "hurts 2 hate somebody (with Chase Atlantic & No Rome)", "PHASES", "BEAUTY IN DEATH")),]
#prendo le canzoni uniche, non ripetute
favArtist7 <- favArtist7 %>%
distinct(track_name, .keep_all = TRUE)
#prendo solo gli album utili per le HAIM
favArtist8 <- favArtist8[which(favArtist8$album_name %in% c("Women In Music Pt III (Expanded Edition)", "Something to Tell You", "Days Are Gone (Deluxe Edition)")),]
#prendo le canzoni uniche, non ripetute
favArtist8 <- favArtist8 %>%
distinct(track_name, .keep_all = TRUE)
#creo un unico df
topArtists <- rbind(favArtist1, favArtist2, favArtist3, favArtist4, favArtist5, favArtist6, favArtist7, favArtist8)
quadranteEmotivo <- ggplot(data = topArtists, aes(x = valence, y = energy, color = artist_name)) +
geom_jitter(aes(text = track_name)) + #jitter e non point per evitare sovrastampa di punti nel grafico
geom_vline(xintercept = 0.5) + #righe per dividere in 4
geom_hline(yintercept = 0.5) +
scale_x_continuous(expand = c(0, 0), limits = c(0, 1)) + # limits limita i valori sugli assi da 0 a 1
scale_y_continuous(expand = c(0, 0), limits = c(0, 1)) + # expand centra gli assi del grafico sull'origine
annotate('text', 0.17, 0.95, label = "Energetico/Arrabbiato", fontface = "bold") + #per scrivere i 4 testi negli angoli
annotate('text', 1.75 / 2, 0.95, label = "Energetico/Felice", fontface = "bold") +
annotate('text', 0.865, 0.05, label = "Pacifico/Tranquillo", fontface = "bold") +
annotate('text', 0.13, 0.05, label = "Triste/Lento", fontface = "bold") +
labs(x= "Valence", y= "Energy") +
ggtitle("Quadrante emotivo dei miei artisti più ascoltati nel mese di luglio")
ggplotly(quadranteEmotivo)
```
# Generi più ascoltati nel mese di luglio
```{r top generi}
# trova i MIEI artisti più ascoltati ultimamente
#genereShort = get_my_top_artists_or_tracks(type = 'artists', time_range = 'short_term') %>%
# select(name, genres, popularity, followers.total) %>%
# rowwise %>% # It is also useful to support arbitrary complex operations that need to be applied to each row.
# mutate(genres = paste(genres, collapse = ', ')) %>%
# ungroup
#mi copio la tabella perhcè viene modificata!
#write.csv(genereShort,"genereShort.csv", row.names = FALSE)
genereShort <- read.csv("genereShort.csv")
# GRAFICO GENERI TOP ARTISTI!!!
#modifico la tabella
genereShort$pop = 0 #5
genereShort$postTeen.pop = 0 #6
genereShort$art.pop = 0 #7
genereShort$dance.pop = 0 #8
genereShort$electropop = 0 #9
genereShort$indie.pop = 0 #10
genereShort$uk.pop = 0 #11
genereShort$modern.rock = 0 #12
genereShort$pop.rock = 0 #13
genereShort$pop.rap = 0 #14
genereShort$RandB = 0 #15
genereShort$punk = 0 #16
# assegno ad ogni artista il genere esatto, cosi poi conto
#Tay
genereShort[1,5] = 1
genereShort[1,6] = 1
#Lorde
genereShort[2,7] = 1
genereShort[2,8] = 1
genereShort[2,9] = 1
genereShort[2,5] = 1
genereShort[2,6] = 1
#Sasha Sloan
genereShort[3,9] = 1
genereShort[3,10] = 1
genereShort[3,5] = 1
genereShort[3,6] = 1
#OLIVIA
genereShort[4,5] = 1
#TOVE LO
genereShort[5,8] = 1
genereShort[5,9] = 1
genereShort[5,5] = 1
genereShort[5,6] = 1
genereShort[5,14] = 1
#LANA
genereShort[6,7] = 1
genereShort[6,5] = 1
#ANNE MARIE
genereShort[7,8] = 1
genereShort[7,5] = 1
genereShort[7,6] = 1
genereShort[7,11] = 1
#CHASE ATLANTIC
genereShort[8,12] = 1
genereShort[8,5] = 1
#AVRIL
genereShort[9,5] = 1
genereShort[9,6] = 1
genereShort[9,8] = 1
#HAIM
genereShort[10,7] = 1
genereShort[10,8] = 1
genereShort[10,10] = 1
genereShort[10,13] = 1
#BILLIE
genereShort[11,9] = 1
genereShort[11,5] = 1
#Demi Lovato
genereShort[12,5] = 1
genereShort[12,6] = 1
genereShort[12,8] = 1
#Dua Lipa
genereShort[13,8] = 1
genereShort[13,5] = 1
genereShort[13,11] = 1
#Sleeping At Last
genereShort[14,5] = 1
genereShort[14,10] = 1
genereShort[14,13] = 1
#FLETCHER
genereShort[15,8] = 1
genereShort[15,9] = 1
genereShort[15,5] = 1
genereShort[15,6] = 1
genereShort[15,10] = 1
#THE WEEKND
genereShort[16,5] = 1
genereShort[16,15] = 1
#Halsey
genereShort[17,8] = 1
genereShort[17,9] = 1
genereShort[17,5] = 1
genereShort[17,6] = 1
genereShort[17,10] = 1
#Rita Ora
genereShort[18,8] = 1
genereShort[18,9] = 1
genereShort[18,14] = 1
genereShort[18,6] = 1
genereShort[18,11] = 1
#BLINK 182
genereShort[19,16] = 1
#KHALID
genereShort[20,5] = 1
#creo un nuovo dataframe per fare un grafico sui generi più ascoltati recentemente
nome <- c("pop", "post-teen pop", "art pop", "dance pop", "electropop", "indie pop", "uk pop", "modern rock", "pop rock", "pop rap", "r&b", "punk")
tot <- c(17, 10, 3, 10, 7, 5, 3, 1, 2, 2, 1, 1)
gen <- data.frame(nome, tot)
# farlo direttamente con plotly perchè con ggplot2 non va poi
generi <- plot_ly(gen, labels = ~nome, values = ~tot, type = 'pie')
generi <- generi %>% layout(title = 'Generi più riprodotti ultimamente',
xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))
generi
#netta maggioranza per il pop ma è presente anche rock e punk!
```
Sono presenti molte sfumature del pop, il quale è palesemente il mio genere più ascoltato ultimamente; a seguire rock e punk.
# Conclusione
cambiamenti più rilevanti:
* abbonamento premium (autunno 2019)
* quarantena (marzo 2020) -> musica più triste, arrabbiata e nostalgica