Biyoinformatikte Python ile Temel Veri Manipülasyonu ve Analizi: Pandas ve NumPy

Değerli Codon.tr okuyucuları,

Moleküler biyoloji ve genetik alanındaki ilerlemeler, özellikle omik teknolojiler sayesinde, her geçen gün daha da karmaşık ve yüksek hacimli biyolojik veri setleriyle karşılaşmamıza neden oluyor. Bu verileri anlamlandırmak ve bilimsel keşiflere dönüştürmek ise biyoinformatik araçlar ve programlama dillerinin etkin kullanımıyla mümkün.

Doktora çalışmalarımı kanser biyolojisi ve biyoinformatik üzerine yoğunlaştırmış, tek hücre dizileme ve genomiğe dayalı biyobelirteç keşfi gibi alanlarda aktif olarak çalışan bir akademisyen olarak, Python’ın biyolojik veri analizi için vazgeçilmez bir araç olduğunu rahatlıkla söyleyebilirim. Bugün, Python ekosisteminin iki temel kütüphanesi olan Pandas ve NumPy’ı kullanarak biyoinformatikte temel veri manipülasyonu ve analizini nasıl gerçekleştireceğimizi adım adım inceleyeceğiz.

Neden Python, Pandas ve NumPy Biyoinformatikte Hayati Önem Taşır?

Python, okunabilirliği, geniş kütüphane desteği ve çok yönlülüğü sayesinde bilimsel hesaplama ve veri analizi alanında kendine sağlam bir yer edinmiştir. Biyoinformatik gibi disiplinlerarası bir alanda, farklı veri türlerini (gen ifadesi, mutasyon, klinik bilgiler vb.) kolayca işleyebilmek büyük avantaj sağlar.

  • Pandas: Özellikle tablo benzeri yapılandırılmış verilerle çalışmak için tasarlanmıştır. DataFrame adı verilen güçlü veri yapısı sayesinde, Excel tablolarına benzer şekilde satır ve sütunlardan oluşan veri setlerini kolayca yükleyebilir, düzenleyebilir ve analiz edebiliriz. Gen ifadesi matrisleri, hasta demografik verileri veya ilaç tarama sonuçları gibi biyolojik veriler için biçilmiş kaftandır.
  • NumPy: Sayısal Python’ın temelini oluşturur ve yüksek performanslı çok boyutlu diziler (ndarray’ler) ve matris işlemleri sağlar. Pandas DataFrame’lerinin arkasındaki gücü de NumPy sağlar. Büyük sayısal veri setleri üzerinde hızlı matematiksel işlemler yapmak, genomik dizileme verilerindeki sayısal hesaplamalar veya istatistiksel analizler için kritik öneme sahiptir.

Temel Veri Yükleme ve Keşif

Biyoinformatik analiz sürecinin ilk adımı, verileri çalışma ortamına yüklemek ve yapısını anlamaktır. Genellikle .csv, .tsv veya .xlsx gibi formatlarda depolanan omik verileri (bütün genlerin, proteinlerin veya metabolitlerin incelenmesi sonucu elde edilen yüksek hacimli veriler), örneğin TCGA’dan indirilmiş gen ifadesi matrisleri veya GEO’dan elde edilmiş RNA-seq sonuçları gibi verileri Pandas ile kolayca okuyabiliriz.


import pandas as pd
import numpy as np

# Örnek bir gen ifadesi matrisi (gerçekte bu bir dosyadan okunur)
# tcga_rna_seq.csv adında bir dosya varsayalım
try:
    df_gen_ifadesi = pd.read_csv('tcga_rna_seq.csv', index_col=0)
