İçeriğe geç

Ders EKO-212.11 · Seviye 2 — Orta

Tekrarlanabilir araştırma

EKO-212 Ekonomistler için Python ve R

4.102 kelime · yaklaşık 19 dakika okuma · seslendirme 9 dk · veriler Eylül 2026 itibarıyla

Katmanlar:SezgiModel

  • hesaplamalı tekrarlanabilirlik
  • replikasyon
  • sürüm denetimi
  • sanal ortam
  • rastgelelik tohumu
  • göreli dosya yolu
Önce özete göz atDersin sonundaki özet, okumaya başlamadan önce yol haritası olarak.
  1. Claerbout'un Donoho'nun aktardığı fikrine göre, hesaplamaya dayanan bir makale bilimin ilanıdır; asıl iş, sonucu üreten yazılım ortamı, kod ve veridir. Tekrarlanabilirlik projenin başında tasarlanır, sonradan eklenmez.
  2. Hesaplamalı tekrarlanabilirlik aynı veri ve kodla aynı sonucun elde edilmesidir; replikasyon, sorunun yeni verilerle sınanmasıdır. Terimler alanlar arasında farklı kullanılır ve tekrarlanabilir bir sonuç doğru olmak zorunda değildir.
  3. Dewald, Thursby ve Anderson, yayımlanmış ampirik iktisat makalelerinde istenmeden yapılmış hataların olağan olduğunu buldu; Trisovic ve arkadaşları, paylaşılmış R dosyalarının yüzde 74'ünün temiz ortamda ilk çalıştırmada hata verdiğini gösterdi.
  4. Temel alışkanlıklar şunlardır: ham veriyi değiştirmeyen bir klasör düzeni, betiğin konumundan hesaplanan göreli yollar, bütün sonuçları üreten tek bir ana betik, betiğin başında tanımlanan tohum ve kaydedilen üreteç, sanal ortam ve sürüm dosyası.
  5. Çekilen veri tarihiyle dondurulur ve parmak iziyle denetlenir; kod git ile kayda alınır ve gönderim anı etiketlenir; yeniden üretilen sayılar birebir eşitlikle değil toleransla karşılaştırılır ve paket, göndermeden önce temiz bir ortamda sınanır.

Öğrenme çıktıları

  • Hatırlama — Hesaplamalı tekrarlanabilirliği, replikasyonu, sürüm denetimini, sanal ortamı, rastgelelik tohumunu ve göreli dosya yolunu tanımlar.
  • Anlama — Aynı kod ve verinin başka bir bilgisayarda ya da yıllar sonra neden farklı sonuç verebildiğini ve tekrarlanabilirlik ile replikasyonun neden farklı sorular olduğunu açıklar.
  • Uygulama — Bir analizi klasör yapısı, göreli yollar, sabit tohum, paket sürüm kaydı, veri parmak izi ve git geçmişiyle, bir başkasının baştan çalıştırabileceği biçimde düzenler.
  • Değerlendirme — Dewald, Thursby ve Anderson'ın ve Trisovic ve arkadaşlarının bulgularını kullanarak bir replikasyon paketinin gerçekten çalışıp çalışmayacağını değerlendirir.

Sezgi

Açılış

Bir makale dergiye gönderildikten on sekiz ay sonra hakem raporu geliyor. Hakem, ana tablonun bir kontrol değişkeni eklenerek yeniden tahmin edilmesini istiyor. Yazar, eski klasörü açıyor ve analiz betiğini çalıştırıyor. İlk satırda hata: betik, veri dosyasını artık var olmayan bir dizüstü bilgisayarın masaüstünde arıyor. Yol düzeltiliyor; bu kez bir paket fonksiyonunun adı değişmiş olduğu için hata alınıyor. O da düzeltiliyor ve betik sonunda çalışıyor, ama tablodaki katsayı makaledekinden üçüncü ondalık basamakta farklı çıkıyor.

Hangisi doğru? Yazar, makaledeki sayıyı hangi veriyle, hangi paket sürümüyle ve betiğin hangi hâliyle ürettiğini bilmiyor. Belki veri kaynağı o arada revize edildi; belki betikte, gönderimden sonra küçük bir düzeltme yapıldı; belki bir örneklem rastgele seçiliyordu ve başlangıç değeri kaydedilmemişti. Önceki derste raporu analizle aynı belgeye bağladık ve veri değişince yenilenmesini sağladık. Bu ders, aynı komutun başka bir bilgisayarda, başka birinin elinde ve yıllar sonra da aynı sonucu vermesi için neyin gerektiğini ele alıyor.

Hikâye — Makale ilan, asıl iş kod

Stanford'da bir yer bilimci olan John Claerbout, 1990'ların başında hesaplamaya dayanan sonuçların onları üreten kod ve veriyle birlikte yayımlanması gerektiğini savunan ilk araştırmacılardan biriydi; bu fikri Martin Karrenbach ile 1992'de yayımladıkları bir çalışmada da anlattı. İstatistikçi David Donoho, 2010'da Biostatistics dergisinde yayımlanan kısa bir yazısında, on beş yılı aşkın bir süre önce Claerbout'tan etkilenerek tekrarlanabilir hesaplamalı bilim yapmaya başladığını anlattı.

