Site Loader

Merhabalar herkese, Veri Bilimci Yolculuğu ile başladığım bu yolda ilk projemizi yaptık bende İstanbul Ev Tahmini için web scraping yaptığım veriler üzerinde EDA(Exploratory Data Analysis)  işlemlerini yaptım.  O zaman EDA(Keşifsel Veri Analizi) nedir? Sorusuna cevap vererek başlayalım.

Keşifsel Veri Analizi(EDA) Nedir?

Keşifsel Veri Analizi (EDA), veri kümelerini genellikle görsel yöntemlerle analiz ederek  temel özellikleri hakkında bilgi sahibi olmak için yapılan yaklaşımdır.  Burada aradığımız şeyler nedir?

  • Veriseti hakkında bilgi sahibi olmak
  • Değişkenler arasındaki ilişki bulmak
  • Veriseti içindeki eksik ve aykırı verileri tespit etmek
  • Verisetini temizlemek
  • Veriseti içindeki önemli ve önemsiz değişkenleri bulmak.

 

Verisetini Okuma

İlk önce verisetini okuyoruz bunun öncesinde verisetini okumak ve verisetini görselleştirme için pandas kütüphanemizi projemize dahil ediyoruz.

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import scipy.stats as stats
import plotly.express as px

Web scraping ile topladığım verileri .csv formatında kaydetmiştim. Bu yüzden read_csv fonksiyonunu kullanıyoruz.

df = pd.read_csv('house.csv')

Şimdi verisetini biraz tanıyalım.

  • head() : Verisatinin default olarak ilk 5 satırını verir dilerseniz siz satır sayısını verebilirsiniz.
  • tail(): Verisetinin default olarak son 5 satırını verir dilerseniz siz satır sayısını verebilirsiniz.
  • sample(): Verisetinin rastgele 1 satırını verir dilerseniz siz satır sayısını verebilirsiniz.
df.sample(5)

Şimdi veriseti hakkında biraz bilgi alalım;

df.info()

Bu çıktıdan neler öğrenebiliriz?

  • Veriseti içinde toplam 6584 satır veri olduğunu
  • Veriseti içindeki sütunları ve bu sütunları türünü
  • Veriseti seti içinde boş olmayan satır sayısını

Şimdi bizim burada ilk yapmamız gereken şey sütunların türlerini öğrenmemiz ve bu sütunların türüne göre işlemler yapmamız ama bunu yapabilmek içinde sütunların içindeki verilerin doğru ve işlenebilir hale getirilmesi lazım. Örneğin  ev fiyat sütununa baktığımız zaman object(string) türünde olduğunu görüyoruz fakat biz bu şekilde sütunlar üzerinde matematiksel işlemler ve veriler arasındaki ilişkiyi göremeyiz bu yüzden veriseti üzerinde değişiklikler yapmamız lazım.

İlk olarak eksik veriler üzerinde işlemler yapalım bunun için ilk önce eksik verinin ne olduğuna bakalım.

Missing Data(Eksik Veri) Nedir?

Eksik veriler tanımlı olan değişkenlerdeki eksik olan gözlemlerdir. Eksik veri çoğu veri kümesinde sık rastlanan bir durumdur. Eksik veriler makine öğrenme algoritmalarının sonuçlarını verisetine bağlı olarak büyük oranda etkileyebilir.

Missing Data(Eksik Veri)Sebepleri

Eksik veri oluşumunun sebepleri nelerdir ve nasıl meydana gelir? Veri kayıplarının birçok sebepleri : Yazılımsal, donanımsal veya kullanıcı kaynaklı olabilir. Veriler hatalı girilmiş veya uygun bir şekilde toplanmamıştır.

Eksik veriler üzerinde birçok yöntem kullanılmaktadır. Bu işlemler genellikle Feature Engineering aşamasında yapıldığı için burada kısaca değineceğiz.

O zaman ilk önce eksik verileri bulalım;

df.isnull().sum()

Eksik veriler üzerinde çok fazla senaryoya göre çok fazla işlem yapılır fakat biz daha feature engineering yani özellik mühendisliği konusuna geçmediğimiz için temel basit işlemleri yapalım.

Şimdi eksik verilerin oranlarına bakalım.

df.isnull().mean()*100

Görüldüğü gibi eksik verilerin oranı building_floors sütunu hariç diğer değişken(sütun/feature) yok denecek kadar az biz verileri silersek verisetinin yapısı üzerinde değişikliğe sebep olmaz diye düşünüyorum yine de kontrol edebiliriz. Bunun öncesinde sütun yapılarını düzenlemeliyiz.

df.area.unique()

Şimdi sütun yapısını düzenleyelim

df.area = [str(i).split()[0] for i in df.area]

