Zoeken op website

Wat maakt een Spotify-hit? Ik heb meer dan 30.000 nummers getest in Python om erachter te komen


Telkens wanneer ik achter de computer zit, lijkt het alsof Spotify op de achtergrond aan staat. Met gegevens over Spotify-nummers beschikbaar, wilde ik zien of er eigenschappen waren die de hits gemeen hadden. Ik gebruikte Spotify om te kijken of ik een model van een hitnummer kon bouwen.

Het verkrijgen van de dataset

Kaggle komt te hulp

Om muziekgegevens te onderzoeken, zou ik een dataset moeten vinden. Zoals veel andere technologiebedrijven, maakt Spotify gegevens beschikbaar voor ontwikkelaars. Ik zou me kunnen aanmelden voor een ontwikkelaarsaccount en de API leren om Spotify's gegevens te scrapen, maar andere mensen hebben dat voor mij gedaan en datasets op Kaggle geplaatst.

Ik heb een dergelijke dataset van meer dan 30.000 hitsongs gedownload, samengesteld door Joakim Arvidsson. Ik gebruikte de Kaggle commandoregelclient om het naar mijn computer te downloaden:

kaggle datasets download joebeachcapital/30000-spotify-songs

Ik heb een Jupyter-notebook opgezet om mijn analyse op te slaan, die je kunt bekijken op mijn GitHub-account.

Ik heb daarna mijn standaard Python statistiekbibliotheken in een cel geïmporteerd:

import numpy as np
import pandas as pd
import seaborn as sns
sns.set_theme()
%matplotlib inline
import matplotlib.pyplot as plt
import statsmodels.formula.api as smf
import statsmodels.api as sm
from scipy import stats

Dit gedeelte importeert NumPy, een populaire bibliotheek voor numerieke analyses en lineaire algebra die ook enkele veelgebruikte statistische functies bevat. pandas is een bibliotheek voor het manipuleren van tabulaire gegevens in "DataFrames." Seaborn is een bibliotheek voor veelgebruikte statistische visualisaties. De functie sns.set_theme() stelt het standaardthema in. De "%matplotlib inline" is een "magic"-commando dat Jupyter vertelt de grafieken in de Jupyter-notebook weer te geven in plaats van in een apart venster. De volgende regel importeert de Matplotlib-bibliotheek om extra grafieken te maken. De regels met statsmodels importeren zowel statsmodels als de formule-API's om de modellen te maken die ik zal gebruiken. Tot slot zal ik de statistiekfuncties van de SciPy-bibliotheek importeren in de hoofdruimte van Python.

Vervolgens wilde ik de gegevens importeren in een pandas DataFrame:

spotify = pd.read_csv('data/spotify_songs.csv')

De gegevens onderzoeken

De omgeving verkennen

Met de geïmporteerde gegevens wilde ik ze verkennen en visualiseren. Eerst bekeek ik de eerste paar regels van de gegevens om te zien hoe ze zijn opgesteld:

sns.head()

Wat betekenen deze koppen? De Kaggle-dataset bevat een "datakaart" die de kolommen uitlegt. Sommige, zoals "track_id," zijn unieke nummers, terwijl andere, zoals "track_title," "track_artist," "playlist_name," en "playlist_genre," voor zich lijken te spreken. Andere worden gedefinieerd door Spotify. "Acousticness" meet in hoeverre akoestische geluiden de track domineren, zoals akoestische gitaren. "Danceability" meet hoe "dansbaar" een track is. "Luidheid" meet hoe luid de track klinkt. "Instrumentaliteit" meet hoe "instrumentaal" het nummer is, of hoeveel zang erin zit. "Levendigheid" meet hoeveel de track klinkt als een liveconcert, inclusief het geluid van het publiek. "Energie" meet hoe opwindend een track klinkt. "Spraakzaamheid" meet de hoeveelheid gesproken woorden in de track. "Valentie" meet hoe "positief" de track klinkt.

Nu wilde ik wat samenvattende statistieken zien. Ik gebruikte de "describe"-methode:

spotify.describe()

Dit zal enkele basis beschrijvende statistieken berekenen, zoals het aantal elementen, gemiddelde, de mediaan, de steekproefstandaardafwijking, de minimumwaarde, het onderste kwartiel of 25e percentiel, de mediaan, het bovenste kwartiel of 75e percentiel, en het maximum van elke kolom. Alleen al aan het aantal elementen te zien, is het een vrij grote dataset.

