exoplanet.eu Kataloğu Örneği

exoplanet.eu kataloğu bugüne kadar çeşitli yöntemlerle keşfedilmiş ve onaylanmış çok sayıda (25 Şubat 2020 itibarı ile 3105 sistemde toplam 4187) gezegen ve bu gezegenlerin barınak yıdızları (ing. host star) parametreleri içermektedir. Tüm katalog, sanal gözlemevi tablosu (ing. virtual observatory (VO) table), dat uzantılı salt metin dosyası ya da virgülle ayrılmış metin dosyası (csv) olarak indirilebilir. Bu dosyayı bilgisayarınızın herhangi bir alanına (aşağıdaki örnekte bu jupyter defteriyle aynı klasöre) csv formatında indirip exoplanet.eu_catalog.csv adıyla kaydedersiniz aşağıdaki örnekleri herhangi bir zamanda çalıştırıp ötegezegen çalışmalarındaki gelişmeleri takip edebilir, parametreler arasındaki ilişkileri sorgulayabilir ve Güneş Sistemimiz dışındaki ötegezegen sistemlerinin mimarilerine varıncaya kadar pek çok konuda istatistiksel çıkarımlarda bulunabilirsiniz.

exoplanet.eu adresindeki ötegezegenler kataloğunu "csv" formatında bilgisayarınıza indirerek bu jupyter defteriyle aynı klasörün altına exoplanet.eu_catalog.csv adıyla kaydediniz. Daha sonra aşağıdaki kod bloklarındaki kodları çalıştırarak dosyanızı açınız ve inceleyiniz.

In [1]:
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
otegezegenler = pd.read_csv('exoplanet.eu_catalog.csv', index_col="# name", skipinitialspace=True)
otegezegenler.head()
Out[1]:
planet_status mass mass_error_min mass_error_max mass_sini mass_sini_error_min mass_sini_error_max radius radius_error_min radius_error_max ... star_sp_type star_age star_age_error_min star_age_error_max star_teff star_teff_error_min star_teff_error_max star_detected_disc star_magnetic_field star_alternate_names
# name
11 Com b Confirmed NaN NaN NaN 19.40 1.50 1.50 NaN NaN NaN ... G8 III NaN NaN NaN 4742.0 100.0 100.0 NaN NaN NaN
11 Oph b Confirmed 21.0 3.0 3.0 NaN NaN NaN NaN NaN NaN ... M9 0.011 0.002 0.002 2375.0 175.0 175.0 NaN NaN Oph 1622-2405, Oph 11A
11 UMi b Confirmed NaN NaN NaN 10.50 2.47 2.47 NaN NaN NaN ... K4III 1.560 0.540 0.540 4340.0 70.0 70.0 NaN NaN NaN
14 And b Confirmed NaN NaN NaN 5.33 0.57 0.57 NaN NaN NaN ... K0III NaN NaN NaN 4813.0 20.0 20.0 NaN NaN NaN
14 Her b Confirmed NaN NaN NaN 4.64 0.19 0.19 NaN NaN NaN ... K0 V 5.100 NaN NaN 5311.0 87.0 87.0 NaN NaN NaN

5 rows × 97 columns

In [2]:
print("Katalogdaki toplam gezegen sayisi: ", otegezegenler['planet_status'].count())
Katalogdaki toplam gezegen sayisi:  4187
In [3]:
otegezegenler.columns
Out[3]:
Index(['planet_status', 'mass', 'mass_error_min', 'mass_error_max',
       'mass_sini', 'mass_sini_error_min', 'mass_sini_error_max', 'radius',
       'radius_error_min', 'radius_error_max', 'orbital_period',
       'orbital_period_error_min', 'orbital_period_error_max',
       'semi_major_axis', 'semi_major_axis_error_min',
       'semi_major_axis_error_max', 'eccentricity', 'eccentricity_error_min',
       'eccentricity_error_max', 'inclination', 'inclination_error_min',
       'inclination_error_max', 'angular_distance', 'discovered', 'updated',
       'omega', 'omega_error_min', 'omega_error_max', 'tperi',
       'tperi_error_min', 'tperi_error_max', 'tconj', 'tconj_error_min',
       'tconj_error_max', 'tzero_tr', 'tzero_tr_error_min',
       'tzero_tr_error_max', 'tzero_tr_sec', 'tzero_tr_sec_error_min',
       'tzero_tr_sec_error_max', 'lambda_angle', 'lambda_angle_error_min',
       'lambda_angle_error_max', 'impact_parameter',
       'impact_parameter_error_min', 'impact_parameter_error_max', 'tzero_vr',
       'tzero_vr_error_min', 'tzero_vr_error_max', 'k', 'k_error_min',
       'k_error_max', 'temp_calculated', 'temp_calculated_error_min',
       'temp_calculated_error_max', 'temp_measured', 'hot_point_lon',
       'geometric_albedo', 'geometric_albedo_error_min',
       'geometric_albedo_error_max', 'log_g', 'publication', 'detection_type',
       'mass_detection_type', 'radius_detection_type', 'alternate_names',
       'molecules', 'star_name', 'ra', 'dec', 'mag_v', 'mag_i', 'mag_j',
       'mag_h', 'mag_k', 'star_distance', 'star_distance_error_min',
       'star_distance_error_max', 'star_metallicity',
       'star_metallicity_error_min', 'star_metallicity_error_max', 'star_mass',
       'star_mass_error_min', 'star_mass_error_max', 'star_radius',
       'star_radius_error_min', 'star_radius_error_max', 'star_sp_type',
       'star_age', 'star_age_error_min', 'star_age_error_max', 'star_teff',
       'star_teff_error_min', 'star_teff_error_max', 'star_detected_disc',
       'star_magnetic_field', 'star_alternate_names'],
      dtype='object')
