Önce özete göz atDersin sonundaki özet, okumaya başlamadan önce yol haritası olarak.
- Python'da liste ve sözlük, R'da vektör ve liste, çoklu değer saklamanın temel araçlarıdır; Python'da sıra numaraları sıfırdan, R'da birden başlar ve bu fark, iki dil arasında geçerken sessiz hatalara yol açabilir.
- Her değerin bir veri tipi vardır; Python listeleri farklı tipleri bir arada tutabilir, R vektörleri ise farklı tipleri kendiliğinden ortak bir tipe, çoğu zaman metne çevirir ve bunu uyarı vermeden yapar.
- Veri çerçevesi, satırları gözlemlere ve sütunları değişkenlere karşılık gelen tablodur; R'a gömülü data.frame'den adını alan pandas DataFrame'i, Wes McKinney'in 2008'de nicel bir yatırım şirketinde başlattığı ve adını panel veriden alan kütüphaneyle Python'a geldi.
- pandas değerleri indekslerine göre hizalar, R ise adlandırılmış vektörleri sıralarına göre toplar; eksik değerlerde pandas ortalamayı varsayılan olarak eksikleri atlayarak, R ise ancak açıkça istenirse hesaplar.
- Wickham'ın düzenli veri ilkesine göre her değişken bir sütun, her gözlem bir satırdır; Ziemann ve arkadaşlarının gösterdiği gibi, veri tiplerini yazılımın tahminine bırakmak, verinin sessizce bozulmasına yol açabilir.
Öğrenme çıktıları
- Hatırlama — Listeyi, sözlüğü, veri tipini, veri çerçevesini, indeksi ve düzenli veriyi tanımlar.
- Anlama — Python'daki listeler, sözlükler ve pandas veri çerçeveleri ile R'daki vektörler, listeler ve data.frame nesneleri arasındaki benzerlik ve farkları, özellikle sıra numaralandırmasının sıfırdan ya da birden başlamasını açıklar.
- Uygulama — İki dilde bir seriyi saklar, elemanlarına erişir, bir veri çerçevesi kurar, sütun ortalaması alır, koşula göre satır seçer ve geniş biçimli bir tabloyu uzun biçime çevirir.
- Analiz — Veri tiplerinin ve indekslerin yanlış yorumlanmasının nasıl sessiz hatalara yol açtığını inceler ve bir veri setinin düzenli olup olmadığını değerlendirir.
Sezgi
Açılış
Bir sınıf listesini düşünelim. Her satırda bir öğrenci, her sütunda bir bilgi var: adı, doğum yılı, notu, bölümü. Bu tabloyu okurken hiç düşünmeden üç şey yaparız. Bir satırın bir kişiye ait olduğunu biliriz. Bir sütundaki bütün değerlerin aynı türden olduğunu varsayarız: not sütununda sayılar, bölüm sütununda metinler. Ve bir bilgiyi ararken ya sırasına ya da adına bakarız: «üçüncü öğrenci» ya da «Ayşe'nin notu».
Bilgisayar bunların hiçbirini kendiliğinden bilmez. Ona, değerlerin hangi biçimde bir arada tutulacağını, her değerin ne türden olduğunu ve bir değere nasıl ulaşılacağını söylememiz gerekir. Bu söyleyiş biçimlerine veri yapıları denir. Doğru yapıyı seçmek, analizin geri kalanını kolaylaştırır; yanlış yapı ise, çoğu zaman hiçbir hata mesajı vermeden, yanlış sonuçlar üretir.
Bu ders, Python'un ve R'ın temel veri yapılarını ve iktisatçının gündelik çalışma nesnesini, her satırın bir gözlem ve her sütunun bir değişken olduğu tabloyu tanıtıyor.
Hikâye — Bir yatırım şirketinde başlayan kütüphane
2008'in başında Wes McKinney, nicel yöntemlerle yatırım yöneten bir şirket olan AQR Capital Management'ta çalışıyordu. Yıllar sonra yazdığı «Python for Data Analysis», yani «Veri Analizi için Python» kitabında, o sırada elindeki hiçbir aracın tek başına karşılamadığı bir dizi ihtiyacı olduğunu anlattı. Bunların ilki, etiketli eksenlere sahip ve verileri otomatik ya da açık biçimde hizalayabilen veri yapılarıydı. McKinney'e göre bu, farklı kaynaklardan gelen ve farklı biçimde indekslenmiş verilerle çalışırken yanlış hizalanmış verilerden doğan yaygın hataları önlüyordu. Zaman serileriyle bütünleşik çalışabilmek de bu ihtiyaçlar arasındaydı.
McKinney bu ihtiyaçları karşılamak için pandas adlı bir kütüphane yazmaya başladı. Kütüphanenin resmî sitesine göre pandas 2009'un sonunda açık kaynak hâline getirildi ve 2012'de McKinney'in kitabının ilk baskısı yayımlandı. McKinney'in anlattığına göre pandas adı, ekonometride çok boyutlu yapılandırılmış veri setleri için kullanılan panel veri terimiyle Python veri analizi ifadesinin bir birleşiminden geliyordu. Kütüphanenin temel nesnesi olan DataFrame'in adı ise, R'daki benzer data.frame nesnesinden alınmıştı. McKinney'in de belirttiği gibi, Python'dan farklı olarak veri tabloları R'ın kendisine gömülüydü.
Birkaç yıl sonra, R dünyasında çalışan istatistikçi Hadley Wickham, 2014'te Journal of Statistical Software'de «Tidy Data», yani «Düzenli Veri» başlıklı bir makale yayımladı. Wickham, veriyi analize hazırlamak için büyük bir emek harcandığını, ama bu işin nasıl kolay ve etkili yapılabileceği üzerine çok az araştırma olduğunu gözledi. Önerisi basitti: her değişken bir sütun, her gözlem bir satır, her gözlem birimi türü ayrı bir tablo olmalıydı. Bu yapıdaki veriler, işlemek, modellemek ve görselleştirmek için kolaydı.
İki hikâye, farklı dillerde ve farklı ihtiyaçlardan doğdu; ama aynı fikirde buluştu. Veriyle çalışırken asıl zorluk hesaplamanın kendisi değil, verinin doğru yapıda tutulmasıdır. Bir yatırım şirketinde fiyat serilerini doğru tarihlerle eşleştirmek isteyen bir programcı ile bir istatistik bölümünde dağınık tabloları düzene sokmak isteyen bir araştırmacı, aynı sorunla uğraşıyordu.
Kavram
Birden çok değeri sırayla tutmanın en basit yolu şudur.
Değerlere sırayla değil, adlarıyla ulaşmak için şu yapı kullanılır.
Her değerin bir türü vardır ve bu tür, onunla neler yapılabileceğini belirler.
İktisatçının en çok kullandığı yapı şudur.
Veri çerçevelerinin satırları da bir kimliğe sahiptir.
Son olarak, bir veri tablosunun nasıl düzenlenmesi gerektiğine dair ilke şudur.
Veri ve kanıt
Wickham'ın önerisinin iktisatçı için anlamı açıktır. Türkiye İstatistik Kurumu'ndan ya da uluslararası kurumlardan indirilen tabloların çoğu, okunmak için tasarlanmıştır: yıllar sütun başlıklarında, ülkeler satırlarda, alt toplamlar tablonun ortasında. Bu tablolar insan gözü için rahattır, ama bir programla analiz etmek için önce düzenli biçime çevrilmeleri gerekir. Veri temizliğinin büyük kısmı, bu çeviriden ibarettir.
Bu bulgu iktisatla ilgisiz görünebilir, ama gösterdiği sorun her alanda aynıdır: bir yazılım, bir değerin veri tipini kullanıcıya sormadan tahmin eder ve yanlış tahmin ettiğinde veri sessizce bozulur. Genetikçilerin bazı gen adları, hesap tablosuna bir tarih gibi göründüğü için tarihe çevrildi. İktisat verilerinde de benzer tuzaklar vardır: başında sıfır olan il ya da sektör kodları sayıya çevrilince sıfırlarını kaybeder, binlik ayracı olarak nokta kullanan bir değer ondalıklı sayı sanılabilir. Veri tipini açıkça belirlemek ve denetlemek, bu hataları önlemenin tek güvenilir yoludur.
Yaygın yanlış«İki dilde de bir listenin ilk elemanına aynı biçimde ulaşılır.»
Python'da sıra numaraları sıfırdan başlar ve enflasyon[0] ilk elemanı verir; R'da ise sıra numaraları birden başlar ve enflasyon[1] ilk elemanı verir. İki dil arasında geçiş yaparken en sık yapılan hatalardan biri budur ve kod çoğu zaman hata vermeden yanlış elemanı seçer.
Yaygın yanlış«Bir tablo ekranda düzgün görünüyorsa, analize hazırdır.»
İnsan gözü için düzenlenmiş bir tablo, örneğin yılları sütun başlığında taşıyan ya da alt toplamları satırların arasına yerleştiren bir tablo, bir program için dağınıktır. Ayrıca ekranda sayı gibi görünen bir sütun, aslında metin olarak saklanıyor olabilir. Analizden önce tablonun düzenli olup olmadığı ve her sütunun veri tipi denetlenmelidir.
Neden önemli?
İktisatçının çalıştığı veriler, çoğu zaman farklı kaynaklardan gelir ve birleştirilmesi gerekir: bir ülkenin enflasyonu bir kurumdan, faiz oranları bir başkasından, döviz kuru üçüncü bir kaynaktan. Bu verileri doğru tarihlerle ve doğru ülkelerle eşleştirmek, analizin temelidir. McKinney'in pandas'ı yazarken önlemek istediği hata, tam da yanlış hizalanmış verilerden doğan hatalardı.
Veri yapılarını doğru seçmek, analizi hızlandırmanın yanında onu daha güvenilir kılar. Bir panel veri seti, yani birden çok ülkenin ya da firmanın birden çok yıl boyunca izlendiği bir veri, düzenli biçimde tutulduğunda, ülke başına ortalamalar, yıllara göre değişimler ya da gruplar arası karşılaştırmalar birkaç satırlık kodla yapılabilir. Aynı veri dağınık tutulduğunda, her hesap için elle düzenleme gerekir.
Türkiye'de TÜİK'in ve Merkez Bankası'nın yayımladığı tabloların önemli bir kısmı, sunum amacıyla geniş biçimde düzenlenmiştir. Bu tabloları analiz edebilmek için önce onları okumayı, veri tiplerini denetlemeyi ve düzenli biçime çevirmeyi öğrenmek gerekir. Bu dersteki yapılar, kursun geri kalanında kullanacağımız bütün araçların temelidir.
Model
Çözümlü örnek — Liste ve sıra numarası
Üç yıllık enflasyon oranlarını, yüzde 20, 40 ve 30 olarak, bir yapıda tutalım. Python'da bir liste, R'da bir vektör kullanılır.
- Python:
enflasyon = [20, 40, 30] - R:
enflasyon <- c(20, 40, 30)
İlk yılın değerine ulaşmak için iki dil farklı sıra numarası kullanır. Python'da sıra sıfırdan başlar, R'da birden.
- Python:
enflasyon[0]ifadesi 20 verir. - R:
enflasyon[1]ifadesi 20 verir.
Python'da enflasyon[1] yazıldığında 40 gelir; yani R alışkanlığıyla yazılmış bir kod, hiçbir hata vermeden ikinci yılı seçer. Son elemana ulaşmak için Python'da enflasyon[-1], R'da enflasyon[length(enflasyon)] yazılır. Eleman sayısını Python'da len(enflasyon), R'da length(enflasyon) verir; ikisi de 3'tür.
Listeye yeni bir yıl eklemek için Python'da enflasyon.append(35), R'da enflasyon <- c(enflasyon, 35) yazılır. Birden çok ardışık elemanı seçmek, yani dilimlemek de iki dilde farklıdır. Python'da enflasyon[1:3], ikinci ve üçüncü elemanı, yani 40 ve 30'u verir; baştaki sınır dahil, sondaki sınır hariçtir. R'da aynı iki elemanı enflasyon[2:3] verir ve iki sınır da dahildir. Sayılar varsayımdır.
Çözümlü örnek — Sözlük ve adlandırılmış vektör
Bir döviz kurunun iki yıllık değerini yıllarla eşleştirerek tutalım. Değere sıra numarasıyla değil, yılın adıyla ulaşmak istiyoruz.
- Python:
kur = {"2023": 10.0, "2024": 12.0} - R:
kur <- c("2023" = 10.0, "2024" = 12.0)
Python'da kur["2024"], R'da kur["2024"] ifadesi 12 değerini verir. Kurdaki yüzde değişimi hesaplayalım.
- Python:
(kur["2024"] - kur["2023"]) / kur["2023"] * 100
Sonuç 20.0'dır; kur yüzde 20 artmıştır. Sözlüğün üstünlüğü, değerin yerini ezberlemek zorunda kalmamaktır: veriye yeni bir yıl eklendiğinde ya da sıra değiştiğinde, kur["2024"] hâlâ doğru değeri verir. Sıra numarasıyla çalışan bir kod ise, araya bir değer girdiğinde sessizce yanlış yıla bakmaya başlar. Sözlükteki anahtarların metin olarak, tırnak içinde yazıldığına da dikkat edelim: "2024" bir metindir, 2024 bir sayı; ikisi farklı anahtarlardır ve kur[2024] yazmak Python'da bir hata verir. Sayılar varsayımdır.
Çözümlü örnek — Veri tipleri ve sessiz dönüşüm
Python'da bir liste, farklı türden değerleri bir arada tutabilir. Aşağıdaki satır bir tam sayı, bir metin ve bir ondalıklı sayıyı aynı listeye koyar.
karisik = [1, "a", 2.5]
Her elemanın tipi korunur: birincisi tam sayı, ikincisi metin, üçüncüsü ondalıklı sayıdır. R'ın vektörü ise yalnızca tek türden değer tutabilir. Farklı türler bir araya getirildiğinde R, hepsini ortak bir türe, çoğu zaman metne çevirir.
- R:
c(1, "a", 2.5)
Bu vektörün üç elemanı da artık metindir: "1", "a" ve "2.5". R hata vermez, uyarı da vermez. Bir sütunda tek bir hatalı hücre, örneğin bir sayının yerine yazılmış bir tire işareti, bütün sütunun metne dönüşmesine yol açabilir ve ortalama almaya çalıştığınızda anlamsız bir sonuç ya da bir hata ile karşılaşırsınız.
Mantıksal değerler de bir veri tipidir: doğru ve yanlış. Python'da True, R'da TRUE yazılır. İki dilde de doğru 1, yanlış 0 gibi işlem görür; Python'da True + True işlemi 2 verir. Bu özellik, bir koşulu sağlayan gözlemleri saymak için kullanılır: koşulu sağlayanların toplamı, onların sayısıdır.
Çözümlü örnek — Bir veri çerçevesi kurmak
Üç yıl için enflasyon ve büyüme verilerini tek bir tabloda tutalım. Python'da pandas paketini yükleyip bir DataFrame, R'da doğrudan bir data.frame kurarız.
- Python, paket yüklemesiyle:
import pandas as pd - Python:
df = pd.DataFrame({"yil": [2021, 2022, 2023], "enflasyon": [20.0, 40.0, 30.0], "buyume": [4.0, 3.0, 5.0]}) - R:
df <- data.frame(yil = c(2021, 2022, 2023), enflasyon = c(20, 40, 30), buyume = c(4, 3, 5))
Her iki yapı da üç satır ve üç sütundan oluşur. Python'da df.shape, (3, 3) sonucunu; R'da dim(df), 3 ve 3 sonucunu verir. Bir sütunun ortalamasını almak için sütun adını kullanırız.
- Python:
df["enflasyon"].mean() - R:
mean(df$enflasyon)
Her ikisi de 30 sonucunu verir. R'da dolar işareti, bir veri çerçevesinden adıyla sütun seçmenin en yaygın yoludur. Python'da df.dtypes, R'da str(df) komutu her sütunun veri tipini gösterir; yeni bir veri setiyle çalışmaya başlarken ilk yapılacak iş, bu çıktıya bakmaktır. Sayılar varsayımdır.
Çözümlü örnek — Koşula göre satır seçmek
Enflasyonun yüzde 25'in üstünde olduğu yılları seçelim. Koşul, her satır için doğru ya da yanlış değeri üretir ve yalnızca doğru olan satırlar seçilir.
- Python:
df[df["enflasyon"] > 25] - R:
df[df$enflasyon > 25, ]
Her ikisi de 2022 ve 2023 satırlarını verir. R'daki virgül önemlidir: köşeli parantezin içinde virgülden önceki kısım satırları, sonraki kısım sütunları seçer; virgülden sonrasını boş bırakmak, bütün sütunların alınması demektir.
Belirli bir satır ve sütundaki tek bir değere ulaşmak için pandas'ta iki yol vardır. df.loc[1, "buyume"], indeksi 1 olan satırın büyüme değerini, yani 3.0'ı verir; loc, indeks etiketine göre seçer. df.iloc[0] ise sırası sıfır olan, yani ilk satırı verir; iloc, sıra numarasına göre seçer. Bu tabloda indeks ile sıra numarası aynı olduğu için fark görünmez, ama bir tabloyu sıraladıktan ya da filtreledikten sonra indeks etiketleri ile sıra numaraları birbirinden ayrılır. R'da aynı değere df[2, "buyume"] ile ulaşılır. Sayılar varsayımdır.
Çözümlü örnek — Sütunlarla hesap ve tip düzeltme
Veri çerçevesinin en güçlü yanı, bir işlemi bütün satırlara aynı anda uygulayabilmesidir. Enflasyon ile politika faizini içeren bir tabloda, kaba bir reel faiz göstergesi olarak faizden enflasyonu çıkaralım. Faiz üç yıl için 15, 30 ve 35 olsun.
- Python:
df["reel_faiz"] = df["faiz"] - df["enflasyon"] - R:
df$reel_faiz <- df$faiz - df$enflasyon
Yeni sütun −5, −10 ve 5 değerlerini taşır. Döngü yazmaya gerek yoktur: çıkarma işlemi her satırda kendiliğinden yapılır. Bir hesap tablosunda formülü aşağı sürüklemenin karşılığı budur, ama formülün hangi satırlara uygulandığı konusunda hiçbir belirsizlik kalmaz.
Şimdi bir dosyadan okunan bir sütunun sayı yerine metin olarak geldiğini varsayalım: "12", "15", "-" ve "20". Tire işareti, verinin eksik olduğunu göstermek için kullanılmış. pandas bu sütunun tipini object, yani metin olarak gösterir ve ortalama alınamaz. Sütunu sayıya çevirip sayıya çevrilemeyen değerleri eksik saymak için şu satır kullanılır.
- Python:
pd.to_numeric(s, errors="coerce") - R:
as.numeric(s)
Python'da sonuç 12, 15, NaN ve 20'dir; ortalama, eksik değer atlanarak yaklaşık 15,67 olur. R'da as.numeric aynı dönüşümü yapar ve çevrilemeyen tire için NA üretirken bir uyarı verir. Bu uyarıyı görmezden gelmemek gerekir: çevrilemeyen değerlerin gerçekten eksik veri mi, yoksa düzeltilmesi gereken bir yazım biçimi mi olduğunu ancak kullanıcı bilebilir. Sayılar varsayımdır.
Çözümlü örnek — İndeks hizalama ve sessiz hata
İki ülke grubunun verilerini toplayalım. Birinci seride TR, DE ve FR için 10, 20 ve 30; ikinci seride DE, FR ve IT için 1, 2 ve 3 olsun. pandas'ta seriler indeksleriyle tanımlanır.
a = pd.Series([10, 20, 30], index=["TR", "DE", "FR"])b = pd.Series([1, 2, 3], index=["DE", "FR", "IT"])a + b
pandas değerleri sıralarına göre değil, indekslerine göre eşleştirir: DE için 20 + 1 = 21, FR için 30 + 2 = 32 verir. TR yalnızca birinci seride, IT yalnızca ikinci seride olduğu için bu ikisinin sonucu eksik değer, yani NaN olur. McKinney'in pandas'ı yazarken önlemek istediği hata tam olarak budur: ülkeler farklı sırada gelse bile değerler doğru eşleşir.
R'da adlandırılmış iki vektörü aynı biçimde topladığımızda ise, R değerleri adlarına göre değil sıralarına göre toplar ve sonuca birinci vektörün adlarını verir.
- R:
c(TR = 10, DE = 20, FR = 30) + c(DE = 1, FR = 2, IT = 3)
Sonuç, TR, DE ve FR adlarıyla 11, 22 ve 33'tür. Türkiye'nin değerine Almanya'nınki, Almanya'nınkine Fransa'nınki eklenmiştir ve R hiçbir uyarı vermez. R'da farklı kaynaklardan gelen verileri birleştirirken, bu yüzden, vektörleri doğrudan toplamak yerine veri çerçevelerini ortak bir anahtar sütunu üzerinden birleştirmek gerekir; bunu ilerleyen derslerde göreceğiz. Sayılar varsayımdır.
Çözümlü örnek — Geniş tabloyu düzenli biçime çevirmek
İki ülkenin iki yıllık büyüme oranları, yılları sütun başlığında taşıyan geniş bir tabloda verilmiş olsun: A ülkesi için 2022'de 3, 2023'te 5; B ülkesi için 1 ve 2. Bu tablo okumak için rahattır, ama düzenli değildir: yıl bir değişkendir, oysa burada sütun adlarına dağılmıştır.
- Python:
wide = pd.DataFrame({"ulke": ["A", "B"], "2022": [3.0, 1.0], "2023": [5.0, 2.0]}) - Python:
long = wide.melt(id_vars="ulke", var_name="yil", value_name="buyume") - R:
library(tidyr)ve ardındanlong <- pivot_longer(wide, cols = -ulke, names_to = "yil", values_to = "buyume")
Sonuç, dört satırlı ve üç sütunlu uzun bir tablodur: her satır bir ülke ve bir yıl, yani bir gözlemdir. Bu biçimde, ülke başına ortalama büyümeyi tek satırla hesaplayabiliriz.
- Python:
long.groupby("ulke")["buyume"].mean()
Sonuç, A için 4.0, B için 1.5'tir. R'da aynı hesap dplyr paketinin group_by ve summarise fonksiyonlarıyla yapılır. Aynı soruyu geniş tabloda sormak için her ülkenin satırındaki yıl sütunlarını tek tek seçmek gerekirdi; yeni bir yıl eklendiğinde de kodu değiştirmek. Düzenli veride ise yeni bir yıl, yalnızca yeni satırlar demektir ve kod değişmeden çalışır. Sayılar varsayımdır.
Çözümlü örnek — Eksik değerler iki dilde
Üç gözlemden birinin eksik olduğu bir seri düşünelim: 10, eksik, 30. Python'da eksik değer NaN, R'da NA ile gösterilir.
- Python:
import numpy as npve ardındanpd.Series([10, np.nan, 30]).mean() - R:
mean(c(10, NA, 30))
pandas, eksik değeri varsayılan olarak atlar ve ortalamayı kalan iki değer üzerinden 20.0 olarak hesaplar. R ise varsayılan olarak NA sonucunu verir: bir değer bilinmiyorsa ortalamanın da bilinmediğini söyler. R'da eksik değeri atlamak için bunu açıkça istemek gerekir.
- R:
mean(c(10, NA, 30), na.rm = TRUE)
Bu satır 20 sonucunu verir. İki dilin farklı varsayılanları, farklı felsefeleri yansıtır: pandas kolaylığı, R ise dikkati öne çıkarır. İktisatçı için önemli olan, eksik değerlerin neden eksik olduğunu sormaktır. Bir ülkenin verisi kriz yılında eksikse, o yılı atlamak ortalamayı sistematik olarak yanıltabilir. Python'da isna().sum(), R'da sum(is.na(x)) bir serideki eksik değer sayısını verir ve her analizin başında bakılması gereken ilk sayılardan biridir. Sayılar varsayımdır.
Modelin sınırları
Bu derste veri yapılarının yalnızca temel biçimlerini gördük. Python'da demetler ve kümeler, numpy dizileri, R'da matrisler, faktörler ve tarih tipleri gibi başka yapılar da vardır ve bunların bazılarını ilerleyen derslerde kullanacağız. pandas ve R'ın veri çerçeveleri, bellekte tutulabilecek büyüklükteki veriler için tasarlanmıştır; milyonlarca satırlık veriler için farklı araçlar gerekebilir.
Python örnekleri pandas'ın 2.3 sürümüyle çalıştırılarak denetlendi. R satırları bu ortamda çalıştırılamadı ve R'ın başvuru belgelerindeki kurallara göre yazıldı; özellikle adlandırılmış vektörlerin sıraya göre toplanması ve eksik değerlerin varsayılan davranışı, R'ın temel kurallarıdır. Paketlerin ve dillerin yeni sürümlerinde bazı ayrıntılar değişebilir; bir fonksiyonun davranışından emin olmadığınızda, küçük bir örnekle denemek en güvenli yoldur.
Uygulama
Özet kartı
- Python'da liste ve sözlük, R'da vektör ve liste, çoklu değer saklamanın temel araçlarıdır; Python'da sıra numaraları sıfırdan, R'da birden başlar ve bu fark, iki dil arasında geçerken sessiz hatalara yol açabilir.
- Her değerin bir veri tipi vardır; Python listeleri farklı tipleri bir arada tutabilir, R vektörleri ise farklı tipleri kendiliğinden ortak bir tipe, çoğu zaman metne çevirir ve bunu uyarı vermeden yapar.
- Veri çerçevesi, satırları gözlemlere ve sütunları değişkenlere karşılık gelen tablodur; R'a gömülü data.frame'den adını alan pandas DataFrame'i, Wes McKinney'in 2008'de nicel bir yatırım şirketinde başlattığı ve adını panel veriden alan kütüphaneyle Python'a geldi.
- pandas değerleri indekslerine göre hizalar, R ise adlandırılmış vektörleri sıralarına göre toplar; eksik değerlerde pandas ortalamayı varsayılan olarak eksikleri atlayarak, R ise ancak açıkça istenirse hesaplar.
- Wickham'ın düzenli veri ilkesine göre her değişken bir sütun, her gözlem bir satırdır; Ziemann ve arkadaşlarının gösterdiği gibi, veri tiplerini yazılımın tahminine bırakmak, verinin sessizce bozulmasına yol açabilir.
Kavram sözlüğü
| Türkçe | İngilizce | Kısa tanım |
|---|---|---|
| Liste | List | Birden çok değeri belirli bir sırayla bir arada tutan yapı |
| Sözlük | Dictionary | Her değeri bir anahtarla eşleştiren yapı |
| Veri tipi | Data type | Bir değerin sayı, metin, mantıksal değer gibi hangi türden saklandığı |
| Veri çerçevesi | Data frame | Her satırı bir gözlem, her sütunu bir değişken olan, sütun tipleri tanımlı tablo |
| İndeks | Index | Bir yapıdaki elemanı ya da satırı tanımlayan etiket ya da sıra numarası |
| Düzenli veri | Tidy data | Her değişkenin bir sütun, her gözlemin bir satır olduğu veri düzeni |
Kendini sına
- (Çıktı 1) Liste ile sözlük arasındaki farkı açıkla. Bir döviz kurunun yıllara göre değerlerini tutmak için hangisini seçerdin ve neden?
- (Çıktı 2) Python'da enflasyon[1] ile R'da enflasyon[1] aynı değeri mi verir? enflasyon = [20, 40, 30] ve enflasyon <- c(20, 40, 30) için her birinin sonucunu yaz ve farkın nedenini açıkla.
- (Çıktı 3) Beş yıllık büyüme oranları 3, 5, 2, 4 ve 6'dır. Bu değerleri Python'da bir listede ve R'da bir vektörde tut, üçüncü yılın değerine iki dilde ulaşmak için hangi ifadeleri yazarsın? Ortalamayı iki dilde nasıl hesaplarsın ve sonuç nedir?
- (Çıktı 3) Bir veri çerçevesinde yil, enflasyon ve faiz sütunları var. Faizin enflasyondan büyük olduğu satırları seçen ifadeyi her iki dilde yaz. Faizden enflasyonu çıkaran yeni bir sütunu nasıl eklersin?
- (Çıktı 4) R'da c(TR = 10, DE = 20) + c(DE = 1, TR = 2) işlemi ne verir? Aynı işlem pandas'ta, indeksleri TR ve DE olan iki seriyle yapılırsa sonuç ne olur? Hangisi doğru eşleştirmedir ve neden?
- (Çıktı 4) Bir iş arkadaşın, «Veriyi hesap tablosunda açtım, sayılar düzgün görünüyor, doğrudan analize başlayabiliriz» diyor. Wickham'ın ve Ziemann ile arkadaşlarının bulgularından yararlanarak, analize başlamadan önce hangi denetimleri yapman gerektiğini açıkla.
Cevaplar
- Liste değerleri belirli bir sırayla tutar ve değerlere sıra numarasıyla ulaşılır; sözlük ise her değeri bir anahtarla eşleştirir ve değere anahtarıyla ulaşılır. Döviz kurunun yıllara göre değerleri için sözlük daha uygundur: kur["2024"] ifadesi, veriye yeni yıllar eklendiğinde ya da sıra değiştiğinde de doğru değeri verir, oysa sıra numarasıyla çalışan bir kod araya bir değer girdiğinde yanlış yıla bakar.
- Aynı değeri vermez. Python'da sıra numaraları sıfırdan başladığı için enflasyon[1] ikinci elemanı, yani 40'ı verir. R'da sıra numaraları birden başladığı için enflasyon[1] ilk elemanı, yani 20'yi verir. İlk elemana Python'da enflasyon[0] ile ulaşılır.
- Python'da buyume = [3, 5, 2, 4, 6] yazılır ve üçüncü yıla buyume[2] ile ulaşılır; değer 2'dir. R'da buyume <- c(3, 5, 2, 4, 6) yazılır ve üçüncü yıla buyume[3] ile ulaşılır. Ortalama Python'da sum(buyume) / len(buyume), R'da mean(buyume) ile hesaplanır; sonuç 20 / 5 = 4'tür.
- Python'da df[df["faiz"] > df["enflasyon"]], R'da df[df$faiz > df$enflasyon, ] yazılır. Yeni sütun Python'da df["reel_faiz"] = df["faiz"] - df["enflasyon"], R'da df$reel_faiz <- df$faiz - df$enflasyon ile eklenir.
- R, adlandırılmış vektörleri sıralarına göre toplar ve birinci vektörün adlarını kullanır: sonuç, TR adıyla 10 + 1 = 11 ve DE adıyla 20 + 2 = 22'dir. Oysa ikinci vektörde 1 değeri DE'ye, 2 değeri TR'ye aitti. pandas ise değerleri indekslerine göre eşleştirir: TR için 10 + 2 = 12, DE için 20 + 1 = 21 verir. Doğru eşleştirme pandas'ınkidir, çünkü her ülkenin değeri kendi değeriyle toplanmıştır; R'daki sonuç sessiz bir hatadır.
- Ekranda düzgün görünmek, verinin analize hazır olduğu anlamına gelmez. Önce tablonun düzenli olup olmadığına bakılmalıdır: Wickham'ın ilkesine göre her değişken bir sütun, her gözlem bir satır olmalıdır; yıllar sütun başlıklarında ya da alt toplamlar satır aralarında ise tablo önce düzenli biçime çevrilmelidir. Ardından her sütunun veri tipi denetlenmelidir: Ziemann ve arkadaşlarının gösterdiği gibi, hesap tablosu yazılımları değerlerin tipini kendiliğinden tahmin eder ve yanlış tahmin ettiğinde veri sessizce bozulur; başında sıfır olan kodlar sayıya dönüşüp sıfırlarını kaybedebilir, bazı değerler tarihe çevrilebilir. Son olarak eksik değerlerin sayısına ve nasıl gösterildiğine bakılmalıdır.
İleri okuma
- Wes McKinney (2022, 3. baskı). Python for Data Analysis. O'Reilly. pandas'ın yazarından Python ile veri analizi; kitabın çevrimiçi sürümü yazarın sitesinde açıktır.
- Hadley Wickham (2014). «Tidy Data». Journal of Statistical Software 59(10). Düzenli veri ilkesinin kaynağı.
- Hadley Wickham, Mine Çetinkaya-Rundel, Garrett Grolemund (2023, 2. baskı). R for Data Science. O'Reilly. R ile veri yapıları ve düzenli veri araçları.
- Mark Ziemann, Yotam Eren, Assam El-Osta (2016). «Gene Name Errors Are Widespread in the Scientific Literature». Genome Biology 17. Veri tiplerinin sessiz dönüşümüne dair çarpıcı bir örnek.
Sonraki derse köprü
Bu derste veri çerçevelerini elle yazdığımız birkaç sayıyla kurduk. Gerçek analizlerde ise veriler kurumların veri tabanlarından gelir ve her güncellemede elle kopyalamak hem zahmetli hem de hataya açıktır. Sıradaki ders, verileri doğrudan programın içinden çekmeyi ele alıyor. TCMB'nin EVDS adlı veri servisi, ABD'deki St. Louis Fed'in FRED veri tabanı ve Dünya Bankası'nın göstergeleri, Python'dan ve R'dan nasıl sorgulanır? Bir serinin kodunu bulmak, bir erişim anahtarı almak ve gelen veriyi bir veri çerçevesine dönüştürmek için hangi adımlar gerekir?