개인 정보 요구 사항을 충족시키기 위해 다각형 수집


10

특정 산업의 모든 고용주의 사무실 위치를 나타내는 포인트 피처 클래스가 있습니다. 피처 클래스에는 각 사무실에서 근무하는 직원 수를 저장하는 속성이 있습니다. 누군가가이 데이터를 가능한 가장 작은 지리적 단위 (이 경우 인구 조사 블록)에 공간적으로 결합하여 사용하도록 요청했습니다. 그러나 개인 정보 보호 계약에 따라 데이터가있는 그대로 릴리스되지 않습니다. 대신 두 가지 기준을 충족하도록 억제해야합니다.

  1. 모든 다각형에는 3 명 이상의 고용주가 포함되어야합니다.
  2. 단일 고용주는 폴리곤 내 총 고용의 80 %를 초과 할 수 없습니다.

나는 점수를 공간적으로 센서스 블록에 결합하여 각각의 합계와 최대 고용을 유지하는 스크립트를 성공적으로 작성했습니다. 억제 기준을 충족하지 않는 각 플래그가 표시됩니다. (점을 포함하지 않는 다각형에는 표시 할 데이터가 없으므로 플래그가 지정되지 않습니다.) 그런 다음 각 블록 그룹 에서 플래그가 지정된 블록이 포함되어 있는지 확인합니다. 플래 깅되지 않은 블록 만 포함 된 블록 그룹은 블록으로 대체됩니다. 그런 다음 결과 피처 클래스를 억제 기준과 비교하여 블록 그룹이 데이터를 적절하게 억제했는지 여부를 확인합니다.

Tracts에 대해 동일한 프로세스가 반복되어 Tracts (일부 플래그가 있고 일부가 아님), Block Groups 및 Blocks (모두 표시되지 않은)로 구성된 데이터 세트가 남습니다. 그러나 지리적 계층에서 다음 단계는 카운티이며이 데이터를 요청하는 사람에게는 아무 소용이 없습니다.

그렇다면 제 질문은 이것입니다 : 다각형을 가능한 한 많은 그룹으로 모아서 최소한의 기준을 충족시키는 방법이 있습니까?

다음은 집계에 적용 할 규칙입니다.

  • 가능하면 플래그가 지정된 트랙은 다른 플래그가있는 트랙과 만 집계해야합니다.
  • 다른 사람과 인접하지 않은 플래그가 지정된 트랩 (또는 여전히 기준을 충족하지 않는 격리 된 그룹)의 경우, 고용주가없는 트랩이있을 수 있지만 이미 기준을 충족하는 트랩과 결합 할 수 있습니다. 포함해야합니다.
  • 나는 절대적으로 불가능하지 않으면 카운티 경계를 그대로 유지하고 싶습니다 (입력 기능을 처리하기 전에 각 카운티로 분리 하여이 기능을 수행 할 것으로 예상합니다).
  • 솔루션은 ArcGIS 도구 또는 오픈 소스 Python 라이브러리를 사용하여 Python이어야합니다.

이상적으로 누군가 가이 집계를 구현하는 기존 수단을 가리킬 수 있습니다. 그렇지 않다면 특정 단계 / 도구 목록이 많이 인정되지만 알고리즘을 직접 코딩하게되어 기쁩니다. 문제는 (DIS 연속 다각형) 선거구 재조정의 특별한 경우로 나를 파업하고,이를 위해 내가 사용으로 보았다 PySAL의 지역화 알고리즘 은 다음을 사용하여 전체 직원의 최대 고용주의 비율을 확인하는 방법을 나에게 분명하지 않지만, .

답변:


5

궁금한 사람은 PySAL의 region.Maxp 알고리즘을 사용하여 자체 솔루션을 고안했습니다 . 본질적으로 Max-p를 사용하면 첫 번째 기준 (지역 당 최소 고용주 수)을 충족하는 지역 집합을 생성 할 수 있으며이를 while 루프 안에 넣습니다. 두 번째 기준 (지역에서 가장 큰 고용주가 기여한 고용 비율)을 충족합니다. ArcGIS 도구로 구현했습니다.

