Agregat Poligon Untuk Memenuhi Persyaratan Privasi

10

Saya memiliki kelas fitur titik yang mewakili lokasi kantor semua pengusaha di industri tertentu. Kelas fitur memiliki atribut untuk menyimpan jumlah karyawan yang bekerja di setiap kantor. Seseorang telah meminta untuk menggunakan data ini, bergabung secara spasial ke unit geografis sekecil mungkin - Blok Sensus, dalam hal ini. Namun, perjanjian privasi mencegah rilis data apa adanya. Sebaliknya, harus ditekan untuk memenuhi dua kriteria:

  1. Setiap poligon harus mengandung setidaknya 3 perusahaan (poin);
  2. Tidak lebih dari 80% dari total pekerjaan dalam satu poligon mungkin oleh satu perusahaan.

Saya telah berhasil menulis skrip yang secara spasial menggabungkan poin ke Blok Sensus, menjaga jumlah dan pekerjaan maksimum di masing-masing. Masing-masing yang tidak memenuhi kriteria penindasan ditandai. (Poligon yang tidak mengandung titik tidak ditandai, karena tidak ada data untuk ditekan.) Saya kemudian memeriksa setiap Grup Blok untuk melihat apakah ada Blok yang ditandai ada di dalamnya. Grup Blok yang hanya berisi Blok yang tidak ditandai kemudian diganti dengan Blok. Kelas fitur yang dihasilkan kemudian diperiksa terhadap kriteria penindasan, untuk memeriksa apakah Grup Blok telah cukup menekan data.

Proses yang sama diulang untuk Tracts, meninggalkan saya dengan dataset yang terdiri dari Tracts (beberapa ditandai dan beberapa tidak), Grup Blok dan Blok (semua tidak ditandai). Namun perkembangan selanjutnya dalam hierarki geografis adalah county, yang tidak berguna bagi orang yang meminta data ini.

Pertanyaan saya, kemudian, apakah ini: Adakah metode agregasi poligon yang dapat diterima secara umum ke dalam kelompok sebanyak mungkin, sehingga semuanya memenuhi beberapa kriteria minimum?

Berikut adalah beberapa aturan yang ingin saya terapkan pada agregasi:

  • Kapan saja memungkinkan, Traktat yang ditandai hanya boleh digabungkan dengan Traktat yang ditandai lainnya;
  • Untuk Traktat yang ditandai yang tidak berdekatan dengan yang lain (atau pengelompokan terisolasi yang masih belum memenuhi kriteria), Traktat tersebut dapat digabungkan dengan Traktat yang sudah memenuhi kriteria, meskipun mungkin ada Traktat dengan tidak ada majikan di antara mereka yang juga akan perlu dimasukkan.
  • Saya ingin menjaga batas-batas county tetap utuh kecuali benar-benar mustahil (dan saya mengantisipasi melakukan ini dengan memisahkan fitur input ke negara masing-masing sebelum memprosesnya).
  • Solusinya harus dalam Python, dengan menggunakan alat ArcGIS atau perpustakaan Python open-source.

Idealnya, seseorang dapat mengarahkan saya ke sarana yang ada untuk mengimplementasikan agregasi ini. Jika tidak, saya senang untuk mengkodekan algoritma sendiri, meskipun daftar langkah / alat khusus akan sangat dihargai. Masalahnya menurut saya sebagai kasus khusus redistricting (dengan poligon dis-berdekatan), dan untuk tujuan ini saya telah melihat ke dalam menggunakan algoritma regionalisasi PySAL , meskipun tidak jelas bagi saya bagaimana memeriksa persentase maksimum majikan dari total karyawan yang menggunakan ini .

orang bodoh
sumber

Jawaban:

5

Bagi siapa pun yang penasaran, saya datang dengan solusi sendiri, menggunakan algoritma PySAL di region.Maxp . Pada dasarnya, Max-p memungkinkan saya untuk menghasilkan seperangkat wilayah yang memenuhi kriteria pertama saya (jumlah minimum pengusaha per wilayah), dan saya menempatkannya di dalam loop sementara, yang akan menolak solusi Max-p yang tidak juga memenuhi kriteria kedua (persentase pekerjaan yang disumbangkan oleh pemberi kerja terbesar di suatu wilayah). Saya sudah mengimplementasikannya sebagai alat ArcGIS.

Saya memutuskan untuk membatalkan pekerjaan yang telah saya lakukan sebelumnya untuk menandai blok / blockgroups / traktat dan bukannya menjalankan Max-p pada blok (meskipun saya telah melakukan semua pengujian pada traktat, sebagai peningkatan sederhana dalam jumlah poligon input yang telah efek dramatis pada waktu pemrosesan). Bagian yang relevan dari kode saya mengikuti. "Shapefile" yang diperlukan sebagai input untuk generate_regions()fungsi (dilewatkan sebagai string yang berisi path lengkap dari shapefile) adalah salah satu yang telah memiliki fitur titik atasan yang telah bergabung secara spasial dengannya, dengan jumlah pengusaha, jumlah karyawan maksimum, dari satu karyawan tunggal. , dan total karyawan yang disimpan sebagai atribut untuk setiap fitur input.

import arcpy, math, pysal, random
import numpy as np

# Suppression criteria:
MIN_EMP_CT = 3      # Minimum number of employers per polygon feature
MAX_EMP_FRAC = 0.8  # Maximum ratio of employees working for a single employer per polygon feature

