बहुभुज एकत्र करना गोपनीयता आवश्यकताओं को पूरा करने के लिए


10

मेरे पास एक निश्चित सुविधा वर्ग है जो एक निश्चित उद्योग में सभी नियोक्ताओं के कार्यालय स्थानों का प्रतिनिधित्व करता है। फीचर क्लास में प्रत्येक कार्यालय में काम करने वाले कर्मचारियों की संख्या को संग्रहीत करने के लिए एक विशेषता है। किसी ने इस डेटा का उपयोग करने का अनुरोध किया है, स्थानिक रूप से इस मामले में सबसे छोटी भौगोलिक इकाई - जनगणना ब्लॉक में शामिल हो गया है। हालाँकि, एक गोपनीयता अनुबंध डेटा की रिलीज़ को रोक देता है जैसा कि है। इसके बजाय, इसे दो मानदंडों को पूरा करने के लिए दबाया जाना चाहिए:

  1. किसी भी बहुभुज में कम से कम 3 नियोक्ता (अंक) होने चाहिए;
  2. बहुभुज के भीतर कुल रोजगार का 80% से अधिक एकल नियोक्ता द्वारा नहीं हो सकता है।

मैंने सफलतापूर्वक एक पटकथा लिखी है जो स्थानिक रूप से जनगणना खंडों में शामिल होती है, प्रत्येक में अधिकतम और अधिकतम रोजगार रखते हैं। दमन मानदंड को पूरा नहीं करने वाले प्रत्येक को चिह्नित किया गया है। (बिना अंक वाले पॉलीगनों को चिह्नित नहीं किया जाता है, क्योंकि दबाने के लिए कोई डेटा नहीं है।) मैं फिर प्रत्येक ब्लॉक समूह की जांच करता हूं कि कोई ध्वजांकित ब्लॉक इसके भीतर समाहित है या नहीं। केवल अन-फ्लैग किए गए ब्लॉक वाले ब्लॉक समूह को ब्लॉक से बदल दिया जाता है। परिणामी फीचर वर्ग को तब दमन मानदंड के खिलाफ जांचा जाता है, यह जांचने के लिए कि क्या ब्लॉक समूहों ने डेटा को पर्याप्त रूप से दबा दिया है।

ट्रैक्ट्स के लिए एक ही प्रक्रिया दोहराई जाती है, मुझे ट्रैक्ट्स (कुछ ध्वजांकित और कुछ नहीं), ब्लॉक समूह और ब्लॉक (सभी संयुक्त राष्ट्र के झंडे) से युक्त डेटासेट के साथ छोड़ दिया जाता है। भौगोलिक पदानुक्रम में अगली प्रगति, हालांकि, काउंटी है, जो इस डेटा का अनुरोध करने वाले व्यक्ति के लिए कोई उपयोग नहीं है।

मेरा सवाल यह है कि क्या यह है: क्या बहुभुजों को यथासंभव अधिक से अधिक समूहों में संयोजित करने की कोई सामान्य रूप से स्वीकृत विधियाँ हैं, ताकि सभी कुछ न्यूनतम मानदंडों को पूरा कर सकें?

यहां कुछ नियम दिए गए हैं जिन्हें मैं एकत्रीकरण पर लागू करना चाहता हूं:

  • जब भी संभव हो, ध्वजांकित ट्रैक्ट्स को केवल अन्य ध्वजांकित ट्रैक्ट्स के साथ एकत्र किया जाना चाहिए;
  • फ़्लैग किए गए ट्रैक्ट्स के लिए जो किसी अन्य के साथ सन्निहित नहीं हैं (या अलग-थलग समूह जो अभी भी मानदंडों को पूरा नहीं करते हैं), वे ट्रैक्ट्स के साथ शामिल हो सकते हैं जो पहले से ही मानदंडों को पूरा करते हैं, हालांकि बीच में कोई भी नियोक्ता के साथ ट्रैक्ट नहीं हो सकते हैं शामिल करने की आवश्यकता है।
  • मैं काउंटी की सीमाओं को तब तक अक्षुण्ण रखना चाहूंगा जब तक कि बिल्कुल असंभव न हो (और मैं प्रोसेसिंग से पहले इनपुट विशेषताओं को उनके संबंधित काउंटियों में अलग करके ऐसा करने का अनुमान लगाता हूं)।
  • आर्कगिस उपकरण या ओपन-सोर्स पायथन पुस्तकालयों के उपयोग के साथ समाधान पायथन में होना चाहिए।

आदर्श रूप से, कोई मुझे इस एकत्रीकरण को लागू करने के मौजूदा साधनों की ओर संकेत कर सकता है। यदि नहीं, तो मुझे एल्गोरिथ्म को स्वयं कोड करने की खुशी है, हालांकि विशिष्ट चरणों / उपकरणों की एक सूची की बहुत सराहना की जाएगी। समस्या मुझे पुनर्वितरण (विशेष- विरोधी बहुभुज के साथ) के एक विशेष मामले के रूप में प्रभावित करती है, और इसके लिए मैंने PySAL के क्षेत्रीयकरण एल्गोरिदम का उपयोग करने पर ध्यान दिया है , हालांकि यह मेरे लिए स्पष्ट नहीं है कि इनका उपयोग करके कुल कर्मचारियों के अधिकतम प्रतिशत की जाँच कैसे करें? ।

