Gizlilik Gereksinimlerini Karşılamak için Çokgenleri Birleştirme


10

Belirli bir sektördeki tüm işverenlerin ofis konumlarını temsil eden bir nokta özellik sınıfım var. Feature sınıfı, her ofiste çalışanların sayısını saklama özelliğine sahiptir. Birisi, mümkün olan en küçük coğrafi birime (bu durumda Sayım Blokları) mekansal olarak birleştirilen bu verileri kullanmak istedi. Ancak, bir gizlilik sözleşmesi verilerin yayınlanmasını olduğu gibi engeller. Bunun yerine, iki kriteri karşılaması gerekir:

  1. Herhangi bir çokgen en az 3 işveren (puan) içermelidir;
  2. Bir poligon içindeki toplam istihdamın% 80'inden fazlası tek bir işveren tarafından gerçekleştirilemez.

Her biri toplam ve maksimum istihdam tutarak mekansal olarak sayım bloklarına noktaları birleştiren bir senaryo yazdım. Bastırma kriterlerini karşılamayan her biri işaretlenir. (Hiçbir nokta içermeyen çokgenler işaretlenmez, çünkü bastırılacak veri yoktur.) Daha sonra her Blok Grubunu , içinde işaretlenmiş Blokların bulunup bulunmadığını görmek için kontrol ederim . Yalnızca işaretlenmemiş Blokları içeren Blok Grupları daha sonra Bloklarla değiştirilir. Sonuçta elde edilen özellikler sınıfı, Blok Gruplarının verileri yeterince bastırıp bastırmadığını kontrol etmek için bastırma kriterlerine göre kontrol edilir.

Aynı işlem, Tracts için tekrarlanır ve beni Tracts (bazıları işaretlenmiş ve bazıları değil), Block Groups and Blocks (tümü işaretsiz) içeren bir veri kümesi bırakır. Bununla birlikte, coğrafi hiyerarşideki bir sonraki ilerleme, bu verileri isteyen kişiye hiçbir fayda sağlamayan ilçedir.

O zaman sorum şu: Çokgenleri mümkün olduğunca çok gruba toplamak için yaygın olarak kabul edilen herhangi bir yöntem var mı, böylece hepsi bazı minimum kriterleri karşılar mı?

Toplamaya uygulamak istediğim bazı kurallar:

  • Mümkün olduğunda, işaretli Traktörler yalnızca diğer işaretli Traktörlerle toplanmalıdır;
  • Başkaları ile bitişik olmayan işaretli Traktörler (veya hala kriterleri karşılamayan izole gruplar) için, aralarında ayrıca işveren bulunmayan Traktörler de bulunabilmesine rağmen, zaten kriterlere uyan Tracts ile birleştirilebilirler. dahil edilmesi gerekiyor.
  • Kesinlikle imkansız olmadıkça ilçe sınırlarını sağlam tutmak istiyorum (ve bunu işlemden önce girdi özelliklerini ilgili ilçelere ayırarak yapmayı umuyorum).
  • Çözüm, ArcGIS araçları veya açık kaynaklı Python kitaplıkları kullanılarak Python'da olmalıdır.

İdeal olarak, birisi beni bu toplama işlemini uygulamak için mevcut bir yola yönlendirebilir. Değilse, belirli adımların / araçların bir listesi çok takdir edilecektir, ancak algoritmayı kendim kodlamak için mutluyum. Sorun, (bitişik çokgenlerle) özel bir yeniden dağıtım örneği olarak karşımıza çıkıyor ve bu amaçla PySAL'ın bölgeselleştirme algoritmalarını kullanmayı araştırdım , ancak bunları kullanan toplam çalışanların maksimum çalışan yüzdesini nasıl kontrol edeceğim açık değil .

Yanıtlar:


5

Merak eden herkes için, PySAL'in bölgesini kullanarak kendi başıma bir çözüm buldum.Maxp algoritması . Esasen, Max-p ilk ölçütümü karşılayan bir dizi bölge oluşturmama izin veriyor (bölge başına minimum işveren sayısı) ve bunu bir süre döngüsüne koyuyorum, bu da Max-p'nin ikinci kriteri yerine getirme (bir bölgedeki en büyük işverenin katkıda bulunduğu istihdam yüzdesi). Bunu bir ArcGIS aracı olarak uyguladım.

