İleri Analitik Yöntemlerle Veri Kalitesi Takibi

Volkan Yurtseven
Akbank Teknoloji
Published in
7 min readMar 24, 2023

Veri, bir organizasyondaki karar ve strateji süreçlerini direkt olarak etkileyen, günümüz iş teknolojisinin en önemli parçalarından biri. Var olan verinin kullanışlı ve yararlı olup olmaması baştan sona tüm planlamaları etkileyebilir. İşte bu noktada veri kalitesinin kontrol edilme ihtiyacı ortaya çıkar. Peki veri kalitesi nasıl kontrol edilir? Nasıl takip edilir?

Akbank Veri Ofisi olarak veri yönetim faaliyetlerini yürütürken en önem verdiğimiz konulardan bir tanesi de iş sözlüğünde tanımladığımız terimlerin kalitesini ölçmek. Tüm bu ölçümleri yaparken de literatürde tanımlanmış ve kabul görmüş 7 boyutlu geleneksel kurallardan faydalanıyoruz. Veri danışmanlarımız, bu kuralları veri sorumlusu (Data Steward) ve BT veri sorumlusu (Data Custodian) ile tanımlıyor, ardından Veri Kalitesi ekibimize yönlendiriyor.

Yukarıda bahsi geçen 7 boyutun detaylarına başka bir yazıda değineceğiz. Şu an için aşağıdaki örneklerin fikir vereceğini düşünüyorum:

· X kolonu dolu olmalı.

· X tipli kodların alabildiği değerler 1, 2, 3’tür.

· X ürün bakiyesi pozitif olmalı.

· X kolonu dolu ise Y kolonu da dolu olmalı.

· X kolonu her zaman Y kolonunda büyük olmalı.

Bu tür kurallar yazmanın iki temel kısıtı bulunmaktadır:

· İş bilgisine hakimiyet ve dolayısıyla işbirimi dahiliyeti

· Basit olmaları ve karmaşık ilişkilerin kurulamaması.

Bu nedenle Veri Kalitesi çalışmalarına İstatistiki ve Makine Öğrenimi bazlı yaklaşımlar getirmek istedik. Bunun için farklı ekiplerden arkadaşlarımızın katılımıyla bir proje takımı oluşturduk ve 1 yıl sürecek çalışmamıza başladık. (Bu yazının kaleme alındığı tarihte çalışmalar devam etmekteydi. Projede finale ulaşılmasına ise birkaç ay kalmıştı.)

Biz bu projede 2 ana çalışma yapmaktayız:

- IQR yöntemi ile univariate ve trendlerdeki anomali (Outlier) tespiti

- Makine Öğrenimi ile kolonlar arası anomali tespiti

Haydi gelin, biraz daha detaylara inelim!

IQR Analizi

IQR konusunu anlamak için boxplot yapısını incelemekte her zaman fayda var.

Nümerik bir kolon için alt ve üst sınır olarak sırayla Q1–1.5*IQR ile Q3+1.5*IQR noktalarını belirleyip bunları bir tabloya basıyoruz, bu sınırların dışındaki değerleri de anomali olarak işaretliyoruz. Anomali gösteren kayıtlarla birlikte bu kayıtlardaki değerlerin referans aralık sınırlarından ne kadar saptığını gösteren oranları da yani outlier’lik derecesini de kullanıcıya sunuyoruz. Örneğin; uygun aralık 50–800 arası olan bir durumda 801 de outlier, 150.000 de outlier’dır. Kullanıcının neye öncelik vereceğini bilmesi açısından 150000/800 ve 801/800 oranlarını da veriyoruz ki böylece daha kolay sıralama yapılabilsin.

IQR analizinde 5 alt çalışma bulunur:

1 — Univariate IQR analizi: Kayıt bazında anomali üretimi içindir. Örneğin;

Bu temel seviyedeki tespite ek olarak veriseti üzerinde her olası kategorik-nümerik kolon kombinasyonu için Anova Testi yaparak bir nümerik kolonun kategorik (boyutsal) bir kolon bazında önemli farklara sahip olup olmadığına bakıyor ve duruma göre bu nümerik kolonu bir veya birden fazla kolona kırarak sonuçlar üretiyoruz. Aşağıdaki örnekte gelir kolonunun bireysel ve ticari müşteriler bazında kırılıp ayrı ayrı üretilen referans aralıklarını görüyorsunuz. (Rakamlar temsilidir.)

