Tổng hợp đa giác để đáp ứng yêu cầu bảo mật


10

Tôi có một lớp tính năng đại diện cho các địa điểm văn phòng của tất cả các nhà tuyển dụng trong một ngành công nghiệp nhất định. Lớp tính năng có một thuộc tính để lưu trữ số lượng nhân viên làm việc tại mỗi văn phòng. Ai đó đã yêu cầu sử dụng dữ liệu này, tham gia không gian đến đơn vị địa lý nhỏ nhất có thể - Khối điều tra dân số, trong trường hợp này. Tuy nhiên, một thỏa thuận bảo mật sẽ ngăn chặn việc phát hành dữ liệu. Thay vào đó, nó phải được loại bỏ để đáp ứng hai tiêu chí:

  1. Bất kỳ đa giác phải chứa ít nhất 3 nhà tuyển dụng (điểm);
  2. Không quá 80% tổng số việc làm trong một đa giác có thể chỉ bởi một chủ nhân.

Tôi đã viết thành công một kịch bản tham gia không gian các điểm vào Khối điều tra dân số, giữ tổng số và việc làm tối đa trong mỗi tập lệnh. Mỗi một tiêu chí không đáp ứng các tiêu chí đàn áp được gắn cờ. (Đa giác không chứa điểm nào không được gắn cờ, vì không có dữ liệu để triệt tiêu.) Sau đó tôi kiểm tra từng Nhóm Khối để xem có bất kỳ Khối được gắn cờ nào trong đó không. Các nhóm Khối chỉ chứa các Khối không được gắn cờ sau đó được thay thế bằng các Khối. Sau đó, lớp tính năng kết quả được kiểm tra theo các tiêu chí triệt tiêu, để kiểm tra xem các Nhóm Khối có triệt tiêu dữ liệu hay không.

Quá trình tương tự được lặp lại cho các Vùng, để lại cho tôi một bộ dữ liệu bao gồm các Vùng (một số được gắn cờ và một số không), Khối Nhóm và Khối (tất cả không được gắn cờ). Tuy nhiên, sự tiến triển tiếp theo trong hệ thống phân cấp địa lý là quận, không có ích cho người yêu cầu dữ liệu này.

Sau đó, câu hỏi của tôi là: Có phương pháp nào được chấp nhận phổ biến để tổng hợp đa giác thành nhiều nhóm nhất có thể, để tất cả đáp ứng một số tiêu chí tối thiểu không?

Dưới đây là một số quy tắc mà tôi muốn áp dụng cho tổng hợp:

  • Bất cứ khi nào có thể, các Vùng được gắn cờ chỉ nên được tổng hợp với các Vùng được gắn cờ khác;
  • Đối với các Vùng được gắn cờ không tiếp giáp với bất kỳ vùng nào khác (hoặc các nhóm bị cô lập vẫn không đáp ứng các tiêu chí), chúng có thể được tham gia với các Vùng đã đáp ứng các tiêu chí, mặc dù có thể có các Vùng không có chủ nhân ở giữa chúng. cần được đưa vào
  • Tôi muốn giữ nguyên ranh giới của quận trừ khi hoàn toàn không thể (và tôi dự đoán sẽ làm điều này bằng cách tách các tính năng đầu vào thành các hạt tương ứng trước khi xử lý chúng).
  • Giải pháp phải bằng Python, với việc sử dụng các công cụ ArcGIS hoặc thư viện Python nguồn mở.

Lý tưởng nhất, ai đó có thể chỉ cho tôi một phương tiện hiện có để thực hiện tập hợp này. Nếu không, tôi rất vui khi tự viết mã thuật toán, mặc dù một danh sách các bước / công cụ cụ thể sẽ được đánh giá cao. Vấn đề gây ra cho tôi như là một trường hợp đặc biệt của việc phân phối lại (với các đa giác không liền kề) và đến cuối cùng, tôi đã xem xét sử dụng các thuật toán khu vực hóa của PySAL , mặc dù tôi không rõ cách kiểm tra tỷ lệ phần trăm nhân viên tối đa sử dụng chúng .

Câu trả lời:


5

Đối với bất kỳ ai tò mò, tôi đã tự mình nghĩ ra một giải pháp, sử dụng thuật toán area.Maxp của PySAL . Về cơ bản, Max-p cho phép tôi tạo ra một tập hợp các vùng đáp ứng tiêu chí đầu tiên của tôi (số lượng người sử dụng lao động tối thiểu cho mỗi vùng) và tôi đặt điều đó trong một vòng lặp, điều này sẽ từ chối bất kỳ giải pháp nào của Max-p cũng không thỏa mãn tiêu chí thứ hai (tỷ lệ phần trăm việc làm được đóng góp bởi chủ lao động lớn nhất trong khu vực). Tôi đã triển khai nó như một công cụ ArcGIS.