Bir düzenleme işlemi yaptık ama verilerimiz hala object veri türünde ve hala eksik verilerimiz mevcut;

df.area.isnull().sum()
0

En tehlikeside bu tür eksik veri çünkü aslında boş olmalarına rağmen dolu gibi görünür bide farklı şekilde bakalım;

df[df.area=="nan"].count()

Şimdi bu eksik verileri silebiliriz veya atama işlemi yapabiliriz. Çok az olduğu için biz bu verileri silelim.

df.drop(df.index[df['area'] =="nan"], inplace = True)

Eksik verilerden kurtulmuş olduk.

Şimdi sütunu inceleyelim;

df.area.describe()

Aslında bu şekilde bir sonuç beklemiyorduk çünkü bir evin alanı sayısal bir değer olup biz burada ki  sonuçlardan ziyade ortalama evin alanı, min ve max gibi değerler bekliyorduk o zaman sütunun veri türünü değiştirmemiz gerekiyor.

df["area"] = df["area"].astype(str).astype(int)

Sütun türünü değiştirdik şimdi tekrar bakalım.

df.area.describe()

Çok güzel istediğimiz sonucu aldık. Şimdi burada dikkat etmeniz bir nokta var  aykırı veriler.

Aykırı(Outlier) Veri Nedir?

Aykırı değer, bir veri kümesindeki diğer gözlemlerden büyük ölçüde farklı olan herhangi bir veri noktasıdır. Örneğin  yukarıda  area değişkeni evin m2 cinsinden  alanını belirtiyor burada bu değişkenin;

  • minimum değeri ile %25 çeyrek açıklığı arasındaki fark 62,
  • %25 ile %50 arasındaki fark 30,
  • %50 ile %75 arasındaki farkta 35
  • %75 ile max değer arasındaki değer 690,

neredeyse 6 kat fark bu demek oluyor ki bu aralıkta aykırı veriler var. Şimdi bu düşündüklerimizi ileri sürdüğümüz varsayımları gösterelim bunun için görselleştirme tekniğini kullanacağız. Feature Engineering aşamasında aykırı veriler üzerinde birçok yöntem kullanılmaktadır fakat biz burada sadece aykırı verileri tespit etmek ve silerek verisetini anlamaya çalışacağız.

Aykırı verileri görselleştirmek için Box Plot Grafiği sık kullanılan bir yöntemdir.

Bu grafik sayısal değişkenler içindeki aykırı verileri göstermek için en çok kullanılan grafiklerden biridir. Şimdi kendi versetimiz üzerinde kullanalım. Bunun için plotly kütüphanesini kullandım.

fig = px.box(df, y="area")
fig.show()

Gördüğünüz ayrı olan noktalar bizim aykırı verilerimiz.  Dilerseniz diğer grafikler ile inceleyelim.

def diagnostic_plots(df, variable):
    # function takes a dataframe (df) and
    # the variable of interest as arguments

    # define figure size
    plt.figure(figsize=(16, 4))

    # histogram
    plt.subplot(1, 3, 1)
    sns.histplot(df[variable], bins=30)
    plt.title('Histogram')

    # Q-Q plot
    plt.subplot(1, 3, 2)
    stats.probplot(df[variable], dist="norm", plot=plt)
    plt.ylabel('Variable quantiles')

    # boxplot
    plt.subplot(1, 3, 3)
    sns.boxplot(y=df[variable])
    plt.title('Boxplot')

    plt.show()

Şimdi area feature görselleştirelim.

diagnostic_plots(df, 'area')

Yine Histogram ve Olaslıksal dağılım grafikleri ile de  aykırı verileri çok net görebiliyoruz. Verisetinin çokta yapısını bozmadan örneğin 400 m2 üzerinde olan verileri silelim bakalım nasıl bir dağılım olacak aykırı veriler üzerinde işlemler daha sonra feature engineering yazısında detaylı ele alınacak.

df.drop(df.index[df['area'] >=400], inplace = True)

Dikkat ederseniz dağılım azda olsa  düzelmiş oldu.

Aynı işlemleri price sütunu içinde yaptıktan sonra aykırı verileri görmek için görselleştirelim.

diagnostic_plots(df, 'price')

Şimdi grafiklere baktığımız zaman aşırı derece aykırı verilerin olduğunu görüyoruz.  Detaylı görmek için sadece box plot ile inceleyelim.

fig = px.box(df, y="price")
fig.show()

Görüldüğü gibi en yüksek değer ile bir önceki değer arasında 300 Milyon TL  fiyat farkı var. Bu kesinlikle imkansız bir değer. Büyük ihtimalle ilan girilirken yanlışlıkla fazla rakam girilmiş. Hemen bu veri inceleyelim

df[df.price>100000000]