def generate_regions(shapefile, min_emp_ct=MIN_EMP_CT, max_emp_frac=MAX_EMP_FRAC):
    '''Use pysal's region.Maxp method to generate regions that meet suppression criteria.'''
    w = pysal.rook_from_shapefile(shapefile, idVariable='GEOID10')
    dbf = pysal.open(shapefile[:-4] + '.dbf')
    ids = np.array((dbf.by_col['GEOID10']))
    vars = np.array((dbf.by_col[employer_count_fieldname],dbf.by_col[max_employees_fieldname],dbf.by_col[total_employees_fieldname]))
    employers = vars[0]
    vars = vars.transpose()
    vars_dict = {}
    for i in range(len(ids)):
        vars_dict[ids[i]] = [int(vars[i][0]),float(vars[i][1]),float(vars[i][2])]
    random.seed(100)     # Using non-random seeds ensures repeatability of results
    np.random.seed(100)  # Using non-random seeds ensures repeatability of results
    bump_iter = int(arcpy.GetParameterAsText(3)) # Number of failed iterations after which to increment the minimum number of employers per region (otherwise we could be stuck in the loop literally forever).
    iteration = 0
    tests_failed = 1
    while tests_failed:
        floor = int(min_emp_ct + math.floor(iteration / bump_iter))
        solution = pysal.region.Maxp(w,vars,floor,employers)
        regions_failed = 0
        for region in solution.regions:
            SUM_emp10sum = 0
            MAX_emp10max = 0
            for geo in region:
                emp10max = vars_dict[geo][1]
                emp10sum = vars_dict[geo][2]
                SUM_emp10sum += emp10sum
                MAX_emp10max = max(MAX_emp10max, emp10max)
            if SUM_emp10sum > 0:
                ratio = MAX_emp10max / SUM_emp10sum
            else:
                ratio = 1
            if ratio >= max_emp_frac:
                regions_failed += 1
        iteration += 1
        if regions_failed == 0:
            arcpy.AddMessage('Iteration ' + str(iteration) + ' (MIN_EMP_CT = ' + str(floor) +') - PASSED!')
            tests_failed = 0
        else:
            arcpy.AddMessage('Iteration ' + str(iteration) + ' (MIN_EMP_CT = ' + str(floor) +') - failed...')
    return solution

solution = generate_regions(spatially_joined_shapefile)

regions = solution.regions

### Write input-to-region conversion table to a CSV file.
csv = open(conversion_table,'w')
csv.write('"GEOID10","REGION_ID"\n')
for i in range(len(regions)):
    for geo in regions[i]:
        csv.write('"' + geo + '","' + str(i+1) + '"\n')
csv.close()
orang bodoh
sumber
2

Saya belum pernah menemukan situasi seperti ini, dan saya percaya rute yang lebih umum adalah benar-benar menjaga unit apa pun yang Anda putuskan secara apriori dan kemudian menggunakan teknik yang berbeda untuk "menipu" data untuk melindungi masalah privasi.

Untuk pengantar berbagai cara orang menyamarkan data, saya akan menyarankan artikel ini;

Matthews, Gregory J. & Ofer Harel. 2011. Kerahasiaan data: Tinjauan metode untuk batasan pengungkapan statistik dan metode untuk menilai privasi . Survei Statistik 5 : 1-29. PDF tersedia secara gratis dari Project Euclid di tautan di atas.

Saya juga memiliki beberapa tautan ke berbagai artikel lain yang membahas "geomasking" di tag itu di perpustakaan citeulike saya (tidak semua terkait dengan data geografis).

Meskipun ini tidak menjawab pertanyaan Anda, ada kemungkinan beberapa teknik yang tercantum dalam artikel Matthews dan Ofer mungkin lebih mudah diterapkan untuk memenuhi kebutuhan Anda. Khususnya pembuatan data sintetik seperti perpanjangan logis dari kemana Anda pergi (data eksternal akan dipinjam dari kelompok blok sensus atau traktat atau kabupaten jika perlu). Juga beberapa jenis pertukaran data (dalam ruang) mungkin lebih mudah diimplementasikan juga.

Andy W
sumber
Terima kasih atas jawaban / komentarnya. Saya menyadari adanya metode untuk memalsukan data untuk mempertahankan validitas statistik sambil melindungi privasi, meskipun makalah itu telah membantu saya untuk memahami spesifiknya sedikit lebih baik. Sayangnya, metode seperti itu tampaknya tidak terlalu berlaku untuk situasi saya, ketika satu-satunya informasi yang saya keluarkan adalah jumlah pengusaha dan karyawan di suatu bidang tertentu: mengaduk-aduk mereka pasti akan berdampak pada validitas setiap analisis berdasarkan pada mereka, bukan?
nmpeterson
Agregasi memengaruhi analisis dengan cara yang berpotensi serupa. Namun sulit untuk memberikan saran umum, dan produk akhir Anda harus dipandu oleh apa yang akan dilakukan orang selanjutnya dengan data tersebut. Saya bisa membayangkan beberapa situasi di mana membuat unit akhir dari agregasi variabel akan bermasalah. Sebagai contoh jika saya tertarik membandingkan aglomerasi / persaingan antara pengusaha, unit yang berbeda akan merepotkan tetapi, terutama jika saya ingin melanjutkan dan menghubungkannya dengan data demografis lainnya dari sensus.
Andy W
Dalam hal itu saya lebih suka memiliki satu unit analisis yang memiliki jumlah kesalahan yang berubah-ubah, tetapi saya yakin Anda dapat memikirkan kegunaan lain di mana agregasi dan (secara teoritis) tidak ada kesalahan akan lebih disukai.
Andy W