Python ile Veri Bilimine Dalış

Veri Bilimi ve Python

1. Giriş

Veri bilimi, karmaşık problemleri çözmek için hem yapılandırılmış hem de yapılandırılmamış veriyi, işe yarar/değerli bilgiye (knowledge) dönüştürmeye yarar. Bu süreçte, bilimsel problem çözme tekniklerini, matematiği, istatistiği ve yazılım geliştirme disiplinlerini birlikte kullanır [1]. Veri biliminin geçmişi çok uzun yıllara dayansa da veri bilimi iş kavramının popüler olması HBR (Harvard Business Review) dergisinde yayınlanan “Data Scientist: The Sexiest Job of the 21st Century” adlı yazıyla başlamaktadır.

Bir veri bilimi projesinin aşamalarını soyut olarak aşağıdaki gibi 4 adımda tanımlamak mümkündür.

  1. Problem Tanımlama
  2. Veri Hazırlama
  3. Model/Algoritma Seçimi
  4. Sonuçları İyileştirme

Aşamaların detaylarına bu yazıda girerek yazıyı boğmak istemiyorum ancak yine de elinizdeki problemin ne olduğunu iyice anlamadan, problemi çözünce tam olarak ne elde edeceğinizi bilmeden ve mümkünse yanınızda bir alan uzmanı olmadan gerçek hayatta hiçbir projeye girmemenizi tavsiye ediyorum.


Olaya bir de makine öğrenmesi açısından bakacak olursak, bir veri bilimi projesinin iş akışındaki adımları (pipeline görevleri) aşağıdaki gibi şekillendirebiliriz.


Günümüzde veri bilimi denilince akla ilk gelen programlama dili Python’dur. Kolay öğrenilebilmesi, kolay okunması, bakımının kolay olması ve hazır birçok veri bilimi kütüphanesi bulundurması, dilin kullanımını oldukça yaygınlaştırmıştır [2]. Popülerliği ve kullanımı arttıkça, var olan kütüphaneleri daha fazla gelişmekte ve ayrıca yeni kütüphaneler de eklenmektedir. Bu yazımızda Python diline veri bilimi perspektifinden hızlı ama detaylı bir giriş yapıp, önemli paketlerden NumPy ve Pandas ile ilgili bilgi verip, örnekler yapacağız. Yazının genel akışı aşağıdaki gibi olacak:

  • Giriş (Veri Bilimi, Tanıtım)
  • Python Programlama Dili (Geçmişi ve Yapısı)
  • Kurulum
  • Python Değişken Türleri
  • Python Koşul Deyimleri
  • Python Döngüleri
  • Python Veri Yapıları (Listeler, Sözlükler)
  • Referans Türleri ve Nesne Klonlama
  • Python Fonksiyon Tanımları
  • Python Lambda Fonksiyonları
  • Veri Bilimi ve Nesne Yönelimli Programlama
  • NumPy Kütüphanesi
  • Pandas Kütüphanesi

2. Python Programlama Dili

Python, Hollandalı bir yazılım geliştirici olan Guido van Rossum tarafından 1990 yılında tasarlanmış bir programlama dilidir. Programlama dilinin adı, yaygın bilinenin aksine piton yılanından değil, Guido van Rossum’un çok sevdiği Monty Python adlı, altı kişiden oluşan İngiliz komedi grubunun oynadığı, Monty Python’s Flying Circus isimli gösteriden gelmektedir [3].

Açık kaynak kod lisansına sahip olan ve ücretsiz yazılım geliştirilmesine imkan veren Python programlama dilinin; Windows, Unix/Linux ve MacOS işletim sistemleri üzerinde farklı yöntemlerle çalıştırılması mümkündür.

Programlama dil yapısı açısından incelendiğinde, yüksek seviyeli diller kategorisine giren Python’un en ilginç özelliği; i) fonksiyonel programlama, ii) nesne yönelimli programlama ve iii) yapısal programlama dil paradigmalarının hepsini desteklemesidir. Dilin diğer güçlü yanlarından birisi de dinamik dil yorumlayıcısına (interpreter) sahip olmasıdır.