Donoho, Claerbout'un kendisine anlattığı ve 1995'te Jonathan Buckheit ile birlikte yazdıkları bir makalede başka sözcüklerle aktardıkları fikri, bu yazıda şöyle özetledi: «an article about computational result is advertising, not scholarship. The actual scholarship is the full software environment, code and data, that produced the result.» Türkçesiyle, hesaplamaya dayanan bir sonuç hakkındaki makale bilimin kendisi değil, onun ilanıdır; asıl bilimsel iş, sonucu üreten yazılım ortamının, kodun ve verinin tamamıdır.

Donoho'nun yazısı, bu fikrin neden önemli olduğunu kendi deneyiminden anlatıyordu. Bilimsel hesaplamada hatanın her yerde olduğunu, bir öğrencinin ya da meslektaşının ne yaptığını onun sunumundan çoğu zaman tam olarak anlayamadığını ve betiklere dikkatle bakınca anlatılanın yapılanla örtüşmediğini gördüğünü yazdı. Daha genel olarak, araştırmacıların ne yaptıklarını unuttuklarını ve hesaplamalarını yanlış aktardıklarını gözlemlediğini ekledi. Destek alan araştırmacıların, proje bittikten kısa süre sonra kendi çalışmalarını çoğu zaman yeniden üretemediğini de not etti.

Aynı yazıda Donoho, tekrarlanabilirliğin sonradan eklenecek bir şey olmadığını, bir projeye en baştan tasarlanması gerektiğini vurguladı. Biostatistics dergisinin çerçevesini örnek verdi: araştırmacı, makalesindeki bütün şekilleri ve tabloları üreten tek bir R betiği hazırlamayı baştan planlamalıdır; klavyede doğaçlama komutlarla parça parça yürütülüp sonra elle birleştirilen bir analiz, tekrarlanabilir sayılmaz. Donoho, kendi grubunun bu biçimde çalışmasının sonucu olarak, on sekiz yıl önce yayımladıkları sonuçları bugün yeniden üretebilen kullanıcılardan hâlâ haber aldığını yazdı.

Kavram

Bu dersin temel sorusunun adı şudur.

Tekrarlanabilirlikten farklı bir soru da şudur.

Kodun geçmişini tutmanın aracı şudur.

Paketlerin sürümlerini sabitlemenin yolu şudur.

Rastgele sayı kullanan analizler için şu gerekir.

Kodun başka bir bilgisayarda çalışması için şu gerekir.

Veri ve kanıt

Bu çalışma, iktisatta tekrarlanabilirlik tartışmasının başlangıç noktalarından biridir. Başlıktaki «replication» sözcüğü, bu derste hesaplamalı tekrarlanabilirlik dediğimiz şeyi, yani aynı veri ve programla aynı sonucu elde etmeyi anlatır; terimlerin alanlar arasında farklı kullanılmasının tipik bir örneğidir. Önemi, hataların kasıtlı olmadığını vurgulamasındadır: sorun, araştırmacıların dürüstlüğü değil, hesaplamanın kaydının tutulmamasıdır. Bir sonucu üreten veri ve program saklanmamışsa, hatayı bulmanın tek yolu, ortadan kaybolmuş bir hesaplamayı yeniden kurmaya çalışmaktır. Dewald ve arkadaşlarının deneyimi, sonraki on yıllarda dergilerin veri ve kod paylaşımını yayım koşulu yapmasının arka planını oluşturdu.

Bu bulgunun anlamı açıktır: kodu ve veriyi paylaşmak, tekrarlanabilirlik için gereklidir ama yeterli değildir. Paylaşılan dosyaların dörtte üçü, başka bir bilgisayarda ilk denemede hata veriyordu. Hataların önemli bir kısmının otomatik düzeltmeyle giderilebilmesi, sorunların çoğunun derin bilimsel sorunlar değil, mutlak dosya yolları ya da eksik paket tanımları gibi basit alışkanlıklar olduğunu düşündürür. Bu dersin Model bölümü, tam olarak bu alışkanlıklar üzerinde duruyor.

Yaygın yanlış«Kodu ve veriyi bir depoya yükledim; çalışmam artık tekrarlanabilir.»
Doğrusu

Trisovic ve arkadaşlarının bulgusu, paylaşılmış R dosyalarının yüzde 74'ünün temiz bir ortamda ilk çalıştırmada hata verdiğini gösteriyor. Tekrarlanabilirlik, dosyaların paylaşılmasıyla değil, bir başkasının onları kendi bilgisayarında baştan sona çalıştırıp aynı sonuçları alabilmesiyle kanıtlanır. En basit sınama, paketi temiz bir bilgisayarda ya da yeni bir sanal ortamda kendin çalıştırmaktır.

Yaygın yanlış«Bir çalışma tekrarlanabiliyorsa, sonucu doğrudur.»
Doğrusu

