Aracılığıyla paylaş


Öğretici: Anlamsal bağlantıyı kullanarak Synthea veri kümesindeki ilişkileri bulma

Bu öğretici, genel Synthea veri kümesinde semantik bağlantı kullanarak ilişkilerin nasıl algılandığını göstermektedir.

Yeni verilerle çalışırken veya mevcut bir veri modeli olmadan çalışırken, ilişkileri otomatik olarak keşfetmek yararlı olabilir. Bu ilişki algılama aşağıdakilere yardımcı olabilir:

  • modeli yüksek düzeyde anlamak,
  • keşif veri analizi sırasında daha fazla içgörü elde etmek,
  • güncelleştirilmiş verileri veya yeni, gelen verileri doğrulama ve
  • verileri temizle

İlişkiler önceden bilinse bile, ilişkiler araması veri modelinin daha iyi anlaşılmasına veya veri kalitesi sorunlarının belirlenmesine yardımcı olabilir.

Bu öğreticide, aralarındaki bağlantıların kolayca takip edebilmesi için yalnızca üç tabloyla denemeler yaptığınız basit bir temel örnekle başlayacaksınız. Daha sonra, daha büyük bir tablo kümesiyle daha karmaşık bir örnek gösterirsiniz.

Bu öğreticide şunların nasıl yapılacağını öğreneceksiniz:

  • Semantik bağlantının Python kitaplığının (SemPy) Power BI ile tümleştirmeyi destekleyen ve veri analizini otomatikleştirmeye yardımcı olan bileşenlerini kullanın. Bu bileşenler şunlardır:
    • FabricDataFrame - ek anlam bilgileriyle geliştirilmiş pandas benzeri bir yapı.
    • Fabric çalışma alanından not defterinize anlamsal modeller çekmek için işlevler.
    • Anlamsal modellerinizdeki ilişkileri bulma ve görselleştirmeyi otomatik hale getiren işlevler.
  • Birden çok tablo ve bağımlılık içeren anlam modelleri için ilişki bulma işleminin sorunlarını giderin.

Önkoşullar

  • Çalışma alanınızı bulmak ve seçmek için sol gezinti bölmesinden çalışma alanları seçin. Bu çalışma alanı, geçerli çalışma alanınız olur.

Not defterini takip edin

relationships_detection_tutorial.ipynb not defteri bu öğreticiye eşlik eder.

  • Bu öğretici için eşlik eden not defterini açmak amacıyla sisteminizi veri bilimi öğreticilerine hazırlama başlığındaki yönergeleri izleyerek not defterini çalışma alanınıza aktarın.

  • Bu sayfadaki kodu kopyalayıp yapıştırmayı tercih ederseniz, yeni bir not defteri oluşturabilirsiniz.

  • Kod çalıştırmaya başlamadan önce, not defterine bir gölevi eklemenizden emin olun.

Dizüstü bilgisayarı ayarla

Bu bölümde, gerekli modüller ve verilerle bir not defteri ortamı ayarlarsınız.

  1. Not defterindeki %pip satır içi yükleme özelliğini kullanarak PyPI'den SemPy yükleyin:

    %pip install semantic-link
    
  2. Daha sonra ihtiyacınız olacak SemPy modüllerinin gerekli içeri aktarmalarını gerçekleştirin:

    import pandas as pd
    
    from sempy.samples import download_synthea
    from sempy.relationships import (
        find_relationships,
        list_relationship_violations,
        plot_relationship_metadata
    )
    
  3. Çıktı biçimlendirmeye yardımcı olan bir yapılandırma seçeneğini zorlamak için pandas'ı içeri aktar:

    import pandas as pd
    pd.set_option('display.max_colwidth', None)
    
  4. Örnek verileri çekin. Bu eğitimde, sentetik tıbbi kayıtların Synthea veri kümesinin (küçük sürümü basitlik için) versiyonunu kullanırsınız.

    download_synthea(which='small')
    

