รูปหลายเหลี่ยมรวมกันเพื่อตอบสนองความต้องการความเป็นส่วนตัว


10

ฉันมีคลาสคุณลักษณะเฉพาะที่แสดงถึงที่ตั้งสำนักงานของนายจ้างทั้งหมดในอุตสาหกรรมหนึ่ง ๆ คลาสคุณลักษณะนี้มีคุณลักษณะสำหรับจัดเก็บจำนวนพนักงานที่ทำงานในแต่ละสำนักงาน มีคนขอใช้ข้อมูลนี้เข้าร่วมเชิงพื้นที่กับหน่วยทางภูมิศาสตร์ที่เล็กที่สุดเท่าที่จะเป็นไปได้ - บล็อกการสำรวจสำมะโนประชากรในกรณีนี้ อย่างไรก็ตามข้อตกลงความเป็นส่วนตัวป้องกันการเปิดเผยข้อมูลตามที่เป็นอยู่ แต่จะต้องระงับเพื่อให้ตรงกับเกณฑ์สองประการ:

  1. รูปหลายเหลี่ยมใด ๆ จะต้องมีนายจ้างอย่างน้อย 3 คน (คะแนน);
  2. ไม่เกิน 80% ของการจ้างงานทั้งหมดภายในรูปหลายเหลี่ยมอาจเป็นนายจ้างคนเดียว

ฉันประสบความสำเร็จในการเขียนสคริปต์ที่เชื่อมโยงประเด็นไปยังบล็อกการสำรวจสำมะโนประชากรเชิงพื้นที่โดยรักษาผลรวมและการจ้างงานสูงสุดในแต่ละ แต่ละรายการที่ไม่ตรงตามเกณฑ์การปราบปรามจะถูกตั้งค่าสถานะ (รูปหลายเหลี่ยมที่ไม่มีคะแนนจะไม่ถูกตั้งค่าสถานะเนื่องจากไม่มีข้อมูลที่จะระงับ) จากนั้นฉันจะตรวจสอบแต่ละกลุ่มบล็อกเพื่อดูว่ามีบล็อกภายในที่ถูกตั้งค่าสถานะอยู่หรือไม่ กลุ่มบล็อกที่มีเฉพาะบล็อกที่ไม่ติดธงจะถูกแทนที่ด้วยบล็อก คลาสคุณลักษณะที่ได้จะถูกตรวจสอบกับเกณฑ์การปราบปรามเพื่อตรวจสอบว่ากลุ่มบล็อกได้ระงับข้อมูลอย่างเพียงพอหรือไม่

กระบวนการเดียวกันนี้ทำซ้ำสำหรับ Tracts โดยปล่อยให้ฉันมีชุดข้อมูลที่ประกอบไปด้วย Tracts (บางคนถูกตั้งค่าสถานะและบางคนไม่ได้) กลุ่มบล็อกและบล็อก (ยกเลิกการตั้งค่าสถานะทั้งหมด) อย่างไรก็ตามความก้าวหน้าครั้งต่อไปในลำดับชั้นทางภูมิศาสตร์เป็นเขตที่ไม่ได้ใช้กับบุคคลที่ขอข้อมูลนี้

จากนั้นคำถามของฉันคือสิ่งนี้: มีวิธีการใดที่ยอมรับกันโดยทั่วไปในการรวมรูปหลายเหลี่ยมเป็นกลุ่มให้ได้มากที่สุดเพื่อให้เป็นไปตามเกณฑ์ขั้นต่ำทั้งหมดหรือไม่

นี่คือกฎบางอย่างที่ฉันต้องการนำไปใช้กับการรวม:

  • เมื่อใดก็ตามที่เป็นไปได้ผืนที่ถูกตั้งค่าสถานะควรรวมกับทางเดินที่ถูกตั้งค่าสถานะอื่นเท่านั้น
  • สำหรับทางเดินที่ถูกตั้งค่าสถานะซึ่งไม่ต่อเนื่องกับคนอื่น ๆ (หรือกลุ่มแยกที่ยังไม่ตรงตามเกณฑ์) พวกเขาสามารถเข้าร่วมกับผืนที่ตรงกับเกณฑ์แล้วแม้ว่าอาจจะมีผืนที่ไม่มีนายจ้างในระหว่างพวกเขาที่จะ จะต้องรวม
  • ฉันต้องการให้เขตแดนของเขตนั้นสมบูรณ์เว้นแต่จะเป็นไปไม่ได้อย่างแน่นอน (และฉันคาดว่าจะทำสิ่งนี้ได้โดยการแยกคุณสมบัติอินพุตเข้าสู่เขตของตนก่อนดำเนินการ)
  • การแก้ปัญหาจะต้องอยู่ใน Python ด้วยการใช้เครื่องมือ ArcGIS หรือไลบรารี Python โอเพนซอร์ส

เป็นการดีที่ใครบางคนสามารถชี้ให้ฉันไปที่วิธีการที่มีอยู่ของการใช้การรวมตัวนี้ ถ้าไม่ฉันยินดีที่จะเขียนอัลกอริทึมด้วยตนเองแม้ว่ารายการขั้นตอน / เครื่องมือเฉพาะจะได้รับการชื่นชมมาก ปัญหาดังกล่าวทำให้ฉันเป็นกรณีพิเศษของการกำหนดใหม่ (ด้วยรูปหลายเหลี่ยมที่ไม่ต่อเนื่องกัน) และด้วยเหตุนี้ฉันจึงได้มองถึงการใช้อัลกอริทึมการกำหนดภูมิภาคของ PySALแม้ว่าจะยังไม่ชัดเจนสำหรับฉัน .