Tekrarlanabilirlik, raporlanan sayının raporlanan hesaplamadan geldiğini gösterir; hesaplamanın doğru soruyu doğru yöntemle ele aldığını göstermez. Yanlış bir tanımlama ya da uygunsuz bir kontrol grubu, kaç kez çalıştırılırsa çalıştırılsın aynı hatalı katsayıya varır. Sonucun sağlamlığı, farklı tanımlamalarla ve yeni verilerle yapılan replikasyonla ayrıca sınanmalıdır.

Neden önemli?

İktisat araştırmalarının sonuçları, faiz, vergi, asgari ücret ya da sosyal yardım gibi pek çok insanı etkileyen kararlarda kullanılır. Bir sonucun hangi veriyle ve hangi hesaplamayla üretildiği bilinmiyorsa, bir hatanın bulunması da düzeltilmesi de şansa kalır. Tekrarlanabilir çalışmak, hatayı önce araştırmacının kendisinin, sonra hakemlerin ve okurların bulabilmesini sağlar.

Tekrarlanabilirlik, aynı zamanda araştırmacının kendi zamanını korur. Açılıştaki yazar gibi bir hakem raporuna cevap vermek, bir veri güncellemesiyle analizi yenilemek ya da bir öğrenciye eski bir çalışmayı devretmek, iş akışı baştan düzenli kurulmuşsa saatler, kurulmamışsa haftalar alır. Donoho'nun vurguladığı gibi, bu alışkanlıklar sonradan eklenmez; projenin ilk gününden kurulur.

Türkiye'de TÜİK ve TCMB verileriyle çalışan araştırmacılar için bir sorun daha vardır: resmî seriler zaman zaman geriye dönük olarak revize edilir ve yöntem değişiklikleriyle yeniden hesaplanır. Önceki derslerde gördüğümüz veri sürümü kavramı, burada tekrarlanabilirliğin ayrılmaz bir parçasıdır: bir çalışmanın hangi tarihte çekilmiş veriyle yapıldığı kaydedilmemişse, aynı kod bugün çalıştırıldığında farklı bir sonuç vermesi kaçınılmazdır.

Model

Çözümlü örnek — Klasör yapısı ve göreli yollar

Tekrarlanabilir bir projenin ilk adımı, dosyaların nerede durduğuna dair tutarlı bir düzendir. Basit ve yaygın bir yapı, ham veriyi, işlenmiş veriyi, kodu ve çıktıları ayrı klasörlerde tutar.

  • proje/veri/ham/ — kaynaktan indirildiği gibi, hiç değiştirilmeyen dosyalar
  • proje/veri/islenmis/ — kodun ürettiği temizlenmiş veriler
  • proje/kod/ — numaralı betikler: 01_temizle.py, 02_tahmin.py, 03_tablolar.py
  • proje/cikti/ — tablolar ve grafikler
  • proje/BENIOKU.md — projenin nasıl çalıştırılacağını anlatan açıklama

Ham veri klasörüne hiçbir betik yazmaz; bu kural, verinin kaynaktan geldiği hâlini her zaman korur. İşlenmiş veri ve çıktılar ise istenildiği an silinip koddan yeniden üretilebilir. Bu ayrım, önceki derslerde gördüğümüz veri temizleme adımlarının kayıt altında kalmasını sağlar.

Şimdi ham verideki iki yıllık işsizlik dosyasını okuyan bir betik düşünelim. Betik veriyi pd.read_csv("veri/ham/issizlik.csv") ile okuyorsa, proje klasöründen çalıştırıldığında sorunsuz çalışır. Ama aynı betik başka bir klasörden çalıştırıldığında, bu dersin hazırlanmasında denendiği gibi, FileNotFoundError hatası verir: yol, betiğin bulunduğu yere göre değil, komutun verildiği klasöre göre yorumlanır. Bilgisayarın kök dizininden başlayan ve kullanıcı adını içeren bir yol ise başka hiçbir bilgisayarda çalışmaz.

Güvenli yol, proje kökünü betiğin kendi konumundan hesaplamaktır.

  • from pathlib import Path
  • KOK = Path(__file__).resolve().parents[1]
  • d = pd.read_csv(KOK / "veri" / "ham" / "issizlik.csv")

Path(__file__) betiğin kendi dosyasını, resolve() onun tam konumunu, parents[1] ise iki üst düzeyi, yani kod klasörünün bir üstündeki proje kökünü verir. Bu satırlarla betik, hem proje klasöründen hem de başka bir klasörden çalıştırıldığında aynı dosyayı buldu. R'da here paketinin here fonksiyonu, projenin kök klasörünü kendisi arayarak benzer bir iş görür: here("veri", "ham", "issizlik.csv").

Çözümlü örnek — Tek komutla bütün analiz

Donoho'nun anlattığı ilke, bütün şekilleri ve tabloları tek bir betiğin üretmesidir. Numaralı betikleri sırayla çalıştıran bir ana betik bu işi görür.

  • import subprocess, sys
  • for adim in ["01_temizle.py", "02_tahmin.py", "03_tablolar.py"]:
  • subprocess.run([sys.executable, str(KOK / "kod" / adim)], check=True)

