Önce özete göz atDersin sonundaki özet, okumaya başlamadan önce yol haritası olarak.
- Veri temizleme, verinin doğru tipte okunmasını, metinlerin tek biçime getirilmesini, yinelenen kayıtların ayıklanmasını, eksik değerlerin ele alınmasını ve tabloların doğru eşleştirilmesini kapsar; bu adımlar bir betikte kaydedilmeli ve her karar açıkça yazılmalıdır.
- Türkçe biçimli dosyalar noktalı virgül ayracı, virgül ondalığı ve nokta binlik ayracı taşır ve açık ayarlarla okunmalıdır; Python'un varsayılan büyük küçük harf dönüşümü Türkçenin noktalı ve noktasız i harflerini tanımaz.
- Birleştirme anahtarları iki tabloda aynı biçimde yazılmalı; birleştirme hata vermese bile eşleşmeyen satırlar ve satır sayısındaki değişim denetlenmelidir.
- Eksik değerleri silmek ya da doldurmak, eksiklik mekanizmasına dair bir varsayıma dayanır; eksiklik değerin kendisiyle ilişkiliyse, iki yol da yanlılığı gidermez ve ortalamayla doldurma dağılımı yapay biçimde daraltır.
- Meyer, Mok ile Sullivan, hane anketlerinde yanıtsızlık, doldurma ve ölçüm hatasının son otuz yılda arttığını; Bollinger ile Hirsch, doldurma modelinde yer almayan özelliklerin, örneğin sendika üyeliğinin, etkilerinin doldurulmuş verilerde ciddi biçimde yanlı ölçüldüğünü gösterdi.
Öğrenme çıktıları
- Hatırlama — Veri temizlemeyi, birleştirme anahtarını, yinelenen kaydı, eksik veri mekanizmasını, eksik değer doldurmayı ve doğrulama denetimini tanımlar.
- Anlama — Eksik değerlerin neden eksik olduğunun, onları atlamak ya da doldurmak arasındaki seçimi nasıl belirlediğini ve doldurulmuş değerlerin bir analizi hangi durumlarda yanılttığını açıklar.
- Uygulama — Türkçe biçimli bir dosyayı doğru ondalık ve binlik ayraçlarıyla okur, metin sütunlarını düzeltir, yinelenen kayıtları bulur, tarihleri çözümler ve iki tabloyu ortak bir anahtarla birleştirip eşleşmeyen kayıtları denetler.
- Değerlendirme — Meyer, Mok ile Sullivan'ın ve Bollinger ile Hirsch'in bulgularından yararlanarak bir veri setindeki eksiklik ve doldurma sorunlarının analizin sonuçlarını ne ölçüde etkileyebileceğini tartışır.
Sezgi
Açılış
İki tablo düşünelim. Birinde 81 ilin işsizlik oranları, öbüründe aynı illerin nüfusları var. İkisini birleştirip nüfusa göre ağırlıklı ortalama bir işsizlik oranı hesaplamak istiyoruz. Birleştirme komutunu çalıştırıyoruz ve sonuç geliyor. Ama bir tabloda il adları büyük harfle, öbüründe küçük harfle yazılmış; birinde «Afyonkarahisar», öbüründe «Afyon» denmiş; birinde İstanbul iki kez geçiyor. Program hiçbir hata vermiyor. Yalnızca birkaç il eşleşmiyor, birkaç il iki kez sayılıyor ve ortalama, fark edilmeden yanlış çıkıyor.
Veri analizinin en az konuşulan, ama çoğu zaman en çok zaman alan kısmı budur. Veriyi analize hazırlamak, yani onu okumak, düzeltmek, birleştirmek ve denetlemek, hesaplamanın kendisinden çok daha fazla emek ister. Üstelik bu aşamada yapılan hatalar, sonraki bütün hesaplara taşınır ve çoğu zaman görünmez kalır.
Bu ders, veri temizlemenin temel adımlarını ve her adımda sorulması gereken soruları ele alıyor: veri doğru okundu mu, her kayıt bir kez mi geçiyor, eksik değerler neden eksik, iki tablo gerçekten eşleşiyor mu?
Hikâye — Aynı veri, farklı büyüme
Penn World Table, yani Penn Dünya Tablosu, ülkeler arası büyüme karşılaştırmalarında iktisatçıların en çok kullandığı veri setlerinden biridir. Farklı ülkelerin milli gelirlerini ortak uluslararası fiyatlarla, yani satın alma gücü paritesiyle değerleyerek karşılaştırılabilir kılar. Onlarca yıldır yüzlerce büyüme çalışması, bu tablonun şu ya da bu sürümüne dayanıyor.
Simon Johnson, William Larson, Chris Papageorgiou ve Arvind Subramanian, 2013'te Journal of Monetary Economics'te yayımlanan bir makalede, bu tablonun farklı sürümlerini karşılaştırdı. Buldukları şey rahatsız ediciydi: tablonun gayri safi yurt içi hasıla tahminleri, çok benzer temel verilerden ve neredeyse aynı yöntemlerle üretilmiş olmalarına rağmen, farklı sürümler arasında önemli ölçüde değişiyordu. Yazarlara göre büyüme oranlarını hesaplamak için kullanılan yöntem sistematik bir oynaklığa yol açıyordu ve bu oynaklık yıllık gibi yüksek sıklıktaki verilerde, küçük ülkelerde ve tahmin, karşılaştırma yılından uzaklaştıkça daha büyüktü.
Bu oynaklık yalnızca teknik bir ayrıntı değildi; ülkeler arası büyüme literatürü için önemliydi. Yazarlar, düşük sıklıktaki, örneğin on yıllık ortalamalara dayanan büyüme çalışmalarının veri revizyonlarına karşı sağlam kaldığını, ama yıllık verileri kullanan çalışmaların daha az sağlam olduğunu gösterdi. Bir başka deyişle, bir araştırmacının hangi sürümü indirdiği, vardığı sonucu değiştirebiliyordu. Makale ayrıca tablonun yönteminin, tablonun var olma nedeni olan satın alma gücü paritesi fiyatlarıyla değerlenmemiş tahminler ürettiğini de gösterdi ve iki sorunu gidermek için bir yaklaşım önerdi.
Bu hikâyenin dersi, veri temizliğinin yalnızca yazım hatalarını düzeltmekten ibaret olmadığıdır. Bir veri setini kullanmadan önce, onun nasıl üretildiğini, hangi sürümün kullanıldığını ve verinin hangi amaç için güvenilir, hangi amaç için güvenilmez olduğunu sormak gerekir. İyi bir temizlik, verinin sınırlarını tanımakla başlar.
Kavram
Bu dersin konusu olan işin adı şudur.
İki tabloyu birleştirmek için ortak bir kimliğe ihtiyaç vardır.
Bir kaydın birden çok kez geçmesi, en sık rastlanan sorunlardan biridir.
Eksik değerleri ele almadan önce, neden eksik olduklarını sormak gerekir.
Eksik değerlerin yerine tahmini değerler koymanın adı şudur.
Son olarak, temizliğin sonucunu denetlemenin yolu şudur.
Veri ve kanıt
Bu bulgu, veri temizliğinin neden kaçınılmaz olduğunu gösterir. İktisatçıların en çok kullandığı veriler, hanelerin kendi beyanlarına dayanan anketlerdir ve bu anketlerde eksik yanıtlar, kurum tarafından doldurulmuş değerler ve yanlış bildirimler giderek artıyor. Bir anket veri setini açan bir araştırmacı, gördüğü değerlerin bir kısmının gerçek yanıt değil, kurumun doldurduğu tahminler olduğunu bilmelidir. Birçok anket, hangi değerlerin doldurulduğunu gösteren işaret sütunları içerir; bu sütunları görmezden gelmek, doldurulmuş tahminleri gerçek gözlemler gibi kullanmak demektir.
Bollinger ile Hirsch'in bulgusu, doldurmanın masum bir teknik işlem olmadığını gösterir. Diyelim ki kurum, kazancını bildirmeyen bir işçinin yerine aynı yaş ve eğitim grubundan rastgele seçilen başka bir işçinin kazancını koyuyor, ama sendika üyeliğine bakmıyor. Sendikalı işçilerin kazancını bildirmeyenlerine sendikasız bağışçıların kazançları atanır ve sendikalı ile sendikasız işçiler arasındaki ücret farkı, gerçekte olduğundan küçük ölçülür. Bir araştırmacı doldurulmuş değerleri gerçek gibi kullanırsa, doldurma modelinin göremediği her ilişkiyi zayıflatarak ölçer. Önerilen çözümlerden biri, doldurulmuş kayıtları dışarıda bırakıp kalan örneklemi yeniden ağırlıklandırmaktır.
Yaygın yanlış«Eksik değerleri silmek her zaman en güvenli yoldur; en azından uydurma veri kullanmamış oluruz.»
Eksiklik tamamen rastgele değilse, eksik değerleri silmek örneklemi sistematik olarak değiştirir. Örneğin yüksek gelirliler gelirlerini daha sık bildirmiyorsa, onları silmek ortalama geliri olduğundan düşük gösterir. Silmek de doldurmak gibi bir varsayıma dayanır; hangisinin daha az yanıltıcı olduğu, eksiklik mekanizmasına bağlıdır.
Yaygın yanlış«Birleştirme komutu hata vermediyse iki tablo doğru eşleşmiştir.»
Birleştirme, anahtarları harfi harfine eşleştirir. Bir tabloda «ANKARA», öbüründe «Ankara» yazıyorsa, ya da bir ilin adı fazladan bir boşluk içeriyorsa, bu satırlar eşleşmez ve program hiçbir hata vermez. Birleştirmeden sonra eşleşmeyen satırların sayısını denetlemek ve beklenen satır sayısını doğrulamak gerekir.
Neden önemli?
Veri temizliği, bir analizin güvenilirliğinin temelidir. Temizlik kararları, yani hangi kaydın silineceği, eksik değerlerin nasıl ele alınacağı ya da iki tablonun hangi anahtarla birleştirileceği, çoğu zaman sonucun kendisini etkiler. Bu kararlar bir betikte açıkça kaydedildiğinde, başka bir araştırmacı onları görebilir, sorgulayabilir ve farklı bir kararla sonucun değişip değişmediğini sınayabilir.
Meyer, Mok ile Sullivan'ın gösterdiği gibi, anket verilerinin kalitesi düşerken idari veriler, yani vergi, sosyal güvenlik ve işletme kayıtları gibi kurumların kendi işleri için tuttuğu veriler, iktisat araştırmalarında giderek daha önemli hâle geliyor. İdari veriler çoğu zaman daha doğrudur, ama başka amaçlar için toplandıkları için tanımları, kodları ve biçimleri araştırmaya uygun değildir; bu yüzden onlar da yoğun bir temizlik gerektirir.
Türkiye'de de araştırmacıların erişebildiği idari veri setleri arttıkça, farklı kaynaklardan gelen tabloları il, sektör ya da firma kodlarıyla birleştirmek sıradan bir iş hâline geliyor. Türkçe karakterler, farklı kurumların farklı il ve sektör kodlamaları ve virgülle yazılan ondalık sayılar, bu işe özgü tuzaklar içerir. Bu tuzakları tanımak, Türkiye verisiyle çalışan her iktisatçı için temel bir beceridir.
Model
Çözümlü örnek — Türkçe biçimli bir dosyayı okumak
Türkiye'deki kurumların yayımladığı dosyalarda ondalık ayracı virgül, binlik ayracı noktadır; sütunlar da virgül yerine noktalı virgülle ayrılır. Varsayılan ayarlarla çalışan bir okuyucu, binlik noktası ve ondalık virgülü taşıyan bir değeri yanlış yorumlar. Bir il gelir tablosunda A ilinin geliri 1.234,5, B ilininki 2.000,0 olsun ve eksik değerler tire işaretiyle gösterilmiş olsun. pandas'a biçimi açıkça söyleriz.
- Python:
pd.read_csv("iller.csv", sep=";", decimal=",", thousands=".", na_values=["-"]) - R:
read.csv2("iller.csv", na.strings = "-")
Python'daki satır, gelir sütununu 1234.5 ve 2000.0 değerleriyle ondalıklı sayı tipinde okur ve tireleri eksik değere çevirir. R'daki read.csv2 fonksiyonu, noktalı virgül ayracını ve virgül ondalığını varsayılan olarak kabul eder. Bu ayarlar verilmeden okunan aynı dosyada, pandas satırları tek bir sütun gibi görür ya da sayıları metin olarak bırakır. Dosyayı okuduktan hemen sonra df.dtypes ile sütun tiplerine bakmak, bu hatayı ilk adımda yakalar. Sayılar varsayımdır.
Çözümlü örnek — Metinleri tek biçime getirmek
Bir tabloda il adları «İstanbul», «ANKARA» ve başında ve sonunda boşluk bulunan « izmir » biçiminde yazılmış olsun. Önce baştaki ve sondaki boşlukları sileriz, sonra hepsini küçük harfe çeviririz.
- Python:
df["il"].str.strip().str.lower()
Bu satır, beklenmedik bir sonuç verir: «ankara» ve «izmir» doğru çıkar, ama «İstanbul» sıradan bir i ile ayrı bir noktalama işaretinin birleşiminden oluşan bir biçime dönüşür ve başka bir tablodaki «istanbul» ile eşleşmez. Python'un varsayılan büyük küçük harf dönüşümü Türkçenin noktalı ve noktasız i harflerini tanımaz; benzer biçimde «izmir».upper() işlemi İZMİR değil IZMIR verir. Türkçe metinler için önce bu iki harfi elle dönüştürmek gerekir.
- Python:
df["il"].str.strip().str.replace("I", "ı").str.replace("İ", "i").str.lower() - R:
stringr::str_to_lower(trimws(df$il), locale = "tr")
Python'daki satır «İstanbul», «ANKARA», « izmir » ve «IĞDIR» değerlerini sırasıyla istanbul, ankara, izmir ve ığdır olarak verir. R'daki stringr paketi, Türkçe yerel ayarını tanıyan bir dönüşüm sunar. Bu dönüşümü bir fonksiyon olarak tanımlayıp her tabloya aynı biçimde uygulamak, birleştirme anahtarlarının tutarlı olmasını sağlar.
En güvenli yol ise, mümkün olduğunda ad yerine bir kod kullanmaktır. İller için plaka kodu, ülkeler için uluslararası üç harfli kodlar, adların yazım farklılıklarından etkilenmez. Ama kodlar da kendi tuzaklarını taşır: plaka kodu 6 olan Ankara, bir tabloda sayı olarak 6, öbüründe metin olarak 06 yazılmış olabilir ve bu iki değer birleştirmede eşleşmez. Kodları birleştirmeden önce aynı tipe ve aynı biçime getirmek, örneğin hepsini iki haneli metne çevirmek gerekir; Python'da df["kod"].astype(str).str.zfill(2) ifadesi 6 değerini 06'ya, 34 değerini ise değiştirmeden 34'e çevirir.
Çözümlü örnek — Yinelenen kayıtları bulmak
Bir il ve yıl tablosunda İstanbul'un 2022 satırı iki kez, aynı değerlerle yer alsın. Tamamen aynı satırları bulmak ve silmek kolaydır.
- Python:
df.duplicated().sum()vedf = df.drop_duplicates() - R:
sum(duplicated(df))vedf <- df[!duplicated(df), ]
Daha zor olan, aynı il ve yıl için farklı değerler taşıyan satırlardır: A ilinin 2022 satırı bir kez 1, bir kez 2 değeriyle geçiyor olsun. Bunları bulmak için yinelenmeyi yalnızca anahtar sütunlara göre ararız.
- Python:
df.duplicated(subset=["il", "yil"]).sum()
Sonuç 1'dir: bir satır, anahtarı bakımından yinelenmektedir. Bu durumda hangi değerin doğru olduğuna program karar veremez. Belki biri eski, biri düzeltilmiş değerdir; belki iki farklı kaynaktan gelmişlerdir. Doğru yol, bu satırları ayrıca listeleyip kaynağa bakmak ve kararı betiğe bir yorum satırıyla birlikte yazmaktır. Yinelenen bir kaydı körü körüne silmek, düzeltilmiş değeri silip eski değeri tutmakla sonuçlanabilir. Sayılar varsayımdır.
Çözümlü örnek — Tarihleri çözümlemek
Türkçe biçimli dosyalarda tarihler çoğu zaman gün, ay ve yıl sırasıyla, noktalarla ayrılarak yazılır: 01.03.2024 gibi. Bir program bu metni tarih olarak tanımayabilir ya da ay ile günü karıştırabilir. Biçimi açıkça belirtmek gerekir.
- Python:
pd.to_datetime(df["tarih"], format="%d.%m.%Y") - R:
as.Date(df$tarih, format = "%d.%m.%Y")
Burada %d gün, %m ay, %Y dört haneli yıl anlamına gelir. 01.03.2024 değeri, 1 Mart 2024 olarak okunur; biçim verilmeseydi bazı programlar onu 3 Ocak olarak okuyabilirdi. Özellikle ayın ilk on iki gününe düşen tarihlerde bu hata görünmez kalır, çünkü her iki okuma da geçerli bir tarih üretir. Tarih sütununu çözümledikten sonra en küçük ve en büyük tarihe bakmak, verinin beklenen dönemi kapsayıp kapsamadığını gösteren basit bir denetimdir.
Çözümlü örnek — Birleştirmek ve eşleşmeyenleri denetlemek
İşsizlik tablosu ile nüfus tablosunu il adıyla birleştirelim. İlk tabloda il adları «İstanbul», «ANKARA» ve « izmir », ikincisinde «İstanbul», «Ankara» ve «İzmir» olsun. Adları düzeltmeden birleştirir ve pandas'tan eşleşme durumunu bir sütunda göstermesini isteriz.
- Python:
m = df.merge(nufus, on="il", how="left", indicator=True) - Python:
m["_merge"].value_counts()
Sonuç, yalnızca İstanbul'un eşleştiğini, ANKARA ile izmir'in sol tabloda kalıp nüfus değeri alamadığını gösterir. Program hiçbir hata vermemiştir; eksik nüfuslar yalnızca NaN olarak görünür. Önceki örnekteki Türkçe dönüşümle her iki tabloda bir anahtar sütunu oluşturup bu sütunla birleştirdiğimizde ise üç ilin üçü de eşleşir.
- R:
m <- merge(df, nufus, by = "anahtar", all.x = TRUE)ve ardındansum(is.na(m$nufus))
how="left" ya da R'daki all.x = TRUE, sol tablonun bütün satırlarını korur ve eşleşmeyenleri eksik değerle doldurur. Eşleşmeyenleri saymak, bir birleştirmeden sonra yapılması gereken ilk iştir. Birleştirmeden önce ve sonra satır sayısını karşılaştırmak da önemlidir: sağ tabloda anahtar yineleniyorsa, birleştirme satır sayısını sessizce artırır ve bazı iller iki kez sayılır. Sayılar varsayımdır.
Çözümlü örnek — Biçim hatasından doğan aykırı değer
Dört ilin işsizlik oranları 9,5, 8,1, 11,0 ve 950 olarak okunmuş olsun. Dördüncü değer, bir oranın alabileceği sınırın çok dışındadır; büyük olasılıkla dosyada 9,50 yazılıydı ve bir aşamada virgül kaybolarak değer yüz katına çıktı. Bu tür hatalar, farklı ondalık ayraçları kullanan dosyaların birleştirilmesinde sık görülür.
- Python:
s.describe() - R:
summary(s)
Python'daki özet, ortalamayı 244,65, medyanı ise 10,25 olarak verir; en büyük değer 950'dir. Ortalama ile medyan arasındaki büyük fark ve en büyük değerin anlamsızlığı, bir sorunu hemen gösterir. Tek bir hatalı değer, ortalamayı gerçek düzeyin yaklaşık yirmi beş katına çıkarmıştır; hatalı değer düzeltildiğinde ortalama 9,525 olur.
Burada doğru yol, aykırı değeri silmek değil, nedenini bulmaktır. Değer bir biçim hatasıysa düzeltilmeli; gerçek ama olağandışı bir gözlemse, örneğin bir kriz yılının değeriyse, korunmalı ve analizde ayrıca ele alınmalıdır. Aykırı değerleri kendiliğinden silen bir betik, gerçek bir krizi de hata sanıp silebilir. Her yeni veri setinde özet istatistiklere, en küçük ve en büyük değerlere bakmak ve bunları alanın bilinen sınırlarıyla karşılaştırmak, bu tür hataları ilk adımda yakalar. Sayılar varsayımdır.
Çözümlü örnek — Eksik değerleri silmenin bedeli
On hanenin aylık geliri, bin lira olarak, 10, 12, 14, 16, 18, 20, 30, 40, 60 ve 80 olsun. Gerçek ortalama 30'dur. Şimdi en yüksek gelirli üç hanenin, yani 40, 60 ve 80 bin lira kazananların, gelirlerini bildirmediğini varsayalım. Eksiklik rastgele değildir: değerin kendisiyle ilişkilidir.
Eksik değerleri silip kalan yedi hanenin ortalamasını alırsak, 17,14 buluruz; gerçek ortalamanın yarısından biraz fazla. Eksikleri, bildirilen değerlerin ortalamasıyla, yani 17,14 ile doldurursak, ortalama yine 17,14 çıkar; doldurma yanlılığı düzeltmez. Üstelik gelirlerin standart sapması, gerçek veride yaklaşık 22,18 iken, doldurulmuş veride yaklaşık 5,13'e düşer. Ortalamayla doldurma, verideki dağılımı yapay biçimde daraltır ve eşitsizliği olduğundan çok daha düşük gösterir.
Bu örnek, eksik veri mekanizmasının neden önemli olduğunu gösterir. Eksiklik tamamen rastgele olsaydı, silmek ortalamayı sistematik olarak saptırmazdı. Eksiklik yüksek gelirle ilişkili olduğunda ise, ne silmek ne de basit doldurma yanlılığı giderir. Bu durumda idari kayıtlar gibi başka kaynaklarla karşılaştırma, yanıt verme olasılığına göre yeniden ağırlıklandırma ya da en azından sonucun ne yönde yanlı olabileceğini açıkça yazmak gerekir. Sayılar varsayımdır.
Çözümlü örnek — Doldurmanın gizlediği fark
Bollinger ile Hirsch'in anlattığı eşleşme yanlılığını bir örnekle görelim. 100 işçinin 50'si sendikalı ve aylık 120 bin lira, 50'si sendikasız ve aylık 100 bin lira kazanıyor olsun. Gerçek sendika ücret farkı 20 bin liradır. Sendikalıların 20'si kazancını bildirmiyor ve kurum, bu eksik değerleri, sendika üyeliğine bakmadan, kazancını bildiren bütün işçiler arasından seçilen bağışçıların değerleriyle dolduruyor.
Kazancını bildiren 80 işçinin 30'u sendikalı, 50'si sendikasızdır ve ortalama kazançları (30 × 120 + 50 × 100) ÷ 80 = 107,5'tir. Doldurulan 20 sendikalı işçiye ortalama olarak bu değer atanır. Doldurulmuş veride sendikalıların ortalama kazancı (30 × 120 + 20 × 107,5) ÷ 50 = 115 olur. Ölçülen sendika farkı 15 bin liraya düşer; gerçek farkın dörtte biri kaybolmuştur.
Doldurma modeli sendika üyeliğini hesaba katmadığı için, sendikalı ile sendikasız işçiler arasındaki farkı doldurulan kayıtlarda sıfır saymıştır. Bollinger ile Hirsch'in önerdiği çözümlerden biri, doldurulmuş kayıtları dışarıda bırakıp kalan örneklemi yeniden ağırlıklandırmaktır. Bunun için veri setinde hangi değerlerin doldurulduğunu gösteren işaret sütunlarını bulmak ve kullanmak gerekir. Sayılar varsayımdır.
Çözümlü örnek — Doğrulama denetimleri yazmak
Temizliğin sonunda, verinin bilinen kurallara uyup uymadığını betiğin içinde denetleriz. Python'da assert ifadesi, bir koşul yanlışsa betiği durdurur ve verilen mesajı yazar.
assert m["_merge"].eq("both").all(), "eşleşmeyen il var"assert not df.duplicated(subset=["il", "yil"]).any(), "yinelenen il ve yıl var"assert df["issizlik"].between(0, 100).all(), "oran sıfır ile yüz arasında değil"assert len(df) == 81, "il sayısı 81 değil"
R'da aynı denetimler stopifnot fonksiyonuyla yazılır; örneğin stopifnot(!anyDuplicated(df[c("il", "yil")])). Bu ders hazırlanırken, il adları düzeltilmeden yapılan birleştirmeden sonra ilk denetim çalıştırıldı ve betik, eşleşmeyen il bulunduğunu söyleyerek durdu; adlar düzeltildikten sonra aynı denetim sorunsuz geçti. Denetimler, verinin bir sonraki güncellemesinde, örneğin kurum bir il adının yazımını değiştirdiğinde, sorunu hemen görünür kılar. Bir hata mesajıyla duran bir betik, yanlış bir sonucu sessizce üreten bir betikten her zaman daha iyidir. Eksik değer içeren bir sütunda between denetimi eksik değerler için yanlış verir; bu yüzden denetimden önce eksik değerlerin nasıl ele alınacağına karar verilmiş olmalıdır.
Modelin sınırları
Bu derste veri temizliğinin en yaygın adımlarını gördük; ama her veri seti kendi sorunlarını getirir. Aykırı değerlerin bulunması, metin alanlarındaki yazım farklılıklarının benzerlik ölçüleriyle eşleştirilmesi, farklı sınıflandırma sistemlerinin birbirine çevrilmesi, örneğin eski ve yeni sektör kodlarının eşleştirilmesi, ve zaman içinde değişen il ve ilçe sınırlarının düzeltilmesi gibi işler, bu dersin kapsamının dışında kaldı.
Eksik değerler için daha gelişmiş yöntemler de vardır: eksik değeri bir modelle birden çok kez tahmin edip sonuçlardaki belirsizliği hesaba katan çoklu doldurma, ya da yanıt verme olasılığına göre yeniden ağırlıklandırma bunlardandır. Bu yöntemlerin her biri, eksiklik mekanizmasına dair bir varsayıma dayanır ve varsayım yanlışsa yanlılığı gidermez. Python satırları, kullanılan pandas kurulumunda tek tek sınandı; R karşılıkları ise yerel bir R kurulumu olmadığından denenmeden yazıldı.
Uygulama
Özet kartı
- Veri temizleme, verinin doğru tipte okunmasını, metinlerin tek biçime getirilmesini, yinelenen kayıtların ayıklanmasını, eksik değerlerin ele alınmasını ve tabloların doğru eşleştirilmesini kapsar; bu adımlar bir betikte kaydedilmeli ve her karar açıkça yazılmalıdır.
- Türkçe biçimli dosyalar noktalı virgül ayracı, virgül ondalığı ve nokta binlik ayracı taşır ve açık ayarlarla okunmalıdır; Python'un varsayılan büyük küçük harf dönüşümü Türkçenin noktalı ve noktasız i harflerini tanımaz.
- Birleştirme anahtarları iki tabloda aynı biçimde yazılmalı; birleştirme hata vermese bile eşleşmeyen satırlar ve satır sayısındaki değişim denetlenmelidir.
- Eksik değerleri silmek ya da doldurmak, eksiklik mekanizmasına dair bir varsayıma dayanır; eksiklik değerin kendisiyle ilişkiliyse, iki yol da yanlılığı gidermez ve ortalamayla doldurma dağılımı yapay biçimde daraltır.
- Meyer, Mok ile Sullivan, hane anketlerinde yanıtsızlık, doldurma ve ölçüm hatasının son otuz yılda arttığını; Bollinger ile Hirsch, doldurma modelinde yer almayan özelliklerin, örneğin sendika üyeliğinin, etkilerinin doldurulmuş verilerde ciddi biçimde yanlı ölçüldüğünü gösterdi.
Kavram sözlüğü
| Türkçe | İngilizce | Kısa tanım |
|---|---|---|
| Veri temizleme | Data cleaning | Veriyi analize hazırlamak için hataların, tutarsızlıkların ve eksiklerin ele alınması |
| Birleştirme anahtarı | Merge key | İki tabloyu birleştirirken satırları eşleştiren ortak sütun |
| Yinelenen kayıt | Duplicate record | Aynı gözlemin veri setinde birden çok kez yer alması |
| Eksik veri mekanizması | Missing data mechanism | Bir değerin neden eksik olduğunu anlatan süreç |
| Eksik değer doldurma | Imputation | Eksik bir değerin yerine başka bilgilerden tahmin edilen bir değerin konması |
| Doğrulama denetimi | Validation check | Verinin bilinen kurallara uyup uymadığının betik içinde otomatik sınanması |
Kendini sına
- (Çıktı 1) Eksik veri mekanizmasının üç biçimini birer örnekle açıkla. Hangisinde eksik değerleri silmek ortalamayı sistematik olarak saptırmaz?
- (Çıktı 2) Bir anket veri setinde bazı kazanç değerleri kurum tarafından doldurulmuşsa, bir araştırmacı bu değerleri gerçek gözlemler gibi kullanırsa ne olabilir? Bollinger ile Hirsch'in bulgusunu kullanarak açıkla.
- (Çıktı 3) Noktalı virgülle ayrılmış, ondalıkları virgülle ve binlikleri noktayla yazılmış, eksik değerleri tireyle gösterilmiş bir dosyayı iki dilde okuyan satırları yaz. Dosyayı okuduktan sonra ilk olarak neyi denetlersin?
- (Çıktı 3) İki tabloyu il adıyla birleştirdin ve 81 ilden 76'sı eşleşti. Eşleşmeyen beş ili nasıl bulursun ve eşleşmemenin olası nedenleri nelerdir? Sağ tabloda bir il iki kez geçiyorsa birleştirmenin satır sayısı nasıl etkilenir?
- (Çıktı 4) Bir gelir anketinde en yüksek gelirli hanelerin gelirlerini bildirmediği biliniyor. Bir araştırmacı eksik gelirleri silip ortalamayı, bir başkası eksikleri ortalamayla doldurup eşitsizliği hesaplıyor. Her iki yaklaşımın sonucunu nasıl etkileyeceğini açıkla.
- (Çıktı 4) Bir stajyer, «Veri setimdeki aykırı değerleri kendiliğinden silen bir betik yazdım; artık temizlikle uğraşmıyorum» diyor. Bu yaklaşımın risklerini ve yerine ne önerdiğini açıkla.
Cevaplar
- Eksiklik tamamen rastgele olabilir: örneğin bir anket formunun bir kısmı postada kaybolmuşsa, eksik olanlar ile olmayanlar arasında sistematik bir fark yoktur. Gözlenen başka özelliklerle ilişkili olabilir: örneğin yaşlılar bir soruyu daha sık yanıtsız bırakıyorsa, eksiklik yaşa bağlıdır. Ya da eksik değerin kendisiyle ilişkili olabilir: örneğin yüksek gelirliler gelirlerini daha sık bildirmiyorsa. Eksik değerleri silmek, yalnızca eksiklik tamamen rastgele olduğunda ortalamayı sistematik olarak saptırmaz; öbür durumlarda silinenler, kalanlardan sistematik olarak farklıdır.
- Doldurulan değerler gerçek gözlemler değil, bir modelin ya da bağışçı eşleştirmesinin ürettiği tahminlerdir. Bollinger ile Hirsch, doldurmada eşleştirme ölçütü olarak kullanılmayan özellikleri, örneğin sendika üyeliğini, içeren regresyonların ciddi biçimde yanlı olduğunu gösterdi: doldurma modeli sendika üyeliğine bakmadığı için, doldurulan kayıtlarda sendikalı ile sendikasız işçiler arasındaki fark sıfır sayılır ve ölçülen fark gerçek farktan küçük çıkar. Araştırmacı, hangi değerlerin doldurulduğunu gösteren işaret sütunlarını kullanmalı; doldurulmuş kayıtları dışarıda bırakıp yeniden ağırlıklandırmak bir çözümdür.
- Python'da pd.read_csv(dosya, sep=";", decimal=",", thousands=".", na_values=["-"]), R'da read.csv2(dosya, na.strings = "-") kullanılır. Dosyayı okuduktan sonra ilk olarak sütunların veri tipleri denetlenir: sayı olması gereken sütunlar sayı olarak mı, yoksa metin olarak mı okunmuş? Ardından özet istatistiklere, en küçük ve en büyük değerlere ve eksik değer sayısına bakılır.
- Birleştirmede pandas'ta indicator=True seçeneği kullanılır ve eşleşme durumu sütununda yalnızca sol tabloda kalan satırlar süzülür; R'da all.x = TRUE ile birleştirip sağ tablodan gelen sütunda eksik değer taşıyan satırlar listelenir. Olası nedenler, büyük ve küçük harf farkları, Türkçe karakterlerin farklı dönüştürülmesi, baştaki ve sondaki boşluklar, farklı yazımlar ya da eski ve yeni il adlarıdır. Sağ tabloda bir il iki kez geçiyorsa, birleştirme o ilin satırını ikiye çoğaltır ve satır sayısı artar; bu yüzden birleştirmeden önce sağ tablodaki anahtarın yinelenmediği denetlenmelidir.
- Eksik gelirleri silen araştırmacı, yalnızca daha düşük gelirli hanelerin kaldığı bir örneklemle çalışır ve ortalama geliri olduğundan düşük bulur. Eksikleri ortalamayla dolduran araştırmacı ise ortalamadaki yanlılığı gidermez, çünkü doldurma değeri bildirilen düşük gelirlerin ortalamasıdır; üstelik bütün eksiklere aynı değeri atadığı için dağılımı yapay biçimde daraltır ve eşitsizliği olduğundan çok daha düşük ölçer. Eksiklik değerin kendisiyle ilişkili olduğunda, iki yaklaşım da yanlılığı gidermez; idari verilerle karşılaştırma ya da yanlılığın yönünü açıkça belirtmek gerekir.
- Aykırı değerleri kendiliğinden silmek, gerçek ama olağandışı gözlemleri de silebilir: bir kriz yılının işsizliği, bir hiperenflasyon ayının fiyat artışı ya da bir sektörün çöküşü, verinin en önemli bilgilerini taşıyabilir. Ayrıca silme kararı kaydedilmezse, sonucun neden değiştiği anlaşılamaz. Bunun yerine aykırı değerler listelenmeli, her birinin nedeni araştırılmalı: bir biçim hatasıysa düzeltilmeli, gerçek bir gözlemse korunmalı ve analizde ayrıca ele alınmalıdır. Karar, betikte bir yorumla birlikte kaydedilmelidir.
İleri okuma
- Bruce D. Meyer, Wallace K. C. Mok, James X. Sullivan (2015). «Household Surveys in Crisis». Journal of Economic Perspectives 29(4). Anket verilerindeki yanıtsızlık, doldurma ve ölçüm hatası.
- Christopher R. Bollinger, Barry T. Hirsch (2006). «Match Bias from Earnings Imputation in the Current Population Survey: The Case of Imperfect Matching». Journal of Labor Economics 24(3). Doldurmanın yol açtığı eşleşme yanlılığı.
- Simon Johnson, William Larson, Chris Papageorgiou, Arvind Subramanian (2013). «Is Newer Better? Penn World Table Revisions and Their Impact on Growth Estimates». Journal of Monetary Economics 60(2). Veri sürümlerinin büyüme tahminlerine etkisi.
- Roderick J. A. Little, Donald B. Rubin (2019, 3. baskı). Statistical Analysis with Missing Data. Wiley. Eksik veri mekanizmaları ve çoklu doldurmanın temel başvuru kitabı.
Sonraki derse köprü
Temizlenmiş bir veri seti, analizin başlangıcıdır. Ama temizliğin kendisi de çoğu zaman bir grafikle başlar: aykırı bir değeri, bir kırılmayı ya da eksik bir dönemi, bir tablodan çok bir çizgi grafiğinde fark ederiz. Sıradaki ders görselleştirmeyi ele alıyor. Her iki dilin temel grafik kütüphaneleriyle zaman serisi, dağılım ve karşılaştırma grafikleri nasıl çizilir? Eksen seçimi, ölçek ve renk, bir grafiğin okuyucuya söylediğini nasıl değiştirir ve yanıltıcı grafiklerden nasıl kaçınılır?