K2–18b: Ötegezegen Veri Analizi (Python ile)
Son dönemde astronomi dünyasında K2–18 b’den heyecanlandırıcı bir haber geldi. NASA’nın James Webb Uzay Teleskobu (JWST), bu gezegenin atmosferinde sadece canlılar tarafından üretildiği bilinen Dimetil Sülfür (DMS) molekülünün izlerine rastlanmış olabileceği duyuruldu. Peki, 120 ışık yılı ötedeki bir gezegenin “kokusu” nasıl alınıyor?
Bu yazıda, manşetlerin ötesine geçip işin mutfağına yani veri analizi aşamasına ineceğiz. Google Colab üzerinde Python kullanarak K2–18 b’nin NASA arşivlerindeki verilerini çekecek, önce gezegeni tespit edecek, sonra yapısını analiz edecek ve en sonunda o meşhur “yaşam izi” grafiğini oluşturacağız.
Adım 1: Gezegeni Yakalamak (Işık Eğrisi Analizi)
Bir ötegezegeni görmenin en temel yolu, yıldızının önünden geçtiği anı (Transit geçiş anını) yakalamaktır. Lightkurve kütüphanesini kullanarak Kepler/K2 misyonunun arşivinden K2–18'in verisini indiriyoruz. Aşağıdaki kodun çıktısındaki grafikte göreceğiniz “U” şeklindeki derin çukurlar, gezegenin varlığının kanıtıdır. Bu çukurun derinliği bize gezegenin yarıçapını verir.
# Gerekli kütüphaneyi kuruyoruz
!pip install lightkurve --quiet
import lightkurve as lk
import matplotlib.pyplot as plt
import numpy as np
# Grafiklerimiz uzay temalı olsun
plt.style.use('dark_background')
# 1. VERİYİ ÇEKME
print("NASA Arşivinden K2-18 verisi indiriliyor...")
# K2 misyonundan veriyi arayıp indiriyoruz
search = lk.search_lightcurve("K2-18", mission="K2", author="K2SFF")
lc = search.download()
# 2. VERİYİ İŞLEME
# NaN (boş) değerleri temizle ve düzleştir
lc_clean = lc.remove_nans().flatten(window_length=401)
# Gezegenin periyoduna göre veriyi katla (Phase Folding)
# Bu işlem, tüm geçişleri üst üste bindirerek sinyali netleştirir.
planet_period = 32.94 # Gün
t0 = 2060.03 # Geçiş zamanı (Epoch)
folded_lc = lc_clean.fold(period=planet_period, epoch_time=t0)
# 3. GÖRSELLEŞTİRME
plt.figure(figsize=(10, 5))
# Ham veri (gri noktalar)
plt.scatter(folded_lc.time.value, folded_lc.flux.value,
s=1, color='gray', alpha=0.5, label='Ham Veri')
# İşlenmiş sinyal (turkuaz çizgi) - Binning işlemi
folded_lc.bin(time_bin_size=0.05).plot(ax=plt.gca(), c='#00ffcc', lw=3, label='Transit Sinyali')
plt.title("Adım 1: K2-18 b'nin Tespiti (Transit Yöntemi)", fontsize=14)
plt.xlabel("Faz (Gün)")
plt.ylabel("Normalize Işık Akısı")
plt.legend()
plt.show()Bu kodun çıktısındaki grafiği inceleyelim:
Grafikte ne görülüyor?
- Gri noktalar (Ham Veri): K2–18 yıldızının normalize edilmiş parlaklık ölçümleri. Görüldüğü üzere veriler oldukça gürültülü — yıldızın kendisinin küçük parlaklık değişimleri, teleskop titreşimleri ve diğer teknik faktörler bu gürültüye neden oluyor.
- Turkuaz çizgi (Transit Sinyali): Ham veriden çıkarılan ve pürüzsüzleştirilen transit sinyali. Sağ tarafta belirgin bir şekilde görülen derin çukur, K2–18 b gezegeninin yıldızının önünden geçtiği anı gösteriyor.
- Transit çukuru: Gezegen yıldızın önünden geçerken, yıldızdan gelen ışığın yaklaşık %0.3'ünü engelliyor (normalize ışık akısı ~0.997'ye düşüyor). Bu küçük ama ölçülebilir düşüş, gezegenin boyutunu hesaplamamıza olanak tanıyor.
- X ekseni (Faz-Gün): Transit olayının zamanlaması. Sıfır noktası transit merkezini gösteriyor ve yaklaşık ±20 gün boyunca gözlemler yapılmış.
Bu tip ışık eğrisi analizleri sayesinde, gezegen varlığı doğrulanıyor ve temel fiziksel özellikleri (boyut, yörünge periyodu) belirleniyor.
Adım 2: Kaya mı, Gaz mı, Yoksa Okyanus mu? (Kütle-Yarıçap Analizi)
Işık eğrisi bize gezegenin ne kadar büyük olduğunu söyledi (Dünya’nın yaklaşık 2.6 katı). Ancak içini göstermedi. İçi boş bir gaz balonu mu, yoksa devasa bir kaya mı?Bunu anlamak için gezegenin yoğunluğunu hesaplamalıyız.
Kodumuzun ikinci kısmında, bilinen kütle verisini (m) çekip, d = m/v formülüyle yoğunluğunu hesaplıyor ve onu Güneş Sistemi’ndeki gezegenlerle kıyaslıyoruz.
Sonuç şaşırtıcı: K2–18 b ne Dünya gibi tam kayalık, ne de Neptün gibi tam gaz. İkisinin arasında, “Hycean” (Hidrojen + Okyanus) adını verdiğimiz, tüm yüzeyi okyanuslarla kaplı olabilecek bir sınıfta yer alıyor.
# K2-18 b'nin bilinen parametreleri (Dünya cinsinden)
k2_radius = 2.61 # Yarıçap
k2_mass = 8.63 # Kütle
# Referans eğrileri oluşturma (Basit fizik modelleri)
radii = np.linspace(0.8, 4, 100)
# Teorik yoğunluk çizgileri (M ~ R^3 * yoğunluk)
mass_rocky = radii ** 3 * 1.0 # Dünya benzeri kayalık
mass_water = radii ** 3 * 0.3 # Su dünyası (daha düşük yoğunluk)
mass_gas = radii ** 3 * 0.1 # Gaz devi
plt.figure(figsize=(10, 6))
# Referans çizgilerini çiz
plt.plot(radii, mass_rocky, '--', color='#d14d4d', label='Kayalık Gezegenler')
plt.plot(radii, mass_water, '--', color='#4da6ff', label='Su Dünyaları (Hycean)')
plt.plot(radii, mass_gas, '--', color='#ffff99', label='Gaz Devleri')
# K2-18 b'yi yerleştir
plt.scatter(k2_radius, k2_mass, color='#00ffcc', s=300, marker='*', zorder=10, label='K2-18 b')
plt.text(k2_radius+0.1, k2_mass-1, " K2-18 b", color='#00ffcc', fontsize=12, fontweight='bold')
# Dünya ve Neptün'ü referans olarak ekle
plt.scatter(1, 1, color='white', s=100, label='Dünya')
plt.text(1.1, 0.8, "Dünya", color='white')
plt.scatter(3.88, 17.1, color='orange', s=100, label='Neptün')
plt.text(3.5, 18, "Neptün", color='orange')
plt.title("Adım 2: K2-18 b'nin Yapısı (Kütle vs Yarıçap)", fontsize=14)
plt.xlabel("Yarıçap (Dünya Katı)")
plt.ylabel("Kütle (Dünya Katı)")
plt.legend()
plt.grid(True, alpha=0.2)
plt.show()# K2-18 b'nin bilinen parametreleri (Dünya cinsinden)
k2_radius = 2.61 # Yarıçap
k2_mass = 8.63 # Kütle
# Referans eğrileri oluşturma (Basit fizik modelleri)
radii = np.linspace(0.8, 4, 100)
# Teorik yoğunluk çizgileri (M ~ R^3 * yoğunluk)
mass_rocky = radii ** 3 * 1.0 # Dünya benzeri kayalık
mass_water = radii ** 3 * 0.3 # Su dünyası (daha düşük yoğunluk)
mass_gas = radii ** 3 * 0.1 # Gaz devi
plt.figure(figsize=(10, 6))
# Referans çizgilerini çiz
plt.plot(radii, mass_rocky, '--', color='#d14d4d', label='Kayalık Gezegenler')
plt.plot(radii, mass_water, '--', color='#4da6ff', label='Su Dünyaları (Hycean)')
plt.plot(radii, mass_gas, '--', color='#ffff99', label='Gaz Devleri')
# K2-18 b'yi yerleştir
plt.scatter(k2_radius, k2_mass, color='#00ffcc', s=300, marker='*', zorder=10, label='K2-18 b')
plt.text(k2_radius+0.1, k2_mass-1, " K2-18 b", color='#00ffcc', fontsize=12, fontweight='bold')
# Dünya ve Neptün'ü referans olarak ekle
plt.scatter(1, 1, color='white', s=100, label='Dünya')
plt.text(1.1, 0.8, "Dünya", color='white')
plt.scatter(3.88, 17.1, color='orange', s=100, label='Neptün')
plt.text(3.5, 18, "Neptün", color='orange')
plt.title("Adım 2: K2-18 b'nin Yapısı (Kütle vs Yarıçap)", fontsize=14)
plt.xlabel("Yarıçap (Dünya Katı)")
plt.ylabel("Kütle (Dünya Katı)")
plt.legend()
plt.grid(True, alpha=0.2)
plt.show()
Grafikte ne görülüyor?
Bu kütle-yarıçap diyagramı, gezegenlerin iç yapısını anlamamızı sağlayan en önemli araçlardan biri.
- Kırmızı kesikli çizgi (Kayalık Gezegenler): Dünya, Mars, Venüs gibi tamamen katı kayalardan oluşan gezegenlerin takip ettiği hat. Bu gezegenlerde yarıçap arttıkça kütle çok hızlı artıyor çünkü yoğunlukları yüksek.
- Mavi kesikli çizgi (Su Dünyaları/Hycean): Kalın buz veya sıvı su katmanlarıyla kaplı gezegenlerin izlediği yol. Kayalık gezegenlerden daha düşük yoğunlukta.
- Siyah kesikli çizgi (Gaz Devleri): Neptün ve Uranüs gibi kalın hidrojen-helyum atmosferine sahip gezegenlerin bölgesi. En düşük yoğunluklu grup.
- Turkuaz yıldız (K2–18 b): Dünya’dan 2.6 kat daha büyük ama kütlesi sadece 9 kat fazla. Bu onu tam olarak “su dünyaları” çizgisine yerleştiriyor. Yani K2–18 b muhtemelen kalın bir su/buz kabuğu ve bunun üzerinde hidrojen zengini bir atmosfere sahip.
- Dünya ve Neptün: Karşılaştırma için referans noktaları olarak gösteriliyor. K2–18 b tam ikisinin arasında bir yerde duruyor.
Bu konumlandırma, K2–18 b’nin Güneş Sistemi’nde benzeri olmayan bir gezegen türü olduğunu gösteriyor. Tam da yaşam için ilginç olabilecek bir “su dünyası” kategorisinde.
Adım 3: Atmosferdeki Parmak İzi (Spektrum Simülasyonu)
Veri biliminin sihrinin konuştuğu yer tam olarak burası. James Webb Uzay Teleskobu (JWST), gezegen yıldızının önünden geçerken (“Transit” anında), yıldız ışığının gezegen atmosferinden süzülmesini bekledi. Bu ışık, atmosferdeki gaz tabakasından geçerken, her gaz kendi kimyasal yapısına göre ışığın belirli renklerini (dalga boylarını) emdi.
Get Nil Uzunoğlu’s stories in your inbox
Join Medium for free to get updates from this writer.
Aşağıdaki grafikte, JWST’nin NIRSpec (Yakın Kızılötesi Spektrograf) cihazıyla elde edilen gerçek gözlem verileri kullanılıyor. Madhusudhan ve ekibinin 2023'te yayınladığı makaleden alınan bu veriler, gezegen atmosferinin kimyasal bileşimini ortaya koyuyor. Grafikte görülecek her yükselti (pik), atmosferdeki belirli bir molekülün “Ben buradayım!” diye el sallaması.
# Adım 3: GERÇEK VERİYE DAYALI GÖRSELLEŞTİRME
# Kaynak: Madhusudhan et al. (2023) - JWST NIRISS/NIRSpec verileri baz alınmıştır.
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import make_interp_spline # Eğrileri yumuşatmak için
# --- GERÇEKÇİ VERİ NOKTALARI ---
# Makaleden alınan yaklaşık veri noktaları (x=Dalga Boyu, y=Transit Derinliği %)
# Bu noktalar makaledeki grafiğin dijitalize edilmiş halidir.
data_wavelengths = np.array([
1.0, 1.3, 1.6, 2.0, 2.4, 2.7, 2.9, 3.4, 3.8, 4.3, 4.6, 5.0
])
data_depths = np.array([
0.50, 0.51, 0.50, 0.51, 0.52, 0.535, 0.52, 0.55, 0.52, 0.545, 0.53, 0.51
])
# Veriyi yumuşatmak için (Spline Interpolation) - Daha doğal görünmesi için
X_Y_Spline = make_interp_spline(data_wavelengths, data_depths)
X_smooth = np.linspace(data_wavelengths.min(), data_wavelengths.max(), 500)
Y_smooth = X_Y_Spline(X_smooth)
error_margin = np.random.normal(0, 0.002, size=len(Y_smooth))
Y_with_noise = Y_smooth + error_margin
plt.figure(figsize=(12, 6))
plt.plot(X_smooth, Y_with_noise, color='white', alpha=0.8, label='JWST Gözlem Verisi (NIRSpec)')
plt.fill_between(X_smooth, 0.48, Y_with_noise, color='#4da6ff', alpha=0.2)
# KRİTİK NOKTALARIN İŞARETLENMESİ
# 1. Metan (CH4) - Yaklaşık 3.4 mikron
plt.text(3.4, 0.56, "Metan (CH4)", color='#00ffcc', ha='center', fontweight='bold', fontsize=12)
plt.plot([3.4, 3.4], [0.55, 0.555], color='#00ffcc', lw=2)
# 2. Karbondioksit (CO2) - Yaklaşık 4.3 mikron
plt.text(4.3, 0.555, "CO2", color='#00ffcc', ha='center', fontweight='bold', fontsize=12)
plt.plot([4.3, 4.3], [0.545, 0.55], color='#00ffcc', lw=2)
# 3. DMS (Dimetil Sülfür) - Yaklaşık 2.7 mikron (Tartışmalı Yaşam İzi)
plt.text(2.7, 0.545, "DMS?\n(Olası Yaşam)", color='#ff4d4d', ha='center', fontweight='bold', fontsize=12)
plt.annotate('', xy=(2.7, 0.535), xytext=(2.7, 0.55),
arrowprops=dict(facecolor='#ff4d4d', shrink=0.05))
# Süslemeler
plt.title("Adım 3: K2-18 b Atmosfer Spektrumu (Makale Verisi Bazlı)", fontsize=16)
plt.xlabel("Dalga Boyu (Mikron)")
plt.ylabel("Transit Derinliği (%)")
plt.ylim(0.48, 0.58)
plt.grid(True, alpha=0.15)
plt.legend()
plt.show()
Grafikte ne görülüyor?
- Beyaz eğri (JWST Gözlem Verisi): James Webb’in gerçek ölçümleri. Transit derinliği yüzdesi, gezegen atmosferinin farklı dalga boylarında ne kadar ışık emdiğini gösteriyor. Eğrideki dalgalanmalar tesadüfi değil, her biri belirli bir molekülün spektral parmak izi.
- Metan (CH4) 3.4 mikron: En belirgin piklerden biri. Metanın varlığı kesin olarak tespit edildi. Bu, atmosferde organik kimya süreçlerinin işlediğini gösteriyor.
- Karbondioksit (CO2) 4.3 mikron: Yine güçlü bir sinyal. CO2, gezegenin atmosfer kimyası hakkında önemli ipuçları veriyor ve su buharına kıyasla beklenenden yüksek oranda bulunuyor.
- DMS? (Dimetil Sülfür) ~2.7 mikron: İşte tartışmalı bölüm. Bu dalga boyunda hafif bir yükselti var ve bu, Dünya’da sadece canlı organizmaların (özellikle deniz fitoplanktonlarının) ürettiği DMS molekülüyle uyumlu. Ancak sinyal zayıf ve kesin değil bu yüzden soru işaretiyle gösteriliyor.
Veriler Bize Ne Anlatıyor?
Grafiğe dikkatlice bakıldığında iki farklı hikaye görülüyor:
1. Okyanusun Kanıtı (Metan ve CO₂)
Grafiğin farklı bölgelerinde Metan (CH₄) ve Karbondioksit (CO₂) moleküllerine ait çok net ve güçlü sinyaller görülüyor.
Anlamı: Bu ikili, K2–18 b’nin “karbon bazlı” bir atmosfere sahip olduğunu kanıtlıyor. Astronomide bu bileşim, gezegenin “Hycean” (Hidrojen + Okyanus) sınıfında olabileceğinin en güçlü göstergesi. Yani elimizde devasa bir okyanus olma ihtimali çok yüksek.
2. Kozmik Piyango (DMS — Dimetil Sülfür)
Asıl olay, grafikte kırmızı okla işaretlenen o küçük, belirsiz çıkıntıda gizli. Bu sinyal Dimetil Sülfür molekülüne ait olabilir.
Neden Bu Kadar Önemli? Dünya’da bu gazın bilinen tek kaynağı yaşam. Okyanuslarımızdaki fitoplanktonlar ve algler bu gazı üretiyor. Bildiğimiz kadarıyla DMS’yi bu miktarda üretebilecek doğal bir jeolojik süreç (yanardağ vb.) yok.
Kritik Veri: Eğer bu küçük veri çıkıntısı bir hata değilse, 120 ışık yılı ötedeki bir okyanusta yüzen mikroskobik canlıların varlığına dair ilk kanıt bulunmuş olabilir.
⚠️ Bir Veri Bilimci Notu (Signal-to-Noise)
Grafikte de fark edileceği üzere, DMS sinyali Metan kadar güçlü değil; “gürültü” (noise) içinde kaybolmaya çok yakın. Bu yüzden bilim insanları henüz “kesin yaşam var” demiyor, “güçlü bir aday sinyal var” diyorlar. Bu küçük kırmızı sapma, belki bir ölçüm hatası, belki de evrendeki yalnızlığımızı bitirecek olan o matematiksel kanıt.
Sonuç: Ne Kadar Gerçekçi?
JWST verileri, K2–18 b’nin atmosferinde kesinlikle metan ve karbondioksit olduğunu gösterdi. Bu, gezegenin kimyasal olarak aktif bir atmosfere sahip olduğunu ve muhtemelen yüzeyinin okyanuslarla kaplı olabileceğini kanıtlıyor.
DMS sinyali ise çok daha belirsiz. Eğer gerçekten DMS varsa, bu potansiyel olarak biyolojik aktiviteye işaret edebilir — çünkü Dünya’da DMS genellikle yaşamla ilişkili. Ancak bilim insanları çok temkinli: Bu sinyal gürültü de olabilir, ya da atmosferdeki başka bir molekülün etkisi olabilir. Kesin bir sonuca varmak için daha fazla gözlem ve daha net veriye ihtiyaç var.
Şu an için şunu söyleyebiliriz: K2–18 b, yaşanabilir bölgede, su buharı içeren, kimyasal olarak zengin bir atmosfere sahip, potansiyel olarak yüzeyi okyanuslarla kaplı bir gezegen. Ve belki — sadece belki — orada bir şeyler yaşıyor olabilir. Ama bunu kesin olarak söylemek için henüz çok erken.
Kodlara buradaki colab dosyasından ulaşabilirsiniz.