sys.executable, ana betiği çalıştıran Python yorumlayıcısının kendisidir; böylece her adım aynı ortamda çalışır. check=True, bir adım hata verdiğinde bütün sürecin durmasını sağlar; aksi hâlde, hata veren bir temizleme adımından sonra tahmin adımı eski veriyle çalışmaya devam edebilir ve hata fark edilmez. R'da aynı iş, bir ana betikte source("kod/01_temizle.R") gibi satırları sırayla yazarak yapılır.

Ana betiğin bir yararı daha vardır: projenin nasıl çalıştırılacağına dair belgenin kendisidir. BENIOKU dosyasında «bütün sonuçlar python3 kod/calistir.py komutuyla üretilir» yazmak, bir hakemin ya da okurun hangi betiği hangi sırayla çalıştırması gerektiğini tahmin etmesine gerek bırakmaz.

Çözümlü örnek — Tohum ve üreteç

Rastgele sayı kullanan bir analizi düşünelim. NumPy'da iki ayrı üreteç, aynı 2026 tohumuyla başlatıldığında ilk üç normal dağılımlı sayıyı her ikisinde de −0,7931, 0,2406 ve −1,8963 olarak verdi. Tohumsuz başlatılan bir üreteç ise her çalıştırmada başka sayılar üretir.

  • uretec = np.random.default_rng(2026)
  • uretec.normal(size=3)

Aynı 2026 tohumu, NumPy'ın eski arayüzü olan np.random.seed ile verildiğinde ise ilk üç sayı −0,4317, −1,3929 ve 0,3116 çıktı. Tohum aynı, üreteç farklıdır; bu yüzden yalnızca tohumu değil, hangi üretecin ve hangi paket sürümünün kullanıldığını da kaydetmek gerekir. R'ın belgelerine göre, R 3.6.0 sürümünde sample fonksiyonunun varsayılan örnekleme yöntemi değiştirildi; aynı set.seed değeriyle eski ve yeni sürümler farklı örneklemler seçer.

Tohumun sonuç üzerindeki etkisini görmek için 200 gözlemlik bir veride ortalamanın standart hatasını 1.000 tekrarlı önyüklemeyle hesaplayalım. Tohum 1 ile iki kez çalıştırıldığında sonuç iki seferde de 0,1244 oldu; tohum 2 ile 0,1207. Fark küçüktür, ama açılıştaki yazarın yaşadığı gibi üçüncü ondalık basamakta bir tutarsızlık yaratmaya yeter. Doğru alışkanlık, tohumu betiğin başında bir kez tanımlamak ve iyi bir analizde sonucun farklı tohumlarla da özünde değişmediğini ayrıca göstermektir. Sayılar varsayımdır.

Çözümlü örnek — Sanal ortam ve sürüm kaydı

Bir projenin paketlerini bilgisayardaki öbür projelerden ayırmak için Python'da bir sanal ortam kurulur.

  • python3 -m venv .venv
  • source .venv/bin/activate
  • python3 -m pip install numpy==1.26.4 pandas==2.3.3 statsmodels==0.14.6
  • python3 -m pip freeze > requirements.txt

Birinci satır, proje klasöründe .venv adlı bir ortam oluşturur; ikinci satır onu macOS ve Linux'ta etkinleştirir. Üçüncü satır paketleri belirli sürümleriyle kurar; dördüncü satır ise ortamdaki bütün paketleri sürümleriyle bir dosyaya yazar. Bu dersin hazırlandığı ortamda bu dosya numpy==1.26.4, pandas==2.3.3 ve statsmodels==0.14.6 gibi satırlar içeriyordu ve Python sürümü 3.9.6'ydı. Başka bir bilgisayarda yeni bir sanal ortamda python3 -m pip install -r requirements.txt komutu, aynı sürümleri kurar.

R'da aynı işi renv paketi görür. Paketin belgelerine göre renv::init() projeye özel bir kütüphane kurar, renv::snapshot() kullanılan paketlerin sürümlerini renv.lock dosyasına yazar ve renv::restore() başka bir bilgisayarda bu dosyadaki sürümleri yeniden kurar. Bu dersin yazıldığı bilgisayarda R yüklü olmadığı için bu üç komut denenmedi.

Sürüm kaydı tek başına her şeyi çözmez. Yıllar sonra eski bir paket sürümü yeni bir işletim sisteminde kurulamayabilir; bu yüzden bazı dergiler ve araştırmacılar, bütün işletim sistemini de içeren kapsayıcı araçlara başvurur. Ama requirements.txt ya da renv.lock gibi bir dosya, en azından hangi ortamın yeniden kurulması gerektiğini kesin olarak söyler.

Çözümlü örnek — Aynı sayı mı, yakın sayı mı?