2 — Tablo bazında genel adet trendi: Burada, tablodaki kayıt sayılarının trendine bakıyoruz. Örneğin aşağıdaki grafikte kırmızı işaretli günlerde genel trendden sapmayı görebiliyoruz. Burada da tıpkı univariate analizde olduğu gibi yine IQR aralıkları kullanılmaktadır.

3 — Nümerik kolonların doluluk adet trendi: Bu analizde ise genel adet trendinde sorun olup olmadığından ziyade dolu kayıt sayısındaki trendlere bakıyoruz. Üstteki görselde, Ekim 2022’deki kayıt sayısında bir anormallik yokken aşağıdaki grafikte o ay nümerik bir kolonda hiç veri gelmediği görülmekte. Bu analizi neden tüm kolonlarda değil de sadece nümerik kolonlarda yaptığımız merak ediyorsanız, cevap bir sonraki maddede sizi bekliyor.

4–Kategorik kolonların değer bazında trendi: Bu grafikte Ocak 2022’de gerek total kayıt gerek total dolu kayıt sayısı normalken, ilgili kolonun (cinsiyet) alabildiği değerler bazındaki doluluk adetlerinde bir anomali oluşmuş ve tüm kayıtlar “kadın” olarak gelmiştir. Tabii ki bu sorunu 3 numaralı çalışmada yakalayamazdık.

5–Kategorik kolonların nümerik kolonlar bazında ortalama trendi: Son olarak, bir üstteki çalışmaya benzeyen, ancak bu sefer adet değil de nümerik kolonlar bazındaki ortalama trendindeki anomalilere bakıyoruz. Burada da Şubat ve Eylül aylarında sırasıyla erkeklerin ve kadınların gelir ortalamasında normal trendden bir sapma görülmekte.

Bu son 4 analizi, ilk runtime sırasında son 3 yıllık veri üzerinden aylık, sonraki günlerde ise iş günü ve tatil günü bazında ayrı ayrı üretiyoruz.

Makine Öğrenimi ile Outlier Tespiti

Makine öğrenimi ile multidimensional bir veri setinde genel pattern’e uymayan anomaliler bulmaya çalışıyoruz. İlk etapta ikili kolon kombinasyonları üzerinden çalışmalara başlamış olsak da bunu daha sonra 3 ve 4 kolon için de genelleştireceğiz.

Nümerik kolonlarda yakalamak istediğimiz case’leri genelde bir scatter plot üzerinden anlatmak daha kolay olur. Aşağıdaki görselde iki kolon arasında yaklaşık 1–10’luk bir ilişki olduğu görülüyor, ancak bu değerlerden biri normal patternden sapmış ve 1–30 gibi bir orana ulaşmış, işte bu gerçek anlamda bir outlier’dır.

Tam burada belirtmemiz lazım ki, her outlier illa hatalı olmak zorunda değildir. Bu çıktıları her zaman ilgili iş biriminin incelemesi gerekir. Uygun gördükleri noktalarda ise BT ekiplerine düzeltme kaydı açabilirler.

Kategorik kolonlarda ise yakalamak istediğimiz durumları şu örnekle açıklayabiliriz. Diyelim ki müşterilerinizden inşaat işçisi meslek grubundan olanların tamamı erkek. Eğer veride sadece bir kadın çıkarsa, işte bu bir anomalidir ve yine ilgili iş birimi tarafından incelenmesi gerekir.

x500
x1

“Peki veri setinde onca kolon varken hangi ikili kolon kombinasyonuna bakacağınızı nasıl biliyorsunuz?” diye sorabilirsiniz. Burada cevap korelasyon değerlerinde yatıyor. Nümerik kolonlar için Pearson’s r katsayısına bakılırken, kategorikler için Cramer’s v değerine bakılır. İki yöntemin de kendi skalasına göre yüksek korelasyon demek olan eşiğin (sırayla 0.8 ve 0.5) üzerindeki değere sahip kolon kombinasyonları alınır. Kategorik-Nümerik için bir çalışmaya gerek duyulmaz. Çünkü onu halihazırda IQR analizindeki 5 numaralı çalışmanın yakalamasını bekleriz.

