Makine Öğrenmesiyle Kiralık Ev Fiyat Tahmini

Ramazan Özdemir
7 min readApr 25, 2021

--

Herkese merhaba! Bu yazımda sizlere makine öğrenmesiyle kiralık evlerin fiyat tahminini yaptığım bir projemi anlatacağım. Veri setini Hürriyet Emlak sitesinden Ankara’daki kiralık evlerin verilerini çekerek oluşturdum. Bu bilgiler içerisinde düzeltilmesi gereken sorunlar vardı. Bu sorunları nasıl çözdüğümü, adım adım ne yaptığımı ve neden yaptığımı açıklayacağım. Projemi Google Colab ile yaptım. Projeye ve veri setine PROJE kısmından erişebilirsiniz. Hazırsanız başlayalım :).

  • Kullandığım kütüphaneler.
Web siteden veri çekme kütüphaneleri
Makine öğrenmesi kütüphaneleri
Derin öğrenme kütüphaneleri
  • Öncelikle notebook’u drive’a bağladım ve dosyaları yükledim. İlk satırda bizden bir kod isteyecek. Drive’a bağlanarak o linki alıp yapıştıracağız. İkinci satırla ise dosyaları yükleyeceğiz.
  • Siteden veri çekmek için BeautifulSuop kütüphanesini kullandım. Colab’ta çalışmadığı için Jupyter Notebook’ta verileri çekip bir csv dosyasına aktardım. Sonra o csv dosyasını yukarıda da görüldüğü üzere notebook’a yükledim.
  • Ankara.csv dosyasını Tablo adlı bir değişkene atadım.
  • Burada .info() ile E.D.A(Exploratory Data Analysis) işlemlerine başladım.
  • Son 4 değişkene baktığımızda neredeyse %99'luk bir boşluk var. Bu oranda bir boşluk benim işime yaramayacağından dolayı bu değişkenleri DataFrame’den .drop() metodunu kullanarak attım.
  • İnfo’ya baktığımızda toplamda 514 satır bulunmakta ama değişkenleri incelediğimde 11 tane değişken 512 tane satıra sahip. Burada aklıma “Acaba 11 tane değişkenin boş verisi aynı satırda mı?” sorusu takıldı. Aşağıdaki fotografa bakarsak bu sorunun cevabı evet oluyor.
  • Burada 11 tane değişkenden rastgele seçtiğim “Bina Yaşı“ değişkenini kullandım.
  • Tamamen boş olan 2 satırı silince boş verileri daha doğru bir şekilde gördüm.
  • Bu kısımda “1000 TL, 3 odalı, 2+1.. “ gibi verileri sadece sayısal hale getirdim. Kategorik verileri de eğer ordinal ise sayısal bir şekilde sıraladım.
  • Bunları yapma sebebim ise, ileri kısımlarda yaptığım .get_dummies() işleminden sonra oluşan sütun sayısını olabildiğince minimize hale getirmektir.
  • Burada yaptığım işlemleri emlakçı bir arkadaşımdan yardım alarak yaptım.
  • Aidat değişkeninde; “TL, virgül ve USD” ifadeleri kaldırdım.
  • “Bina Yaşı” değişkenin verilerinden string verilerini temizledim. Daha sonra binanın yaşı ile kira arasındaki ters orantıdan dolayı “Bina Yaşı” değişkenindeki tüm verileri en yaşlı binanın yaş değeriyle çıkardım.
  • “Brüt / Net M2” değişkeninin verilerinden string olan m2 ve virgülü çıkardım ve türünü “int64” olarak değiştirdim.
  • “Kat Sayısı” değişkeninin verilerinden string olan “Katlı” kelimesini çıkardım.
  • “Bulunduğu Kat” değişkeninde bazı veriler sadece string’ten oluşmaktaydı ve ben de bu terimlerin anlamlarını yorum satırı olarak yazdım. Her bir terim yerine karşısındaki değeri yerleştirdim.
  • Bulunduğu kat binanın kat sayısından fazla olan bozuk veri var mı diye kontrol ettim ve öyle bir verinin olmadığını teyit etmiş oldum.
  • .unique() metoduyla bu değişkendeki benzersiz verileri inceledim.
  • “Eşyalı Durumu” değişkeninin benzersiz verilerini inceledim. Bu ifadeleri 0 veya 1 şekline çevirdim.
  • Fiyat değişkeninin verilerinde bulunan “\n ve TL” ifadeleri kaldırdım ve türünü “int64” yaptım.
  • “Isınma Tipi” değişkeni ordinal bir değişken olduğu için bu değişkeni kiraya etkisine göre sıraladım.
  • “Konut Şekli” değişkeni ordinal bir değişken olduğu için bu değişkeni kiraya etkisine göre sıraladım.
  • Değişkenin türünü “int64” yaptım.
  • “Kullanım Durumu” değişkeni ordinal bir değişken olduğu için bu değişkeni kiraya etkisine göre sıraladım.
  • Öncelikle “Oda + Salon Sayısı” değişkeninde bulunan string ifadeleri kaldırdım. Sonra oluşan birleşik değerleri tek tek toplayarak düzgün bir hale getirdim.
  • “Son Güncelleme Tarihi” değişkeninde bulunan “Gün Önce” ifadesini kaldırdım.
  • Dün ve bügün ifadelerini sayısal bir hale getirdim.
  • Değişkenin türünü “int64” yaptım.
  • “Yakıt Tipi” değişkeninin boş verilerini değişkenin medyanı ile doldurdum.
  • “Yakıt Tipi” değişkeni ordinal bir değişken olduğu için bu değişkeni kiraya etkisine göre sıraladım.
  • “Kömür-Odun” verisi sadece 1 tane olduğu için onu değişkende en çok bulunan doğalgaz verisine çevirdim. Bu işlemi başka bir yerde yaptım.
  • “Yapının Durumu” değişkeninin içerisindeki benzersiz verilerin yoğunluğunu inceledim ve bu yoğunluğa göre boş verilerini doldurdum.
  • “Yapının Durumu” değişkeni ordinal bir değişken olduğu için bu değişkeni kiraya etkisine göre sıraladım.
  • Cephe değişkeninin boş verilerini, değişkendeki benzersiz verilerin yoğunluğuna göre doldurdum.
  • Dairenin baktığı cephe kirayı etkilediği için bu etkiye göre sıralama işlemi yaptım.
  • “Site İçerisinde” değişkeninde çok farklı bölgeler olduğu için en basit şekilde ya site içindedir ya da site içinde değildir olarak değiştirdim.
  • Depozito değişkeninin içindeki string ifadeleri kaldırdım ve boş verileri değişkenin medyanı ile doldurdum.
  • “Bulunduğu Kat” ve “Kat Sayısı” değişkenlerinin boş verilerini değişkenlerin medyanları ile doldurdum.
  • Son durumda DataFrame bu şekildedir.
  • Bazı değişkenler sayısal veri olmasına rağmen türleri object şeklinde, bu değişkenlerin türünü “int64” tipine döndürdüm
  • İleride yapacağım işlemler orijinal DataFrame’i bozmaması için orijinal DataFrame’in bir kopyasını çıkardım.
  • Bu kısımda değişkenlerin ayrık verilerini düzeltme işlemlerini yaptım.
  • 512 veri arasından birkaç tane aykırı veri yüzünden regresyon eğrisinde sapma olacaktır. Bu sapmayı azaltabilmek için bu aykırı verilerden kurtulmam lazım.
  • Daha detaylı bilgi için AykırıDeğerler-BernaTaş Medium yazısını okumanızı tavsiye ederim
  • Düzeltme işlemleri için bir fonksiyon yazdım. Bu fonksiyonda bir değişkenin %75'i ile %25 arasındaki farkın 1.5 katını; %25'ten çıkararak alt sınırı, %75'e ekleyerek üst sınırı oluşturdum. Üst sınır veya alt sınırı aşan veriler aykırı verilerdir. Bu aykırı veriler eğer üst sınırın üstündeyse üst sınıra, alt sınırın altındaysa alt sınıra çektim.
  • Aşağıda yaptığım tüm aykırı veri düzeltme işlemleri bulunmaktadır.

Makine Öğrenmesi

  • Öncelikle Makine öğrenmesi modellerini tanımladım. Sonra bağımlı ve bağımsız değişkenimi tanımladım ve bağımsız değişkenime get_dummies() uguladım. Daha sonra bağımlı ve bağımsız değişkenimi test ve train olarak ayırdım. En son olarak da “fitting” fonksiyonuna gereken değişkenleri yolladım.
  • Fonksiyon sonucu elde ettiğim değerler.

Basit Derin Öğrenme

  • Bu kısımda da basit bir derin öğrenme modeli oluşturdum.
  • Derin öğrenmeden çıkan sonuç.

Projemin sonuna geldik umarım yararlı olmuştur. Bu seriye devam edeceğim. Takipte kalın :)

GitHub hesabım → ozdmrramazan

LinkedIn hesabım →ramazan-ozdemir

--

--

Ramazan Özdemir
Ramazan Özdemir

Written by Ramazan Özdemir

Prompt Enigneer / Ege University Computer Engineering /

No responses yet