Bir replikasyon denetiminde, yeniden üretilen sayının makaledekiyle «aynı» olup olmadığına nasıl karar verilir? İki yıllık işsizlik verisinin, 10,7 ile 10,1'in ortalamasını Python'da hesaplayalım. Sonuç 10,4 değil, 10,399999999999999 olarak yazıldı. Önceki derslerde gördüğümüz gibi, 10,7 gibi ondalık bir değer, bilgisayarın iki tabanlı gösteriminde ancak yaklaşık olarak saklanır.

Toplama sırası da sonucu değiştirebilir. Python'da sum([1e16, 1.0, -1e16]) sıfır, sum([1e16, -1e16, 1.0]) ise bir verdi: ilk sırada küçük sayı büyük sayının içinde kayboldu. Farklı paket sürümleri, farklı işlemciler ya da paralel hesaplama, işlemlerin sırasını değiştirebildiği için son basamaklarda küçük farklar doğabilir.

  • math.isclose(yeni, eski, rel_tol=1e-9)
  • np.allclose(yeni_tablo, eski_tablo)

Bu yüzden yeniden üretilen sonuçlar, birebir eşitlikle değil, makul bir toleransla karşılaştırılır. Makalede üç ondalık basamakla raporlanmış bir katsayı, yeniden üretildiğinde o üç basamakta aynı çıkmalıdır; on beşinci basamaktaki bir fark bir sorun değildir. Açılıştaki gibi üçüncü basamakta bir fark ise gerçek bir değişikliğe, yani veri, kod ya da tohumdaki bir farka işaret eder. Sayılar varsayımdır.

Çözümlü örnek — Veriyi ve kodu kayda almak

Önceki derste raporun altına veri dosyasının parmak izini yazdık. Tekrarlanabilir bir projede bu parmak izi, betiğin başında bir denetim olarak da kullanılır: beklenen özet bir dosyada saklanır ve betik, veri dosyası değişmişse hemen durur.

  • beklenen = open(KOK / "veri" / "ham" / "issizlik.sha256").read().strip()
  • assert hashlib.sha256(dosya.read_bytes()).hexdigest() == beklenen, "Ham veri değişmiş"

Kodun kendisi için sürüm denetimi kullanılır. Bu dersin hazırlanmasında proje klasöründe git init, git add . ve git commit -m "ilk analiz" komutlarıyla ilk kayıt oluşturuldu. Ardından ham verideki 2024 değeri 10,1'den 10,2'ye değiştirildi. git diff komutu, değişikliği tam olarak gösterdi: 2024,10.1 satırı silinmiş, 2024,10.2 satırı eklenmişti.

  • git tag -a gonderim-1 -m "Dergiye ilk gönderim"
  • git checkout gonderim-1

Kayıtlar küçük ve anlamlı adımlarla yapılmalıdır: «örneklemden 2020 çıkarıldı» ya da «standart hatalar il düzeyinde kümelendi» gibi bir kayıt mesajı, iki yıl sonra bir katsayının neden değiştiğini anlamayı sağlar; «düzeltmeler» gibi bir mesaj ise hiçbir şey söylemez. git log komutu bu mesajları tarih sırasıyla listeler ve projenin bir tür araştırma günlüğü olur. Makale dergiye gönderildiği anda konan bir etiket, kodun o anki hâlini kalıcı olarak işaretler. Hakem raporu geldiğinde, git checkout ile tam olarak o hâle dönülebilir ve makaledeki sayıların hangi kodla üretildiği tartışma konusu olmaktan çıkar. Gizlilik gerektiren mikro veriler ve çok büyük dosyalar ise .gitignore dosyasıyla kaydın dışında tutulur; bunların yerine, verinin nereden ve nasıl edinileceği BENIOKU dosyasında anlatılır.

Çözümlü örnek — Çekilen veriyi dondurmak

Önceki derslerde veriyi TCMB'nin, FRED'in ve Dünya Bankası'nın arayüzlerinden doğrudan çektik. Bu kolaylık, tekrarlanabilirlik için bir tuzak da kurar: betik her çalıştığında veriyi yeniden çekiyorsa, kaynak seriyi revize ettiği gün sonuç sessizce değişir. Açılıştaki yazarın katsayısındaki fark, tam da böyle bir revizyondan kaynaklanmış olabilir.

Çözüm, veri çekme adımını analizden ayırmak ve çekilen dosyayı tarihiyle birlikte ham veri klasörüne kaydetmektir. Çekme betiği, dosya adına çekim tarihini ekler; örneğin issizlik_2026-09-28.csv. Analiz betikleri ise arayüze değil, bu dondurulmuş dosyaya bağlanır. Veri güncellenmek istendiğinde çekme betiği yeniden çalıştırılır, yeni tarihli bir dosya oluşur ve eski dosya silinmez; iki dosya arasındaki fark, revizyonun kendisini gösterir.