Tôi đã quyết định loại bỏ công việc tôi đã thực hiện trước đó để gắn cờ các khối / nhóm / vùng và thay vào đó chạy Max-p trên các khối (mặc dù tôi đã thực hiện tất cả các thử nghiệm của mình trên các vùng, vì số lượng đa giác đầu vào tăng lên một cách khiêm tốn ảnh hưởng lớn đến thời gian xử lý). Phần có liên quan của mã của tôi sau đây. "Shapefile" được yêu cầu làm đầu vào cho generate_regions()hàm (được truyền dưới dạng một chuỗi chứa đường dẫn đầy đủ của shapefile) là một chuỗi có các đặc điểm điểm của nhà tuyển dụng đã tham gia vào nó, với số lượng người sử dụng lao động, nhân viên tối đa từ một chủ nhân và tổng số nhân viên được lưu trữ dưới dạng một thuộc tính cho từng tính năng đầu vào.

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()

2

Tôi chưa bao giờ gặp phải một tình huống như thế này và tôi tin rằng một cách phổ biến hơn là thực sự giữ bất kỳ đơn vị nào bạn quyết định cho một tiên nghiệm và sau đó sử dụng các kỹ thuật khác nhau để "làm mờ" dữ liệu để bảo vệ các mối quan tâm về quyền riêng tư.

Để giới thiệu về vô số cách mọi người che giấu dữ liệu, tôi sẽ đề xuất bài viết này;

Matthews, Gregory J. & Ofer Harel. 2011. Bảo mật dữ liệu: Đánh giá các phương pháp giới hạn công bố thống kê và phương pháp đánh giá quyền riêng tư . Thống kê Khảo sát 5 : 1-29. PDF có sẵn miễn phí từ Project Euclid ở liên kết trên.

Tôi cũng có một số liên kết đến các bài viết khác thảo luận về "geomasking" tại thẻ đó tại thư viện citeulike của tôi (không phải tất cả đều liên quan chặt chẽ đến dữ liệu địa lý).

Mặc dù điều này không trả lời câu hỏi của bạn, nhưng có thể một số kỹ thuật được liệt kê trong bài viết của Matthews và Ofer có thể dễ thực hiện hơn để đáp ứng nhu cầu của bạn. Cụ thể, việc tạo dữ liệu tổng hợp có vẻ như là một phần mở rộng hợp lý của nơi bạn sẽ đến (dữ liệu bên ngoài sẽ được mượn từ nhóm khối điều tra dân số xung quanh hoặc đường hoặc quận nếu cần thiết). Ngoài ra, một số loại trao đổi dữ liệu (trong không gian) cũng có thể dễ thực hiện hơn.


Cảm ơn câu trả lời / bình luận. Tôi nhận thức được sự tồn tại của các phương pháp làm mờ dữ liệu để duy trì tính hợp lệ thống kê trong khi bảo vệ quyền riêng tư, mặc dù bài báo đó đã giúp tôi hiểu chi tiết cụ thể hơn một chút. Thật không may, các phương pháp như vậy dường như không thể áp dụng đặc biệt cho tình huống của tôi, khi thông tin duy nhất tôi đưa ra là số lượng người sử dụng lao động và nhân viên trong một khu vực nhất định: xáo trộn chúng xung quanh chắc chắn sẽ ảnh hưởng đến tính hợp lệ của bất kỳ phân tích nào dựa trên chúng, phải không?
nmpeterson

Tập hợp tác động đến phân tích theo cách có khả năng tương tự. Thật khó để đưa ra lời khuyên chung, và sản phẩm cuối cùng của bạn nên được hướng dẫn bởi những gì mọi người sẽ làm sau đó với dữ liệu. Tôi có thể tưởng tượng một số tình huống trong đó việc tạo ra các đơn vị kết thúc của các tập hợp biến sẽ có vấn đề. Ví dụ, nếu tôi quan tâm đến việc so sánh sự kết tụ / cạnh tranh giữa các nhà tuyển dụng, các đơn vị khác nhau sẽ là một nỗi đau nhưng đặc biệt là nếu tôi muốn tiếp tục và liên kết nó với dữ liệu nhân khẩu học khác từ điều tra dân số.
Andy W

Trong trường hợp đó, tôi muốn có một đơn vị phân tích có số lượng lỗi tùy ý được kết hợp, nhưng tôi chắc chắn bạn có thể nghĩ đến các cách sử dụng khác trong đó tổng hợp và (về mặt lý thuyết) không có lỗi nào thích hợp hơn.
Andy W
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.