Analytics Data Anonymization Workflow
Strip and generalize identifiers before analytics ingestion, validate anonymity with re-identification tests, and document the transformation lineage.
Objective
Produce analytics datasets that cannot be traced back to individuals, verified by adversarial re-identification attempts rather than by good intentions.
Environment
- Raw production data requiring analytics use
- A transformation stage before the analytics store
- A re-identification test methodology (k-anonymity or attack simulation)
Steps
1. Classify fields by identifiability
Label every field direct identifier, quasi-identifier, or sensitive attribute, since each class needs different treatment.
Expected state: A classification table covers every field entering analytics.
2. Transform by class
Drop or token-map direct identifiers, generalize quasi-identifiers (age bands, region coarsening), and bound sensitive attributes by aggregation where possible.
Expected state: The analytics store contains no direct identifiers and coarsened quasi-identifiers.
3. Run re-identification attacks on the output
Attempt known attacks: uniqueness of quasi-identifier combinations, linkage against public datasets, and sequence uniqueness in event streams.
Expected state: An attack report shows the minimum combination size needed for uniqueness, above the accepted threshold.
4. Validate on every schema change
Re-run the anonymity tests whenever fields are added or generalization changes, treating them as data-quality gates.
Expected state: Anonymity tests are part of the pipeline CI, failing on regression.
5. Document lineage and deletions
Record what transformation each field underwent and honor deletion requests by token mapping that allows key deletion without reidentification.
Expected state: The lineage doc answers any auditor question about how raw became anonymous.
Expected outcome
Analytics datasets with provable resistance to re-identification, tested continuously, with lineage that satisfies audits and deletion obligations.
Verification
The attack report shows uniqueness thresholds above policy; injecting a high-granularity field into the pipeline fails the anonymity gate in CI.
Anonymous means tested, not intended
Removing names is not anonymization: age plus postcode plus diagnosis uniquely identifies people in famous real cases. Classifying fields, generalizing quasi-identifiers, and running actual re-identification attacks is what earns the word anonymous.
field classification -> transform:
user_email direct -> drop (token retained, keyed)
user_id direct -> salted token (deletable)
age quasi -> 5-year bands
postal_code quasi -> first 2 chars
diagnosis sensitive -> keep (analysis needs it)
event sequence quasi -> session-truncated, coarsened ts
attack report (quarterly):
unique combos: min 3 quasi-ids needed (k=27)
linkage vs public voter file: 0 matches at current grain
sequence uniqueness: 0.3% rows unique -> coarsen ts +1
Quasi-identifiers are the leak
The dangerous fields are not names but the innocent-looking ones: birthdate, region, device model. Individually harmless, combined unique. Generalization has to target the combinations, which is what the uniqueness test measures directly.
Deletion needs the token bridge
Right-to-be-forgotten conflicts with truly anonymous data only if the mapping is destroyed. Keeping a keyed, access-controlled token map lets deletion requests remove a person’s rows from analytics without anyone being able to reverse the token.