जवाबों:


5

किसी के लिए जो उत्सुक है, मैं अपने आप पर एक समाधान के साथ आया, PySAL के क्षेत्र का उपयोग कर रहा हूँMaxp एल्गोरिथ्म । अनिवार्य रूप से, मैक्स-पी मुझे उन क्षेत्रों का एक समूह बनाने की अनुमति देता है जो मेरी पहली कसौटी (प्रति क्षेत्र नियोक्ताओं की न्यूनतम संख्या) को पूरा करता है, और मैंने इसे थोड़ी देर के लूप के अंदर रखा, जो मैक्स-पी के किसी भी समाधान को अस्वीकार कर देगा जो कि भी नहीं दूसरी कसौटी पर खरा उतरना (किसी क्षेत्र में सबसे बड़े नियोक्ता द्वारा योगदान दिया गया रोजगार का प्रतिशत)। मैंने इसे आर्कजीआईएस टूल के रूप में लागू किया है।

मैंने उस कार्य को स्क्रैप करने का निर्णय लिया, जिसे मैंने पहले ब्लॉक / ब्लॉकग्रुप / ट्रैक्स को फ्लैग करने के लिए किया था और इसके बजाय ब्लॉकों पर मैक्स-पी चलाया (हालांकि मैं ट्रैक्स पर अपने सभी परीक्षण कर रहा हूं, इनपुट पॉलीगनों की संख्या में मामूली वृद्धि हुई है प्रसंस्करण समय पर एक नाटकीय प्रभाव)। मेरे कोड का प्रासंगिक हिस्सा निम्नानुसार है। 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। पीडीएफ स्वतंत्र रूप से उपरोक्त लिंक पर प्रोजेक्ट यूक्लिड से उपलब्ध है।

मेरे पास कई अन्य लेखों के कुछ लिंक भी हैं जो मेरे citeulike लाइब्रेरी में उस टैग पर "जियोमास्किंग" पर चर्चा करते हैं (हालांकि सभी सख्ती से भौगोलिक डेटा से संबंधित नहीं हैं)।

यद्यपि यह आपके प्रश्न का उत्तर नहीं देता है, लेकिन यह संभव है कि मैथ्यू और ओफर लेख में सूचीबद्ध कुछ तकनीकों को अपनी आवश्यकताओं को पूरा करने के लिए लागू करना आसान हो। विशेष रूप से सिंथेटिक डेटा का निर्माण एक तार्किक विस्तार की तरह लगता है जहां आप जा रहे थे (यदि आवश्यक हो तो बाहरी डेटा आसपास के जनगणना ब्लॉक समूह या ट्रैक्ट या काउंटी से उधार लिया जाएगा)। साथ ही कुछ प्रकार के डेटा स्वैपिंग (अंतरिक्ष में) भी लागू करना आसान हो सकता है।


उत्तर / टिप्पणी के लिए धन्यवाद। मैं गोपनीयता की रक्षा करते हुए सांख्यिकीय वैधता बनाए रखने के लिए डेटा को ठगने के तरीकों के अस्तित्व से अवगत हूं, हालांकि उस कागज ने मुझे बारीकियों को थोड़ा बेहतर समझने में मदद की है। दुर्भाग्य से, इस तरह की विधियां विशेष रूप से मेरी स्थिति पर लागू नहीं होती हैं, जब एकमात्र सूचना जो मैं जारी कर रहा हूं, किसी दिए गए क्षेत्र में नियोक्ताओं और कर्मचारियों की संख्या है: उनके चारों ओर फेरबदल करना अनिवार्य रूप से उनके आधार पर किसी भी विश्लेषण की वैधता को प्रभावित करेगा, नहीं?
nmpeterson

एकत्रीकरण संभावित रूप से विश्लेषण को प्रभावित करता है। हालांकि, सामान्य सलाह देना मुश्किल है, और आपके अंतिम उत्पाद को यह निर्देशित करना चाहिए कि लोग बाद में डेटा के साथ क्या करने जा रहे हैं। मैं कुछ स्थितियों की कल्पना कर सकता हूं जहां परिवर्तनशील इकाइयों की अंतिम इकाइयाँ बनाना समस्याग्रस्त होगा। उदाहरण के लिए, अगर मैं नियोक्ताओं के बीच ढेर / प्रतिस्पर्धा की तुलना करने में रुचि रखता था, तो विभिन्न इकाइयाँ इसमें दर्द होगी, खासकर अगर मैं इसे जनगणना के अन्य जनसांख्यिकीय आंकड़ों से जोड़ना चाहता हूं।
एंडी डब्ल्यू

उस उदाहरण में, मेरे पास विश्लेषण की एक इकाई होगी जिसमें मनमानी मात्रा में त्रुटि शामिल है, लेकिन मुझे यकीन है कि आप अन्य उपयोगों के बारे में सोच सकते हैं जहां एकत्रीकरण और (सैद्धांतिक रूप से) कोई त्रुटि बेहतर नहीं होगी।
एंडी डब्ल्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.