Credit

Web Scraping — Regresyon Projesi : İkinci El Araç Fiyatı Tahminlemesi

Istanbul Data Science Academy — Web Scraping, Regression Project 2

1. Web Scraping

Gerçek veriler ile çalışmak, veri bilimini öğrenme sürecinde çok önemli bir yere sahiptir. Gerçek verilere ulaşabilmek için web scraping işlemi bu aşamada önemli rol almaktadır.

Web scraping, web sitesi üzerinde otomatik olarak veri toplama işlemidir. Web sitelerindeki veriler metin tabanlı biçimlendirme dilleri (HTML, XML vs.) ile tutulan yapılandırılmamış verilerdir. Web scraping işlemi ile bu verileri kazıyarak yapılandırılmış bir şekilde saklamamıza imkan verir.

Bu işlemi gerçekleştirmek için Python’da bazı kütüphanelere ihtiyacımız var. Bunlardan biri “BeautifulSoup” diğeri ise “requests” kütüphanesidir. “Requests” ile web sitesine veri kazıma isteğini göndeririz “BeutifulSoup” ile HTML formatını ayıklayıp bilgileri alabiliriz.

Bu projede, araç satışı yapan bir sitenin sayfasından alınan 2. el otomobil ilanlarının verileri ile ikinci el araç fiyatı tahminlemesi yaptım. Web sitesine gerekli komutları gönderip her ilan sayfasının içerisine giderek araçların belirli özelliklerini topladım.

Bu işlem ile yaklaşık 33.000 tane ilan verisi topladım. Her ilan sayfasındaki belirleyici elementleri kullanarak araçların özelliklerini ayıklayıp veri setimi oluşturdum. Oluşturduğum veri setimde 15 tane feature oldu.

Oluşturulup düzenlenen dataframe

Not : Oluşturulan veri setindeki “İlan no, ilan tarihi, takasa uygun, kimden” kolonları veri setinden modelde kullanılmayacağı için silinmiştir.

2. Exploratory Data Analysis

Veri setimizi biraz inceleyelim.

Kilometre kutu grafiğine göre en küçük kilometre değerinin sıfır olduğunu gözlemliyoruz. Fakat, web sitesini biraz incelediğimde bazı değerlerin yanlış girilmiş olduğunu gördüm. Örneğin, araç kilometresi 220000 iken 220 olarak yazılan değerler var. Bu yanlışların modeli etkilememesi için veri setinden çıkardım. Aynı şekilde grafikte görüldüğü üzere kilometresi çok yüksek olan araçların modelimizi saptırmaması için 450000 kilometre ile sınırlandırdım.

Fiyat grafiğine bakılırsa, 700000 TL’den sonra gözle görülür bir azalma var. Bu ilanların bazıları gerçek dışı ve model üzerinde iyi bir etki yaratmayacağından 700000 TL üzerinde olan verileri çıkardım. Yine web sitesini incelediğimde kiralık araç ilanlarının olduğunu gördüm. Bu ilanların model üzerinde kötü bir performansa sebep olmaması için en küçük fiyat değerini 5000 TL olarak aldım.

Araç fiyatlarını yaş ve kilometre açısından incelediğimizde, araçların yaşı küçük ve kilometresi az ise fiyatlarda artış, yaşı büyük ve kilometresi de çok ise fiyatlarda bir düşüş gözlemliyoruz. Bu zaten tahmin ettiğimiz bir durum. Fakat, grafikte kilometresi düşük ve yaşı büyük araçlar da var. Bu araçlar, veri setinde bir hata olduğunu düşünmemize sebep olabilir. Bu yüzden, veri setinin bu kısmını incelediğimde verilerde hata olmadığını, bu verilerin “TOFAŞ” marka araçlara ait olduğunu gördüm.

Veri setinde en çok düz vitesli araçlar bulunuyor. Vites tiplerine göre araç fiyatları incelenirse en düşük fiyatların düz vitesli araçlar olduğunu görüyoruz. Vites tipinin fiyat ile bağlantısını aşağıdaki korelasyon ısı haritasından görebiliriz. Özellikte düz vitesli araçlar ile fiyatın ters yönlü bir ilişkisi olduğu dikkatimizi çekiyor.

Not : Değişkenler arasında bağlantı olduğunu heatmap üzerinden görüyoruz. Bu model seçiminde göz önünde bulundurmamız gereken bir durum olacak.

