Python ile Veri Setine İlk Bakış

ozgunsungar
Bentego Teknoloji
Published in
5 min readApr 12, 2023

Bu yazıda 4 ana madde yer alacaktır. Bunlar:

  1. Genel Resim
  2. Kategorik Değişken Analizi (Analysis of Categorical Variables)
  3. Sayısal Değişken Analizi (Analysis of Numerical Variables)
  4. Hedef Değişken Analizi (Analysis of Target Variable)

Not: Yukarıdaki yöntemlerin hepsinde titanic veri seti kullanılmıştır.

1.Genel Resim

Genel resim dediğimiz şey aslında veri setimizin nasıl veriler içerdiği, matris yapısının nasıl olduğu, içerisinde null değer olup olmadığını anlamak üzere pandas kütüphanesinde bulunan built-in fonksiyonların kullanıldığı bir yöntemdir.

Kütüphanelerimizi import etmekle işe başlayalım:

import pandas as pd
import seaborn as sns

#seaborn kütüphanesini kullanarak titanic veri setinin yüklenmesi
df = sns.load_dataset("titanic")

Kullanılabilecek fonksyionlar :

  • df.head(): ilk indexten itibaren içine yazılan n değeri kadar satır döner. deafult değeri n=5’tir.
  • df.tail(): head() fonksiyonunun kuyruk tarafında çalışan hali.
  • df.shape: kaça kaçlık matris olduğunu döner
  • df.info(): sütunların hangi veri tipinden olduğunu söyler
  • df.columns: sütun isimlerini liste halinde döner
  • df.index: başlangıç — bitiş index değerini ve ne kadar atlayarak gittiğini döner
  • df.isnull().values.any(): Herhangi bir null değerin olup olmadığının kontrolü için
  • df.isnull().sum(): null değerlerin toplamı

İşleri otomatize etmek için örnek bir fonksiyon kullanımı :

def check_df(dataframe, head=5):
print("##################### Shape #####################")
print(dataframe.shape)
print("##################### Types #####################")
print(dataframe.dtypes)
print("##################### Head #####################")
print(dataframe.head(head))
print("##################### Tail #####################")
print(dataframe.tail(head))
print("##################### NA #####################")
print(dataframe.isnull().sum())

check_df(df)
Out[]:
##################### Shape #####################
(891, 15)
##################### Types #####################
survived int64
pclass int64
sex object
age float64
sibsp int64
parch int64
fare float64
embarked object
class category
who object
adult_male bool
deck category
embark_town object
alive object
alone bool
dtype: object
##################### Head #####################
survived pclass sex age sibsp parch fare embarked class \
0 0 3 male 22.0 1 0 7.2500 S Third
1 1 1 female 38.0 1 0 71.2833 C First
2 1 3 female 26.0 0 0 7.9250 S Third
3 1 1 female 35.0 1 0 53.1000 S First
4 0 3 male 35.0 0 0 8.0500 S Third

who adult_male deck embark_town alive alone
0 man True NaN Southampton no False
1 woman False C Cherbourg yes False
2 woman False NaN Southampton yes True
3 woman False C Southampton yes False
4 man True NaN Southampton no True
##################### Tail #####################
survived pclass sex age sibsp parch fare embarked class \
886 0 2 male 27.0 0 0 13.00 S Second
887 1 1 female 19.0 0 0 30.00 S First
888 0 3 female NaN 1 2 23.45 S Third
889 1 1 male 26.0 0 0 30.00 C First
890 0 3 male 32.0 0 0 7.75 Q Third

who adult_male deck embark_town alive alone
886 man True NaN Southampton no True
887 woman False B Southampton yes True
888 woman False NaN Southampton no False
889 man True C Cherbourg yes True
890 man True NaN Queenstown no True
##################### NA #####################
survived 0
pclass 0
sex 0
age 177
sibsp 0
parch 0
fare 0
embarked 2
class 0
who 0
adult_male 0
deck 688
embark_town 2
alive 0
alone 0
dtype: int64

Çıktımızı sırasıyla inceleyecek olursak:

  1. shape çıktısı (891, 15) gelmiş. Bu da 891 adet kayıtın ve 15 farklı verinin olduğunu gösterir. Bu veri setinde 15 farklı değişkenin sadece 1’i hedef değişkendir.
  2. dtype çıktısı ile ilk maddede bahsedilen 15 farklı verinin tiplerini görmüş olduk. Verimizi detaylı olarak analiz etmek istersek bu değerlere çok dikkat etmemiz gerekiz. Bazı değişkenler her ne kadar numerik gözükse bile bunlar kategorik, her ne kadar kategorik gözükse bile numerik olabilir. Dolayısıyla bunları göz önünde bulundurmalıyız.
  3. head()/tail() sayesinde veri setimizin nasıl doldurulduğunu görmüş oluyoruz. Örneğimizde kullandığımız titanic veri setinin hepsini bastırmak kolay ve zahmetsiz gözükebilir. Ancak büyük çaplı projelerde milyonlarca hatta milyarlarca satır olduğunu düşünürsek veri setinin tamamını bastırmanın maaliyeti bir hayli yüksek olacaktır.
  4. isnull().sum() null değerleri görmemizi sağladı. İleride yapacağımız herhangi bir istatistik işleminde ya da model eğitiminin öncesinde null değerleri manipule etmek önemli.

