Eleven Years of Musical Evolution A Deep Dive into My Spotify Data Journey (2012-2023)

RobertoRoberto
23 min read

How I turned 6,488 hours of listening data into insights about musical taste, technology, and the evolution of streaming culture

The complete code for this Spotify analytics dashboard is available on GitHub at https://github.com/soyroberto/streamlit. The dashboard is deployed and accessible at soyroberto.streamlit.app for interactive exploration.

When I first signed up for Spotify in 2012, streaming music was still a novelty. Most people were still buying individual songs on iTunes, burning CDs, or relying on radio for music discovery. Fast forward eleven years, and I've accumulated what can only be described as a musical autobiography written in data: 6,488.3 hours of listening time across 10,894 unique artists and 140,473 individual plays.

To put this in perspective, that's equivalent to listening to music non-stop for nearly nine months straight. If we consider an average work year of 2,080 hours, I've essentially worked more than three full-time jobs worth of music listening over the past decade. This isn't just data—it's a chronicle of musical evolution, personal growth, and the transformation of how we consume culture in the digital age.

What makes this journey particularly fascinating is not just the sheer volume of data, but what it reveals about the intersection of technology and taste. Using modern data visualization tools like Streamlit and Plotly, I've transformed this raw listening history into an interactive dashboard that tells the story of how musical preferences evolve over time, how streaming algorithms influence discovery, and how personal taste intersects with broader cultural movements. You can actually see it an interact with it by clicking: https://soyroberto.streamlit.app/

The Numbers Tell a Story

The raw statistics alone paint a compelling picture of digital music consumption in the streaming era. Over eleven years, my listening habits generated a dataset that would make any data scientist's eyes light up (I'd like to think). But beyond the impressive totals lies a more nuanced story about musical taste, cultural evolution, and the democratization of music discovery.

The Classical Revelation

Perhaps the most surprising discovery in my data analysis was the dominance of classical music in my listening habits. The top two positions in my most-played artists are occupied by Pyotr Ilyich Tchaikovsky and Johann Sebastian Bach, each commanding over 108 hours of listening time. This wasn't a conscious decision—it emerged organically from my listening patterns over the years.

This classical music preference reveals something profound about how streaming services have transformed our relationship with historical music. Before Spotify, accessing the complete works of Tchaikovsky or Bach required either an extensive CD collection or frequent trips to the library. The very 1st ever record I ever bought for $5AUD of Tchaikovsky and which is my most listened artist is:

Streaming democratized access to centuries of musical heritage, making it as easy to explore a Bach cantata as it is to discover the latest pop hit.

The Electronic Undercurrent

Balancing the classical foundation is a strong electronic music presence. Vangelis, the legendary composer behind the "Blade Runner" soundtrack, claims the third position with approximately 60 hours of listening time. It's fair to say I became fixated and obsessed to a point with it for many years

Depeche Mode, pioneers of electronic music, rounds out the top five. This juxtaposition of baroque complexity and electronic innovation illustrates how streaming platforms enable listeners to transcend traditional genre boundaries.

The presence of Vangelis is particularly telling. His music represents the intersection of classical composition techniques with electronic innovation—a bridge between the historical and the futuristic. This suggests a listening preference for music that combines structural sophistication with sonic experimentation, regardless of the era in which it was created.

The Long Tail of Discovery

While the top artists dominate in terms of hours played, the true story lies in the breadth of exploration. 10,894 unique artists represents an almost incomprehensible level of musical diversity. To put this in context, if you listened to one new artist every day, it would take nearly 30 years to experience this level of variety.

This number reflects one of streaming's most profound impacts: the elimination of scarcity in music discovery. In the pre-streaming era, discovering new music required significant investment—both financial and temporal. You had to buy albums based on limited information, hope radio would play something interesting, or rely on word-of-mouth recommendations. Streaming transformed music discovery from a high-stakes investment into a low-risk exploration.

Building the Data Story: Technical Implementation

Transforming raw Spotify data into meaningful insights required building a sophisticated yet accessible visualization platform. The result is an interactive dashboard built with Streamlit, Pandas, and Plotly—a technology stack that exemplifies the democratization of data science tools.

The Architecture: Simplicity Meets Power

The foundation of the dashboard rests on a deceptively simple architecture that masks considerable complexity underneath. At its core, the system processes JSON files containing my Spotify's streaming history data, each representing a year's worth of listening activity from 2012 to 2023.

