Biyoinformatik | Veri Bilimi, NumPy, Pandas, Matplotlib, Jupyter
Ayşegül MURAT - Ege Üniversitesi Sağlık Biyoinformatiği A.B.D., Doktora Öğrencisi
Colin McCulloch’un 2013 yılında söylediği gibi, biyolojik bilimler diğer birçok bilimsel alan gibi şu anda bir “büyük veri” devrimi yaşamaktadır [1]. En özet haliyle, insan tarafından analiz edilip anlamlandırılması çok uzun zaman alacak ya da anlamlandırılma imkânı olmayan vereleri büyük veri olarak tanımlayabiliriz. Ancak bir bilgisayar tarafından analiz edilip saklanması mümkün olan büyük veriler; sağlık alanında genomik, proteomiks gibi omik verilerden, sağlık ve medikal kayıt verilerinden, akıllı saat, tablet ve telefon bilgilerinden, laboratuvar ve görüntü cihazları verileri gibi birçok analiz edilmeyi bekleyen verilerdir. Teknik olarak bir veriyi ancak doğru şekilde işlenerek analiz edildikten sonra bilgi haline gelebilmektedir. Bir veriden bilgi elde etmek istiyorsak, ham veriyi iyi tanımalıyız. Verinin depolanmasından, güvenliğinden, doğruluğundan, temizlenmesinden sonra ancak bilgiye erişip paylaşabilen taraf olabiliyoruz [1,2].
1991’de ortaya çıkan Python programlama dili, çeşitli tarihsel ve kültürel nedenlerle yorumlanan diller arasında geniş ve aktif bir bilimsel hesaplama ve veri analizi topluluğu geliştirmiştir. Python’un kütüphaneleri (pandas, numpy ve scikit-learn gibi), onu veri analizi için popüler bir seçim haline getirmiştir. Yorumlanmış bir programlama dili olması, genel olarak çoğu Python kodunun Java ve C++ gibi derlenmiş bir dille yazılmış koddan önemli ölçüde daha yavaş çalışmasını sağlar veya birçok CPU’ya bağlı iş parçacığını içeren uygulamalarda çok iş parçacığı oluşturmak için zorlu bir dil olabilir. Fakat yine de bunlar üstesinden gelinemeyecek özelliklerden değildir ve Python’un işlevselliğini değiştirmez [3].
Tüm biyolojik alanlarda standartlaştırılmış istatistiksel hesaplamalar; ortalamanın ve standart sapmaların hesaplaması (t-testleri, ANOVA’lar, regresyon, vb.) günümüzde birçok laboratuvar ortamındaki lisans öğrencisi tarafından yapılabilmektedir. İstatistiksel hesaplamaların yapılacağı veri analizleri için en çok tercih edilen Python gibi R dili de açık kaynaklı bir programlama dilidir. Ellerindeki verilerden ileri seviyede analiz etmek isteyen veri bilimine meraklı kişiler içinde Python aranan becerileri sağlamaktadır. Veri analizinde Python, çok çeşitli istatistiksel analizleri (pandas, numpy, scipy vb.) ve sonucunun sayısız şekilde görselleştirilmesini (matplotlib, seaborn, plotly vb.) sağlayan kütüphanelere sahiptir [1,4,5].
NumPy
Numerical Python’un kısaltması olan NumPy, uzun süredir Python’da sayısal hesaplamanın temel taşı olmuştur [3] ve bilimsel hesaplama için temel pakettir [6]. Veri madenciliği, makine öğrenmesi ve veri analizinde kullanılan bir modüldür. Numpy tek boyutlu ve çok boyutlu array yapılarına sahip olduğu için oldukça fazla kullanılır. Python’daki liste yapısının karşılığı NumPy’da array yapısıdır. Python listelerine göre az yer kapladığı için büyük verilerle uğraşırken avantajlıdır. NumPy arraylerinin elemanlarına erişmek Python listelerinin elemanlarına erişmekten daha hızlıdır [3,7].
NumPy;
NumPy paketinin merkezinde hızlı ve verimli birçok boyutlu dizi nesnesi ndarray bulunur,
Dizilerle eleman bazlı hesaplamalar veya diziler arasında matematiksel işlemler gerçekleştirmek için işlevleri,
Doğrusal cebir (linear algebra) işlemleri, Fourier dönüşümü ve rastgele sayı üretimi,
Python uzantılarının yerel C veya C++ kodunun NumPy’ın veri yapılarına ve hesaplama tesislerine erişmesini sağlamak için olgun bir C API’sine sahip olmak gibi özellikler sağlar.
Sayısal veriler için Numpy dizileri, verileri depolamak ve işlemek için diğer yerleşiklerden (built-in, dile gömülü olarak gelen) daha etkilidir [3,6,7].
NumPy arrayleri ve Python dizileri arasındaki bazı önemli farklar şunlardır;
NumPy dizileri, Python listelerinin (dinamik olarak büyüyebilen) aksine, oluşturulma sırasında sabit bir boyuta sahiptir. Aynı zamanda homojen veri değerlerine sahip olmalıdır. Bu da bir array yapısı ya integer içermeli ya da sadece float değerler almalıdır. Bir ndarray boyutunun değiştirilmesi yeni bir dizi oluşturacak ve orijinal diziyi silecektir.
Genel olarak bir NumPy dizisindeki öğelerin hepsinin aynı veri türünde olması gerekir ve bu nedenle bellekte aynı boyutta olacaklardır. NumPy dizisi yalnızca sayısal veri değerlerine (integers ya da float değerler) izin verir. Python listeleri için string dediğimiz ifadelere de izin verir.
NumPy dizileri, çok sayıda veri üzerinde ileri düzey matematiksel ve diğer işlem türlerini kolaylaştırır.
Basit bir örnek verecek olursak, bir boyutlu bir dizideki her bir elemanı aynı uzunluktaki başka bir dizideki karşılık gelen elemanla çarpma durumunu düşünelim. Veriler a ve b olmak üzere iki Python listesinde saklanıyorsa, her bir öğe üzerinde yineleme yapabiliriz:
c = []
for i in range(len(a)):
c.append(a[i]*b[i])
Şeklinde yazılmış standart Python kodu bize a ve b listelerindeki elemanlar, sırasıyla (for i in…) çarpıldıktan sonra oluşturulan boş bir c listesinin (c=[]) içerisine eklenmesini (çappend fonksiyonu) sağlamaktadır. NumPy ise, önceden derlenmiş C kodu tarafından hızlı bir şekilde yürütülen, bir ndarray yapasında varsayılan olarak bulanan öğe bazında işlem yapabilmemizi sağlayarak, biraz önce yazdığımız üç satırlık kodu tek satırda,
c = a * b
şeklinde az, hızlı ve basit bir kod şekliyle yazmamıza NumPy olanak sağlar [6,8].
SymPy
NumPy’a benzer olabilecek tamamen Python’da yazılmış SymPy kütüphanesi ise, açık kaynaklı bir bilgisayar cebir sistemidir. Sembolik matematik (Symbolic mathematics- SymPy) kütüphanesi kodun olabildiğince basit, anlaşılır ve kolayca genişletilebilir olmasını sağlarken tam özellikli bir bilgisayar sistemi (CAS) olmayı amaçlamaktadır [9, 10].
Pandas
pandas, yapılandırılmış veya tablo şeklindeki verilerle çalışmayı hızlı, kolay ve anlamlı hale getirmek için tasarlanmış üst düzey veri yapıları ve işlevleri sağlar. Pandas her veri bilimcisinin karşılaştığı temel Python kütüphanelerinden biridir. 2010 yılında ortaya çıkmasından bu yana Python’un güçlü ve verimli bir veri analizi ortamı olmasına yardımcı olmuştur [3].
Pandas hem satır hem de sütun etiketleri içeren tablo şeklinde sütun yönelimli bir veri yapısı olan DataFrame (df) ve tek boyutlu etiketli dizi nesnesi olan Series’leri içerir. Series’ler tek boyutlu dizler ve DataFrame (veri çerçeveleri) ise iki boyutlu matrislerdir. İki series2şn toplamı bir df olarak düşünebilirsiniz ve .csv, .json, .xml ve .sql gibi veri dosyalarını alıp df’e çevirdikten sonra bu verilerin üzerinde istediğimiz işlemler için sorgulama yapabiliyoruz. NumPy’ın hesaplama kabiliyetinin yüksek performansını gösteren Pandas; verileri esnek işleme kabiliyetiyle, verileri yeniden şekillendirmeyi ve parçalara ayırmayı, toplama, verileri alt kümelere bölmeyi veya verilerin içeresinden seçimler yapmayı kolaylaştırmak için indeksleme işlevi sağlamaktadır [3, 8].
Özellikle büyük veri işlemede oldukça önemli olan; veri işleme, hazırlama, temizleme gibi basamaklarda oldukça kullanışlı olduğu için veri madenciliği gibi alnalarda sıklıkla kullanılmaktadır. Farklı kaynaklardan verilerle etkili çalışmayı sağlayan pandas birçok dosya türüyle çalışmamıza olanak sağlar. İstatistiksel hesaplama için R dilinin (data.frame) kullananlara DataFrame adı tanıdık gelecektir. Python’dan farklı olarak dataframeler R programlama diline ve standart kitaplığa yerleştirilmiştir. NumPy’ın aksine Pandas’ta her bir eleman aynı veri tipinde olmak zorunda değildir. Kullanacağımız veri tipimiz integer, float ve string gibi veri tiplerinden oluşabilir [3, 11].
Pypolars
İsminden de anlaşılabileceği gibi pandas (pandalara benzeyen hayvan polar bear’den geliyor ismi) kütüphanesine benzer, keşif amaçlı veri analizi (EDA-exploratory data analysis) yapmak için yararlı bir python kitaplığıdır. Rust’taki (programlama dili) Polars adlı ünlü DataFrames kütüphanesinin, Python hali Pypolars olara kullanılmaktadır. Pandas kütüphanesi gibi .csv uzantılı dosyaları okuyabilir, df yapıdaki verinin satır ve sütunlarında işlemler yapabilir, group, join, head gibi birçok fonksiyonu kullanabilmekteyiz [12,13].
Matplotlib, Seaborn, Plotly
matplotlib, grafikler ve diğer iki boyutlu veri görselleştirmeleri üretmek için en popüler Python kütüphanesidir. Başlangıçta John D. Hunter tarafından oluşturulmuş olsa da şimdi büyük bir geliştirici ekibi tarafından çalışmalar sürdürülüyor. Başka görselleştirme kütüphaneler varken en yaygın olarak matplotlib kullanılmaktadır ve geri kalanlarla en iyi entegrasyona sahiptir [1, 3, 8, 11].
seaborn, istatistiksel grafikler oluşturmak için kullanılan bir Python kütüphanesidir. Matplotlib’e üst düzey bir arayüz sağlar ve pandas veri yapılarıyla bütünleşik olarak çalışır. Veri değerlerini renk, boyut veya stil gibi görsel niteliklerle otomatik olarak eşleri istatistiksel dönüşümleri dahili olarak hesaplar ve grafiği bilgilendirici eksenle dekore ederek etiketler. [5, 11].
plotly, dağılım, alan, çubuk grafikleri, hata çubukları, kutu grafikleri gibi kırktan fazla benzersiz grafik türünü destekleten etkileşimli, yayın kalitesinde grafik oluşturmamızı sağlayan açık kaynaklı Python kütüphanesidir [4,14,15].
Jupyter
2001 yılında Fernando Perez’in daha iyi etkileşimli Python yorumlayıcısı yapma yan projesi olarak başlayan IPython projesi, sonraki 16 yılda modern Python veri yığınındaki en önemli araçlardan biri haline geldi. Diğer birçok programlama dilinin tipik düzenleme derleyici çalışma iş akışı yerinei yürütmeyi keşfetme iş akışını teşvik eder. Ayrıca işletim sisteminizin kabuğuna ve dosya sistemine kolay erişim sağlar. 2014’te Fernando ve IPython ekibi, dilden bağımsız etkileşimli bilgi işlem araçlarını tasarlamak için daha geniş bir girişim olan Jupyter projesini duyurdu. IPython web not defteri, şimdi 40’tan fazla programlama dilini destekleyen Jupyter notebook haline geldi. IPython kabuğu ve Jupyter not defteri veri keşfi ve görselleştirme için kullanışlıdır. Jupyter notebook, Python kodunun yazılmasını, test edilmesini ve hata ayıklanmasını hızlandırır. Ayrıca Markdown ve HTML içerik yazmanıza izin vererek, size kod ve metin içeren zengin belgeler oluşturmak için olanak sunar [3,16].