3. Kurulum

Python dili ile yazılmış bir programın bilgisayarınızda çalışabilmesi için işletim sistemiyle uyumlu Python yorumlayıcının bilgisayarınızda kurulu olması gerekmektedir. Resmi Python sitesinden [4] uygun yorumlayıcıya sahip kurulum paketini indirip, sisteminize kurabilirsiniz.

Python kurulum paketlerinde, 2.7 ve 3.x olmak üzere iki temel farklı sürümün olması dikkat çekicidir. 2008 yılında Python 2.6 ile beraber, geçmiş versiyonlarla uyumlu olmayan Python 3.0 çıkartılmış, daha sonra 2009 yılında Python 2.7 ve Python 3.1 yine birlikte çıkartılarak, bundan sonra Python 2 serisine devam edilmeme kararı verilmiştir [5].

Python kodu yazabilmek için farklı birçok IDE (Integrated Development Environment — Bütünleşik Geliştirme Ortamı) bulunsa da Notepad gibi basit metin düzenleyiciler kullanarak Python programlama yapmanız mümkündür. Programlama dilinin söz dizimlerini renklendirmek, iç-içe kod satırı yuvalaması yapmak gibi isteklerim var, basit metin düzenleyicileri ile uğraşamam diyorsanız, orta seviye IDE’leri hiç kullanmadan, doğrudan Spyder ve Jupyter Notebook yazılımlarını içerisinde barındıran Anaconda [6] gibi dağıtımları kurmanız kişisel gelişiminiz açısından daha yararlı olacaktır.

4. Python Değişken Türleri

Değişkenler programlamanın vazgeçilmez birer parçası olup, özel bellek bölgelerinde saklanmaktadırlar. Diğer programlama dillerinde olduğu gibi Python programlama dilinde de aşağıdaki gibi farklı değişken türleri desteklenmektedir.

  • Sayısal Türler
  • Karakter Dizileri (string)
  • Boolean Türler
  • Özel Türler

Python kodlarında değişkenlerin türlerini tanımlamak için özel anahtar kelimelerin yazılmasına (int, float, string) yani “bak burada şimdi değişken tanımlıyorum” demeye gerek yoktur. Python’da değişken tanımı, değişkene değer atandığında otomatik olarak gerçekleşir (type inferred language). Aşağıdaki kod parçasında farklı türde değişken atamaları ve sonuçları gösterilmiştir, son satırda type() fonksiyonu kullanılarak, her değişkenin türü çıktı olarak yazdırılmıştır.

Kod 1. Basit değişken türleri ve atamaları

5. Python Koşul Deyimleri

Python programlama dilinde, koşul deyimi olarak “if” kullanılmaktadır. Bu koşulun sonucu doğru (true) ise koşul devamındaki iç içe yuvalanmış kodlar işletilir, doğru değilse (false) “else” deyimi ve devamındaki kod satırları çalışır. Ayrıca “elif” deyimi kullanılarak, else kod blokuna düşülen bir durumda, ilave bir “if” deyimi daha çalıştırılabilir. Aşağıda her üç durumu gerçekleyen bir kod parçası yer almaktadır.

Kod 2. Koşul deyimlerinin kullanımı

6. Python Döngüleri

Diğer programlama dillerinde olduğu gibi Python’da da while ve for olmak üzere iki temel döngü türü bulunmaktadır.

  • while döngülerinde, bir koşul en başta işletilir ve bu koşul doğru olduğu sürece while döngüsü içerisinde yer alan kod satırları çalıştırılır. Her yinelemede koşul tekrar kontrol edilir, eğer koşul sonucu yanlışsa koşuldan çıkılır.
  • for döngülerinde, belirli bir “dizi/liste/sayı aralığı” içerisinde baştan sona döngü işletilir ve for döngüsü içerisinde yuvalanmış kodlar çalıştırılır. Döngünün işleteceği eleman kalmayınca döngü sonlandırılır.