In [4]:
otegezegenler.describe()
Out[4]:
mass mass_error_min mass_error_max mass_sini mass_sini_error_min mass_sini_error_max radius radius_error_min radius_error_max orbital_period ... star_mass_error_max star_radius star_radius_error_min star_radius_error_max star_age star_age_error_min star_age_error_max star_teff star_teff_error_min star_teff_error_max
count 1176.000000 1107.00 1098.0000 972.000000 824.000000 824.0000 3086.000000 2982.000000 2982.000000 3959.000000 ... 3001.00 3623.000000 3423.000000 3423.000000 1242.000000 976.0000 977.00 3836.000000 3566.000000 3566.000000
mean 6.136284 inf inf 3.595865 inf inf 0.418765 0.044008 0.056183 842.399126 ... inf 1.538996 0.177529 0.244098 4.436980 inf inf 5491.306178 111.006725 108.805782
std 13.058253 NaN NaN 7.478659 NaN NaN 0.462034 0.080505 0.157061 13914.434586 ... NaN 3.176641 0.634065 1.942894 3.123961 NaN NaN 1504.453983 211.549625 207.355949
min 0.000002 0.00 0.0000 0.000470 0.000000 0.0000 0.000002 0.000000 0.000000 0.027829 ... -0.13 0.015600 -0.180000 -0.180000 0.000500 -2.6000 -2.60 575.000000 0.000000 0.000000
25% 0.094000 0.02 0.0120 0.093138 0.010615 0.0100 0.143925 0.012000 0.014000 4.527530 ... 0.04 0.800000 0.040000 0.040000 2.000000 0.4675 0.50 5020.750000 60.000000 60.000000
50% 0.840000 0.08 0.0700 1.155000 0.070000 0.0715 0.216000 0.023100 0.030000 12.834502 ... 0.05 0.990000 0.070000 0.100000 4.000000 1.0000 1.10 5600.000000 93.120000 90.510000
75% 3.692500 0.51 0.3875 3.250000 0.260000 0.2725 0.414000 0.051000 0.061000 53.856500 ... 0.09 1.270000 0.180000 0.240000 6.695000 2.3050 2.56 5930.000000 128.052500 120.000000
max 81.900000 inf inf 63.300000 inf inf 6.520000 2.378000 6.148000 730000.000000 ... inf 51.100000 20.510000 104.530000 15.000000 inf inf 42000.000000 5500.000000 5500.000000

8 rows × 84 columns

Kepler'in 3. Yasası

Johannes Kepler'in Tycho Brahe'nin gözlemleri üzerindeki çalışmaları sonucu tamamen deneysel olarak türettiği ve bugün Kepler Yasaları olarak tanımladığımız üç ana kural Güneş Sistemi'ndeki gezegenler gibi ötegezegenlerin de yörünge hareketlerini tanımlarlar. Bu yasalardan, gezegenin yörünge dönemi ile yörünge büyüklüğü arasındaki ilişkiyi ifade eden 3. yasası Newton'ın kütleçekim yasasından hareketle aşağıdaki şekilde elde edilir.

$$ a^3 = \frac{G (M_{"*"} + M_g)}{4~\pi^2} P^2 $$

(1)