@st.cache_data
def load_data():
    json_dir = 'data/'
    dataframes = []

    for file in os.listdir(json_dir):
        if file.endswith('.json'):
            try:
                with open(os.path.join(json_dir, file), 'r', encoding='utf-8') as f:
                    data = json.load(f)
                    dataframes.append(pd.DataFrame(data))
            except Exception as e:
                st.warning(f"Error loading {file}: {str(e)}")

    df = pd.concat(dataframes, ignore_index=True)
    df['ts'] = pd.to_datetime(df['ts'])
    df['hours_played'] = df['ms_played'] / 3600000
    return df

This data loading function demonstrates several key principles of modern data engineering. The @st.cache_data decorator ensures that the computationally expensive process of loading and processing multiple JSON files only happens once per session, dramatically improving user experience. The error handling ensures that corrupted or missing files don't crash the entire application—a crucial consideration when dealing with data spanning over a decade.

Data Transformation: From Milliseconds to Insights

The raw Spotify data comes in a format optimized for Spotify's internal systems, not human comprehension. Each listening session is recorded with millisecond precision, artist and track metadata is scattered across multiple fields, and timestamps are in UTC format. The transformation process converts this machine-readable format into human-meaningful insights.

The conversion from milliseconds to hours (df['ms_played'] / 3600000) might seem trivial, but it represents a fundamental shift in how we conceptualize music consumption. Spotify thinks in milliseconds because their systems need to track exactly when songs start and stop for royalty calculations. Humans think in hours because that's how we conceptualize the investment of our time and attention.

Interactive Filtering: The Power of Real-Time Analysis

One of the dashboard's most powerful features is its real-time filtering capability. Users can select specific years or combinations of years to analyze, and the entire dashboard updates instantly. This interactivity transforms static data into a dynamic exploration tool.

years = sorted(df['ts'].dt.year.unique(), reverse=True)
year_filter = st.sidebar.multiselect(
    "Select Year(s)",
    years,
    default=years
)

df_filtered = df[df['ts'].dt.year.isin(year_filter)]

This filtering mechanism enables temporal analysis that would be impossible with static visualizations. Want to see how your taste evolved between 2015 and 2018? Simply adjust the year filter. Curious about the impact of the pandemic on listening habits? Compare 2019 with 2020-2021. The ability to slice and dice the data in real-time transforms passive consumption into active exploration.

Visualization Philosophy: Clarity Through Complexity

The dashboard employs Plotly Express for its visualizations, a choice that reflects a broader philosophy about data presentation. While Plotly is capable of creating incredibly complex, multi-dimensional visualizations, the dashboard prioritizes clarity and accessibility over technical sophistication.

fig = px.bar(
    top_artists,
    x='hours_played',
    y='master_metadata_album_artist_name',
    orientation='h',
    title=f"Top {len(top_artists)} Artists by Total Hours Played",
    labels={
        'hours_played': 'Hours Played',
        'rank': 'Rank'
    },
    hover_data={'rank': True, 'hours_played': ':.1f'},
    height=max(600, 30 * len(top_artists)),
    color='hours_played',
    color_continuous_scale='viridis'
)

This code creates a horizontal bar chart that serves as the dashboard's centerpiece. The choice of horizontal orientation accommodates artist names of varying lengths without truncation. The dynamic height calculation ensures that the chart remains readable regardless of how many artists are displayed. The 'viridis' color scale provides visual hierarchy while remaining accessible to colorblind users.

Performance Optimization: Handling Decade-Scale Data

Processing eleven years of streaming data presents significant performance challenges. With 140,473 individual plays across 10,894 artists, naive implementations would quickly become unusable. The dashboard employs several optimization strategies to maintain responsiveness.

The caching strategy extends beyond just data loading. Expensive operations like artist ranking and time-based aggregations are cached at multiple levels, ensuring that user interactions feel instantaneous even when processing massive datasets. The slider for controlling the number of displayed artists (ranging from 5 to 500) allows users to balance detail with performance based on their specific needs.

Responsive Design: From Desktop to Mobile

Modern data visualization must work across devices, and the dashboard's responsive design ensures that insights remain accessible whether viewed on a desktop monitor or a smartphone screen. Streamlit's built-in responsive capabilities handle most layout adjustments automatically, but the dashboard includes specific optimizations for mobile viewing.