except FileNotFoundError:
    # Dosya bulunamazsa örnek bir DataFrame oluşturalım
    # Bu DataFrame'in 20.07.2026 tarihinde oluşturulduğunu varsayalım
    data = {
        'Gen_A': np.random.rand(5) * 100,
        'Gen_B': np.random.rand(5) * 50,
        'Gen_C': np.random.rand(5) * 200,
        'Gen_D': np.random.rand(5) * 75
    }
    df_gen_ifadesi = pd.DataFrame(data, index=['Hasta_01', 'Hasta_02', 'Hasta_03', 'Hasta_04', 'Hasta_05'])
    df_gen_ifadesi['Kanser_Tipi'] = ['Meme', 'Akciğer', 'Meme', 'Kolorektal', 'Akciğer']

print("DataFrame'in ilk 5 satırı:")
print(df_gen_ifadesi.head())

print("
DataFrame hakkında genel bilgi:")
df_gen_ifadesi.info()

print("
Sayısal sütunların özet istatistikleri:")
print(df_gen_ifadesi.describe())

Yukarıdaki kod bloğu, bir CSV dosyasından gen ifadesi verilerini okumayı ve ardından .head() ile ilk birkaç satırını, .info() ile veri tiplerini ve eksik değer sayılarını, .describe() ile de temel istatistiksel özetleri görüntülemeyi gösterir. Bu adımlar, verinin genel yapısını ve olası sorunlarını hızlıca anlamak için kritik öneme sahiptir.

Veri Temizleme ve Ön İşleme

Gerçek dünya biyolojik verileri genellikle eksik değerler (NaN – Not a Number), hatalı girişler veya yinelenen kayıtlar içerir. Bu sorunları çözmek, güvenilir analizler yapabilmek için elzemdir.

  • Eksik Değerleri Yönetme: Eksik değerleri ya ortalama/medyan gibi değerlerle doldurabilir (.fillna()) ya da bu satırları tamamen silebiliriz (.dropna()). Seçim, verinin doğasına ve eksiklik oranına bağlıdır.
  • Yinelenen Verileri Kaldırma: Özellikle hasta ID’leri veya örnek ID’leri gibi tanımlayıcı sütunlarda yinelenen kayıtlar bulunabilir. .drop_duplicates() metodu ile bu sorun giderilebilir.

# Eksik değerleri simüle edelim
df_gen_ifadesi.loc['Hasta_02', 'Gen_A'] = np.nan
df_gen_ifadesi.loc['Hasta_04', 'Gen_C'] = np.nan

print("
Eksik değerler sonrası DataFrame:")
print(df_gen_ifadesi)

# Eksik değerleri ortalama ile doldurma (sadece sayısal sütunlar için)
# Kanser_Tipi gibi kategorik sütunları dışarıda bırakmak önemlidir
numeric_cols = df_gen_ifadesi.select_dtypes(include=np.number).columns
df_gen_ifadesi[numeric_cols] = df_gen_ifadesi[numeric_cols].fillna(df_gen_ifadesi[numeric_cols].mean())

print("
Eksik değerler ortalama ile doldurulduktan sonra:")
print(df_gen_ifadesi)

# Yinelenen satırları kaldırma (örneğimizde yok ama genel kullanım için)
# df_gen_ifadesi = df_gen_ifadesi.drop_duplicates()

Veri Filtreleme ve Seçimi

Belli koşullara uyan satırları veya belirli sütunları seçmek, biyoinformatik analizlerde sıkça karşılaşılan bir durumdur. Örneğin, sadece belirli bir kanser tipine ait hastaları veya sadece yüksek ifadeye sahip genleri incelemek isteyebiliriz. Pandas’ın loc ve iloc erişimcileri ile koşullu filtreleme işlemleri oldukça kolaydır.


# Sadece meme kanseri hastalarını filtreleme
df_meme_kanseri = df_gen_ifadesi[df_gen_ifadesi['Kanser_Tipi'] == 'Meme']
print("
Meme kanseri hastaları:")
print(df_meme_kanseri)

# Belirli bir genin (örneğin Gen_A) ifadesi 70'ten yüksek olan hastaları bulma
df_yuksek_gen_a = df_gen_ifadesi[df_gen_ifadesi['Gen_A'] > 70]
print("
Gen_A ifadesi 70'ten yüksek olan hastalar:")
print(df_yuksek_gen_a)

# Sadece belirli sütunları seçme (örneğin Gen_A ve Gen_B)
df_secili_genler = df_gen_ifadesi[['Gen_A', 'Gen_B']]
print("
Seçili genler:")
print(df_secili_genler)

Veri Birleştirme (Merging) ve Birleştirme (Concatenation)

Farklı dosyalarda tutulan biyolojik verileri (örneğin, bir dosyada gen ifadesi, diğerinde hasta klinik bilgileri) birleştirmek, kapsamlı analizler için temel bir adımdır. Pandas, bu işlemleri .merge() ve .concat() metotlarıyla kolaylaştırır.


# Örnek klinik veri DataFrame'i oluşturalım
data_klinik = {
    'Yaş': [55, 62, 48, 71, 59],
    'Tedavi_Grubu': ['A', 'B', 'A', 'C', 'B']
}
df_klinik = pd.DataFrame(data_klinik, index=['Hasta_01', 'Hasta_02', 'Hasta_03', 'Hasta_04', 'Hasta_05'])
df_klinik.index.name = 'Hasta_ID'

print("
Klinik veri DataFrame:")
print(df_klinik)

# Gen ifadesi ve klinik verileri hasta ID'sine göre birleştirme
# df_gen_ifadesi'nin index'ini bir sütuna dönüştürüp merge yapmak daha uygun olabilir
df_gen_ifadesi_reset = df_gen_ifadesi.reset_index().rename(columns={'index': 'Hasta_ID'})

df_birlesik = pd.merge(df_gen_ifadesi_reset, df_klinik, on='Hasta_ID', how='inner')
print("
Birleştirilmiş DataFrame:")
print(df_birlesik)

.merge() fonksiyonu, SQL benzeri birleşimler yapmanıza olanak tanır (inner, outer, left, right). Bu, farklı omik veri türlerini (örneğin gen ifadesi ve mutasyon verileri) veya farklı hasta gruplarını aynı DataFrame’de toplamak için idealdir.

Temel İstatistiksel Analizler ve Gruplandırma

Verileri gruplara ayırarak (örneğin, kanser tipine veya tedavi grubuna göre) istatistiksel özetler çıkarmak, biyolojik farklılıkları keşfetmek için güçlü bir yaklaşımdır. Pandas’ın .groupby() metodu bu konuda oldukça etkilidir.


# Kanser tipine göre gen ifadesi ortalamalarını hesaplama
df_kanser_tipi_ort = df_birlesik.groupby('Kanser_Tipi')[['Gen_A', 'Gen_B', 'Gen_C', 'Gen_D']].mean()
print("
Kanser tipine göre gen ifadesi ortalamaları:")
print(df_kanser_tipi_ort)

# Tedavi grubuna göre yaş ortalamasını bulma
df_tedavi_yas_ort = df_birlesik.groupby('Tedavi_Grubu')['Yaş'].mean()
print("
Tedavi grubuna göre yaş ortalamaları:")
print(df_tedavi_yas_ort)

NumPy ile Sayısal İşlemlerin Gücü

NumPy, özellikle büyük sayısal veri setleri üzerinde hızlı ve etkin işlemler yapmak için tasarlanmıştır. Pandas DataFrame’lerinin temelini oluşturan NumPy dizileri, vektörize işlemler (her bir eleman üzerinde tek tek döngü yerine, tüm dizi üzerinde aynı anda işlem yapma) sayesinde Python’da for döngüsü kullanmaktan çok daha performanslıdır.


# NumPy dizisi oluşturma
array_gen_ifadesi_values = df_gen_ifadesi[['Gen_A', 'Gen_B', 'Gen_C', 'Gen_D']].values
print("
DataFrame'den oluşturulan NumPy dizisi:")
print(array_gen_ifadesi_values)
print("Dizinin şekli:", array_gen_ifadesi_values.shape)

# Tüm gen ifadelerine log2 dönüşümü uygulama (biyoinformatikte yaygın bir işlem)
log2_ifade = np.log2(array_gen_ifadesi_values + 1) # +1 ekleyerek log(0) hatasını önleriz
print("
Log2 dönüşümü uygulanmış gen ifadeleri:")
print(log2_ifade)

# Matris çarpımı (örneğin, bir dönüştürme matrisi ile)
matris_A = np.array([[1, 2], [3, 4]])
matris_B = np.array([[5, 6], [7, 8]])
matris_carpimi = np.dot(matris_A, matris_B)
print("
Matris çarpımı:")
print(matris_carpimi)

NumPy’ın sağladığı bu yetenekler, gen ifadesi verilerinde normalizasyon, boyut indirgeme veya ileri düzey istatistiksel modelleme gibi karmaşık biyoinformatik algoritmaların temelini oluşturur.

Gerçek Biyolojik Veri Senaryoları

Bu temel Pandas ve NumPy işlemleri, biyoinformatikteki birçok gerçek dünya problemine uygulanabilir:

  • Tek Hücre RNA Dizileme (scRNA-seq): Seurat veya Scanpy gibi kütüphaneler de Pandas DataFrames’i ve NumPy dizilerini yoğun bir şekilde kullanır. Meta veri (hücre tipi, doku kökeni) manipülasyonu, gen ifadesi matrislerindeki filtreleme ve normalizasyon adımları Pandas ve NumPy ile yapılır.
  • Kanser Genomiği: TCGA gibi kaynaklardan alınan mutasyon verilerini (VCF formatı) Pandas ile okuyup, belirli genlerdeki mutasyonları filtreleyebilir, tümör tiplerine göre mutasyon sıklıklarını karşılaştırabiliriz.
  • Biyobelirteç Keşfi: Farklı gruplar (hastalık vs. kontrol) arasındaki gen ifadesi farklılıklarını bulmak için Pandas groupby() ile ortalamaları hesaplayıp, NumPy ile istatistiksel testler (örneğin t-testi) uygulayarak potansiyel biyobelirteç adaylarını belirleyebiliriz.
  • İlaç Keşfi ve Tarama: Yüksek verimli tarama (HTS) sonuçlarını içeren büyük tablosal verileri Pandas ile işleyerek aktif bileşikleri filtreleyebilir, doz-yanıt eğrileri için veri hazırlığı yapabiliriz.

Sonuç ve Gelecek Adımlar

Python’ın Pandas ve NumPy kütüphaneleri, biyoinformatik araştırmacılarının günlük veri manipülasyonu ve analiz görevlerini hızlı, verimli ve esnek bir şekilde gerçekleştirmeleri için vazgeçilmez araçlardır. Bu yazımızda ele aldığımız temel işlemler, yüksek hacimli omik verilerle çalışırken karşılaşacağınız karmaşık problemlerin çoğunun temelini oluşturur.

Unutmayın ki biyoinformatikteki başarı, sadece teorik bilgiyle değil, pratik uygulamalarla da mümkündür. Sunduğum kod örneklerini kendi veri setlerinizle veya açık veri kaynaklarından (GEO, SRA, cBioPortal) indireceğiniz verilerle deneyerek pratik yapmaya devam edin. Bir sonraki adımlarda, bu temel yeteneklerinizi veri görselleştirme (Matplotlib, Seaborn), istatistiksel modelleme veya makine öğrenimi (scikit-learn, TensorFlow, PyTorch) gibi daha ileri konularla birleştirebilirsiniz.

Biyoinformatik yolculuğunuzda hepinize başarılar dilerim!

Kaynaklar

  • McKinney, W. (2010). Data Structures for Statistical Computing in Python. In Proceedings of the 9th Python in Science Conference (Vol. 445, pp. 51-56).
  • 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.
  • Pandas Resmi Dokümantasyonu
  • NumPy Resmi Dokümantasyonu

Yorum yapın