Bu yöntemle makaledeki sonuç her zaman belirli bir veri sürümüne bağlı kalır. Makalenin veri bölümünde «seriler 28 Eylül 2026'da çekilmiştir» gibi bir cümle, okura aynı sürümü nereden bulacağını söyler. Bazı kurumlar, eski veri sürümlerini kendileri de arşivler; FRED'in kardeş veri tabanı ALFRED gibi arşivler, bir serinin belirli bir tarihte nasıl göründüğünü sonradan da görmeyi sağlar. Ama böyle bir arşiv her kaynak için bulunmadığından, kendi kopyanı saklamak en güvenli yoldur. Veri lisansı ham dosyanın paylaşılmasına izin vermiyorsa, dosya pakete konmaz; yerine çekme betiği ve çekim tarihi konur.

Çözümlü örnek — Temiz ortamda son sınama

Bir replikasyon paketi göndermeden önceki son adım, onu bir yabancının gözüyle çalıştırmaktır. Proje, git ile yeni bir klasöre kopyalanır, bu klasörde yeni bir sanal ortam kurulur, requirements.txt ile paketler yüklenir ve ana betik çalıştırılır. Ardından üretilen tablolar, makaledeki tablolarla bir önceki örnekteki toleransla karşılaştırılır.

Bu sınama, Trisovic ve arkadaşlarının temiz bir ortamda yaptığı denemenin küçük bir kopyasıdır ve aynı hataları yakalar: yazarın bilgisayarında kurulu olup kayda geçmemiş bir paket, masaüstünde unutulmuş bir ara dosya, projenin dışında kalmış bir yardımcı betik. BENIOKU dosyası da bu sırada sınanır: verinin nereden edinileceği, hangi yazılımın gerektiği, bütün analizin yaklaşık ne kadar sürdüğü ve hangi betiğin hangi tabloyu ürettiği, dosyayı ilk kez okuyan birinin sorusuz ilerleyebileceği açıklıkta yazılmış mı?

Modelin sınırları

Bu dersteki araçlar, bir çalışmanın hesaplamasını kayda alır, ama kayda alınan hesaplamanın doğru olduğunu garanti etmez. Tekrarlanabilir bir analiz, hatalı bir tanımlamayı da kusursuz bir sadakatle yineler. Sonuçların güvenilirliği, ayrıca farklı tanımlamalarla, farklı verilerle ve başka araştırmacıların bağımsız replikasyonlarıyla sınanmalıdır.

Bazı veriler de paylaşılamaz. TÜİK'in hane halkı mikro verileri ya da şirketlerin gizli kayıtları gibi kaynaklar, ancak izinle ve güvenli ortamlarda kullanılabilir. Bu durumda bile kod paylaşılabilir ve verinin nasıl edinileceği ayrıntılı biçimde anlatılabilir; böylece erişim izni alan biri analizi yeniden yürütebilir. Tekrarlanabilirliğin bir maliyeti de vardır: klasör düzeni, sürüm kaydı ve temiz ortam sınaması zaman alır. Ama Donoho'nun belirttiği gibi, bu maliyet en çok alışkanlığın ilk kurulduğu dönemde hissedilir; bir kez kurulduğunda, projeyi yürütmenin olağan biçimi hâline gelir. Python örnekleri bu dersin hazırlandığı ortamda çalıştırıldı; R komutları paketlerin belgelerinden aktarıldı.

Uygulama

Özet kartı

  1. Claerbout'un Donoho'nun aktardığı fikrine göre, hesaplamaya dayanan bir makale bilimin ilanıdır; asıl iş, sonucu üreten yazılım ortamı, kod ve veridir. Tekrarlanabilirlik projenin başında tasarlanır, sonradan eklenmez.
  2. Hesaplamalı tekrarlanabilirlik aynı veri ve kodla aynı sonucun elde edilmesidir; replikasyon, sorunun yeni verilerle sınanmasıdır. Terimler alanlar arasında farklı kullanılır ve tekrarlanabilir bir sonuç doğru olmak zorunda değildir.
  3. Dewald, Thursby ve Anderson, yayımlanmış ampirik iktisat makalelerinde istenmeden yapılmış hataların olağan olduğunu buldu; Trisovic ve arkadaşları, paylaşılmış R dosyalarının yüzde 74'ünün temiz ortamda ilk çalıştırmada hata verdiğini gösterdi.
  4. Temel alışkanlıklar şunlardır: ham veriyi değiştirmeyen bir klasör düzeni, betiğin konumundan hesaplanan göreli yollar, bütün sonuçları üreten tek bir ana betik, betiğin başında tanımlanan tohum ve kaydedilen üreteç, sanal ortam ve sürüm dosyası.
  5. Çekilen veri tarihiyle dondurulur ve parmak iziyle denetlenir; kod git ile kayda alınır ve gönderim anı etiketlenir; yeniden üretilen sayılar birebir eşitlikle değil toleransla karşılaştırılır ve paket, göndermeden önce temiz bir ortamda sınanır.

Kavram sözlüğü