Güneş sistemi için gezegen kütleleri ($M_g$) Güneş'in kütlesinden ($M_{"*"}$) çok küçük kabul edilir, yörünge yarı-büyük eksen uzunluğu ($a$) Astronomi Birimi cinsinden (exoplanet.eu kataloğunda verildiği gibi), yörünge dönemi ($P$) Dünya Yılı cinsinden (exoplanet.eu kataloğunda Dünya günü biriminde verilmiştir) ifade edilirse denklemin sabitleri (evrensel kütleçekim sabiti $G$ ve $4~\pi^2$ birim dönüşümünden gelen çarpanlarla sadeleşir ve denklem;

$$ a^3 = P^2 $$

(2)

şeklinde ifade edilir.

Ötegezegenlerin yörüngeleri de Kepleryan'dır. Yani, yörünge hareket, büyüklük ve şeklini tarif eden Kepler yasaları başka yıldızlarla ortak kütle merkezi etrafında dolanan bu gezegenler için de geçerlidir. Ayrıca ötegezegen kütlelerini de yıldız kütlelerine oranla küçük kabul edersek; ki bu çok doğru değildir zira çok küçük yıldızlar ve çok büyük kütleli ötegezegenler söz konusudur, bu ilişkiyi katalogdaki gezegenler için de gösterebiliriz.

In [5]:
otegezegenler['orbital_period'].head()
Out[5]:
# name
11 Com b       326.03
11 Oph b    730000.00
11 UMi b       516.22
14 And b       185.84
14 Her b      1773.40
Name: orbital_period, dtype: float64
In [6]:
otegezegenler['semi_major_axis'].head()
Out[6]:
# name
11 Com b      1.29
11 Oph b    243.00
11 UMi b      1.54
14 And b      0.83
14 Her b      2.77
Name: semi_major_axis, dtype: float64
In [7]:
# 0.1 AU'dan uzak 10 AU'dan yakin gezegenler icin Kepler 3. yasa
%matplotlib inline
dunya_yili = 365.25 # gun
P = otegezegenler.loc[(otegezegenler['semi_major_axis'] > 0.1) & (otegezegenler['semi_major_axis'] < 10.0), \
                  'orbital_period'] / dunya_yili
a = otegezegenler.loc[(otegezegenler['semi_major_axis'] > 0.1) & (otegezegenler['semi_major_axis'] < 10.0), \
                  'semi_major_axis']
plt.plot(a**3, (P/dunya_yili)**2,'r.')
plt.xlabel('$a^3$')
plt.ylabel('$P^2$')
plt.show()
In [8]:
# Aykiri noktalari belirleyip cizdirelim
Port = P.mean()
Pstd = P.std()
aort = a.mean()
astd = a.std()
kosul = (P < Port + 3*Pstd) & (a < aort + 3*astd)
plt.plot(a[kosul]**3, P[kosul]**2, 'r.')
plt.xlabel('$a^3$')
plt.ylabel('$P^2$')
plt.show()

Sonuç olarak gerçekten eğimi 1'e yakın (bunu bir doğru uyumlayıp görebiliriz) ancak bir miktar saçılması bulunmakla birlikte bu iki nicelik arasında bir ilişki olduğunu göstermiş olduk. Grafiğimizdeki saçılmanın nedenlerinden biri yaptığımız, anak her sistem için doğru olmadığını bildiğimiz gezegen kütlesinin yıldız kütlesinden çok küçük olduğu varsayımıdır. Bir başka önemli nokta (2) numaralı denklemin tam olarak geçerli olabilmesi için yıldızın da Güneş kütlesinde olması gerekir. Oysa ki katalogdaki yıldızların büyük çoğunluğu bu kütlenin altında bir kısmı ise üstündedir.

Gezegen Barındıran Yıldızların Özellikleri

Gezegen barındıran yıldızların (ing. host stars) temel parametrelerini (sıcaklık, metal bolluğu, kütle, yarıçap, yaş) bilmek ne tür yıldızların etrafında gezegen bulunabileceğini anlamak açısından önem taşır. Örneğin gezegen barındıran yıldızların hangi sıcaklık aralığına ne şekilde dağıldıklarını anlamak için basit bir histogram çizmek ve bazı temel istatistiksel parametrelere bakmak bile faydalı olacaktır. Katalogda yıldızın sıcaklığı star_teff sütununda yer almaktadır.

In [9]:
otegezegenler['star_teff'].describe()
Out[9]:
count     3836.000000
mean      5491.306178
std       1504.453983
min        575.000000
25%       5020.750000
50%       5600.000000
75%       5930.000000
max      42000.000000
Name: star_teff, dtype: float64
In [10]:
# Gezegen barindiran yildizlarin sicaklik histogrami
otegezegenler.hist(column='star_teff', bins=10)
Out[10]:
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7f7722bfbcc0>]],
      dtype=object)