Korelasyonları belirledikten sonra sıra artık uygun bir model oluşturmaya geliyor. Öncelikle belirtmek isteriz ki Outlier/Anomali Detection üzerine geliştirilen algoritmaların büyük kısmı ağırlıklı olarak nümerik değerler üzerinde çalışacak şekilde kurgulanmıştır. Doğrudan kategorik-kategorik veri setleri için geliştirilen bir algoritma bulamadık.

Nümerikler için önerilen algoritmaların da çoğu (DBSCAN, KNN, Elliptic Envelope, LOF vb.) mesafe ölçümü yaptığı için bizim gibi büyük hacimli veri setlerinde çalışması computation complexity (Big O notasyonları çok yüksek) açısından imkansız hale gelmekte. Kalan algoritmalar (Isolation Forest) ise sistemi çökertmeden çalışabilmekte ancak hem çalışma süreleri uzun hem de false positive miktarı çok olmakta. (Her koşulda belirlemek zorunda olduğunuz bir oranda outlier ürettikleri için) Ayrıca false negative durumlar olduğunu, yani outlier olduğu halde bunları bir nedenden yakalayamadığını da gördük.

Kategorikler için önerilen ise genel olarak mevcut verinin one-hot encoding ile flat hale getirilip, sonrasında nümerik bazlı bir algoritmanın uygulanmasıdır. Bir veri 0–1 düzlemine geldiği ve bu değerler öklidyen uzayda bir anlam ifade etmediği için uzaklık ölçümü yapan algoritmalar burada anlamsız olmakta (veri seti küçük olsa bile). Biz yine de one-hote encoding yapıp isolation forest da denedik ancak hem süreler çok daha uzun oldu hem de başarı oranı oldukça düşük oldu.

Bu sebeplerden dolayı sonunda kendi algoritmamızı yazmak durumunda kaldık. Bu algoritmanın başarı düzeyi çok yüksek olup, optimizasyon ve genelleştirme çalışmaları devam etmektedir. Algoritmanın nasıl çalıştığını ve kod örneklerini de bir başka yazımıza saklayalım.

Kullanılan Araçlar ve Süreç

Çalışmamızın temelini Python kodları oluşturmaktadır.

Öncelikle seçilen tablonun profillemesi yapılmaktadır. Bu aşamada;

· Tablonun hangi kolonunun hangi veri tipinde okunacağını (float/integer türevleri, category, datetime),

· Hangi kolonların okunmayacağını (kardinalitesi 1 veya full olanların en baştan hariç bırıkılması ve yine yüksek kardinalitesi olan kategorik kolonların elle seçilmesi. Örn: Müşteri adı soyadı),

· Analiz sırasında hangi kolona nasıl davranılacağını (Kolon, veri tabanında nümerik olarak tutuluyor olsa bile biz onun kategorik gibi ele alınmasını isteyebiliyoruz. Örn: Şube kodu her ne kadar integer bir alan olsa da aslında kategorik(boyutsal) de bir veridir.),

· Hangi tarihsel alanların yaşlandırlıp nümerikleştirileceğini,

· Anova testi ile nümerik kolonların hangi kategorik kolonlar bazında kırılacağını belirliyoruz.

Profillemenin son bacağını ise IQR aralıklarının tespiti oluşturuyor. Tüm belirlediğimiz bu input’lar bir tabloya basılmakta, prod kodu ile testi yapılmakta ve deployment’a hazır hale getirilmektedir.

Veri işleme kütüphanesi olarak pandas’ı kullanmaktayız fakat Polar, Dask, PySpark gibi diğer birçok alternatifi de değerlendirmekteyiz. Biz büyük hacimli verilerde, IQR hesabını yaparken veri tabanı gücünden yararlanmayı tercih ediyoruz. Tabii ki Python içinde programatik olarak ürettiğimiz SQL’leri veri tabanı üzerinde çok yüksek performanslı bir şekilde çalıştırarak.

Geliştirmelerimiz bittiğinde bize ayrılan bir sunucuda kodlar çalıştırılacak ve sonuçlar yine veri tabanına basılacak; son adım olarak da Qlik Sense aracılığıyla ilgili iş birimlerine sunulacaktır.

Okuduğunuz için teşekkür ederim

--

--

Volkan Yurtseven
Akbank Teknoloji

Once self-taught-Data Science Enthusiast,now graduate one