The sidebar filters collapse into a mobile-friendly format on smaller screens, and the visualizations automatically adjust their aspect ratios to maintain readability. This attention to responsive design reflects the reality that data exploration increasingly happens on mobile devices, especially for personal projects like music listening analysis.

Cultural Archaeology: What Streaming Data Reveals About Us

Analyzing eleven years of personal music data is like conducting an archaeological dig through your own cultural evolution. Each data point represents a moment in time—a mood, a discovery, a phase of life—and collectively, they form a narrative that extends far beyond individual taste preferences.

The Democratization of Classical Music

The prominence of classical composers in my listening data reflects one of streaming's most profound cultural impacts: the democratization of historically elite art forms. Before Spotify, building a comprehensive classical music collection required significant financial investment and cultural capital. You needed to know which recordings were considered definitive, which conductors were respected, which labels produced quality releases. I by chance bought this album which may sound extreme but it did change my musical world and it made me love Beethoven.

Streaming eliminated these barriers to entry. Suddenly, the complete works of Bach, Beethoven, and Tchaikovsky were available for the same monthly fee as any pop album. This accessibility has led to what musicologists are calling a "classical renaissance" among younger listeners who might never have encountered these works through traditional channels.

The data reveals something even more interesting: my classical music consumption wasn't front-loaded in the early years of streaming adoption. Instead, it grew steadily over time, I wasn't familiar with Bach's work other than the famous Organ works which I found extremely hard to digest. Streaming allowed me to discover his Choral work which I found so outstanding, revealing, deep and vast

.

This pattern challenges the common assumption that streaming promotes only immediate gratification and shallow engagement.

The Algorithm's Invisible Hand

While the dashboard shows what I listened to, it can't fully capture how I discovered these artists. However, patterns in the data suggest the profound influence of algorithmic recommendation systems. The presence of artists like Vangelis and Depeche Mode alongside classical composers isn't accidental—it reflects Spotify's sophisticated understanding of musical relationships that transcend traditional genre boundaries.

The long tail of 10,894 artists represents the algorithm's exploratory power but also the way I discover myself by myself considering that if I like a song I will shazam it and it turn that song will be automatically added to a playlist, but there's other ways which I cannot fully remember. Many of these artists were likely discovered through Spotify's "Discover Weekly" playlists, radio features, or artist-based recommendations. This algorithmic discovery has fundamentally changed how musical taste develops, shifting from a primarily social process (recommendations from friends, radio DJs, music critics) to a hybrid model that combines human curation with machine learning. There's also

Temporal Patterns: The Rhythm of Digital Life

The dashboard's listening patterns heatmap reveals fascinating insights about how digital life structures our relationship with music. The data shows distinct patterns across days of the week and hours of the day, creating a visual representation of modern work-life rhythms.

Peak listening times align with commuting hours, work periods, and evening relaxation—patterns that would be familiar to anyone living in the digital economy. But the data also reveals more subtle patterns: increased classical music consumption during work hours (suggesting music as a productivity tool), higher electronic music engagement during evening hours (indicating music as entertainment), and weekend listening patterns that differ significantly from weekday habits.

These temporal patterns represent a form of "digital archaeology" that future researchers will use to understand how people in the early 21st century structured their days, managed their attention, and used technology to enhance their emotional and cognitive states.

The Paradox of Choice and Curation

The presence of 10,894 artists in my listening history illustrates both the promise and the challenge of infinite choice. Streaming platforms offer access to virtually all recorded music in human history—an unprecedented level of choice that would have been unimaginable just two decades ago.

Even with infinite choice, human attention naturally gravitates toward familiar patterns

Yet the concentration of listening time among a relatively small number of top artists (the top 10 artists account for a disproportionate share of total listening time) suggests that even with infinite choice, human attention naturally gravitates toward familiar patterns. This reflects what psychologists call the "paradox of choice"—when presented with too many options, people often default to familiar selections rather than exploring new possibilities.

The dashboard data reveals how streaming services have solved this paradox through sophisticated curation and recommendation systems. The long tail of artists represents successful algorithmic exploration, while the concentrated listening time among top artists reflects the human need for musical comfort food—familiar sounds that provide emotional stability in an increasingly complex world.