Aşağıdaki kod parçasında hem while hem de for döngüleri kullanılarak 0 ve 5 arasındaki sayılar (5 hariç) ekrana yazdırılmıştır.

Kod 3. for ve while döngülerinin kullanımı

7. Python Veri Yapıları

7.1. Listeler

Listeler neredeyse bu dilin en çok kullanılan veri yapılarından birisidir. Aslında temel bir sıralama türü olarak da adlandırılan listeler, bir değer koleksiyonunu saklamak için kullanılırlar. Bir liste, herhangi bir veri türünde değerleri içerebilir ayrıca liste değerleri içinde başka yuvalanmış listeler de saklanabilir. Aşağıdaki kod parçasında bir liste tanımı ve bu liste elemanlarına indis ile erişimler gösterilmiştir. Python’da liste elemanlarının indis değerleri 0'dan başlayarak artmaktadır.

Dikkat edilirse negatif indis değerleri kullanılarak listenin sonundan başına doğru erişim de gerçekleştirilebilmektedir.
Kod 4. Liste kullanımı

Python listelerine erişimde birden fazla liste elemanını getirme ihtiyacı olduğunda, “liste dilimleme (list slicing)” adlı yöntem kullanılmaktadır. Alt liste getirme olarak da isimlendirilebilecek bu yöntemin genel yapısı aşağıdaki gibidir.

liste_nesnesi[baslangic_indisi:bitis_indisi:adim]
  • baslangic_indisi: getirilecek alt listenin ilk elemanının indis değeridir. Bu indiste yer alan eleman alt listeye dahil edilir. Varsayılan değeri 0'dır.
  • bitis_indisi: getirilecek alt listenin son elemanının indis değeridir. Bu indiste yer alan eleman alt listeye dahil edilmez. Varsayılan değeri, “eleman sayısı -1” şeklinde hesaplanır.
  • adim: getirilecek alt listedeki elemanların indis aralıklarını belirtmektedir. Varsayılan değeri 1'dir.
Kod 5. Liste dilimleme yöntemi

Liste elemanları üzerinde değişiklik yapmak için remove() ve append() gibi fonksiyonlar kullanılmaktadır. Ayrıca toplama operatörü (+) de kullanılarak listeye ekleme işlemi yapılabilir.

Kod 6. Liste elemanları üzerinde değişiklik yapılması

Liste nesnelerinin desteklediği bazı fonksiyonlar aşağıdaki kod parçasında örnek olarak gösterilmiştir.

Kod 7. Liste veri yapısının fonksiyonları

7.2. Sözlükler (Dictionaries)

Sözlükler anahtar-değer çiftlerini saklayabilen özel koleksiyonlar olup, anahtarların mutlaka benzersiz değerlere sahip olması gerekmektedir. Sözlük oluşturulması sırasında süslü parantezler kullanılmaktadır. Aşağıdaki kod parçasında; sözlüğe yeni eleman ekleme, sözlükten eleman silme (del) ve sözlükteki bir elemanı anahtar ile kontrol etme (“key” in) işlemleri için kod satırları görülmektedir.

Kod 8. Sözlük kullanımı

Sözlük nesnelerinin desteklediği bazı fonksiyonlar aşağıdaki kod parçasında örnek olarak gösterilmiştir.

Kod 9. Sözlük veri yapısının fonksiyonları

8. Referans Türleri ve Nesne Klonlama

Python programlama dilindeki birçok nesne türü (örneğin: listeler) referans türündedir (reference type). Yani siz bir nesneye atama yaparken “ilgili değerleri” değil, “değerlerin tutulduğu bellek adresini” kullanırsınız [7].

Dolayısıyla referans türündeki bir nesneyi, başka bir nesneye “=” operatörü ile atayarak, yeni değerlere sahip bir nesne oluşturmuş (kopyalamış / klonlamış) olmazsınız, aynı bellek adresini gösteren “ikinci nesneniz” olur.

Bir nesnede yapılan herhangi bir değişiklik diğer nesnede de aynı şekilde etkisini gösterir. Aşağıdaki kod parçasında bu durum, liste türündeki nesneler üzerinde iki farklı yöntem ile gösterilmiştir.

Kod 10. Referans tür örneği (listeler)

9. Python Fonksiyon Tanımları

Fonksiyonlar belirli bir isme sahip program parçalarıdır. Karmaşık yapıdaki programların karmaşıklığını azaltmak ve bu programları modüler bir yapıya kavuşturmak için kullanılırlar.

Modüler yapıları sayesinde programcıların tekrarlanan kodlar yazmalarını önlerler.

Aşağıdaki kod parçasında, veri yapıları dersinin olmazsa olmazlarından kabarcık sıralama (bubble sort) algoritmasının, fonksiyon gerçekleştirimi yer almaktadır. Python’da fonksiyon tanımlayıcı anahtar kelime olarak “def” kullanılır. Geriye bir değer döndürülmesi isteniyorsa “return <deger>” şeklinde bir kod satırı ile fonksiyon tamamlanır.

Kod 11. Fonksiyon örneği — kabarcık sıralama

Veri bilimi projelerinde, fonksiyonlar, sıkça kullanılan programlama yapılarıdır. Örneğin Keras kütüphanesi kullanarak basit (basitModel()) ve derin bir yapay sinir ağı modelini (derinModel())fonksiyonlar yardımıyla aşağıdaki gibi oluşturabiliriz.

Kod 12. Fonksiyon örneği — derin öğrenme modelleri

10. Python Lambda Fonksiyonları

Python programlama dilindeki anonim lambda fonksiyonları, istenildiği kadar girdi parametresi alır ve bir tane deyimi çalıştırır. Genel kullanım şekli aşağıdaki gibidir.

lambda parametreler : deyim

Aşağıdaki kod parçasında fnc ve fnc2 isimli 2 adet lambda fonksiyon bulunmaktadır. fnc fonksiyonu 1 adet parametre alarak, parametrenin değeri 1 arttırıp geri dönmektedir. fnc2 fonksiyonu ise aldığı 2 adet parametrenin değerini toplayarak geri dönmektedir. Dikkat edilirse bir lambda fonksiyonunun değeri olarak başka bir fonksiyon kullanmak mümkündür.

Kod 13. Lambda fonksiyon kullanımı — 1

Lambda fonksiyonları içeren fonksiyonlar yazarak generic(genel) fonksiyonlar oluşturmak da mümkündür. Aşağıdaki fnc3() fonksiyonu, girdi olarak aldığı parametreyi, içerisinde barındırdığı lambda fonksiyonuna parametre olarak geçirmekte ve sayının n. kuvvetinin alınmasını sağlamaktadır. Bu yapı sayesinde, fnc_kare_al ve fnc_kup_al fonksiyonları dinamik olarak oluşturulmuş ve kullanılmıştır.

Kod 14. Lambda fonksiyon kullanımı — 2

11. Veri Bilimi ve Nesne Yönelimli Programlama

Nesne yönelimli programlama (Object Oriented Programming) nesneyi merkezine alan bir bilgisayar programlama yaklaşımıdır. Nesne yönelimli programlama terminolojisindeki “object/nesne” ve “oriented/yönelimli” kavramları ilk olarak 1960'lı yılların başında MIT tarafından yapay zeka projeleri yapan bir araştırma grubunda “ varlıklar ve onların sahip oldukları özellikler” isimlendirilirken kullanılmıştır.

Fonksiyonların kullanıldığı yapısal programlama yaklaşımında sadece soruna odaklı farklı fonksiyonlar yazılır ve sadece o sorun için fonksiyonlar kullanılır. Dolayısıyla yapısal programlama yaklaşımıyla oluşturulmuş bir program binlerce ayrı isimde tanımlanmış değişken ve yüzlerce farklı fonksiyona sahip olabilir. En ufak işlem için bile ayrı fonksiyon oluşturulması gerekir ve bu programın karmaşıklığını arttırır.