2.Kategorik Değişken Analizi (Analysis of Categorical Variables)

Kategorik verilerin analizi için kullanılan en basit yöntemlerden biri dağılımın oranını bulmak. Bu sayede değişkenlerin target(hedef) değerini ne kadar etkileyip etkilemeyeceğini tahmin edebiliriz. Ancak direkt hedef değişkene göre analiz yapılmak istenirse yazının 4. Bölümüne göz atılması gerekir.

Bunun için ufak bir fonksiyon yazabiliriz. Bu fonksiyon bir dataframe oluştursun. İçinde 2 column olsun ; kategorik değişkenin ismi ve oran(ratio). Ne kadar veri olduğunu bulmak için dataframe[col_name].value_counts() kodunu kullanabiliriz. Oranı hesaplamak için ise basit bir matematik formulü kullanacağız.

🖊 100*istenilen_değer / toplam_değer

Koda döktüğümüzde ise

100*dataframe[col_name].value_counts()/len(dataframe)

def categorical_summary(dataframe, column_name):
print(pd.DataFrame({column_name: dataframe[column_name].value_counts(),
"Ratio": 100 * dataframe[column_name].value_counts() / len(dataframe)}))
print("##########################################")

categorical_summary(df, "embark_town")
Out[]:
embark_town Ratio
Southampton 644 72.278339
Cherbourg 168 18.855219
Queenstown 77 8.641975
##########################################

3. Sayısal Değişken Analizi (Analysis of Numerical Variables)

Sayısal değişkenleri analiz etmek için olmazsa olmaz fonksiyonumuz df.describe(). Çıktının transpozunu alıp almamak tamamiyle size kalmış. Ben görünüş ve okunabilirlik açısından tranpozunu almayı tercih ediyorum.

df.describe().T: Sütunların istatistiksel özetini gösterir. Bu özete NaN değerler dahil edilmez.

def numerical_summary(dataframe, numerical_column, plot=False):
percentiles = [0.05, 0.10, 0.20, 0.30, 0.40, 0.50, 0.60, 0.70, 0.80, 0.90, 0.95, 0.99] #default olarak [.25, .5, .75].
print(dataframe[numerical_column].describe(percentiles).T)
numerical_summary(df, "age", plot=True)
Out[]:
count 714.000000
mean 29.699118
std 14.526497
min 0.420000
5% 4.000000
10% 14.000000
20% 19.000000
30% 22.000000
40% 25.000000
50% 28.000000
60% 31.800000
70% 36.000000
80% 41.000000
90% 50.000000
95% 56.000000
99% 65.870000
max 80.000000
Name: age, dtype: float64

4.Hedef Değişken Analizi (Analysis of Target Variable)

Hedef değişken analizini 2 ana başlık altında inceleyeceğiz:

  1. Hedef Değişkenin Kategorik Değişkenler ile Analizi
  2. Hedef Değişkenin Sayısal Değişkenler ile Analizi

Bu bölümde dataframe.groupby() fonksiyonunun önemi bir hayli fazla. Bu fonksiyonun kısaca işlemi, birbirinden ayrı sütunları birleştirip bir takım işlemler yapmamıza olanak sağlar. SQL’deki groupby ile aynı işlevdedir.

4.1 Hedef Değişkenin Kategorik Değişkenler ile Analizi

Kategorik değişkenleri hedef değişkenlerle analiz edebilmek için kegorik değere göre gruplamamız gerekir. Çünkü bir kategoriye ne kadar hedef değişkenin düştüğünü öğrenmek istiyoruz.

def target_summary_with_cat(dataframe, target, categorical_col):
print(pd.DataFrame({"TARGET_MEAN": dataframe.groupby(categorical_col)[target].mean()}))

target_summary_with_cat(df, "survived", "sex")
Out[]:
TARGET_MEAN
sex
female 0.742038
male 0.188908

4.2 Hedef Değişkenin Sayısal Değişkenler ile Analizi

Sayısal değişkenlerde ise durum biraz farklı. Sayısal değişkenler herhangi bir şekilde kategori içermediğinden ve sürekli(continuous) olduklarından bunları gruplamamız mantıksızdır. Dolayısıyla burada hedef değişkene göre gruplarız ve böylece hedef değişkene sayısal sütundaki değerlerin etkisini gözlemleyebiliriz.

def target_summary_with_num(dataframe, target, numerical_col):
print(dataframe.groupby(target).agg({numerical_col: "mean"}))

target_summary_with_num(df, "survived","age")
Out[]:
age
survived
0 30.626179
1 28.343690

Referanslar

https://pandas.pydata.org/docs/reference/frame.html

https://seaborn.pydata.org/

https://towardsdatascience.com/exploratory-data-analysis-in-python-a-step-by-step-process-d0dfa6bf94ee

http://www.sefidian.com/2021/07/02/measure-the-correlation-between-numerical-and-categorical-variables-and-the-correlation-between-two-categorical-variables-in-python-chi-square-and-anova/

--

--