Music as Memory: The Emotional Archaeology of Data

Each data point in the dashboard represents more than just a song played—it's a moment in time, a mood, a memory. The 6,488 hours of listening time contain within them the soundtrack to eleven years of life: celebrations and sorrows, discoveries and rediscoveries, moments of focus and periods of distraction.

This emotional dimension of music data is what makes personal streaming analytics so compelling. Unlike other forms of digital tracking, music listening data captures something essentially human—our need for beauty, meaning, and emotional connection. The prominence of classical music in my data isn't just about aesthetic preference; it reflects periods of seeking depth, complexity, and transcendence through art.

The electronic music presence tells a different story—one of seeking innovation, energy, and connection to contemporary culture. The diversity of the long tail represents curiosity, openness to new experiences, and the joy of discovery that streaming platforms have made possible.

The Social Dimension of Solitary Listening

While music listening through streaming platforms is often a solitary activity, the data reveals its deeply social nature. Many of the artists in my listening history were discovered through social media, other streaming services, friend recommendations, tv shows (Breaking Bad and Mad Men) or cultural conversations. The dashboard captures the end result of these social interactions—the actual listening—but can't fully represent the social networks that made discovery possible.

This hidden social dimension of streaming data represents one of the most significant changes in how music culture operates. Traditional music scenes were geographically bounded and socially visible—you could see who was at the concert, who bought the album, who wore the band's t-shirt. Streaming culture is globally distributed and largely invisible—you might share musical DNA with someone on another continent without ever knowing it.

The algorithms that power streaming recommendations are, in essence, massive social networks that connect listeners based on musical behavior rather than geographic proximity or social relationships. My classical music consumption connects me to a global community of listeners who share similar preferences, even though we may never interact directly.

Code Deep Dive: Building Your Own Music Analytics Dashboard

For developers and data enthusiasts interested in creating their own music analytics projects, the dashboard's implementation offers valuable lessons in data processing, visualization design, and user experience optimization. Let's walk through the key components that make this project work.

Data Architecture: Handling Spotify's Export Format

Spotify provides user data in JSON format through their privacy settings, but the raw export requires significant processing to become analytically useful. The data structure includes nested objects, inconsistent field naming, and temporal data that needs careful handling.

import streamlit as st
import pandas as pd
import plotly.express as px
import os
import json

@st.cache_data
def load_data():
    json_dir = 'data/'
    dataframes = []

    # Create data directory if doesn't exist
    if not os.path.exists(json_dir):
        os.makedirs(json_dir)
        st.warning(f"Created missing directory: {json_dir}")

    # Check if directory is empty
    if not os.listdir(json_dir):
        st.error("No JSON files found in {json_dir}")
        st.stop()

    for file in os.listdir(json_dir):
        if file.endswith('.json'):
            try:
                with open(os.path.join(json_dir, file), 'r', encoding='utf-8') as f:
                    data = json.load(f)
                    dataframes.append(pd.DataFrame(data))
            except Exception as e:
                st.warning(f"Error loading {file}: {str(e)}")

    if not dataframes:
        st.error("No valid data loaded")
        st.stop()

    df = pd.concat(dataframes, ignore_index=True)
    df['ts'] = pd.to_datetime(df['ts'])
    df['hours_played'] = df['ms_played'] / 3600000
    return df

This data loading function demonstrates several important principles for robust data processing applications. The error handling ensures that missing files or corrupted data don't crash the application—crucial when dealing with user-generated data exports that may be incomplete or malformed.

The caching decorator (@st.cache_data) is particularly important for this type of application. Loading and processing multiple years of JSON data can take several seconds, which would make the dashboard unusable if it happened on every user interaction. Streamlit's caching system ensures that expensive operations only run when the underlying data changes.

Interactive Filtering: Real-Time Data Exploration

The dashboard's filtering system allows users to explore their data across different time periods and artist counts. This interactivity transforms static analysis into dynamic exploration.

# Streamlit App
st.title("🎵 Spotify Streaming History Dashboard (2013-2023)")
st.sidebar.header("Filters")

# Filter by Year
years = sorted(df['ts'].dt.year.unique(), reverse=True)
year_filter = st.sidebar.multiselect(
    "Select Year(s)",
    years,
    default=years
)

# Add number of artists selector
num_artists = st.sidebar.slider(
    "Number of Artists to Display",
    min_value=5,
    max_value=500,
    value=25,
    step=5
)