Synthea tablolarının küçük bir alt kümesindeki ilişkileri algılama

  1. Daha büyük bir kümeden üç tablo seçin:

    • patients hasta bilgilerini belirtir
    • encounters, tıbbi karşılaşmaları olan hastaları belirtir (örneğin, tıbbi randevu, prosedür)
    • providers hangi sağlık hizmeti sağlayıcılarının hastalarla ilgilendiğini belirtir

    encounters tablosu, patients ile providers arasındaki çoka çok ilişkisini çözer ve ilişkisel varlıkolarak tanımlanabilir.

    patients = pd.read_csv('synthea/csv/patients.csv')
    providers = pd.read_csv('synthea/csv/providers.csv')
    encounters = pd.read_csv('synthea/csv/encounters.csv')
    
  2. SemPy'nin find_relationships işlevini kullanarak tablolar arasındaki ilişkileri bulun:

    suggested_relationships = find_relationships([patients, providers, encounters])
    suggested_relationships
    
  3. SemPy'nin plot_relationship_metadata işlevini kullanarak DataFrame ilişkilerini grafik olarak görselleştirin.

    plot_relationship_metadata(suggested_relationships)
    

    Veri kümesindeki tablolar arasındaki ilişkileri gösteren ekran görüntüsü.

    İşlev, çıkıştaki "from" ve "to" tablolarına karşılık gelen ilişki hiyerarşisini sol taraftan sağ tarafa doğru düzenler. Başka bir deyişle, sol taraftaki bağımsız "from" tabloları, sağ taraftaki "to" bağımlılık tablolarına işaret etmek için yabancı anahtarlarını kullanır. Her bir varlık kutusu, bir ilişkinin "giden" veya "gelen" tarafına katılan sütunları gösterir.

    Varsayılan olarak, ilişkiler "m:1" ("1:m" veya "1:1" olarak oluşturulmaz) olarak oluşturulur. "1:1" ilişkileri, eşlenen değerlerin tüm değerlere oranının yalnızca bir veya iki yönde coverage_threshold aşıp aşmamalarına bağlı olarak bir veya iki şekilde oluşturulabilir. Bu eğitimde ilerleyen bölümlerde "m:m" ilişkilerinin nadir görülen durumlarını ele alıyoruz.

İlişki algılama sorunlarını giderme

Temel örnekte temiz Synthea verilerinde başarılı bir ilişki algılama gösterilmektedir. Uygulamada, veriler nadiren temizdir ve bu da başarılı algılamayı önler. Veriler temiz olmadığında yararlı olabilecek çeşitli teknikler vardır.

Bu öğreticinin bu bölümü, anlam modeli kirli veriler içerdiğinde ilişki algılamayı ele alır.

  1. "Kirli" verileri almak için özgün DataFrame'leri işleyerek başlayın ve kirli verilerin boyutunu yazdırın.

    # create a dirty 'patients' dataframe by dropping some rows using head() and duplicating some rows using concat()
    patients_dirty = pd.concat([patients.head(1000), patients.head(50)], axis=0)
    
    # create a dirty 'providers' dataframe by dropping some rows using head()
    providers_dirty = providers.head(5000)
    
    # the dirty dataframes have fewer records than the clean ones
    print(len(patients_dirty))
    print(len(providers_dirty))
    
    
  2. Karşılaştırma için, özgün tabloların boyutlarını yazdırın:

    print(len(patients))
    print(len(providers))
    
  3. SemPy'nin find_relationships işlevini kullanarak tablolar arasındaki ilişkileri bulun:

    find_relationships([patients_dirty, providers_dirty, encounters])
    

    Kodun çıktısı, "kirli" bir anlam modeli oluşturmak için daha önce yaptığınız hatalar nedeniyle herhangi bir ilişkinin algılanmadığını gösteriyor.

Doğrulamayı kullanma

Doğrulama, aşağıdakilerden dolayı ilişki algılama hatalarını gidermek için en iyi araçtır:

  • Belirli bir ilişkinin neden Yabancı Anahtar kurallarına uymadığı ve bu nedenle algılanamadığına ilişkin net bir şekilde bildirir.
  • Yalnızca bildirilen ilişkilere odaklandığı ve arama gerçekleştirmediği için büyük anlamsal modellerle hızlı çalışır.

Doğrulama, find_relationshipstarafından oluşturulana benzer sütunlara sahip herhangi bir DataFrame kullanabilir. Aşağıdaki kodda, suggested_relationships DataFrame patients_dirtyyerine patients'e atıfta bulunur, ancak DataFrame'lere bir sözlükle farklı isimler verebilirsiniz:

dirty_tables = {
    "patients": patients_dirty,
    "providers" : providers_dirty,
    "encounters": encounters
}

errors = list_relationship_violations(dirty_tables, suggested_relationships)
errors

Arama ölçütlerini gevşetme