TürkçeİngilizceKısa tanım
Hesaplamalı tekrarlanabilirlikComputational reproducibilityAynı veri ve kodla, başka biri tarafından aynı sonuçların elde edilebilmesi
ReplikasyonReplicationBir çalışmanın sorusunun yeni verilerle sınanıp benzer sonuca ulaşılıp ulaşılmadığı
Sürüm denetimiVersion controlDosyalardaki her değişikliğin kaydedildiği ve önceki hâllere dönülebilen sistem
Sanal ortamVirtual environmentBir projenin kendi yorumlayıcısı ve paket sürümleriyle ayrı tutulduğu ortam
Rastgelelik tohumuRandom seedRastgele sayı üretecinin başlatıldığı, aynı diziyi yeniden üreten sabit değer
Göreli dosya yoluRelative pathDosya konumunun proje klasöründen başlayarak yazılması

Kendini sına

  1. (Çıktı 1) Hesaplamalı tekrarlanabilirlik ile replikasyon arasındaki farkı açıkla. Bir çalışma birini sağlayıp öbürünü sağlayamaz mı? Birer örnekle göster.
  2. (Çıktı 2) Aynı betik ve aynı veri dosyası, iki yıl arayla çalıştırıldığında farklı sonuç veriyor. Bu dersteki kavramlarla bu farkın olası üç kaynağını say ve her birini neyin önleyeceğini yaz.
  3. (Çıktı 2) Bir yazar, «makaledeki katsayı 0,412, benim yeniden ürettiğim 0,41199999999999998; çalışma tekrarlanamıyor» diyor. Bu değerlendirme doğru mu? Makaledeki katsayı 0,412, yeniden üretilen 0,418 olsaydı ne derdin?
  4. (Çıktı 3) Proje kökü bir üst klasör olan kod/tahmin.py betiğinde, veri/islenmis/panel.csv dosyasını her klasörden çalışacak biçimde okuyan satırları yaz. Ardından 2026 tohumuyla bir NumPy üreteci başlatan satırı ve sürüm dosyasını üreten komutu ekle.
  5. (Çıktı 3) Dergiye gönderdiğin kodun hâlini işaretlemek ve hakem raporu geldiğinde o hâle dönmek için hangi git komutlarını kullanırsın? Gizli bir mikro veri dosyasının kayda girmemesi için ne yaparsın?
  6. (Çıktı 4) Bir dergi, «yazarlardan veri ve kod dosyalarını yüklemelerini istiyoruz; bu yüzden yayımladığımız makaleler tekrarlanabilir» diyor. Dewald ve arkadaşlarının ve Trisovic ve arkadaşlarının bulgularını kullanarak bu iddiayı değerlendir.

Cevaplar

  1. Hesaplamalı tekrarlanabilirlik, aynı veri ve kodla aynı sonucun elde edilmesidir; replikasyon ise sorunun yeni verilerle sınanmasıdır. Bir çalışma tekrarlanabilir olup replike edilemeyebilir: örneğin bir asgari ücret çalışmasının kodu aynı sayıları üretir, ama başka bir ülkenin verisinde etki bulunmaz. Tersi de olabilir: bir çalışmanın kodu kaybolduğu için sayıları yeniden üretilemez, ama sorusu yeni verilerle ele alındığında benzer sonuç bulunur.
  2. Birincisi, paket sürümleri değişmiş olabilir; sanal ortam ve sürüm dosyası bunu önler. İkincisi, analiz rastgele sayı kullanıyor ve tohum tanımlanmamış ya da üreteç değişmiş olabilir; betiğin başında tanımlanan tohum ve kaydedilen üreteç bunu önler. Üçüncüsü, betik veriyi her seferinde arayüzden yeniden çekiyor ve kaynak seriyi revize etmiş olabilir; çekilen verinin tarihiyle dondurulması ve parmak iziyle denetlenmesi bunu önler. Betiğin kendisinin değişmiş olması da bir kaynaktır; sürüm denetimi bunu gösterir.
  3. Değerlendirme yanlıştır. 0,41199999999999998, kayan noktalı sayıların ikili temsilinden kaynaklanan bir görünümdür ve üç basamağa yuvarlandığında 0,412'dir; sonuç tekrarlanmıştır. Yeniden üretilen değer 0,418 olsaydı, fark raporlanan basamaklarda olduğu için gerçek bir tutarsızlık olurdu ve veri sürümü, kod değişikliği ya da tohum gibi bir kaynağı araştırılmalıydı.
  4. from pathlib import Path; KOK = Path(__file__).resolve().parents[1]; d = pd.read_csv(KOK / "veri" / "islenmis" / "panel.csv"); uretec = np.random.default_rng(2026). Sürüm dosyası, etkin sanal ortamda python3 -m pip freeze > requirements.txt komutuyla üretilir.
  5. Gönderim anında git tag -a gonderim-1 -m "Dergiye ilk gönderim" ile bir etiket konur; hakem raporu geldiğinde git checkout gonderim-1 ile o hâle dönülür. Gizli mikro veri dosyasının adı ya da klasörü .gitignore dosyasına yazılır; dosya kayda girmez ve BENIOKU dosyasında verinin nasıl edinileceği anlatılır.
  6. İddia aşırıdır. Dewald ve arkadaşları, yazarlardan toplanan program ve verilerle yapılan denemelerde istenmeden yapılmış hataların olağan olduğunu buldu. Trisovic ve arkadaşları ise depolarda paylaşılmış R dosyalarının yüzde 74'ünün temiz bir ortamda ilk çalıştırmada hata verdiğini, otomatik temizlemeden sonra bile yüzde 56'sının hata verdiğini gösterdi. Dosyaları yüklemek gereklidir ama yeterli değildir; derginin, paketlerin temiz bir ortamda gerçekten çalışıp çalışmadığını ve makaledeki sonuçları üretip üretmediğini denetlemesi gerekir. Trisovic ve arkadaşları da dergi politikalarının katılığının kodun yeniden çalışma oranıyla ilişkisini tartıştı.

