聚合多边形以满足隐私要求


10

我有一个点要素类,代表某个行业中所有雇主的办公室位置。要素类具有用于存储在每个办公室工作的员工人数的属性。有人要求使用此数据,并在空间上连接到最小的地理单位(在这种情况下为人口普查区块)。但是,隐私协议阻止数据按原样发布。相反,必须抑制它以满足两个条件:

  1. 任何多边形必须包含至少3个用人单位(点);
  2. 一个多边形内最多只能有80%的就业机会由单个雇主提供。

我已经成功编写了一个脚本,该脚本将这些点在空间上连接到人口普查区块,并在每个区块中保持总和和最大用工。每个不符合抑制标准的标记。(不包含点的多边形不会被标记,因为没有抑制的数据。)然后,我检查每个块组,以查看其中是否包含任何标记的块。然后,仅包含未标记的块的块组将替换为这些块。然后对照抑制标准检查结果要素类,以检查块组是否已充分抑制数据。

对Tracts重复相同的过程,剩下的数据集包括Tracts(有些被标记,有些没有标记),Block Groups和Blocks(全部未标记)。但是,地理层次结构中的下一个进展是县,这对请求此数据的人毫无用处。

那么,我的问题是:是否存在任何普遍接受的将多边形聚合到尽可能多的组中的方法,以使所有这些都满足最低要求?

以下是一些我想应用于聚合的规则:

  • 只要有可能,已标记的道仅应与其他已标记的道合并;
  • 对于标记的与其他不连续的领域(或仍不符合标准的孤立组),可以将它们与已经符合标准的领域结合起来,尽管之间可能存在没有雇主的领域。需要包括在内。
  • 除非绝对不可能,否则我希望保持县域边界不变(我希望通过在处理输入要素之前将其分为各自的县来做到这一点)。
  • 解决方案必须使用Python,并使用ArcGIS工具或开源Python库。

理想情况下,有人可以向我指出实现此聚合的现有方法。如果没有,我将很高兴自己编写算法,尽管会特别感谢一些特定步骤/工具的列表。这个问题使我感到震惊,因为它是重新划分区域(具有不连续的多边形)的一种特殊情况,为此,我研究了使用PySAL的区域化算法,尽管我不清楚如何使用这些方法来检查最大雇主在总雇员中所占的百分比。

Answers:


5

对于任何好奇的人,我自己使用PySAL的region.Maxp算法提出了一个解决方案。本质上,Max-p允许我生成一组符合我的第一个条件(每个区域的最小雇主数量)的区域,然后将其放入while循环中,这将拒绝Max-p的任何解决方案满足第二个标准(一个地区最大的雇主所贡献的就业百分比)。我已经将其实现为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。可从上述链接的Euclid项目免费获得PDF。

我也有指向其他文章的链接,这些文章在我的citeulike图书馆的那个标签上讨论了“ geomasking” (尽管并非所有文章都与地理数据严格相关)。

尽管这不能回答您的问题,但是Matthews and Ofer文章中列出的某些技术可能更容易实现,以满足您的需求。特别是合成数据的生成似乎是您要去往的地方的逻辑延伸(如果需要,可以从周围的人口普查区组或地区或县借用外部数据)。同样,某些类型的数据交换(在空间中)也可能更容易实现。


感谢您的回答/评论。我知道存在一些在保护隐私的同时篡改数据以保持统计有效性的方法,尽管该论文已帮助我更好地理解了细节。不幸的是,当我发布的唯一信息是给定区域内的雇主和雇员数量时,这种方法似乎并不特别适合我的情况:对他们进行改组将不可避免地影响基于他们的分析的有效性,不是吗?
nmpeterson 2012年

聚合可能以类似的方式影响分析。但是,很难给出一般性建议,并且最终产品应以人们随后将如何处理数据为指导。我可以想象在某些情况下,使可变聚合的最终单元存在问题。例如,如果我有兴趣比较雇主之间的集聚/竞争,那么不同单位将是一件痛苦的事情,但是,特别是如果我想继续将其与人口普查的其他人口统计数据联系起来的话。
安迪W

在那种情况下,我宁愿使用一个合并了任意数量错误的分析单元,但是我敢肯定,您可以想到聚合和(理论上)没有错误可取的其他用途。
安迪W
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.