Daha önce yaptığım işi bloklara / blok gruplarına / trac'lara işaretlemeye karar verdim ve bunun yerine Max-p'yi bloklar üzerinde çalıştırdım (her testimi traktörler üzerinde yapmama rağmen, giriş çokgenlerinin sayısında mütevazı bir artış olduğu için) işlem süresi üzerinde dramatik bir etki). Kodumun ilgili kısmı aşağıdaki gibidir. generate_regions()İşlev için girdi olarak gerekli olan "şekil dosyası" (şekil dosyasının tam yolunu içeren bir dize olarak geçirilir), işverenlerin mekansal olarak katılmış olduğu noktalara sahip olan, işveren sayısı ile tek bir işverenin maksimum çalışanıdır. ve her giriş özelliği için bir özellik olarak depolanan toplam çalışan.

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

Daha önce böyle bir durumla karşılaşmadım ve daha yaygın bir yolun, önceden karar verdiğiniz birimleri önceden tutmak ve daha sonra gizlilik endişelerini korumak için verileri "değiştirmek" için farklı teknikler kullanmak olduğuna inanıyorum .

İnsanların verileri maskeleme yollarına sayısız giriş için bu makaleyi öneririm;

Matthews, Gregory J. ve Ofer Harel. 2011. Veri gizliliği: İstatistiksel açıklama sınırlaması yöntemlerinin ve gizliliği değerlendirme yöntemlerinin gözden geçirilmesi . İstatistik Anketleri 5 : 1-29. PDF, yukarıdaki linkten Project Euclid'den ücretsiz olarak edinilebilir.

Ayrıca citeulike kütüphanemde bu etiket "geomasking" tartışmak çeşitli diğer makalelere bağlantılar var (hepsi kesinlikle coğrafi verilerle ilgili değildir).

Bu, sorunuza cevap vermese de, Matthews ve Ofer makalesinde listelenen tekniklerin bazılarının, ihtiyaçlarınızı karşılamak için uygulanması daha kolay olabilir. Özellikle sentetik verilerin hazırlanması, gittiğiniz yerin mantıksal bir uzantısı gibi görünmektedir (dış veriler, gerekirse sayım bloğu grubundan veya yoldan veya ilçeden ödünç alınacaktır). Ayrıca bazı veri takas türlerinin (uzayda) uygulanması da daha kolay olabilir.


Cevabınız / yorumunuz için teşekkürler. Gizliliği korurken istatistiki geçerliliği korumak için verilerin ilerletilmesine yönelik yöntemlerin varlığının farkındayım, ancak bu makale, özellikleri biraz daha iyi anlamama yardımcı oldu. Ne yazık ki, bu tür yöntemler durumum için özellikle geçerli görünmüyor, serbest bıraktığım tek bilgi belirli bir alandaki işveren ve çalışan sayısı olduğunda: bunları karıştırmak kaçınılmaz olarak onlara dayalı herhangi bir analizin geçerliliğini etkileyecektir, değil mi?
nmpeterson

Toplama, analizi potansiyel olarak benzer bir şekilde etkiler. Yine de genel tavsiye vermek zordur ve son ürününüz, insanların daha sonra verilerle ne yapacağına göre yönlendirilmelidir. Değişken toplamaların uç birimlerini oluşturmanın sorun yaratabileceği bazı durumlar hayal edebiliyorum. Örneğin, işverenler arasındaki yığılmayı / rekabeti karşılaştırmakla ilgileniyor olsaydım, farklı birimler bir acı olurdu, ama özellikle devam etmek ve nüfus sayımından diğer demografik verilere bağlamak istersem.
Andy W

Bu durumda, isteğe bağlı miktarda hata içeren bir analiz birimine sahip olmayı tercih ederim, ancak eminim ki toplama ve (teorik olarak) hiçbir hatanın tercih edilmeyeceği diğer kullanımları düşünebilirsiniz.
Andy W
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.