이전에 블록 / 블록 그룹 / 트랙에 플래그를 지정하기 위해 이전에 수행 한 작업을 폐기하기로 결정하고 대신 블록에서 Max-p를 실행하기로 결정했습니다 (입력 다각형의 수가 약간 증가함에 따라 트랙에서 모든 테스트를 수행했지만) 처리 시간에 대한 극적인 영향). 내 코드의 관련 부분은 다음과 같습니다. generate_regions()함수에 대한 입력으로 필요한 "shapefile"(shapefile 의 전체 경로를 포함하는 문자열로 전달됨)은 고용주 수, 단일 고용주의 최대 직원 수와 함께 고용주가 이미 공간적으로 결합 된 기능을 고용주에게 제공 한 기능입니다. 및 각 입력 기능에 대한 속성으로 저장된 총 직원 수

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

나는 이런 상황을 겪어 본 적이 없으며, 더 일반적인 경로는 우선 순위 에 따라 결정한 단위를 실제로 유지 하고 다른 기술을 사용하여 개인 정보 보호 문제를 보호하기 위해 데이터를 "퍼지"하는 것입니다.

사람들이 데이터를 숨기는 수많은 방법에 대한 소개를 위해이 기사를 제안합니다.

Matthews, Gregory J. & Ofer Harel. 2011. 데이터 기밀성 : 통계적 공개 제한 방법 및 개인 정보 평가 방법 검토 . 통계 조사 5 : 1-29. PDF는 위 링크의 Project Euclid에서 자유롭게 구할 수 있습니다.

나는 또한 내 citeulike 라이브러리의 해당 태그에서 "지오 마스킹"에 대해 논의하는 다양한 다른 기사에 대한 링크를 가지고 있습니다 (모두 지리 데이터와 엄격하게 관련된 것은 아닙니다).

이것이 귀하의 질문에 대한 답변은 아니지만 Matthews and Ofer 기사에 나열된 일부 기술이 귀하의 요구를 충족시키기 위해 구현하기가 더 쉬울 수 있습니다. 특히 합성 데이터 작성은 어디로 가는지에 대한 논리적 확장처럼 보입니다 (외부 데이터는 주변 인구 조사 블록 그룹 또는 필요한 경우 지역 또는 카운티에서 빌려옵니다). 또한 (공간에서) 일부 유형의 데이터 교환도 구현하기가 더 쉬울 수 있습니다.


답변 / 댓글에 감사드립니다. 프라이버시를 보호하면서 통계적 타당성을 유지하기 위해 데이터를 퍼징하는 방법이 있다는 것을 알고 있지만, 그 논문은 세부 사항을 조금 더 잘 이해하는 데 도움이되었지만. 불행히도, 그러한 방법은 내 상황에 특별히 적용되지 않는 것 같습니다. 내가 제공하는 유일한 정보가 주어진 영역의 고용주와 직원의 수일 때입니다.
nmpeterson

집계는 잠재적으로 유사한 방식으로 분석에 영향을줍니다. 그러나 일반적인 조언을하기는 어렵고, 최종 제품은 사람들이 데이터로 수행 할 작업에 따라 안내되어야합니다. 변수 집계의 최종 단위를 만드는 것이 문제가 될 수있는 상황을 상상할 수 있습니다. 예를 들어, 고용주 간의 응집 / 경쟁을 비교하는 데 관심이 있다면, 다른 부서가 어려움을 겪을 수 있지만, 특히 인구 조사의 다른 인구 통계 데이터와 연결하려는 경우에는 더욱 그렇습니다.
Andy W

이 경우 임의의 양의 오류가있는 분석 단위가 하나 있지만 집계 및 이론적으로 오류가없는 다른 용도를 생각할 수 있습니다.
Andy W
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.