Şekil 1: Jupyter ortamında Kaagle veri seti kullanımı. Jupyter’in HTML ve Markdown özelliği ilk iki satırda gösterilmiştir. A hücresinde, Python’un pandas ve numpy kütüphanesini indirdikten sonra, .csv uzantılı dosyamızı okutuyoruz. B hücresinde, DataFrame yapısındaki verimizi yazdırdığımızda satır ve sütunlardan oluştuğunu görüyoruz. C hücresinde ise, oluşturulan df içerisindeki sütunlar içerisinde boş değer olup olmadığını kontrol ederek toplamlarını (head – ilk 10 sonucu gösterir) yazdırıyoruz [16].
SciPy, Scikit-learn
SciPy, bilimsel hesaplamada bir dizi farklı standart problem alanını ele alan bir açık kaynaklı paketler koleksiyonudur. Örneğin; scipy.linalg: doğrusal cebir rutinleri ve matris ayrıştımralrı, scipy.signal: signal işleme araçları, scipy.stats ise standart sürekli ve ayrık olasılık dağılımları, çeşitli istatistiksel testler ve daha fazlası tanımlayıcı istatistikleri içermektedir [3,17].
Scikit-learn, 2010 yılından beri scikit-learn Python programcıları için önce gelen makine öğrenimi araç seti haline geldi. Makine öğrenimi için alt modüller içerir. Bunlardan bazıları; sınıflandırma (classification) için: SVM, en yakın komşu, rastgele orman, lojistik regresyon vb., regresyon için: Lasso, ridge resresyın vb., kümeleme (clustering) için: k-means, spektral kümele vb., boyut azaltma (dimensionality) için: PCA özellik seçimi/feature selection, matris çarpanlara ayırma/matrix factorization, model seçimi (model selction): grid/ızgara arana, çağraz doğrulama/cross validation, metrikler, ön işleme (preprocessing): özellik çıkarma/feature extraction, normalleştirme için kullanılan modellerdir [3,11].
Referanslar
David, A. A. (2021). Introducing Python Programming into Undergraduate Biology. The American Biology Teacher, 83(1), 33-41.
Dash, S., Shakyawar, S. K., Sharma, M., & Kaushik, S. (2019). Big data in healthcare: management, apnalysis and future prospects. Journal of Big Data, 6(1), 1-25.
Wes McKinney. Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython (2nd ed.), O'Reilly 2018
Adams, C. (2014). Learning Python data visualization. Packt Publishing Ltd.
Waskom, M. L. (2021). Seaborn: statistical data visualization. Journal of Open Source Software, 6(60), 3021.
Rabbi Radliya, N. (2019). [2] Numpy User Guide.
Harris, C. R., Millman, K. J., van der Walt, S. J., Gommers, R., Virtanen, P., Cournapeau, D., ... & Oliphant, T. E. (2020). Array programming with NumPy. Nature, 585(7825), 357-362.
Rajagopalan, G. (2021). Prepping Your Data with Pandas. In A Python Data Analyst’s Toolkit (pp. 147-241). Apress, Berkeley, CA.
Meurer, A., Smith, C. P., Paprocki, M., Čertík, O., Kirpichev, S. B., Rocklin, M., ... & Scopatz, A. (2017). SymPy: symbolic computing in Python. PeerJ Computer Science, 3, e103.
Rocklin, M., & Terrel, A. R. (2012). Symbolic statistics with SymPy. Computing in Science & Engineering, 14(3), 88-93.
Sial, A. H., Rashdi, S. Y. S., & Khan, A. H. (2021). Comparative Analysis of Data Visualization Libraries Matplotlib and Seaborn in Python. International Journal, 10(1).
Charis J. (2021), blog.jcharistech.com/2021/01/11/pypolars-data-analysis-with-pypolars-a-pandas-alternative/
Blank, S. (2009). Python Programming in OpenGL A Graphical Approach to Programming.
Dhruv, A. J., Patel, R., & Doshi, N. (2021). Python: The Most Advanced Programming Language for Computer Science Applications.
Plotly Technologies Inc. (2021). Collaborative data science. Plotly Technologies Inc. https: //plot.ly
Fangohr, H., Kluyver, T., & DiPierro, M. (2021). Jupyter in Computational Science. Computing in Science & Engineering, 23(2), 5-6.
Virtanen, P., Gommers, R., Oliphant, T. E., Haberland, M., Reddy, T., Cournapeau, D., ... & van Mulbregt, P. (2020). SciPy 1.0: fundamental algorithms for scientific computing in Python. Nature methods, 17(3), 261-272.