Öğ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
Microsoft Fabric aboneliği alın. Ya da ücretsiz Microsoft Fabric deneme sürümünekaydolun.
Microsoft Fabrichesabınıza giriş yapın.
Ana sayfanızın sol alt köşesindeki deneyim değiştiriciyi kullanarak Fabric'e geçin.
- Ç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.
Not defterindeki
%pip
satır içi yükleme özelliğini kullanarak PyPI'denSemPy
yükleyin:%pip install semantic-link
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 )
Çı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)
Ö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
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
ileproviders
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')
-
SemPy'nin
find_relationships
işlevini kullanarak tablolar arasındaki ilişkileri bulun:suggested_relationships = find_relationships([patients, providers, encounters]) suggested_relationships
SemPy'nin
plot_relationship_metadata
işlevini kullanarak DataFrame ilişkilerini grafik olarak görselleştirin.plot_relationship_metadata(suggested_relationships)
İş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.
"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))
Karşılaştırma için, özgün tabloların boyutlarını yazdırın:
print(len(patients)) print(len(providers))
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_relationships
tarafından oluşturulana benzer sütunlara sahip herhangi bir DataFrame kullanabilir. Aşağıdaki kodda, suggested_relationships
DataFrame patients_dirty
yerine 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.
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
ilepatients
ilişkisinin algılandığını gösterir, ancak iki sorun vardır:- İlişki, beklenen ilişkinin tersi olan
patients
'danencounters
'e bir yön gösterir. Bunun nedeni tümpatients
encounters
(Coverage From
1,0) kapsamında olması,encounters
ise hastaların satırları eksik olduğundan yalnızca kısmenpatients
(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
veUnique Count To
sütunlarıyla gösterilir.
- İlişki, beklenen ilişkinin tersi olan
Sadece "m:1" ilişkilerini aramak için
find_relationships
tekrar çalıştırın, ancak daha düşük bircoverage_threshold=0.5
ile:find_relationships(dirty_tables, include_many_to_many=False, coverage_threshold=0.5)
Sonuç,
encounters
ileproviders
arasındaki ilişkilerin doğru yönünü gösterir. Ancak,patients
benzersiz olmadığındanencounters
ilepatients
arasındaki ilişki algılanamaz, bu nedenle "m:1" ilişkisinin "Bir" tarafında olamaz.hem
include_many_to_many=True
hem decoverage_threshold=0.5
gevş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.
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.8
ile iyi yönetilir.- Daha fazla değerlendirme için hangi sütunların seçildiğini anlamak için
Varsayılan
name_similarity_threshold=0.8
ile 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 tekilpatient
ile karşılaştırıldığını görebilirsiniz.Varsayılan
name_similarity_threshold=0
ile 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
- "m:1" ilişkileri için tam eşleşmeden başlayın (yani varsayılan
include_many_to_many=False
vecoverage_threshold=1.0
). Bu genellikle istediğiniz şey. - Tabloların daha küçük alt kümelerinde dar bir odak kullanın.
- Veri kalitesi sorunlarını algılamak için doğrulamayı kullanın.
- İ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. - Arama kriterlerinin ödünlerine dikkat edin.
include_many_to_many=True
vecoverage_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.
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'), }
SemPy'nin
find_relationships
işlevini kullanarak tablolar arasındaki ilişkileri bulun:suggested_relationships = find_relationships(all_tables) suggested_relationships
İlişkileri görselleştirme:
plot_relationship_metadata(suggested_relationships)
Kaç yeni "m:m" ilişkisi
include_many_to_many=True
ile 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']
İ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ı olanRow Count To
göre sıralamayı seçebilirsiniz.suggested_relationships.sort_values(['Row Count From', 'Row Count To'], ascending=False)
Farklı bir anlam modelinde,
Null Count From
veyaCoverage To
null 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.
İlgili içerik
Anlamsal bağlantı / SemPy için diğer öğreticilere göz atın: