Veri Analizinde Değişkenlerin Gruba Bağlı Özelliklerini Ayrıntılı Veren Fonksiyonunun Python’da Adım Adım Tanımlanması

Yiğit Şener
3 min readFeb 15, 2020

Bu yazıda Python’da Pandas üzerindeki groupby ve aggregate fonksiyonlarını kullanarak sayısal değerleri ayrıştırıp bunların basit istatistiksel özelliklerini sıralı bir şekilde ve istediğimiz değişkene göre gruplayan kendi fonksiyonumuzu yazacağız. Fonksiyon kurulumunu anlatırken içeriden dışarı doğru kodları tanımlayacağım. Kodun tamamını GITHUB repom üzerinden görebilirsiniz.

Groupby ve aggregation işlemleri için örnek DataFrame oluşturup tabloya bir bakalım.

Öncelikle tabloya göre kadınlar ve erkeklerin, maaş ortalamasını hesaplayan formülü yazalım

human.groupby("Gender").agg({"Salary": ["mean"]})
Salary
mean
Gender
Female 400.000000
Male 366.666667

Kodda görüldüğü üzere groupby fonksiyonuna cinsiyeti gruplamak istediğimizi belirttik. Ardından “Salary” değişkenini agg fonksiyonu içine belirterek hangi değişkenin hesaplanmasını istediğimizi belirtiyoruz. Sözlük yapısını alan fonksiyonun içerisine hangi işlemin yapılmasını istiyorsak onu ekliyoruz. Burada ortalamasını bulmak için sözlüğün değer aldığı bölüme mean diyoruz.

İşte tam burada amacımız ortaya çıkıyor. Öyle ki herhangi bir veri setindeki seçtiğimiz kategorik değişken için sayısal değişkenlerin ortalamasını (diğer istatistikleri) bulup liste biçiminde sıralı olarak yazdırılması. Bunu for döngüsü ile sağlayabiliriz. Fakat bu döngüyü doğrudan yazarsak veri setinin içerisindeki tüm kategorik değişkenleri de hesaplamaya katacağı için kodumuz hata verecektir. İşte bu yüzden öncelikle hangi değişkenin sayısal değerlerden oluştuğunu tespit etmemiz gerekiyor

if human["Salary"].dtypes in ["float64", "int64"]:
print(True)
else:
print(False)

>>> True

Pandas DataFrame’de değişkenlerdeki değerlerin niteliğini tanımlayan fonksiyon dtypes’dir. Bu fonksiyon yardımı ile sayısal değişken anlamına gelen “float64” ve “int64” için kontrol sağlayabiliriz. Yukarıdaki if bloğunda mantıksal düzende in ile yapılmak istenen; eğer Salary değişkeni “float64” veya “int64” ise kodun True olarak dönmesi. else olan bölümünde ise kategorik değişkenler geliyor olacaktır. Diğer bir sorun ise gruplamak istediğimiz değişkenin de bu döngü içerisinde yer almasını engellemek gerekiyor.

columns = human.drop(columns="Gender").columns
print(columns)
['Salary', 'Experience', 'MaritalStatus']

Yukarıdaki koddan da anlaşıldığı üzere verdiğimiz gruplamak istediğimiz değişkeni kaldırıp geri kalan kolonları alıyoruz. Bu sayede for döngüsüne alacağımız değişkenleri de seçmiş olduk. Kodları toparlayıp yazalım.

columns = human.drop(columns="Gender").columns
for column in columns:
if human[column].dtypes in ["float64", "int64"]:
print(human.groupby("Gender").agg({column: ["mean"]}))
else:
print(f"categorical variable: {column}")
--------------------
Salary
mean
Gender
Female 400.000000
Male 366.666667
Experience
mean
Gender
Female 4.000000
Male 3.666667
categorical variable: MaritalStatus

Yukarıdaki kodda en başta hangi değişkeni seçtik ise onu for döngüsünden kaldıracağımız hale getirirken diğer kolonları da bir liste içinde belirledik. Ardından for döngüsü ile seçtiğimiz kolonları veri setindeki karşılıkları ile eşleştikten sonra if bloğundan sadece sayısal nitelikte olan değişkenler seçilir ve cinsiyete göre ortalaması alınır. Tüm bunların dışında kalan kategorik değişkenler ise else bloğuna tanımlanır.

Bir defalık için bu kodları yazdık peki bundan sonra gelebilecek veri setleri için farklı değişken türlerini birbirinden ayırıp sadece istediğimiz değişkene göre bu döngüyü nasıl çalıştırabiliriz? Tabi ki fonksiyon kurarak bunu başarabiliriz.

def multipleGroupby(df, mainColumn):
objectVariable = []
columns = df.drop(columns=mainColumn).columns
for column in columns:
if df[column].dtypes in ["float64", "int64"]:
print("\n==================")
print(df.groupby(mainColumn).agg({column: ["mean"]}))
else:
objectVariable.append(column)
print("\n==================")
print(f"Categorical Variables: {objectVariable}")
multipleGroupby(human,"Gender")==================
Salary
mean
Gender
Female 400.000000
Male 366.666667
==================
Experience
mean
Gender
Female 4.000000
Male 3.666667
==================
Categorical Variables: ['MaritalStatus']

Yukarıdaki fonksiyonu adım adım açıklayarak yazalım:

  1. multipleGroupby adlı bir fonksiyon oluşturuyoruz. Burada parantez içinde yazan iki değeri zorunlu olarak tanımlanmıştır. Bunlardan ilki DataFrame’e aktarılmış veri seti, ikincisi ise bu DataFrame içerisinde gruplanmak istenen değişkenin adını istemektedir.
  2. objectVariable listesi for döngüsünden çıkan kategorik değişkenleri biriktirmesi için oluşturulmuş listedir.
  3. columns listesi fonksiyonun başında tanımlanan, gruplanmak istenen değişkenin yer almadığı fakat geri kalan tüm değişkenlerin bulunduğu bir listedir.
  4. Geri kalan kodların ayrıntıları yukarıda açıklandı. Ancak print(“\n ile başlayan kod parçacığı ise her döngü sonrası aralığı yansıtmak için verilmiştir.

Şimdi geri kalan istatistiksel hesaplamalardan bazılarını da ortalamanın yanına ekleyerek devam edelim.

print(df.groupby(mainColumn).agg({column:["mean", "median",
'min', 'max',
"std", 'sum',
"var"]}))

Yukarıdaki kodda görüldüğü üzere fonksiyona ortanca (median), minimum, maksimum, standart sapma (std), toplam (sum) ve varyans (var) eklendi. Şimdi fonksiyonu yeniden çağıralım.

multipleGroupby(human,"Gender")=======
Salary
mean median min max std sum var
Gender
Female 400.000000 400 300 500 100.0000 1200 10000.000000
Male 366.666667 300 200 600 208.1666 1100 43333.333333
=======
Experience
mean median min max std sum var
Gender
Female 4.000000 4 3 5 1.000000 12 1.000000
Male 3.666667 3 2 6 2.081666 11 4.333333
=======
Categorical Variable: ['MaritalStatus']

Görüldüğü üzere her bir değişken için farklı farklı betimleyici istatistiksel bilgileri verdi.

Sonuç

Python’da Pandas kütüphanesini kullanarak ilk başlarda yapacağınız analiz önceleri zor ve zahmetli gelebilir. Ancak zamanla veriye bakış açınızı geliştirdikçe kendi fonksiyonlarınızı yazarak işlerinizi otomatize edebilirsiniz.

--

--