คำตอบ:


5

สำหรับใครที่อยากรู้อยากเห็นฉันมากับวิธีการแก้ปัญหาด้วยตัวเองโดยใช้อัลกอริทึม region.Maxp PySAL ของ โดยพื้นฐานแล้ว Max-p ช่วยให้ฉันสามารถสร้างชุดของภูมิภาคที่ตรงกับเกณฑ์แรกของฉัน (จำนวนขั้นต่ำของนายจ้างต่อภูมิภาค) และฉันวางมันไว้ในขณะที่ลูปซึ่งจะปฏิเสธโซลูชันของ Max-p ใด ๆ พึงพอใจในเกณฑ์ที่สอง (ร้อยละของการจ้างงานที่นายจ้างรายใหญ่ที่สุดได้รับในภูมิภาค) ฉันใช้มันเป็นเครื่องมือ ArcGIS

ฉันตัดสินใจที่จะทิ้งงานที่ฉันทำก่อนหน้านี้เพื่อตั้งค่าสถานะบล็อก / บล็อก / กลุ่ม / ผืนและแทนที่จะเรียกใช้ Max-p ในบล็อก (แม้ว่าฉันได้ทำการทดสอบทั้งหมดของฉันในผืนสถานที่เป็นเพิ่มขึ้นเล็กน้อยในจำนวนของรูปหลายเหลี่ยมอินพุต ผลกระทบอย่างมากต่อเวลาในการประมวลผล) ส่วนที่เกี่ยวข้องของรหัสของฉันดังต่อไปนี้ "shapefile" ที่จำเป็นสำหรับการป้อนข้อมูลสำหรับgenerate_regions()ฟังก์ชั่น (ส่งผ่านเป็นสตริงที่มีเส้นทางแบบเต็มของ 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 ที่ลิงค์ด้านบน

ฉันยังมีลิงก์ไปยังบทความอื่น ๆ อีกมากมายที่กล่าวถึง "geomasking" ที่แท็กนั้นที่ห้องสมุด citeulike ของฉัน (ไม่ใช่ทั้งหมดที่เกี่ยวข้องกับข้อมูลทางภูมิศาสตร์อย่างเคร่งครัด)

แม้ว่าสิ่งนี้จะไม่ตอบคำถามของคุณ แต่เป็นไปได้ว่าเทคนิคบางอย่างที่ระบุไว้ในบทความ Matthews และ Ofer อาจนำไปใช้เพื่อตอบสนองความต้องการของคุณได้ง่ายขึ้น โดยเฉพาะอย่างยิ่งการสร้างข้อมูลสังเคราะห์ดูเหมือนเป็นส่วนขยายแบบลอจิคัลของที่ที่คุณไป (ข้อมูลภายนอกจะถูกยืมจากกลุ่มบล็อกการสำรวจสำมะโนประชากรรอบหรือทางเดินหรือเคาน์ตี้หากจำเป็น) นอกจากนี้การแลกเปลี่ยนข้อมูลบางประเภท (ในที่ว่าง) อาจนำไปใช้งานได้ง่ายขึ้นเช่นกัน


ขอบคุณสำหรับคำตอบ / ความคิดเห็น ฉันตระหนักถึงการมีอยู่ของวิธีการที่ทำให้เสียข้อมูลเพื่อรักษาความถูกต้องทางสถิติในขณะที่ปกป้องความเป็นส่วนตัวแม้ว่ากระดาษนั้นจะช่วยให้ฉันเข้าใจเฉพาะเจาะจงได้ดีขึ้น น่าเสียดายที่วิธีการดังกล่าวดูเหมือนจะไม่สามารถนำไปใช้กับสถานการณ์ของฉันได้โดยเฉพาะเมื่อข้อมูลเดียวที่ฉันปล่อยคือจำนวนนายจ้างและลูกจ้างในพื้นที่ที่กำหนด: การสับพวกเขาไปรอบ ๆ จะส่งผลกระทบต่อความถูกต้องของการวิเคราะห์
nmpeterson

การรวมกันส่งผลกระทบต่อการวิเคราะห์ในลักษณะที่คล้ายกัน เป็นการยากที่จะให้คำแนะนำทั่วไปและผลิตภัณฑ์ขั้นสุดท้ายของคุณควรได้รับคำแนะนำจากสิ่งที่ผู้คนจะทำกับข้อมูลในภายหลัง ฉันสามารถจินตนาการถึงสถานการณ์บางอย่างที่ทำให้การรวมหน่วยสิ้นสุดของการรวมตัวแปรเป็นปัญหา ตัวอย่างเช่นถ้าฉันมีความสนใจในการเปรียบเทียบการรวมตัวกัน / การแข่งขันระหว่างนายจ้างหน่วยงานที่แตกต่างกันจะเจ็บปวดในการ แต่โดยเฉพาะอย่างยิ่งถ้าฉันต้องการที่จะไปและเชื่อมโยงกับข้อมูลประชากรอื่น ๆ จากการสำรวจสำมะโนประชากร
Andy W

ในตัวอย่างนั้นฉันต้องการหน่วยวิเคราะห์ที่มีข้อผิดพลาดจำนวนหนึ่ง แต่ฉันแน่ใจว่าคุณสามารถนึกถึงการใช้งานอื่น ๆ ที่การรวมตัวและ (ในทางทฤษฎี) ไม่มีข้อผิดพลาดจะดีกว่า
Andy W
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.