Call Centre Analytics Dashboard
Power BI Development | Python Sentiment Analysis | Customer Service Operations
01The challenge
A multi-channel call centre operation (spanning Call-Center, Chatbot, Email, and Web) had no way to see customer sentiment at scale across its interaction data. Management could track call volume and response times, but had no visibility into how customers actually felt about those interactions, or whether certain reasons, channels, or cities were driving disproportionately negative experiences. Nearly 33,000 call records existed as raw static data with no sentiment layer, no SLA breakdown logic, and no consolidated reporting view.
02The data problem
The source data came as static Excel exports covering call metadata, timestamps, channel, city, reason, response time, and call duration, but with no sentiment or customer experience signal attached anywhere. Response time was logged as a raw duration with no SLA classification built in. Before any meaningful reporting could happen, the dataset needed both a sentiment layer added from scratch and consistent SLA categorization built on top of the raw timing data.
03My approach
Since the raw call data had no sentiment field, I built a Python script using a natural language processing library (VADER/TextBlob-style sentiment scoring) to analyze the customer interaction text and classify each record into a five-point sentiment scale, from Very Negative to Very Positive. This turned a purely operational dataset into one that could actually answer "how are customers feeling," not just "how many calls came in."
Once the sentiment scores were generated, I brought the enriched dataset into Power BI and used Power Query to build out the SLA classification logic (Within SLA, Above SLA, Below SLA) based on each record's response time against defined thresholds, since the raw data only had a duration figure with no pass/fail categorization. I also cleaned and standardized the channel, city, and reason fields to support consistent grouping and filtering across nearly 33,000 rows.
I structured the report around two views: a Home page giving a fast operational read, total calls, average call duration, and response time percentage, alongside visual breakdowns by day, state (using a geographic bubble map), reason, channel, sentiment, and call centre city, and a Grid page giving support teams a fully filterable, record-level table for case-by-case lookups, filterable by date range, channel, and city.
04The result
The finished dashboard gave leadership a sentiment-aware view of call centre performance for the first time. It revealed that negative and very negative sentiment together outweighed positive and very positive combined (roughly 19.9K vs. 7.1K calls), a clear signal of a broader customer experience issue rather than isolated incidents. It also showed billing questions driving the overwhelming majority of contact volume (23.46K of roughly 32.9K total calls), giving the business a specific, high-leverage area to target for process improvement or self-service deflection.
Tools & tech stack
- Python (NLP/Sentiment Analysis): used to generate sentiment classification (Negative to Positive scale) from raw call interaction data, since no sentiment signal existed in the source
- Power Query (M): used to clean, standardize, and build SLA classification logic (Within/Above/Below SLA) from raw response time data
- Power BI Desktop & DAX: used to build the reporting layer, KPI cards, and cross-filterable visuals across day, state, channel, reason, and sentiment
- Geospatial Visualization: bubble map for call volume by state
- Data Structure: single consolidated call record table (~33K rows) enriched with a Python-generated sentiment dimension
Have data that isn't telling you anything yet?
Send me what you are working with — even if it is four spreadsheets and a CRM export that don't agree with each other.