Met deze cijfers berekend, zou ik vervolgens naar de verdelingen willen kijken. Het plotten van een histogram van elke kolom kan tijdrovend zijn bij een dataset met veel kolommen, maar ik kan pandas een histogram voor elk laten plotten in één commando:

spotify.hist()

Ik merkte dat veel van de verdelingen van de dataset naar de ene of de andere kant scheef zijn. De populariteit van het nummer, die ik probeer te voorspellen, heeft veel nummers die helemaal niet zo populair lijken, weergegeven door de hoge balk van 0 aan de linkerkant van het histogram.

Een model bouwen: eigenschappen volgen

Waar is een hitnummer van gemaakt?

Met de geladen gegevens en enkele gemaakte visualisaties, wilde ik zien welke variabelen het grootste effect zouden hebben op populariteit. Mijn eerste poging was om statsmodels te gebruiken om een gewone kleinste-kwadraten regressie uit te voeren op de andere variabelen. Ik gebruikte de formuliermethode van statsmodels:

results = smf.ols('track_popularity ~ danceability + energy + key + loudness + mode + speechiness + acousticness + instrumentalness + liveness + valence + tempo + duration_ms',data = spotify).fit()
results.summary()

Het diagram liet een poging zien om een model aan te passen, maar er was een bericht dat de numerieke resultaten mogelijk niet betrouwbaar zijn vanwege mogelijke collineariteit, of dat waarden op dezelfde lijn liggen.

Ik besloot om genormaliseerde regressie te proberen, aangezien het extreme resultaten bestraft:

results = smf.ols('track_popularity ~ danceability + energy + key + loudness + mode + speechiness + acousticness + instrumentalness + liveness + valence + tempo + duration_ms',data = spotify).fit_regularized()

Het heeft niet dezelfde results-methode, maar er is een params-attribuut om de coëfficiënten te bekijken. De coëfficiënten kunnen je vertellen hoe het effect van een verandering in één variabele het resultaat beïnvloedt, en of er een positieve of negatieve relatie is.

results.params

Hier zijn de resultaten:

Intercept           57.497818
danceability         6.867472
energy             -21.567406
key                  0.095799
loudness             1.123025
mode                 1.183389
speechiness         -5.345878
acousticness         6.543464
instrumentalness   -12.618947
liveness            -3.144802
valence              4.081272
tempo                0.064768
duration_ms         -0.000032
dtype: float64

De grootste negatieve voorspellers van populariteit, gebaseerd op de coëfficiënten, zijn energie, spraakgehalte en instrumentaalheid. De grootste positieve voorspellers lijken dansbaarheid, luidheid en valentie te zijn. Als je akoestische set het goed deed bij de laatste open mic, zou je kunnen proberen een platencontract te krijgen. Als je instrumentale muziek maakt, zou je waarschijnlijk niet snel je dagelijkse baan willen opgeven.

Een model bouwen: genre

Het soort muziek doet er ook toe

Ik wilde ook bekijken of het genre een voorspeller van succes was. Daarvoor zou ik naar variantieanalyse gaan, of ANOVA. Eerst maakte ik een boxplot van populariteit per afspeellijstgenre:

sns.catplot(x='playlist_genre',y='track_popularity',kind='box',data=spotify)

Het doosdiagram lijkt een significant verschil in populariteit van nummers tussen afspeellijstgenres te suggereren. Ik heb een ander lineair model gemaakt, dit keer met een categorie:

Toen gebruikte ik dit lineaire model op de anova_lm-methode.

sm.stats.anova_lm(genre_lm)

Aangezien de p-waarde zo laag is, betekent dit dat het genre een significante voorspeller van populariteit is. Ik zal een staafdiagram maken van de populariteit van nummers per genre:

sns.catplot(x='playlist_genre',y='track_popularity',kind='bar',data=spotify)

Als je een hit wilde hebben, wil je misschien op Latin- en popafspeellijsten komen.


Misschien kun je wat hits voorspellen

Hoewel muziek subjectief is, kunnen sommige brede eigenschappen misschien voorspeld worden. Misschien houden mensen gewoon op een bepaalde manier van bepaalde muzikale elementen. Een lied in een momenteel populair genre zou een grote hit kunnen zijn. Maar muziek kan niet altijd worden teruggebracht tot cijfers. Het is nog steeds leuk om een menselijke ervaring statistisch te verkennen met code.

Gerelateerde artikelen