Daha bulanık senaryolarda arama ölçütlerinizi gevşetmeyi deneyebilirsiniz. Bu yöntem hatalı pozitif olasılığını artırır.

  1. include_many_to_many=True ayarlayın ve yardımcı olup olmadığını değerlendirin:

    find_relationships(dirty_tables, include_many_to_many=True, coverage_threshold=1)
    

    Sonuçlar, encounters ile patients ilişkisinin algılandığını gösterir, ancak iki sorun vardır:

    • İlişki, beklenen ilişkinin tersi olan patients'dan encounters'e bir yön gösterir. Bunun nedeni tüm patientsencounters (Coverage From 1,0) kapsamında olması, encounters ise hastaların satırları eksik olduğundan yalnızca kısmen patients (Coverage To = 0,85) kapsamında olmasıdır.
    • Düşük kardinalite GENDER sütununda yanlışlıkla bir eşleşme oluşmuştur ve bu her iki tabloda da isim ve değer açısından eşleşir, ancak bu ilgi çekici bir "m:1" ilişkisi değildir. Düşük kardinalite, Unique Count From ve Unique Count To sütunlarıyla gösterilir.
  2. Sadece "m:1" ilişkilerini aramak için find_relationships tekrar çalıştırın, ancak daha düşük bir coverage_threshold=0.5ile:

    find_relationships(dirty_tables, include_many_to_many=False, coverage_threshold=0.5)
    

    Sonuç, encounters ile providersarasındaki ilişkilerin doğru yönünü gösterir. Ancak, patients benzersiz olmadığından encounters ile patients arasındaki ilişki algılanamaz, bu nedenle "m:1" ilişkisinin "Bir" tarafında olamaz.

  3. hem include_many_to_many=True hem de coverage_threshold=0.5gevşetin:

    find_relationships(dirty_tables, include_many_to_many=True, coverage_threshold=0.5)
    

    Artık her iki ilgi ilişkisi de görünür durumdadır, ancak çok daha fazla gürültü vardır:

    • GENDER üzerinde bir düşük kardinalite eşleşmesi mevcut.
    • ORGANIZATION üzerinde daha yüksek kardinaliteye sahip bir "m:m" eşleşmesi ortaya çıktı ve bu, ORGANIZATION'in her iki tabloya da denormalize edilmiş bir sütun olduğunu gösterir.

Sütun adlarını eşleştir

Varsayılan olarak SemPy, veritabanı tasarımcılarının ilgili sütunları genellikle aynı şekilde adlandırmalarından yararlanarak yalnızca ad benzerliğini gösteren özniteliklerle eşleşir. Bu davranış, en sık düşük kardinaliteli tamsayı anahtarlarıyla oluşan sahte ilişkileri önlemeye yardımcı olur. Örneğin, 1,2,3,...,10 ürün kategorisi ve 1,2,3,...,10 sipariş durumu kodu varsa, yalnızca sütun adlarını hesaba katmadan değer eşlemelerine bakarken birbirleriyle karıştırılırlar. Sahte ilişkiler GUID benzeri anahtarlarla ilgili bir sorun olmamalıdır.

SemPy, sütun adları ile tablo adları arasındaki benzerliğe bakar. Eşleştirme yaklaşık olup büyük/küçük harfe duyarlı değildir. "id", "code", "name", "key", "pk", "fk" gibi en sık karşılaşılan "dekoratör" alt dizelerini yoksayar. Sonuç olarak, en tipik eşleşme durumları şunlardır:

  • 'foo' varlığındaki 'column' adlı öznitelik, 'bar' varlığındaki 'column' (aynı zamanda 'COLUMN' veya 'Column') adlı bir öznitelikle eşleşir.
  • 'foo' varlığındaki 'column' adlı bir öznitelik, 'bar' içindeki 'column_id' adlı bir öznitelikle eşleşir.
  • 'foo' varlığındaki 'bar' adlı bir öznitelik, 'bar' içindeki 'code' adlı bir öznitelikle eşleşir.

Önce sütun adlarını eşleştirerek algılama daha hızlı çalışır.

  1. Sütun adlarını eşleştirin:

    • Daha fazla değerlendirme için hangi sütunların seçildiğini anlamak için verbose=2 seçeneğini kullanın (verbose=1 yalnızca işlenen varlıkları listeler).
    • name_similarity_threshold parametresi sütunların nasıl karşılaştırılmasını belirler. 1 eşiği, sadece 100% eşleşmesiyle ilgilendiğinizi gösterir.
    find_relationships(dirty_tables, verbose=2, name_similarity_threshold=1.0);
    

    100% benzerlikle çalıştırma işlemi, adlar arasındaki küçük farkları hesaba katmıyor. Örneğinizde, tabloların "s" soneki olan çoğul bir formu vardır ve bu da tam eşleşmeye neden olmaz. Bu, varsayılan name_similarity_threshold=0.8ile iyi yönetilir.

  2. Varsayılan name_similarity_threshold=0.8ile yeniden çalıştırın:

    find_relationships(dirty_tables, verbose=2, name_similarity_threshold=0.8);
    

    Çoğul form patients kimliğinin artık yürütme süresine çok fazla başka sahte karşılaştırma eklemeden tekil patient ile karşılaştırıldığını görebilirsiniz.

  3. Varsayılan name_similarity_threshold=0ile yeniden çalıştırın:

    find_relationships(dirty_tables, verbose=2, name_similarity_threshold=0);
    

    name_similarity_threshold 0 olarak değiştirmek diğer aşırılıktır ve tüm sütunları karşılaştırmak istediğinizi gösterir. Bu nadiren gereklidir ve daha fazla yürütme süresine ve gözden geçirilmesi gereken sahte eşleşmelere neden olur. Ayrıntılı çıktıdaki karşılaştırma sayısını gözlemleyin.