3. Feature Engineering ve Model seçimi

Elimizdeki nümerik değişkenler ile OLS uyguladığımızda R-skorunun 0.845 olduğu görüyoruz. Bu durum ilk başta iyi bir skor olarak görülse de şüphelenmemiz gereken bazı durumlar var.

Lineer regresyon varsayımlarından biri “iki ya da daha fazla değişken arasında ilişki olmaması”dır. Cond. No. bize değişkenler arasında ilişkinin olup olmadığı bilgisini verir.

Oluşturduğum OLS modelinde hesaplanan Cond. No. sayısı çok yüksek olduğu için (zayıf çoklu bağlantı için 1000'in altında olmasını bekleriz) değişkenler arasında bağlantı olduğunu söyleyebiliriz.

Aslında, bu veri setinde güçlü çoklu bağlantı beklediğimiz bir durum. Çünkü, araçların yaşı arttıkça kilometresinin de arttığını ya da model ve motor hacminin birbiri ile bağlantılı olduğunu düşünürüz. (Bunu zaten ısı haritasından da görmüştük) Bu yüzden şimdiden lineer regresyon varsayımlarına uymadığı için lineer regresyon kullanamayacağımızı öngörebiliriz.

Modelde tahmin edeceğimiz hedef değişkenin normal dağılıma sahip olmasını isteriz. Hedef değişkenimizin dağılımını incelediğimizde sağa çarpık yani normal dağılım olmadığını görüyoruz. Bu durumu hedef değişkenine logaritmik dönüşüm uygulayarak düzeltebiliriz.

Feature Engineering

Regresyon modellerinde, kategorik değişkenleri modele dahil edemeyiz. Bu değişkenler üzerine bazı teknikler uygulayarak modele alabiliriz.

  • Herkesin bildiği üzere “marka” araç fiyatları üzerinde önemli bir etkiye sahiptir. Bu veri setinde, ilan sayısı az olan markalar modelimizde etkin olmayacağı için “Diger” olarak değiştirildi ve marka kolonu dummy yapılarak modele alındı.
  • Yıl” değişkeni, her ilan için 2020'den çıkarılarak “Yaş” olarak değiştirildi. (2020 - Araç Yılı)
  • Vites tipi” dummy yapılarak modele alındı.
  • Model”, “Seri” ve “Boya-değişen” değişkenleri üzerinde “Label Encoding” uygulandı.

Model Seçimi

Feature engineering uyguladığımız değişkenleri modele dahil ettiğimizde lineer regresyon ve ridge regresyon bize aynı sonuçları getirdi. En kötü skoru ise Lasso ile elde ettik.

En yüksek skora 0.93 ile “2. dereceden polinomal regresyon” ile ulaştık. Fakat, bu bölümün başında bahsettiğim üzere değişkenler arasında çoklu bağlantı sorunu olduğu için model üzerinde “Ridge” uygulamamız gerekir.

R² skorunun bizi yanıltmaması için, polinomale dönüştürdüğüm veri setineRidge Regresyon” uygulayarak yine 0.93 skoruna ulaşabildim. Bu sayede çoklu bağlantı sorununu da çözmüş oldum.

Her model için cross validation uyguladığımızda (kfold = 7 ) skorlarda çok az düşüş görüyoruz. Bu yüzden cross validation ı eledik.

Son olarak kurulan modeller üzerinde ortalama mutlak hatalarına baktığımızda bize en düşük hatayı polinomal regresyon ve polinomal üzerinde uyguladığımız ridge regresyonu verdi. Bu sonuca göre ve çoklu bağlantı problemini göz önünde bulundurarak polinomal ridge regresyonun bize en doğru sonuçları getireceğini söyleyebiliriz.

4. Sonuç

Grafik üzerinde 0.93 skor ile karar verdiğimiz “Polinomal Ridge” modelinin tahmin ettiği değerler ile gerçek değerler karşısındaki durumunu görüyoruz. Noktaların kırmızı çizginin üzerinde veya yakınında olmasını isteriz. Bu model ile bunu başardığımızı görüyorum :)

Yazımı okuduğunuz için teşekkür ederim.

Web scraping ve data preprocessing için GitHub reposu burada.

Tahminleme yaptığım repo ise burada.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store