In [11]:
# Verinin icinde cok sicak ve cok sogu bazi yıildizlar var
# Bu yildizlari ve sicaklik hatalarini bir gorelim
otegezegenler.loc[(otegezegenler['star_teff'] > 20000) | (otegezegenler['star_teff'] < 1000), \
                  ['star_teff','star_teff_error_min', 'star_teff_error_max']]
Out[11]:
star_teff star_teff_error_min star_teff_error_max
# name
KIC 10001893 d 26700.0 300.0 300.0
Kepler-70 b 27730.0 270.0 270.0
Kepler-70 c 27730.0 270.0 270.0
NSVS 1425 (AB) d 42000.0 NaN NaN
NY Vir (AB) b 33000.0 NaN NaN
NY Vir (AB) c 33000.0 NaN NaN
SDSS J1110+0116 940.0 20.0 20.0
V391 Peg b 29300.0 500.0 500.0
WD J0914+1914 b 27743.0 310.0 310.0
WISE 1217+16 A b 575.0 25.0 25.0
WISE 1711+3500 b 770.0 80.0 80.0
In [12]:
# Histogrami daha makul bir araliga kisitlayalim
otegezegenler[(otegezegenler['star_teff'] < 8000) & (otegezegenler['star_teff'] > 3000)]\
    .hist(column='star_teff', bins=25)
Out[12]:
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7f77206242b0>]],
      dtype=object)

Grafikten gezegen barındıran yıldızların büyük çoğunluğunun $5400 - 6200$ K aralığında olduğu görülmektedir. Ancak bunun nedeni gerçekten de bir yıldızın gezegen barındırmak için sahip olması gereken optimum yüzey sıcaklığının bu aralıkta olması gerektiği sonucu hemen çıkarılmamaldır. Zira gezegen araştırmalarında (özellikle de Kepler uzay teleskobu söz konusu olduğunda) etrafında gezegen bulmak üzere hedef olarak seçilen yıldızların büyük çoğunluğunun Güneş benzeri yıldızlar olmasıdır!

Şimdi bir de metal bolluğu dağılımına bakalım.

In [13]:
otegezegenler['star_metallicity'].describe()
Out[13]:
count    3635.000000
mean       -0.008767
std         0.202294
min        -1.000000
25%        -0.100000
50%         0.010000
75%         0.100000
max         0.610000
Name: star_metallicity, dtype: float64
In [14]:
# Metalce zengin yıldızların etrafındaki gezegenlerin sayısı konunusuna bakmak ilginc olabilir
otegezegenler[otegezegenler['star_metallicity'] > 0.20]\
    .hist(column='star_metallicity', bins=10)
Out[14]:
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7f77205b8908>]],
      dtype=object)
In [15]:
# Ayni sekilde metalce fakir yıldızların etrafındaki gezegenlerin sayısı da ilginizi cekebilir
otegezegenler[otegezegenler['star_metallicity'] < -0.20]\
    .hist(column='star_metallicity', bins=10)
Out[15]:
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7f7720541860>]],
      dtype=object)
In [16]:
# Keşif yöntemlerinin başarısı da ilgi çekici olabilir
otegezegenler['detection_type'].describe()
Out[16]:
count                4187
unique                 10
top       Primary Transit
freq                 2996
Name: detection_type, dtype: object
In [17]:
# Her bir kesif yontemine bakalim
otegezegenler['detection_type'].unique()
Out[17]:
array(['Radial Velocity', 'Imaging', 'Primary Transit', 'Timing',
       'Astrometry', 'TTV', 'Default', 'Controversial', 'Microlensing',
       'Primary Transit, TTV'], dtype=object)
In [18]:
# Her kesif yonteminin bir histogramini almaya calisalım
toplam_sayi = len(otegezegenler)
for yontem in otegezegenler['detection_type'].unique():
    sayi = len(otegezegenler[otegezegenler['detection_type'] == yontem])
    print("{:s} :{:d}, %{:.2f}".format(yontem, sayi, sayi / toplam_sayi * 100))
Radial Velocity :880, %21.02
Imaging :135, %3.22
Primary Transit :2996, %71.55
Timing :41, %0.98
Astrometry :10, %0.24
TTV :9, %0.21
Default :6, %0.14
Controversial :1, %0.02
Microlensing :107, %2.56
Primary Transit, TTV :2, %0.05

Daha pek çok istatistik geliştirebileceğimiz, anlamlı bir şekilde çok yönlü olarak görselleştirebileceğimiz ve üzerinden istatistiksel çıkarımlar yapabileceğimiz bu veritabanı üzerinde çalışmayı sürdüreceğiz.