This project aimed to create a Spotify Wrapped-Style analytics dashboard to visualize personalized listening habits, uncover behavioral trends, and enhance user engagement.
1. Transform raw streaming data into actionable insights (e.g peak listening times, skip rates, platform preferences).
2. Improve user experience by enabling direct track playback and visualizing top artists/tracks or albums.
3. Support data-driven decisions for personalized marketing and playlist curation.
1. Converted ms_played to minutes, categorized time into day periods (midnight, morning, evening).
2. Proper cased all the text column except spotify uri, which used to retrieve image using API
3. Integrated Spotify's API via power query to fetch album art dynamically using spotify track uri
4. Created Interactive track URLs for seamless playback within dashboards.
5. Created new column in the dataset with the newly retrieved URL using merging technique.
6. Leveraged dax to develop measures like ranking track, artist or album, dynamic title, top artist etc
7. Leveraged dax to create calculated column to simplify categories of column for a visually appealing comparison between top artist and others. For example: Reason Start categories simplified into three categories only like 'Trackdone', 'Frwdbtn' and rest are 'Others', ensuring clarity and focus in the analysis.
Power Query function to retrieve Image URLs using Track URI:
let
GetSpotifyImageURL = (TrackID as text) as text =>
let // Replace with your actual access token
AccessToken = "Your Token",
URL = "https://api.spotify.com/v1/tracks/"&TrackID,
Source = Json.Document(Web.Contents(URL, [Headers=[Authorization="Bearer "&AccessToken]])),
Album = Source[album],
ImageURL = Album[images]{0}[url]
in
ImageURL
in
GetSpotifyImageURL
1. Identified peak listening hours (8 PM & 12 AM on Wed/Fri) and top artists (The Beatles, 13.5K plays).
2. Analyzed skip rates (36%) and shuffle usage (75%) to gauge user preferences.
3. Highlighted Android dominance (90% streams).
4. Interactivity to play track on Web/Spotify app directly through dashboard.
5. Top 5% artists dominates 77.2% of plays for tracks under 5 minutes, showcasing their popularity in shorter, high-energy formats.
Tools: Power BI, Power Query, Dax, Spotify API, Excel.
TotalPlays = COUNT(SpotifyData[Spotify Track URI])
Rank Artists =
RANKX(
ALL(SpotifyData[Artist Name]),
[TotalPlays],
,
DESC,
Dense
)
Top5% =
VAR ArtistRank = [RankArtist]
VAR UniqueArtist = CALCULATE( DISTINCTCOUNT(SpotifyData[Artist Name]), ALL(SpotifyData[Artist Name]))
VAR Top5 = ROUND(UniqueArtist * 0.05, 0)
RETURN
IF( ISFILTERED( SpotifyData[Artist Name] ),
IF( ArtistRank < Top5, [TotalMinutes], BLANK() ),
CALCULATE( [TotalMinutes], TOPN( Top5, ALL( SpotifyData[Artist Name] ), [TotalMinutes], DESC ) ) )
SummaryLess5Minutes =
VAR TotalPlaysAllArtists = [TotalPlays]
VAR FilteredArtists =
CALCULATETABLE(
VALUES(SpotifyData[Artist Name]),
SpotifyData[Minutes Played] < 5
)
VAR TotalUniqueArtists = COUNTROWS(FilteredArtists)
VAR Top5Threshold = ROUND(TotalUniqueArtists * 0.05, 0)
VAR Top5ArtistsPlays =
CALCULATE(
[TotalPlays],
SpotifyData[Minutes Played] < 5,
TOPN(
Top5Threshold,
FilteredArtists,
[TotalPlays], DESC
)
)
VAR LessThan5Mins =
DIVIDE(
Top5ArtistsPlays,
TotalPlaysAllArtists,
0
)
RETURN
"Top 5% artists: " &FORMAT(LessThan5Mins, "0.0%") & " of plays for tracks <5min"
FormattedTime =
VAR TotalMinutes = [TotalMinutes]
VAR TotalSeconds = TotalMinutes * 60
VAR Hours = INT(TotalSeconds / 3600)
VAR Minutes = INT(MOD(TotalSeconds, 3600) / 60)
VAR Seconds = MOD(TotalSeconds, 60)
RETURN FORMAT(Hours, "00")&":"&FORMAT(Minutes, "00")&":"&FORMAT(Seconds, "00")
Subtitle Heatmap =
VAR _MostListenedDay =
CALCULATE(
CONCATENATEX(
TOPN(1, ALL('Calendar'[Day Name]), [TotalPlays], DESC),
'Calendar'[Day Name],
" & ",
'Calendar'[Day Name]
)
)
VAR _MostListenedTime =
CALCULATE(
CONCATENATEX(
TOPN(1, ALL(SpotifyData[DayTime]), [TotalPlays], DESC),
SpotifyData[DayTime],
" & ",
SpotifyData[DayTime]
)
)
VAR _MostListenedDay_Min =
CALCULATE(
CONCATENATEX(
TOPN(1, ALL('Calendar'[Day Name]), [TotalMinutes], DESC),
'Calendar'[Day Name],
" & ",
'Calendar'[Day Name]
)
)
VAR _MostListenedTime_Min =
CALCULATE(
CONCATENATEX(
TOPN(1, ALL(SpotifyData[DayTime]), [TotalMinutes], DESC),
SpotifyData[DayTime],
" & ",
SpotifyData[DayTime]
)
)
VAR _Result_Count = "Peak Listening Days: "&_MostListenedDay&UNICHAR(10)&"Peak Listening Hour: "&_MostListenedTime
VAR _Result_Mins = "Peak Listening Days: "&_MostListenedDay_Min&UNICHAR(10)&"Peak Listening Hour: "&_MostListenedTime_Min
VAR _SelectedParameter = SELECTEDVALUE('Select Measure'[Select Measure Order])
RETURN
SWITCH(
TRUE(),
_SelectedParameter = 0 , _Result_Count,
_Result_Mins
)
TopArtist =
VAR _topArtistbyMinutes =
IF(
[RankArtist] <= 5,
1,
BLANK()
)
VAR _topArtistbyPlayCount =
IF(
[RankArtistsByPlay] <= 5,
1,
BLANK()
)
VAR _SelectedParameter = SELECTEDVALUE('Select Measure'[Select Measure Order])
VAR _Result =
SWITCH(
TRUE(),
_SelectedParameter = 0, _topArtistbyPlayCount,
_topArtistbyMinutes
)
RETURN
_Result
Top Track of Favourite Artist =
CALCULATE(
MAX(SpotifyData[Track Name]),
TOPN(1, ALL(SpotifyData[Track Name]), [TotalPlays],DESC)
)
Skipped% =
VAR _CountMusic_Skipped = CALCULATE([TotalPlays], SpotifyData[Skipped] = FALSE())
VAR _MinutesPlayed_Skipped = CALCULATE([TotalMinutes], SpotifyData[Skipped] = FALSE())
VAR _CountMusic_SkippedPct = _CountMusic_Skipped/[TotalPlays]
VAR _MinutesPlayed_SkippedPct = _MinutesPlayed_Skipped/[TotalMinutes]
VAR _Result_CountPct = FORMAT(_CountMusic_SkippedPct, "0%")
VAR _Result_MinsPct = FORMAT(_MinutesPlayed_SkippedPct, "0%")
VAR _SelectedParameter = SELECTEDVALUE('Select Measure'[Select Measure Order])
RETURN
SWITCH(
TRUE(),
_SelectedParameter = 0 , _Result_CountPct,
_Result_MinsPct
)
There are many more measures playing behind the dashboard.
> Delivered an engaging, interactive report mirroring Spotify Wrapped’s appeal while providing deeper behavioral insights for strategic decisions.