Агрегування полігонів для задоволення вимог конфіденційності


10

У мене є точковий клас функцій, який представляє офісні місця всіх роботодавців у певній галузі. Клас функцій має атрибут для зберігання кількості співробітників, що працюють в кожному офісі. Хтось попросив використати ці дані, просторово приєднані до найменшої можливої ​​географічної одиниці - Блоків перепису, в цьому випадку. Однак угода про конфіденційність перешкоджає звільненню даних як є. Натомість його потрібно придушити, щоб відповідати двом критеріям:

  1. Будь-який багатокутник повинен містити щонайменше трьох роботодавців (балів);
  2. Не більше 80% загальної зайнятості на полігоні може бути одним роботодавцем.

Я успішно написав сценарій, який просторово приєднує бали до Блоків перепису, зберігаючи суму і максимальну зайнятість у кожному. Кожен, який не відповідає критеріям придушення, позначений прапором. (Полігони, що не містять точок, не позначаються, оскільки немає даних для їх придушення.) Потім я перевіряю кожну групу блоків, щоб побачити, чи містяться в ній якісь позначені блоки Групи блоків, що містять лише блоки, які не позначені прапором, потім замінюються на Блоки. Потім отриманий клас функцій перевіряється на відповідність критеріям придушення, щоб перевірити, чи адекватно придушили дані групи блоків.

Той самий процес повторюється і для трактів, залишаючи мені набір даних, що складається з трактів (деякі відмічені, а деякі ні), груп блоків та блоків (усі не позначені прапорцями). Наступним прогресом в географічній ієрархії, однак, є графство, яке не приносить користі особі, яка запитує ці дані.

Моє запитання таке: чи існують якісь загальноприйняті методи агрегації полігонів на якомога більше груп, щоб усі відповідали деяким мінімальним критеріям?

Ось декілька правил, які я хотів би застосувати до сукупності:

  • По можливості, позначені тракти повинні бути об'єднані лише з іншими прапорами;
  • Для позначених урочищ, які не є суміжними з будь-якими іншими (або відокремленими угрупованнями, які все ще не відповідають критеріям), їх можна приєднати до урочищ, які вже відповідають критеріям, хоча між ними можуть бути урочища, у яких немає роботодавців, які також будуть потрібно включити.
  • Я хотів би зберегти кордони округу недоторканими, якщо це абсолютно неможливо (і я передбачаю, що це буде зроблено, розділивши вхідні функції у відповідні округи перед їх обробкою).
  • Рішення повинно бути в Python, з використанням інструментів ArcGIS або бібліотек з відкритим кодом Python.

В ідеалі хтось може вказати мені на існуючий спосіб реалізації цього агрегування. Якщо ні, я радий сам кодувати алгоритм, хоча список конкретних кроків / інструментів буде дуже вдячний. Проблема вражає мене як особливий випадок перерозподілу (із неоднорідними багатокутниками), і для цього я розглядав використання алгоритмів регіоналізації PySAL , хоча мені не зовсім зрозуміло, як перевірити максимальний відсоток роботодавців у загальній кількості працівників, які використовують ці .

Відповіді:


5

Для тих, хто цікавиться, я придумав рішення самостійно, використовуючи алгоритм PySAL's region.Maxp . По суті, Max-p дозволяє мені генерувати набір регіонів, що відповідають моєму першому критерію (мінімальна кількість роботодавців у регіоні), і я поміщаю це всередину циклу, який відкидає будь-які рішення Max-p, які також не задовольняють другий критерій (відсоток зайнятості, внесений найбільшим роботодавцем у регіоні). Я реалізував це як інструмент ArcGIS.

Я вирішив припинити роботу, яку я раніше робив, щоб позначити блоки / блок-групи / тракти і замість цього запустити Max-p по блоках (хоча я робив усі свої тестування на трактах, оскільки незначне збільшення кількості вхідних полігонів має драматичний вплив на час обробки). Відповідна частина мого коду наступна. "Формат", необхідний як вхід для generate_regions()функції (передається у вигляді рядка, що містить повний шлях формфайлу), є тим, що роботодавці вказували на функції, які вже просторово приєднані до нього, при цьому кількість роботодавців, максимум працівників від одного роботодавця , і загальна кількість співробітників, що зберігаються як атрибут для кожної функції введення.

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

Я ніколи не стикався з такою ситуацією, і я вважаю, що більш поширеним маршрутом є фактично зберігати будь-які одиниці, які ви вирішите апріорі, а потім використовувати різні методи для "підробки" даних, щоб захистити проблеми конфіденційності.

Для впровадження безлічі способів маскування даних я б запропонував цю статтю;

Меттьюс, Грегорі Дж. Та Офер Харел. 2011. Конфіденційність даних: огляд методів статистичного обмеження розкриття інформації та методів оцінки приватність . Статистичні опитування 5 : 1-29. PDF є у вільному доступі від Project Euclid за вищенаведеним посиланням.

У мене також є посилання на різні інші статті, які обговорюють "геомаскировку" на цьому тезі в моїй бібліотеці, що цитує (хоча не всі суворо пов'язані з географічними даними).

Хоча це не відповідає на ваше запитання, можливо, деякі методи, перелічені в статті Меттьюса та Офера, можуть бути простішими у застосуванні для задоволення ваших потреб. Зокрема, створення синтетичних даних видається логічним розширенням того, куди ви їдете (зовнішні дані будуть запозичені у навколишньої групи перепису чи урочища чи округу, якщо це необхідно). Також деякі типи обміну даними (у просторі) також можуть бути простішими.


Дякуємо за відповідь / коментар Мені відомо про існування методів підробки даних для збереження статистичної достовірності, захищаючи конфіденційність, хоча ця робота допомогла мені зрозуміти специфіку трохи краще. На жаль, такі методи не видаються особливо застосовними до моєї ситуації, коли єдиною інформацією, яку я випускаю, є кількість роботодавців та службовців у певній області: переміщення їх навколо неминуче вплине на обґрунтованість будь-якого аналізу, заснованого на них, ні?
nmpeterson

Агрегація впливає на аналіз потенційно подібним чином. Однак важко дати загальну пораду, і ваш кінцевий продукт повинен керуватися тим, що люди згодом збираються робити з даними. Я можу уявити деякі ситуації, коли складати кінцеві одиниці змінної агрегації було б проблематично. Наприклад, якщо я був зацікавлений у порівнянні агломерації / конкуренції між роботодавцями, різні підрозділи будуть болем, але, особливо, якщо я хочу продовжувати і пов'язувати це з іншими демографічними даними, проведеними в результаті перепису.
Енді Ш

У цьому випадку я б скоріше мав одну одиницю аналізу, яка містить довільну кількість помилок, але я впевнений, що ви можете придумати інші види використання, де агрегація та (теоретично) жодна помилка не буде кращою.
Енді Ш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.