Soru: Veri bilimi projelerinde nesne yönelimli programlama kullanılması zorunlu mu?

Bu sorunun cevabına hızlıca “hayır, zorunlu değil” diyebiliriz. Ancak,

  • projenizde kod karmaşıklığı gittikçe artıyor ve soyutlama ihtiyacı duyuyorsanız,
  • yazdığınız kodlar birer “science-script” olmaktan çıkıp servis koduna dönüşüyorsa,
  • bu kodların başka projeler içerisinde sadece sizin belirlediğiniz erişim kurallarıyla kullanılmasını istiyorsanız,

veri bilimi projenizi nesne yönelimli yaklaşımla yeniden düzenlemeniz (refactoring) gerekebilir.

Sizi “amaçtan uzaklaştırmıyor” ve “yapmış olmak için yapmıyorsanız” bir veri bilimi projesinde nesne yönelimli programlamanın üzerine SOLID tasarım prensiplerini [8] bile kullanabilirsiniz.

Ayrıca Python ile gerçekleştirdiğimiz neredeyse her veri bilimi projesinde, nesne yönelimli programlama yaklaşımı ile geliştirilmiş kütüphaneleri kullandığımızı da unutmamak gerekiyor. Aşağıdaki linke tıklayarak “scikit-learn” kütüphanesinde yer alan “naive_bayes.py” dosyasını ve içerdiği sınıfları inceleyebilirsiniz.

İki sınıftan oluşan, Python ile yazılmış basit bir program parçası aşağıda örnek olarak verilmiştir. Sınıfların tanımlanmasında “class” anahtar kelimesi ve kurucu metot (constructor) tanımında “__init__” fonksiyon adı kullanılmıştır. self anahtar kelimesi kullanılarak o anki aktif nesnenin özelliklerine ve metotlarına erişilebilir. Üst sınıfa (parent) erişmek için ise super() kullanılabilir.

Kod 15. Nesne yönelimli programlama kod parçası

12. NumPy Kütüphanesi

Numpy kütüphanesi adını Sayısal Python (Numerical Python) kelimelerinin kısaltmalarından almıştır. Kütüphanenin en önemli özelliği, hızlı matematiksel işlemler yapılabilecek diziler (array) sunmasıdır. Python’un kendi veri yapısında bulunan liste veri yapısına göre oldukça hızlı çalışan Numpy kütüphanesi kullanılarak; rastgele sayı üretme, matris çarpımı ve doğrusal cebir işlemleri gibi birçok matematiksel işlemi gerçekleştirmek mümkündür. Kütüphane kullanımına yönelik; çok boyutlu dizi oluşturma, dizilerin farkını/toplamını/çarpımını hesaplama, belirli bir değerden büyük olan elemanların indislerini bularak elemanları ekranı yazdırma gibi örnekler aşağıda gösterilmiştir.

Kod 16. Numpy kütüphanesi kullanım örnekleri — 1

Aşağıdaki örneklerde ise dizinin minimum/maksimum değerine sahip elemanını bulma, dizinin ortalamasını/toplamını/logaritmasını/karekökünü hesaplama, matrisin transpozunu alma gibi işlemler gösterilmiştir.

Kod 17. Numpy kütüphanesi kullanım örnekleri — 2

13. Pandas Kütüphanesi

