{
  "data_quality": {
    "transaction_rows": 2413,
    "unsold_plot_slots_excluded": 4497,
    "dates_nulled_out_of_range": 10,
    "date_bounds_applied": [
      2015,
      2027
    ]
  },
  "dropped_fields": [
    "ACCOUNT NUMBER",
    "AFFLIATE(SALES)",
    "ALLOCATED PLOT",
    "ALLOCATED PLOT(S)",
    "BANK NAME",
    "CARD NO",
    "CLIENT",
    "CLIENT ADDRESS",
    "CLIENT EMAIL",
    "CLIENT NAME",
    "CLIENT PHONE",
    "COMMENT",
    "CON",
    "COS",
    "EARNER ( DIRECT) AND INDIRECT)",
    "PAYMENT MADE BY",
    "REASON",
    "REASON STATUS",
    "REASONS",
    "REFERRED BY",
    "REFERRED EMAIL",
    "REFERRED PHONE NO.",
    "REMARKS/STATUS",
    "S/N",
    "TITLE"
  ],
  "dropped_workbooks": [
    "ESTATE REPORT.xlsx (aggregate)",
    "commission schedule (agent bank details)"
  ],
  "pseudonymisation": "record_id = SHA-256(random per-run salt | estate | row number), truncated to 10 hex. The salt is never written to disk, so the mapping back to a client cannot be reconstructed from these files.",
  "public_sample_generalisation": {
    "dates": "reduced to year-month",
    "money": "record totals rounded to nearest NGN 50,000; instalments to NGN 10,000",
    "rows": "random subset of 150 records, not the full set"
  },
  "k_anonymity": {
    "quasi_identifiers": [
      "estate",
      "plot_type",
      "size_sqm",
      "payment_method"
    ],
    "classes": 183,
    "singleton_classes": 41,
    "class_size_distribution": {
      "1": 41,
      "2": 22,
      "3": 16,
      "4": 10,
      "5": 9,
      "6": 10,
      "7": 7,
      "8": 4,
      "9": 2,
      "10": 5,
      "11": 3,
      "12": 1
    }
  },
  "residual_risk": "No direct identifier is present in any output. Re-identification would require an external copy of the operator's own client register."
}