EDA (Python)
Bu yazımda, başlangıç düzeyde bir EDA’nin (Exploratory Data Analyses) Python ortamında nasıl yapıldığına dair basit birtakım fonksiyonları, Kaggle üzerinden indirdiğim “Cirrhosis Patient Survival Prediction” veri setine nasıl uyguladığımı göstereceğim. Makine öğrenmesi için teorik bilgileri gözden geçirmek isteyenler, önceki yazılarıma göz atabilir: “Yeni Başlayanlar İçin Denetimli Makine Öğrenmesi”, “Yeni Başlayanlar İçin Denetimsiz Makine Öğrenmesi”, ve “Yeni Başlayanlar İçin Derin Öğrenme”
Veri bilimi çalışırken öncelikle üzerinde çalıştığınız veri setine hâkim olmanız gerekmektedir. Ancak ilgili bilgilere sahip olduğunuz veri seti içerisinde, önemli noktaları gözden kaçırmadan amaca yönelik adımlar atabilir ve modelinizden istediğiniz sonucu alabilirsiniz. Veri ile ilgili bilgi sahibi olduktan sonra, yapılan analiz sonucu veri setine dair bilgileriniz katlanarak artacak ve yapılmak istenen her neyse, zihniniz ona yönelik adımlar atacaktır. Bu süreç, genele yönelik basitçe Exploratory Data Analyses, Preprocessing, Modeling, Evaluation, Hyperparameter Tunning şeklinde sıralanabilir.
Öncelikle EDA yaparken, data knowledgeın kapsamlı olması çok önemlidir çünkü veri setine dair ne kadar bilgi edinilirse, kullanılmak istenen featureların seçimi de o kadar doğru olabilir, missing values impute ya da drop etme seçenekleri daha doğru değerlendirilebilir. İyi yapılan bir analiz, veri setini modele sokmadan önce ihtiyaç duyulan scaling, encoding yöntemlerinin ya da multicollinearity varlığında uygulanacak olan regularization yöntemleri gibi durumlara nasıl yaklaşılması gerektiğini, veriden atmanın tercih edilmediği outlier için yapılacak olan regularization, verinin balanced ya da imbalanced olma durumuna bağlı olarak kullanılacak metrik seçimlerini etkilemektedir.
Kaggle üzerinden indirilen bu veri setinde, toplam 424 PBC hastası deneye katılmaya hak kazanmış fakat içlerinden 112 hasta deneye katılmayı reddetmiş ve bu 112 hastanın 6’sının bilgileri de izlenememiş. Deneye katılım sağlayamayan ve kayıtları tutulan hastaların, yalnızca temel ölçümleri ve hayatta kalmalarına dair bilgiler mevcut. Hayatta kalma durumları ‘D’: ölüm, ‘C’: sansürlenen ve ‘CL’: karaciğer nakli ile sansürlenen olarak kayıt edilmiş. Burada 17 feature ve 3 class var.
Öncelikle kütüphaneler eklenerek başlandı. Bir EDA için olmazsa olmaz numpy ve pandas kütüphaneleri, özellikle görselleştirme için kullanılan ve pandas ve matplotlib modülleri üzerinde kurulmuş seaborn kütüphanesi import edildi.
Daha sonra verilerin kayıtlı tutulduğu dosya okutuldu. Burada ki veri dosyası (.csv), virgülle ayrılmış excel dosyası. Kullanılan başka veri tiplerine örnek olarak html ve json verilebilir. Takiben, head() kullanılarak kayıtları tutulan tüm hastaların içerisinden ilk beşi gözlemlendi. Dilerseniz kaç satıra göz atmak istiyorsanız, parantez içerisinde belirtebilirsiniz. Özellikle milyonluk veriler barındıran veri setlerinde, tüm satırları gözden geçirebilmek mümkün olmayacaktır. Aslında Python bize bu anlamda konfor sağlamaktadır. Burada veri setinin ilk beş satırı incelenebildiği gibi, son satırları inceleyebilmek, kaç satır, kaç sütuna sahip olduğunu (shape) bilmek, bunlardan hangilerinde kaç adet missing value olduğunu bilmek çok önemli.
Değişkenlerin tipine ait bilgileri, kaç satır ve kaç sütuna sahip olduğunu öğrenmek için info() suna bakıldı. Ayrıca, buradan missing valuelar hakkında da bilgi edinilir. Burada 10 adet float, 3 adet int ve 7 adet object veri ve 418 satır, 20 adet sütun var. Birbirini tekrarlayan veri var mı diye kontrol etmek için ise duplicate() kullanıldı.
Sonrasında, verinin describe()ı incelendi. Burada featureların min ve max değerlerine, standart sapmalarına, min-max arasında ki quarterların birbirine olan oranlarına bakıldı. Buradan yola çıkılarak hangi featureda outlier çıkacağı öngörülebilir. Örneğin, ‘Alk_Phos’un min-max aralığına bakıldığı zaman, third quater ile max arasında bir sıçrama yaşandığı gözlemlenebilir.
Ayrıca, sınıflandırma yaparken veri incelendiğinde yapılacak ilk şeylerden biride verinin balanced ya da imbalanced olup olmadığının kontrol edilmesidir. Imbalanced durumda, yakalanmak istenen veri fazla olan classa ait ise, o zaman çok etkilemeyebilir ama aksi halde kullanılan metrik seçimini etkileyecektir.
Burada hasta numaralarını temsil eden ‘ID’ sütununu ve object verilerin içerisinden analize etki edecek anlamlı farklılık yaratmadığı düşünülen 5 adet feature, drop edildi. 1 adet object feature ‘Drug’ kaldı, o da ihtiyaca yönelik olarak modele sokulmadan preprocessing kısmında Label/Ordinal/OneHot Encoding türlerinden biri ile kategorik veriden numerik veriye çevrilecekti. Ayrıca target da hala kategorik bir veri. Bu sefer, kalanlar tail() kullanılarak, son beş satırda gözlemlendi. Burada rahatça söylenebilir ki missing values mevcut (NaN/Not a Number). NaN valueları veri setinden atmak ya da istenen herhangi bir değişkenle, mean, median ile doldurmak, featureın sınıflandırmayı ne kadar etkilediğini göz önünde tutarak karar verilmeli.
Takiben, veri setinin sahip olduğu missing valueların kaç tane ve hangi sütuna ait olduğuna bakıldı. ‘Cholesterol’de 134 adet NaN value gözlemlenirken, ‘Drug’da 106 adet gözlemlenmekte.
Yukarıda analiz için kritik olmadığı düşünülen featurelar üzerinden, sütunların nasıl drop (dropna) edileceği pratikte gösterildi. Burada da ‘Drug’ value üzerinden satırlar drop edildi. 418 hastadan ‘Drug’ sütununa ait 106 adet missing vaulenun başarı ile drop edildiğini tail() ile incelenebilir.
Şimdi target, tek object olan feature ile dataframe üzerinde sütun olarak en sona alındı. Burada, sütunların yerini değiştirmek isteyenler için örnek gösterilmek istendi.
Şimdi featureların histogram grafikleri üzerinden dağılımına bakılıp, class bazında boxplotları incelenecek. Histogram grafikleri bir değişkenin veri seti içerisinde, belirli aralıklarla, nasıl dağıldığını gösterir. Değişkenlerin normal dağılıma sahip olması parametrik testler için önem teşkil ederken, burada ki gözlemler sonucu, normal dağılıma sahip olmayan bir feature için kullanılacak transformation tekniği üzerine yorum getirilebilir.
Boxplot, verinin hangi aralıkta dağıldığını gösteren oldukça kullanışlı bir araçtır. Boxplotlara, featurelar için target üzerinden bakılması lazım çünkü genel dağılımla class içerisinde ki dağılım farklılık gösterebilir. Burada target ve estimatorların aynı aralıkta olması sınıflandırmayı zorlaştıracaktır. Örneğin bu incelemede, logistic regression ile buradan iyi sonuç alınamayacağı öngörülebilir.
Bir de ‘Drug’ sütununu komple drop ederek, kalan verilerde ki NaN valueları fillna() ile mean değerlerle dolduruldu. Bu sefer pairplot üzerinden durum incelenerek, bu uygulamalar da, python üzerinde gösterildi.
Pairplot üzerinden de açıkça görülebilir ki burada classlar iç içe geçmiş durumda. Bu da featureların targetı sınıflandırmak için net farklılıklar ortaya koymadığını göstermekte.
Bir de featureların arasında ki ve featureların target ile arasında ki korelasyonu değerlendirebilmek için korelasyon incelemesi yapılsın. Burada korelasyonu görsel üzerinden veren heatmap kullanımı gösterildi.. Burada featurelar arasında ki korelasyonun az, featurelar ile target arasında ki korelasyonun ise yüksek olması beklenir. Featurelar arasında ki yüksek korelasyon multicollinearity sebep olabilir. Buraya bakıldığında featureların kendi arasında yüksek korelasyonu yok fakat target ile yüksek korelasyona sahip herhangi bir featureda mevcut değil.
Böyle durumlarda outlierlar veri setinin büyüklüğüne göre düşürülebilir. Preprocessing kısmında uygulanacak scale yöntemi robustscaler olarak tercih edilebilir. Belki classlar düşürebilir. Farklı modeller değerlendirilerek, farklı regularization yöntemleri üzerinden metrikler iyileştirilmeye çalışılabilir.
Bir veri seti için, modele sokmadan önce analiz yapmanın ne kadar önemli olduğunu somutlaştırabilmek için böyle bir veri seti seçildi. Gerçek hayatta ki veriler, genelde modele sokmak için uygun özelliklere sahip olmaz. Böyle zamanlarda, veriyi çeşitli tekniklerle daha uygun bir hale getirmek gerekir. Ayrıca milyonlarca verinin kayıt edildiği bir veri setinin tek tek incelenmesi de mümkün değildir. Tüm bunlar göz önüne alındığında, veri bilimi, sahip olduğu tüm aşamalarla bir bütündür ve tüm aşamalarında detaylı inceleme gerektirir.