Project Lighthouse Part 3 - project-lighthouse-anonymize
6 min read
Project Lighthouse — Part 3: Introducing project-lighthouse-anonymize
Author: Adam Bloomston (Airbnb) | Source: medium.com/airbnb-engineering | Published: 2026-08-26
한 줄 요약
Airbnb가 플랫폼 차별을 측정하기 위해 쓰는 k-익명화 파이프라인을 오픈소스로 공개하고, 확장 가능한 알고리즘(Core Mondrian)과 “익명화된 데이터가 분석에 충분히 좋은가”를 판정하는 데이터 품질 프레임워크 두 편의 논문을 함께 냈다.
핵심 주장/내용
문제 설정: 2020년 시작한 Project Lighthouse는 시민권·프라이버시 단체와 협력해 개발했고 사용자 경험의 잠재적 격차를 측정한다. 이 작업은 개별 계정에 절대 연결되지 않는 perceived race 데이터를 쓰고, 격차 측정 용도로만 사용하며, 원하는 사용자는 계정 Privacy 페이지의 데이터 사용 설정을 꺼서 opt-out할 수 있다
세 편의 논문이 완결된 이야기를 이룬다 — 기초 방법론(2020) / 확장 가능한 구현(2025) / 품질 검증 프레임워크(2025)
기초 방법론 (2020): Project Lighthouse의 privacy-by-design 접근을 확립하고, 대규모에서 민감 속성 노출(sensitive attribute disclosure)을 막는 기술적 프라이버시 모델로 k-anonymity를 고른 근거를 제시했다. 앞선 두 블로그 포스트가 p-sensitive k-anonymity와 익명화된 데이터로 측정하기를 다룬다
Core Mondrian — 확장 가능한 파티션 기반 익명화 (2025): 오픈소스 라이브러리 심장부의 k-anonymity 알고리즘. 고전 Mondrian 알고리즘을 다음으로 확장한다
확장 가능한 아키텍처 — Strategy Pattern으로 k-anonymity와 향후 프라이버시 모델 확장을 지원
병렬 처리 — hybrid recursive-queue 실행 모델. 작은 파티션은 즉시 재귀 처리하고, 큰 파티션은 큐 기반 병렬 처리로 결합
기타 개선 — NaN-pattern pre-partitioning(결측값 수용), 동적 suppression budget 관리
이 알고리즘이 대규모 데이터셋의 확장 가능한 익명화를 가능하게 하면서 기저 데이터를 통계 분석에 계속 쓸 수 있게 한다
Measuring Data Quality for Project Lighthouse (2025) — 결정적 질문을 다룬다: 익명화된 데이터가 분석에 “충분히 좋은지” 어떻게 아는가?
세 가지 주요 지표:
Pearson correlation — 원본과 익명화 값 사이의 선형 관계 보존
RILM (Revised Information Loss Metric) — 데이터의 “shape”/기하학적 크기가 얼마나 보존되는지. 점수가 높을수록 왜곡이 적다
NMIv1 (Normalized Mutual Information v1) — 엔트로피 보존, 본질적으로 정보 내용이 얼마나 유지되는지
경험적 검증 방법론 — 데이터 품질 평가를 머신러닝 분류 문제로 재프레이밍하고, 합성 데이터셋으로 지표와 임계값이 익명화 데이터가 통계적으로 유효한 결과를 낼 때를 성공적으로 예측하는지 검증
기본 임계값 — Project Lighthouse가 쓰는 구체적 임계값을 논문과 라이브러리에 포함. 유사 시스템을 구현하는 다른 곳의 출발점으로 유용할 수 있다
이 프레임워크가 깊은 익명화 전문성이 없는 분석가도 자기 익명화 데이터가 유효한 통계적 결론을 뒷받침하는지 자신 있게 평가할 수 있게 한다
두 프라이버시 모델을 순차 적용하는 API:
p, k = 2, 5# 첫 번째 기술적 프라이버시 모델: k-anonymityanon_df, dq_metrics, disclosure_metrics = k_anonymize(logger, input_df, qids, k, {}, "row_id")# 두 번째: perturbation을 통한 p-sensitive k-anonymitysensitized_df, _, _ = p_sensitize(logger, anon_df, qids, "race", p, k, sens_attr_value_to_prob)# 품질 게이트minimum_dq_met, reasons = check_dq_meets_minimum_thresholds(dq_metrics)assert minimum_dq_met, str(reasons)
→ 익명화 결과가 품질 임계를 통과하지 못하면 분석 자체를 진행하지 않는 assert가 파이프라인에 박혀 있다