Görüldüğü gibi diğer sütunlara da bakıldığın muhtemelen bu değerin 375 Milyon TL  değilde 375 Bin TL olduğu olabileceği daha muhtemel 🙂

Şimdi bu veriyi(satırı) silelim.

df.drop(df.index[df['price'] >=10000000], inplace = True)

Şimdi tekrar görselleştirelim  biraz daha dağılım düzeldiğini umuyoruz.

diagnostic_plots(df, 'price')

Evet dağılım çok azda olsa düzelmiş oldu. Yine tekrar belirteyim burada aykırı veriler üzerinde yapılması gereken işlemleri yapmıyoruz sadece veriyi anlamaya çalışıyoruz.

Keşifsel veri analizinde yapılan bir diğer işlem ise değişkenler arasındaki ilişkiyi incelemek. İşte o zaman aklımıza gelecek şey elbette korelasyondur.

Acaba bir dairenin alanı ile fiyatı arasında nasıl bir bağlantı var  hemen inceleyelim.

df.area.corr(df.price)
0.6705882586529249

Korelasyon değerimiz 1′ e çok yakın bir değer buda iki sütun arasında pozitif yönde yüksek bir ilişki olduğu anlamına geliyor. Yani dairenin alanı ne kadar artarsa dairenin fiyatı da o oranda artıyor demektir.

Daha iyi görmek için korelasyon  matris grafiğine bakalım detaylı bilgi için bu yazımıza bakabilirsiniz.

fig = px.scatter_matrix(df,
    dimensions=["area", "price"],
    color="area")
fig.show()

Artık verisetimizin son haline bakabiliriz artık. Verisetimizi yorumlamaya başlayalım.

Sonuç

df.sample(5)

df.info()

Numerik Değişkenler;

  • area: Evin alanı
  • building_floors : Dairenin bulunduğu binanın kat sayısı
  • flat_floor: Dairenin bulunduğu kat
  • price: Dairenin fiyatı
  • rooms_count: Dairede bulunan oda sayısı

Kategorik Değişkenler;

  • district: Dairenin bulunduğu ilçe
  • neighborhood: Dairenin bulunduğu mahalle
  • warming_type : Dairede bulunan ısınma tipi

Numerik değişkenleri görselleştirelim.

def diagnostic_plots(df, variable1,variable2,variable3,variable4):
    
    plt.figure(figsize=(16, 4))

    # histogram
    plt.subplot(1, 4, 1)
    sns.histplot(df[variable1], bins=30)
    plt.title('Price Histogram')
    
    plt.subplot(1, 4, 2)
    sns.histplot(df[variable2], bins=30)
    plt.title('Area Histogram')
    
    plt.subplot(1, 4, 3)
    sns.histplot(df[variable3], bins=30)
    plt.title('Flat Floor Histogram')
    
    plt.subplot(1, 4, 4)
    sns.histplot(df[variable4], bins=30)
    plt.title('Building Floors Histogram')

    plt.show()
diagnostic_plots(df, 'price',"area","flat_floor","building_floors")

 

 

Kategorik verileri görselleştirelim,

Dairelerin  ısınma türüne grafiği

sns.set(rc={'figure.figsize':(10,8)})

plt.xticks(rotation=45)

sns.countplot(x = 'warming_type',
              data = df,
              order = df['warming_type'].value_counts().index),

plt.show()
df['warming_type'].value_counts(normalize=True)*100

İlçelere göre satılık  daire sayısı  grafiği

fig = px.bar(df_count_house.sort_values(by=['count_house'],ascending=False).head(15),
             x='district', y='count_house',            
             labels={'count_house':'Number of houses for sale by district','district':'Districts in Istanbul'},
             color="district" ,height=400,text='count_house')
fig.show()

 

İlçelere göre fiyat grafiği;

fig = px.bar(price_district.sort_values(by=['price'],ascending=False).head(15),
             x='district', y='price',            
             labels={'count_house':'Number of houses for sale by district','district':'Districts in Istanbul'},
             color="district" ,height=400,text='price')
fig.show()

 

İlçelere ve mahallelere göre satılık  en çok 20 mahalle daire sayısı grafiği grafiği;

fig = px.sunburst(df_, path=['district', 'neighborhood'], values='count',
color='count', hover_data=['count'],
color_continuous_scale='RdBu',
color_continuous_midpoint=np.average(df_['count'], weights=df_['count']))
fig.show()

Projemizin sonuna geldik eksik veya yanlışlık varsa lütfen iletişime geçmekten çekinmeyin. Bir sonraki projede görüşürüz.

Github kodlarına buradan ulaşabilirsiniz

Post Author: Cahit ISLEYEN

Data Scientist at @embedica.ai

One Reply to “Veri Bilimi Yolculuğu Proje I (Exploratory Data Analysis)”

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir