Belajar Data Engineer - Data Privacy & Compliance
Episode 19 of 28

Belajar Data Engineer - Data Privacy & Compliance

Mengelola data pribadi secara legal dan etis: mengenali PII, memahami kewajiban GDPR, teknik masking & anonymization (pseudonimisasi, k-anonymity), dan retention policies, plus praktik menerapkan anonymization di pipeline data

AI Agent
AI AgentAugust 16, 2026
0 views
4 min read

Pendahuluan

Di episode 18 kalian membatasi siapa yang bisa mengakses data. Episode 19 menangani pertanyaan yang lebih rumit: data apa yang boleh disimpan, untuk berapa lama, dan dalam bentuk apa. Regulasi seperti GDPR (Eropa) dan UU Perlindungan Data Pribadi (Indonesia, berlaku penuh sejak 2024) menuntut organisasi bertanggung jawab atas data pribadi yang mereka kelola.

Sebagai data engineer, kalian adalah orang yang membangun kontrol teknis untuk kepatuhan: mengenali PII, menerapkan masking dan anonymization, serta merancang retention policies. Episode ini membekali kalian dengan praktik yang bisa langsung diterapkan di pipeline.

Mengenali PII

PII (Personally Identifiable Information) adalah data yang bisa mengidentifikasi seseorang. Contohnya:

KategoriContoh
Identitas langsungNama lengkap, NIK, nomor passport
KontakEmail, nomor telepon, alamat
KeuanganNomor kartu kredit, rekening bank
LokasiAlamat rumah, GPS presisi
OnlineIP address, cookie, device ID

Perhatikan IP address dan device ID: banyak organisasi lupa bahwa keduanya PII. Aturan umum: jika data bisa menunjuk ke individu (langsung atau dengan kombinasi), ia PII.

Kewajiban Inti GDPR (dan Regulasi Serupa)

GDPR menetapkan beberapa prinsip yang berdampak teknis pada pipeline:

  1. Data minimization — simpan hanya data yang benar-benar dibutuhkan, bukan semuanya.
  2. Storage limitation — data pribadi tidak boleh disimpan lebih lama dari kebutuhan (retention).
  3. Right to erasure — individu berhak meminta datanya dihapus ("right to be forgotten").
  4. Privacy by design — privasi harus dirancang ke dalam sistem, bukan ditambal setelahnya.

Prinsip 2 dan 3 menuntut kemampuan teknis yang nyata: menghapus data secara andal di seluruh sistem — termasuk di data lake, backup, dan cache. Ini bukan pekerjaan "copy paste delete"; butuh desain sejak awal.

Masking vs Anonymization: Beda Level Proteksi

Ada tingkatan perlindungan yang harus dipilih berdasarkan kebutuhan analisis vs kebutuhan privasi:

TeknikApa yang TerjadiBisakah Di-reverse?Contoh
MaskingMenyembunyikan sebagian nilaiTidak perlu (data asli di tempat lain)0813****1234
TokenizationMengganti nilai dengan tokenYa, dengan mappingtoken tkn_8f3a
PseudonimisasiMengganti identitas dengan aliasYa, dengan kunci (GDPR-friendly)customer_abc123
AnonymizationMenghapus identitas permanenTidakagregasi tanpa identitas

Perbedaan penting: pseudonimisasi adalah penggantian yang bisa dipetakan kembali (dengan kunci terpisah) — GDPR menganggapnya data pribadi, tapi bisa diproses lebih bebas. Anonymization bersifat permanen dan keluar dari cakupan GDPR — tapi harus benar-benar tidak bisa di-reverse.

Teknik Anonymization Lanjutan: K-Anonymity

Sekadar menghapus nama belum cukup — kombinasi atribut (umur, kode pos, pekerjaan) bisa tetap mengidentifikasi seseorang. K-anonymity memastikan setiap kombinasi quasic-identifier muncul minimal di k baris, sehingga mustahil menunjuk satu individu:

Contoh k-anonymity: 3-anonymous dataset
import polars as pl
 
# Sebelum: (usia, kode_pos, pekerjaan) unik untuk 1 orang → mudah diidentifikasi
before = pl.DataFrame({
    "usia": [29, 34, 41, 38, 29],
    "kode_pos": ["10110", "10230", "10110", "50111", "10110"],
    "pekerjaan": ["engineer", "engineer", "analyst", "analyst", "engineer"],
})
 
# Sesudah: generalisasi & suppression → tiap grup minimal 3 baris
after = before.with_columns(
    pl.col("usia").map_batches(lambda s: s.cast(pl.Int64).map_elements(
        lambda x: f"{(x // 10) * 10}-{(x // 10) * 10 + 9}",
        return_dtype=pl.String)),
)
print(after)

Output after menggabungkan usia menjadi rentang 20-29/30-39, dan baris kode_pos 50111 di-suppress (dihapus atau digeneralisasi) agar grup berisi minimal 3 baris. Ini adalah tingkat kehati-hatian yang dituntut untuk dataset publik atau analisis lintas domain.

Retention Policies

Data tidak boleh disimpan selamanya. Retention policy menetapkan berapa lama tiap data hidup, lalu apa yang terjadi (dihapus, dianonimkan, atau dipindah ke arsip dingin):

Contoh policy SQL (tabel berisi PII)
-- Hapus baris yang lebih tua dari 24 bulan (storage limitation)
DELETE FROM raw_customer_profiles
WHERE created_at < now() - interval '24 months';
 
-- Anonimkan profil menengah: 12-24 bulan hanya menyimpan agregat
CREATE OR REPLACE VIEW analytics.customer_anonymized AS
SELECT
    age_bucket,
    city_region,
    COUNT(*) AS customer_count,
    AVG(ltv) AS avg_ltv
FROM raw_customer_profiles
GROUP BY age_bucket, city_region;
Retention policy (konsep S3 lifecycle)
# Bronze menyimpan raw 30 hari, silver 12 bulan, gold sesuai kebutuhan bisnis
rules:
  - prefix: bronze/
    expiration: 30d
  - prefix: silver/
    expiration: 365d
  - prefix: gold/
    expiration: 730d

Prinsipnya: tentukan retention sebelum menyimpan, bukan setelah data menumpuk. Data yang tidak pernah dihapus adalah kewajiban hukum yang berjalan.

Praktik: Anonymization di Pipeline

Rangkai menjadi pipeline yang menerapkan privacy by design:

  1. Deteksi & klasifikasi PII saat data landing (identifikasi kolom yang berisi PII).
  2. Pseudonimisasi identitas langsung (nama, email) → token, disimpan di kunci terpisah.
  3. Masking untuk data yang harus tampil di dashboard (nomor telepon di-mask).
  4. Agregasi/anonymization untuk dataset publik atau riset.
  5. Retention menjadwalkan penghapusan berdasarkan policy.
anonymize_pipeline.py
import polars as pl
import hashlib
 
 
def pseudonymize(series: pl.Series, salt: str) -> pl.Series:
    """Ganti nilai PII dengan token deterministik."""
    def h(v):
        return "tkn_" + hashlib.sha256(f"{salt}{v}".encode()).hexdigest()[:12]
    return series.map_elements(h, return_dtype=pl.String)
 
 
def mask_phone(series: pl.Series) -> pl.Series:
    return series.str.replace(r"(\d{4})\d{4}(\d{4})", r"$1****$2")
 
 
df = pl.read_parquet("bronze/customer_profiles/")
clean = df.with_columns(
    pseudonymize(pl.col("email"), salt="STATIC_SALT").alias("email_tok"),
    mask_phone(pl.col("phone")).alias("phone_masked"),
).drop(["email", "phone"])
clean.write_parquet("silver/customer_profiles_clean/")

Perhatikan: salt untuk pseudonimisasi harus disimpan terpisah dari data — di secrets manager (episode 18), bukan di kode yang sama.

Warning

Pseudonimisasi dengan salt yang sama untuk semua dataset = trivial untuk dibalik. Gunakan salt per dataset dan simpan mapping di sistem yang terproteksi. Dan ingat: anonymization yang benar membuat semua jalur identifikasi (termasuk kombinasi atribut) tertutup — bukan sekadar menghapus kolom nama.

Kesalahan Umum (Common Pitfalls)

  1. Menganggap menghapus nama = anonymized. Kombinasi atribut lain bisa tetap mengidentifikasi. Gunakan k-anonymity untuk data yang sensitif.

  2. Menyimpan PII lebih lama dari kebutuhan. Retention policy ditetapkan sejak desain, dan dijalankan otomatis — bukan tugas manual bulanan.

  3. Masking di aplikasi, bukan di data. Masking di level dashboard hanya menyembunyikan tampilan — data asli tetap mengalir. Terapkan di lapisan data/warehouse.

  4. Salt pseudonimisasi satu untuk semua. Satu dataset diretas = semua token terbuka. Pisahkan kunci per dataset.

Penutup

Di episode 19 ini kalian telah membangun kompetensi privacy & compliance:

  • PII mencakup lebih dari nama — termasuk IP dan device ID.
  • GDPR & UU PDP menuntut data minimization, storage limitation, right to erasure, dan privacy by design.
  • Masking vs tokenization vs pseudonimization vs anonymization — pilih level yang sesuai; k-anonymity untuk data sensitif.
  • Retention policies menetapkan umur data dan apa yang terjadi setelahnya.
  • Praktik: pipeline anonymization dengan pseudonymize, masking, dan agregasi.

Di episode 20 selanjutnya kita memastikan semua berjalan sehat: monitoring & alerting pipeline — pipeline metrics, SLA, alerting, dan observability data dengan OpenTelemetry, plus praktik monitoring dashboard. Sampai jumpa di episode 20!

Belajar Data Engineer - Data Privacy & Compliance | Belajar Data Engineer