# Apply filters
df_filtered = df[df['ts'].dt.year.isin(year_filter)]

The year filtering system uses Streamlit's multiselect widget, which provides an intuitive interface for temporal analysis. Users can easily compare different time periods or focus on specific years of interest. The default selection includes all years, ensuring that new users see the complete dataset immediately.

The artist count slider addresses a common challenge in data visualization: balancing detail with readability. Showing all 10,894 artists would create an unusable visualization (I tried), while showing only the top 5 might miss interesting patterns. The slider lets users find their preferred balance between overview and detail.

Advanced Data Processing: From Raw Streams to Insights

The transformation from raw streaming data to meaningful insights requires sophisticated data processing. The dashboard aggregates data at multiple levels and creates derived metrics that weren't present in the original dataset.

# Top Artists Analysis
st.subheader(f"Top Artists Analysis ({min(num_artists, len(df_filtered))} shown)")

# Clean and prepare data
df_filtered = df_filtered.dropna(subset=['master_metadata_album_artist_name'])
top_artists = (df_filtered
               .groupby("master_metadata_album_artist_name")['hours_played']
               .sum()
               .nlargest(num_artists)
               .reset_index()
               .sort_values('hours_played', ascending=False))

# Add rank column (1st, 2nd, 3rd...)
top_artists['rank'] = range(1, len(top_artists) + 1)

# Create interactive plot with ranking
fig = px.bar(
    top_artists,
    x='hours_played',
    y='master_metadata_album_artist_name',
    orientation='h',
    title=f"Top {len(top_artists)} Artists by Total Hours Played",
    labels={
        'hours_played': 'Hours Played',
        'rank': 'Rank'
    },
    hover_data={'rank': True, 'hours_played': ':.1f'},
    height=max(600, 30 * len(top_artists)),
    color='hours_played',
    color_continuous_scale='viridis'
)

This data processing pipeline demonstrates several important techniques for working with streaming data. The dropna() call removes entries where artist information is missing—common in podcast or audiobook entries that might be included in Spotify exports. The groupby() and sum() operations aggregate individual listening sessions into artist-level totals.

The ranking system adds context that helps users understand relative positions among their top artists. The dynamic height calculation ensures that the visualization remains readable regardless of how many artists are displayed—a crucial consideration for responsive design.

Visualization Design: Balancing Information and Aesthetics

The dashboard's visualizations prioritize clarity and accessibility while maintaining visual appeal. The choice of horizontal bar charts for artist rankings, for example, accommodates artist names of varying lengths without truncation.

# Format y-axis labels to show rankings
fig.update_yaxes(
    ticktext=[f"#{i} - {artist}" for i, artist in 
              zip(top_artists['rank'], top_artists['master_metadata_album_artist_name'])],
    tickvals=top_artists['master_metadata_album_artist_name'],
    title=None
)

# Improve tooltips
fig.update_traces(
    hovertemplate="<b>%{y}</b><br>Rank: #%{customdata[0]}<br>Hours Played: %{x:.1f}<extra></extra>"
)

# Enhanced layout
fig.update_layout(
    margin=dict(l=180, r=50, t=80, b=50),  # Increased left margin for longer artist names
    yaxis={'categoryorder': 'total ascending'},
    hovermode='y',
    plot_bgcolor='rgba(0,0,0,0)',
    xaxis_title="Hours Played"
)

st.plotly_chart(fig, use_container_width=True)

The tooltip customization provides additional context without cluttering the main visualization. Users can see exact rankings and precise hour counts by hovering over bars, while the main chart remains clean and readable.

The layout optimizations address practical concerns that often get overlooked in data visualization projects. The increased left margin accommodates long artist names, while the responsive width ensures the chart works well on different screen sizes.

Performance Optimization: Handling Large Datasets

With 140,473 individual plays across 11 years, performance optimization becomes crucial for maintaining a responsive user experience. The dashboard employs several strategies to ensure smooth operation even with large datasets.

# Add some metrics
col1, col2, col3 = st.columns(3)
with col1:
    st.metric("Total Artists", len(df_filtered['master_metadata_album_artist_name'].unique()))
with col2:
    st.metric("Total Plays", len(df_filtered))
with col3:
    st.metric("Total Hours", f"{df_filtered['hours_played'].sum():.1f}")