Pandas yüksek performanslı ve kolay kullanılabilen bir veri yapılandırma ve veri analizi kütüphanesidir. En temel dezavantajı, kütüphanenin paralel programlama alt yapısını desteklemiyor olmasıdır. Dolayısıyla yapacağımız işlemlerin performansı, makinemizin gücü ile doğru orantılı olacaktır. Bu kütüphane ile excel, json, metin (csv) ve veritabanı gibi birçok farklı kaynaktan veri okunabilir ve bu kaynaklara veri yazılabilir. Tek boyutlu olarak Series isimli, 2 boyutlu olarak da DataFrame isimli veri yapısını içinde barındırır. Pandas tabloları içerisinde birçok tipte değişken tutabilirler (sayısal, kategorik, tarih vb.). Veri dönüştürme, filtreleme gibi önemli veri ön işleme aşamaları bu kütüphane ile kolayca gerçekleştirilebilir. Pandas ile yapılabilecek işlemlere bazı örnekler aşağıdaki kod parçasında gösterilmiştir.

Kod 17. Pandas kütüphanesi kullanım örnekleri

Veri biliminin Hello World’ü olarak bilinen ve hava durumu özniteliklerine (‘outlook’, ‘temp’, ‘humidity’, ‘windy’) göre dışarı çıkıp tenis oynanıp oynanmayacağına (‘play’) karar verilen veri kümesi (tennis dataset) üzerinde yapılan bazı çalışmalar aşağıda gösterilmiştir. Öncelikle, liste tipindeki data isimli değişkene atanan veriler pd.DataFrame() fonksiyonu kullanılarak, bir veri çerçevesine dönüştürülmüş ve df adlı değişkende (nesnede) saklanmıştır. Daha sonra, veri çerçevesine ait üst seviye bazı bilgiler; info, shape ve describe fonksiyonları kullanılarak ekrana yazdırılmıştır.

Kod 18. Pandas kütüphanesinin veri kümesi üzerinde kullanılması

Oluşturduğumuz veri kümesine ait tüm veriler kategorik türde olduğu için describe() fonksiyonunu çalıştırdığımızda, minimum/maksimum değer ve standart sapma gibi sonuçlar elde edilemeyecektir. Etiket kodlama (label encoder) yapılmasını sağlayan kütüphaneleri kullanarak, kategorik değerleri sayısal değerlere aşağıdaki gibi çevirmek mümkündür. Öznitelik değerlerinden benzersiz olanlar alfabetik olarak sıralanır ve 0'dan başlayarak ayrı birer değer alır. Örneğin temp özniteliğinin sahip olduğu Cool değeri alfabetik sıralamada, ilk sırada (Cool-Hot-Mild) yer alacağı için 0 değeri alacaktır.

Kod 19. Kategorik değerlerin sayısal değerlere dönüştürülmesi

Dönüşüm işlemi öncesinde ve sonrasında, describe() fonksiyonunun çalıştırılması ile elde edilen çıktılar aşağıdaki resimde gösterilmiştir.

Tür dönüşüm işleminin durumdan duruma değişen faydaları ve zararları olabilir (algoritmanın uyumsuzluğu, veri kaybı vb.). Öğrenme sürecinde (hatta devamında) bu ve benzeri senaryolarda, deneme yanılma yapmak genelde tek çaredir. Zaman içerisinde farklı veri bilimi projeleri yaptıkça, aldığınız kararların hızı ve kalitesi de artacaktır.

Yazıyı kısa tutmaya çalışsam da mecburen ana başlıklara değinmek ve bazı detaylara girmek zorunda kaldım. Bu kısma kadar okuduğunuz için teşekkürler :) Pandas kısmı ile ilgili Nezahat Başeğmez’in hakkını da ayrıca vermek istiyorum.

Sorularınız için Deep Learning Türkiye soru-cevap sitesini kullanabilirsiniz.

Görüşmek üzere…

Referanslar

  1. https://en.wikipedia.org/wiki/Data_science
  2. https://www.pythontr.com/makale/python-nedir-235
  3. https://www.imdb.com/title/tt0063929/mediaviewer/rm287774976
  4. https://www.python.org/
  5. https://www.anaconda.com/
  6. http://www.veridefteri.com/2017/12/08/temel-python-programlama-ilk-adimlar/
  7. http://www.tutorialsteacher.com/csharp/csharp-value-type-and-reference-type
  8. https://deviq.com/solid/