Context
The dataset was a stack of employee messages with no labels attached. The ask was to turn that into something a manager could act on: who is disengaging, who might be about to leave, and which way the mood is trending. Everything downstream depends on getting the first labeling step honest.
Problem
Working without ground-truth labels is the whole difficulty. You have to assign sentiment yourself and then build scores, rankings, and a risk flag on top of labels you generated, which means a sloppy first step quietly corrupts every number after it. The flight-risk call especially has a cost on both sides: miss someone and you lose them, flag the wrong person and you damage trust.
Approach
The pipeline runs in six stages:
- label each message positive, negative, or neutral,
- explore and visualize the structure and trends,
- compute a monthly sentiment score per employee,
- rank employees by that score,
- flag flight risk for four or more negative messages in a 30 day window,
- fit a linear regression to read the sentiment trend over time.
Each stage is its own step so the labeling can be checked before the scores lean on it.
Outcome
The project turns raw messages into a monthly view of engagement with a concrete risk flag, which is the form a manager can actually use. The honest caveat is that the labels are model-assigned, so the scores are only as trustworthy as that first step, and the writeup says so rather than hiding it.
Next Iteration
- Validate the auto-labels against a small hand-labeled sample to put error bars on the scores.
- Replace the fixed risk threshold with one tuned against real outcomes.