İleri okuma

  • William G. Dewald, Jerry G. Thursby, Richard G. Anderson (1986). «Replication in Empirical Economics: The Journal of Money, Credit and Banking Project». American Economic Review 76(4). İktisatta yayımlanmış sonuçları yeniden üretme girişimlerinin öncülerinden.
  • Ana Trisovic, Matthew K. Lau, Thomas Pasquier, Mercè Crosas (2022). «A Large-Scale Study on Research Code Quality and Execution». Scientific Data 9. Paylaşılmış araştırma kodunun temiz ortamda çalışıp çalışmadığına dair geniş bir inceleme.
  • David L. Donoho (2010). «An Invitation to Reproducible Computational Research». Biostatistics 11(3). Claerbout'un fikrini ve tekrarlanabilir çalışmanın yararlarını anlatan kısa bir yazı.
  • National Academies of Sciences, Engineering, and Medicine (2019). Reproducibility and Replicability in Science. National Academies Press. Terimlerin tanımları ve bilim genelinde durum.

Sonraki derse köprü

Bu kursta veriyi çekmekten, temizlemekten, görselleştirmekten ve regresyonla analiz etmekten, otomatik raporlamaya ve tekrarlanabilir bir proje kurmaya kadar bir analizin bütün adımlarını ayrı ayrı gördük. Kursun son dersi bu adımları tek bir projede birleştiriyor: kendi ekonomi panonu oluşturacaksın. Seçtiğin göstergeleri bir kaynaktan otomatik olarak çekecek, temizleyecek, grafiklerle bir panoda gösterecek ve veri güncellendiğinde panonun tek komutla yenilenmesini sağlayacaksın; bu derste kurduğun klasör düzeni, sürüm kaydı ve veri dondurma alışkanlıkları, projenin iskeleti olacak.

Anlamadığın bir yer mi var?

Mentor yalnız bu dersin metnine dayanarak cevap verir. Metinde geçmeyen bir şey sorarsan uydurmaz, geçmediğini söyler.

Animasyon ve seslendirme notları

Animasyon ve seslendirme notları

Video akışı

  • Açılış: eski bir klasörün açılması, betiğin art arda üç hata vermesi ve sonunda çalıştığında tablodaki katsayının üçüncü basamağının makaledekinden farklı yanıp sönmesi.
  • Hikâye: bir makale sayfasının küçülüp bir ilan panosuna asılması; arkasında kod, veri ve yazılım ortamından oluşan büyük bir yapının görünmesi.
  • Kavram: aynı veri ve kodla aynı sonuca giden bir ok ile yeni veriyle aynı soruya giden ikinci bir ok; tekrarlanabilirlik ile replikasyonun ayrılması.
  • Veri ve kanıt: dört R dosyasından üçünün kırmızıya dönmesi, otomatik temizlemeden sonra bir kısmının yeşile geçmesi.
  • Model: bir proje klasörünün ham veri, işlenmiş veri, kod ve çıktı olarak ayrılması; iki üretecin aynı tohumla farklı sayılar vermesi; git geçmişinde bir etiketin konması ve yıllar sonra o etikete dönülmesi.
  • Neden önemli: revize edilen bir resmî serinin eski ve yeni hâllerinin üst üste çizilmesi ve iki tarihli veri dosyasının yan yana durması.

Seslendirme, tekrarlanabilirliği bir suçlama ya da bürokratik bir yük olarak değil, araştırmacının önce kendi işini koruyan bir alışkanlık olarak anlatır. Dewald, Trisovic ve Donoho'ya dair bütün bilgiler yayımlanmış metinlerinden aktarılmıştır; Claerbout'un sözü Donoho'nun 2010 yazısındaki özgün İngilizcesiyle verilir. Ekrandaki tohum ve toplama örnekleri dersin çalıştırılmış kodunun çıktısıdır.

Kısa kesit

Dikey çekilmiş, yarım dakikayı aşmayan bir parça. Seslendirme: «Aynı kod. Aynı veri. İki yıl sonra başka bir sayı.» Ekranda 0,412 ve 0,418. «Paketler değişti, veri revize edildi, tohum yazılmamıştı.» Kapanış: «Tekrarlanabilir araştırma. Derste.»