The metrics calculation demonstrates efficient pandas operations that provide immediate feedback to users about their filtered dataset. These calculations run quickly even on large datasets because they use pandas' optimized aggregation functions.

The caching strategy extends beyond just data loading. Complex calculations like artist rankings and temporal aggregations are cached at the function level, ensuring that repeated operations don't require recomputation.

Deployment Considerations: From Local to Production

The dashboard is designed to work both as a local development tool and as a deployed web application. The code includes several features that make deployment straightforward:

# Requirements.txt
streamlit
pandas
plotly

The minimal dependency list ensures that the application can be deployed on various platforms without complex environment management. Streamlit's built-in deployment capabilities make it possible to share the dashboard publicly with minimal configuration.

For developers interested in extending this project, the modular structure makes it easy to add new visualizations or data sources. The caching system ensures that additional features won't compromise performance, and the responsive design principles ensure that new components will work across devices.

Error Handling and User Experience

Robust error handling is crucial for applications that process user-generated data. The dashboard includes comprehensive error handling that provides helpful feedback without exposing technical details to end users.

try:
    with open(os.path.join(json_dir, file), 'r', encoding='utf-8') as f:
        data = json.load(f)
        dataframes.append(pd.DataFrame(data))
except Exception as e:
    st.warning(f"Error loading {file}: {str(e)}")

This approach ensures that corrupted or malformed files don't crash the entire application. Instead, users receive clear feedback about which files couldn't be processed, allowing them to fix data issues without losing their analysis session.

The user experience design prioritizes immediate feedback and intuitive navigation. Filter changes update visualizations instantly, metrics provide immediate context about the current dataset, and the responsive design ensures consistent functionality across devices.

The Future of Personal Data Analytics

This Spotify data analysis represents more than just a personal project—it's a glimpse into the future of how we'll understand ourselves through the digital traces we leave behind. As our lives become increasingly digitized, the ability to analyze and interpret our own behavioral data becomes a crucial form of digital literacy.

The Quantified Self Movement

The dashboard exemplifies the "quantified self" movement—the practice of using technology to track and analyze personal behavior patterns. While fitness trackers and sleep monitors focus on physical health, music streaming data provides insights into emotional and cultural health. The 6,488 hours of listening data represent a form of emotional archaeology, revealing patterns of mood, productivity, and personal growth that might otherwise remain invisible.

This type of personal analytics has profound implications for self-understanding. Traditional introspection relies on memory and subjective perception, both of which are notoriously unreliable. Data-driven self-analysis provides an objective counterpoint to subjective experience, revealing patterns that might surprise even the most self-aware individuals.

The prominence of classical music in my listening data, for instance, wasn't something I was consciously aware of until the data revealed it. This discovery led to deeper reflection about what draws me to complex, historically significant music and how that preference relates to other aspects of my personality and professional life.

Privacy and Ownership in the Data Age

The ability to analyze personal streaming data raises important questions about data ownership and privacy. While Spotify provides users with access to their listening history, the company retains far more detailed information about listening patterns, including real-time behavioral data that could reveal intimate details about users' lives.

The dashboard project demonstrates the value of personal data ownership. By downloading and analyzing my own data, I gained insights that Spotify's own analytics tools don't provide. This suggests a future where personal data analytics becomes a form of digital empowerment—a way for individuals to reclaim agency over their own information.

However, this empowerment requires technical skills that aren't universally accessible. The code required to build this dashboard, while not exceptionally complex, assumes familiarity with programming concepts and data analysis techniques. As personal data analytics becomes more important, there's a growing need for tools that make this type of analysis accessible to non-technical users.

Cultural Implications of Algorithmic Curation

This algorithmic influence raises fascinating questions about cultural evolution. Are streaming algorithms simply reflecting existing musical relationships, or are they actively creating new ones? The answer is likely both. Algorithms identify patterns in existing music that humans might miss, but they also create new listening experiences that wouldn't occur through traditional discovery methods.

The long tail of 10,894 artists in my listening history represents algorithmic exploration at scale. Many of these discoveries would have been impossible in the pre-streaming era, when music discovery was limited by physical distribution, radio programming, and human social networks. Algorithms have democratized music discovery, making it possible for listeners to explore musical traditions and contemporary scenes from around the world.