Sorun giderme ipuçlarının özeti

  1. "m:1" ilişkileri için tam eşleşmeden başlayın (yani varsayılan include_many_to_many=False ve coverage_threshold=1.0). Bu genellikle istediğiniz şey.
  2. Tabloların daha küçük alt kümelerinde dar bir odak kullanın.
  3. Veri kalitesi sorunlarını algılamak için doğrulamayı kullanın.
  4. İlişki için hangi sütunların dikkate alındığını anlamak istiyorsanız verbose=2 kullanın. Bu, büyük miktarda çıkışa neden olabilir.
  5. Arama kriterlerinin ödünlerine dikkat edin. include_many_to_many=True ve coverage_threshold<1.0, analiz edilmesi zor olabilecek ve filtrelenmiş olması gerekebilecek sahte ilişkiler üretebilir.

Tam Synthea veri kümesindeki ilişkileri algılama

Basit temel örnek, kullanışlı bir öğrenme ve sorun giderme aracıydı. Uygulamada, çok daha fazla tablo içeren tam Synthea veri kümesi gibi bir anlam modelinden başlayabilirsiniz. Tam synthea veri kümesini aşağıda gösterildiği gibi keşfedin.

  1. synthea/csv dizinindeki tüm dosyaları okuyun:

    all_tables = {
        "allergies": pd.read_csv('synthea/csv/allergies.csv'),
        "careplans": pd.read_csv('synthea/csv/careplans.csv'),
        "conditions": pd.read_csv('synthea/csv/conditions.csv'),
        "devices": pd.read_csv('synthea/csv/devices.csv'),
        "encounters": pd.read_csv('synthea/csv/encounters.csv'),
        "imaging_studies": pd.read_csv('synthea/csv/imaging_studies.csv'),
        "immunizations": pd.read_csv('synthea/csv/immunizations.csv'),
        "medications": pd.read_csv('synthea/csv/medications.csv'),
        "observations": pd.read_csv('synthea/csv/observations.csv'),
        "organizations": pd.read_csv('synthea/csv/organizations.csv'),
        "patients": pd.read_csv('synthea/csv/patients.csv'),
        "payer_transitions": pd.read_csv('synthea/csv/payer_transitions.csv'),
        "payers": pd.read_csv('synthea/csv/payers.csv'),
        "procedures": pd.read_csv('synthea/csv/procedures.csv'),
        "providers": pd.read_csv('synthea/csv/providers.csv'),
        "supplies": pd.read_csv('synthea/csv/supplies.csv'),
    }
    
  2. SemPy'nin find_relationships işlevini kullanarak tablolar arasındaki ilişkileri bulun:

    suggested_relationships = find_relationships(all_tables)
    suggested_relationships
    
  3. İlişkileri görselleştirme:

    plot_relationship_metadata(suggested_relationships)
    

    Tablolar arasındaki ilişkilerin ekran görüntüsü.

  4. Kaç yeni "m:m" ilişkisi include_many_to_many=Trueile keşfedilecek, sayın. Bu ilişkiler, daha önce gösterilen "m:1" ilişkilerine ek olarak, bu nedenle, multiplicityüzerinde filtreleme yapmanız gerekir.

    suggested_relationships = find_relationships(all_tables, coverage_threshold=1.0, include_many_to_many=True) 
    suggested_relationships[suggested_relationships['Multiplicity']=='m:m']
    
  5. İlişki verilerini çeşitli sütunlara göre sıralayarak bunların doğasını daha iyi anlayabilirsiniz. Örneğin, çıktıyı Row Count From ve en büyük tabloları tanımlamaya yardımcı olan Row Count Togöre sıralamayı seçebilirsiniz.

    suggested_relationships.sort_values(['Row Count From', 'Row Count To'], ascending=False)
    

    Farklı bir anlam modelinde, Null Count From veya Coverage Tonull değer sayısına odaklanmak önemli olabilir.

    Bu analiz, ilişkilerden herhangi birinin geçersiz olup olmadığını ve bunları aday listesinden kaldırmanız gerekip gerekmediğini anlamanıza yardımcı olabilir.

Anlamsal bağlantı / SemPy için diğer öğreticilere göz atın: