Power BI Dashboard

About this project

This project aimed to create a Spotify Wrapped-Style analytics dashboard to visualize personalized listening habits, uncover behavioral trends, and enhance user engagement.

Goals & Business Needs:

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.

Key Technical Work:

Data Transformations:

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

Insights & Visualization

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.

Few Code Example:

  1. Total Plays :
TotalPlays = COUNT(SpotifyData[Spotify Track URI])
  1. Rank Artist by Play Count:
Rank Artists = 
RANKX(
    ALL(SpotifyData[Artist Name]),
    [TotalPlays],
    ,
    DESC,
    Dense
)
  1. Calculate Total Minutes by Top 5% Artist:
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 ) ) )
  1. Summary of Top 5% Artists Played Less then 5 Minutes:
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"

  1. Time Format to hh:mm:sss
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")
  1. Dynamic Comments Based on Parameter Selection:
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
)
  1. Top Artist:
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
  1. Top 1 Track by Play Count:
Top Track of Favourite Artist = 
CALCULATE(
        MAX(SpotifyData[Track Name]),
        TOPN(1, ALL(SpotifyData[Track Name]), [TotalPlays],DESC)
)
  1. Skipped Percentage (%):
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.

Additional project images

Introduction of the product
Find your favorite artist and play music
Discussion and feedback(0 comments)
2000 characters remaining
Cookie SettingsWe use cookies to enhance your experience, analyze site traffic and deliver personalized content. Read our Privacy Policy.