The Economics of Attention in the Streaming Era

The concentration of listening time among a relatively small number of top artists, despite having access to nearly 11,000 artists, illustrates fundamental principles about human attention and choice. Even with infinite options, attention naturally gravitates toward familiar patterns—a phenomenon that has profound implications for artists, labels, and the music industry as a whole.

This pattern suggests that streaming's "long tail" effect, while real, operates differently than initially predicted. Rather than democratizing attention equally across all available music, streaming creates a more complex ecosystem where algorithmic curation helps surface diverse content, but human psychology still favors repeated engagement with familiar artists.

For artists, this means that breaking into listeners' top rotation requires not just initial discovery, but sustained engagement over time. The data shows that becoming a "top artist" in someone's listening history is about building a deep, ongoing relationship rather than achieving viral moments.

Lessons for Data-Driven Decision Making

The dashboard project offers several lessons for anyone interested in data-driven decision making, whether in personal or professional contexts. First, the importance of longitudinal data—insights emerge from patterns over time rather than snapshots of current behavior. Second, the value of interactive exploration—static reports can't capture the full richness of complex datasets.

Perhaps most importantly, the project demonstrates that meaningful insights often emerge from unexpected places. The classical music dominance in my listening data wasn't something I was looking for, but it became one of the most interesting discoveries. This suggests that effective data analysis requires both focused questions and open-ended exploration.

Building Your Own Music Analytics Project

For readers interested in creating their own music analytics projects, the technical implementation provides a roadmap that can be adapted to different platforms and data sources. While this project focuses on Spotify data, similar approaches could work with Apple Music, YouTube Music, or even local music library data.

The key principles—robust data loading, interactive filtering, clear visualization design, and responsive user experience—apply regardless of the specific technology stack. The choice of Streamlit and Plotly reflects a preference for rapid prototyping and ease of deployment, but the same insights could be achieved with other tools.

More importantly, the project demonstrates that meaningful personal analytics doesn't require enterprise-level tools or massive datasets. With basic programming skills and freely available tools, anyone can gain insights into their own digital behavior patterns.

Conclusion: The Soundtrack to a Digital Life

Eleven years of Spotify data tells a story that extends far beyond individual music preferences. It's a chronicle of how streaming technology has transformed cultural consumption, how algorithms shape discovery, and how personal taste evolves in the digital age.

The 6,488 hours of listening time represent more than entertainment—they're a form of digital autobiography written in data. Each play represents a moment in time, a mood, a discovery. Collectively, they form a narrative about how we use technology to enhance our emotional and intellectual lives.

The dashboard project demonstrates the power of personal data analytics to reveal patterns that might otherwise remain invisible. The prominence of classical music, the diversity of exploration, the temporal patterns of listening—these insights emerged from data analysis rather than introspection.

But perhaps the most important lesson is about the democratization of both music and data analysis. Streaming platforms have made the world's musical heritage accessible to anyone with an internet connection. Similarly, modern data analysis tools have made sophisticated analytics accessible to anyone willing to learn basic programming concepts.

As we generate ever more digital traces of our lives, the ability to analyze and interpret our own data becomes a crucial form of digital literacy. This Spotify analysis is just one example of how we can use technology not just to consume culture, but to understand ourselves more deeply.

The future belongs to those who can navigate both the infinite choices that technology provides and the analytical tools needed to make sense of those choices. In a world of algorithmic curation and endless options, the ability to understand our own patterns becomes a form of self-knowledge that's both deeply personal and culturally significant.

Whether you're a data enthusiast, a music lover, or simply someone curious about the digital traces of your own life, the tools and techniques demonstrated in this project offer a starting point for deeper exploration. The code is available, the methods are documented, and the insights are waiting to be discovered.

Your streaming data is more than just a list of songs—it's the soundtrack to your digital life, waiting to tell its story.


The complete code for this Spotify analytics dashboard is available on GitHub at https://github.com/soyroberto/streamlit. The dashboard is deployed and accessible at soyroberto.streamlit.app for interactive exploration.

For more data-driven insights and technology analysis, visit allthingscloud.net or connect with me on LinkedIn.

0
Subscribe to my newsletter

Read articles from Roberto directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Roberto
Roberto

I'm technology-geek person, in love with almost all things tech from my daily job in the Cloud to my Master's in Cybersecurity and the journey all along.