Yazılarımız

Cadsay

MATLAB'DE VERİ TEMİZLEME VE ÖN İŞLEME YAPMAK

MATLAB ekranında ham CSV verisinin tabloya yüklenmesi eksik değer ve aykırı nokta tespiti ile temizleme adımlarının görünümü

Bir rüzgâr ölçüm istasyonundan üç ay boyunca on dakika aralıkla veri geldi. Dosya 13 binin üzerinde satır içeriyor; bazı saatlerde anemometre donmuş, NaN basmış; bazı satırlarda hız 380 km/h gibi fiziksel olarak mümkün olmayan değerler var; sıcaklık sütununda tarih biçimi tutarsız; üstelik bir günde saat dilimi atlamalı kaymış. Modele veya raporlama sayfasına bu hâliyle giren veri yanlış kararlar doğurur. Veri biliminin yarısı analizdir, diğer yarısı veriyi analize hazır hâle getirme disiplinidir.

MATLAB bu temizleme hattını table ve timetable veri tipleri etrafında kurar. İçe aktarma readtable ve readtimetable, eksik veri için ismissing fillmissing rmmissing, aykırı değer için isoutlier filloutliers rmoutliers, gürültü için smoothdata, ölçek için normalize ve rescale komutları aynı söz dizimi kurgusuyla art arda dizilir. Resmi referans için veri ön işleme dokümantasyonu birinci başvuru kaynağıdır.

HAM VERİ HANGİ TİPE ALINMALI?

Temizleme akışının kalitesi veri ham hâlinde içe aktarılırken belirlenir. CSV'yi numerik matrise (csvread, dlmread) okumak eski alışkanlık; modern MATLAB sütun adı, tip karması ve eksik değer sezgisi olan readtable veya zaman damgalı veride readtimetable üzerinden çalışır. Komut tek satır olabilir, ama altta neyin döndüğü farkın yarısıdır.

  • T = readtable('olcum.csv'); — sütun başlıklarını otomatik isim olarak alır, tipleri sezer (datetime, double, string)
  • TT = readtimetable('saha.csv'); — ilk datetime sütununu satır zamanı yapar, geri kalanı değişken olarak tutar
  • T = readtable('olcum.xlsx', 'Sheet', 'Mayis'); — Excel sayfası seçimi
  • opts = detectImportOptions('olcum.csv'); opts.VariableTypes(3) = {'double'}; — tip otomatik sezilmediğinde elle dayatma
  • TT = table2timetable(T, 'RowTimes', 'zaman'); — elde table varsa zaman sütununu satır zamanına yükseltme

Timetable, zaman serisinde sade table'a kıyasla net üstünlük sağlar. retime(TT, 'hourly', 'mean') tek satırda saatlik ortalamaya iner; on dakikalık örneklemden saatlik raporlamaya geçiş elle for döngüsü yazmadan biter. Türk meteoroloji genel müdürlüğü, deprem ölçüm istasyonları ve elektrik dağıtım şirketlerinin SCADA çıktıları gibi zaman damgalı veri setleriyle çalışırken timetable ön işleme süresini düşürür.

EKSİK VERİ NASIL TESPİT EDİLİR VE NE YAPILIR?

Eksik değer iki kaynaktan gelir: cihazın okumayı atlaması (sensör donması, ağ kesintisi) ve içe aktarma sırasında tip uyumsuzluğunun NaN'a düşmesi. İlk adım her zaman tespittir; körü körüne doldurmak yapay desen üretir.

  • ismissing(T) — mantıksal matris döner, her hücre eksik mi gösterir
  • sum(ismissing(T)) — sütun bazlı eksik sayısı
  • standardizeMissing(T, -999) — "-999" gibi koda gömülü eksik göstergesini NaN'a çevirir
  • rmmissing(T) — eksik içeren satırı tamamen siler; veri yeterince büyükse en güvenli seçenek
  • fillmissing(T, 'linear') — lineer interpolasyonla doldurur; zaman serisinde doğal
  • fillmissing(T, 'previous') — bir önceki değerle doldurur; sayaç verisi gibi monotonik seri için uygun
  • fillmissing(T, 'movmean', 5) — beş elemanlı hareketli ortalama ile doldurur; gürültülü ölçümde yumuşatır
  • fillmissing(T, 'spline') — kübik spline; düz eğri varsayımı yapılan bilimsel veride uygundur

Karar mantığı veri yoğunluğuna bağlıdır. %5 altı eksik varsa interpolasyon güvenlidir; %20 üstü eksiklik o sütunun analize sokulup sokulmayacağını yeniden değerlendirtir. Türk elektrik iletim sistemi operatörü tarafından yayımlanan saatlik tüketim serileri gibi yüksek frekanslı veride 'linear' default seçim olur; gece saatlerindeki düz platolarda 'previous' daha yapısaldır. Bir kategorik sütunda (örneğin trafo arıza nedeni) sayısal interpolasyon anlamsızdır; fillmissing(T, 'constant', "BILINMIYOR") ya da modu hesaplayıp manuel atama tercih edilir.

AYKIRI DEĞER NASIL TESPİT EDİLİR?

Aykırı değer (outlier) seçimi tek bir "doğru yöntem" içermez; verinin dağılımına göre yöntem değişir. isoutlier ve rmoutliers aynı yöntem listesini paylaşır; filloutliers aykırıyı silmek yerine başka bir değerle değiştirmek istendiğinde kullanılır.

YöntemMantıkVarsayılan eşikNe zaman uygun
median (varsayılan)Medyandan ölçekli MAD uzaklığı3 MADNormal olmayan dağılım, asimetrik veri
meanOrtalamadan std uzaklığı3 stdYaklaşık normal dağılım
quartilesIQR tabanlı (Tukey kuralı)1.5 IQRÇarpık dağılım, kutu grafiği klasiği
grubbsTek değişkenli hipotez testi0.05 anlamlılıkTek aykırı şüphesi
gesdGenelleştirilmiş Grubbs, iteratif0.05Birden çok aykırı şüphesi
movmedian / movmeanPencereli lokal yöntem3 (ölçekli)Trendi olan zaman serisi

Pencereli yöntem (movmedian) zaman serisindeki gerçek trendi aykırı sanıp atmaktan kurtarır. Bir endüstriyel kompresörün sıcaklık eğrisi gün içinde 30 dereceden 70 dereceye yükseliyorsa global median yöntemi gün ortasındaki yüksek değerleri aykırı işaretler — yanlış. rmoutliers(x, 'movmedian', hours(2)) son iki saatin medyanına bakar, yalnızca lokal sıçramaları yakalar.

Sık sorulan soru: aykırıyı silmek mi kırpmak mı? Veri seti büyükse silmek (rmoutliers) tercih edilir; küçük örneklemde her satır değerli olduğundan kırpma veya doldurma (filloutliers(x, 'clip') veya filloutliers(x, 'linear')) daha akılcıdır. Türk üretim sektöründe kalite kontrol istasyonundan gelen ölçümlerde her parça önemli olduğundan kırpma yaygındır; yüksek frekanslı sensör verisinde ise silme tercih edilir.

MATLAB ekranında bir sensör zaman serisinin ham hâli ve isoutlier ile işaretlenmiş aykırı noktaların kırpılmış sürümünün karşılaştırma görünümü

GÜRÜLTÜ AZALTMA — SMOOTHDATA VE PENCERE SEÇİMİ

Sensör verisi neredeyse her zaman gürültü taşır. Gürültü yalnızca aykırı değer değil; sürekli düşük genlikli salınım analiz ve görselleştirmede sinyali bulanıklaştırır. smoothdata bu işin tek satırlık komut hâlidir ve birden fazla yöntemi destekler.

  • smoothdata(x, 'movmean', 10) — on elemanlı hareketli ortalama; en hızlı, yumuşatma agresif
  • smoothdata(x, 'movmedian', 10) — hareketli medyan; aykırıya dayanıklı
  • smoothdata(x, 'gaussian', 15) — Gauss çekirdeği, doğal eğri
  • smoothdata(x, 'lowess', 30) — yerel ağırlıklı regresyon; trend takibi iyi
  • smoothdata(x, 'sgolay', 7) — Savitzky-Golay; sinyalin türev özelliklerini koruma istendiğinde

Pencere genişliği seçimi yumuşatmanın derecesini belirler. Çok dar pencere gürültüyü geçirir; çok geniş pencere gerçek sinyal değişimini de yutar. Pratik kural: ilgilenilen olayın süresinden kısa pencere seç. Akıllı şehir projelerinde trafik akış sensörlerinden gelen saniye seviyesi veriden dakika seviyesi rapor üretirken 60 elemanlı movmean, dakika içindeki gürültüyü temizleyip dakika trendlerini korur.

Bir başka pratik karar: yumuşatmadan önce mi aykırı temizlenir, sonra mı? Sıralama önemlidir. Önce rmoutliers veya filloutliers ile uçları kes, sonra smoothdata ile yumuşat. Aksi sırayla aykırı değer pencereye yayılır ve civarındaki temiz değerleri de bozar.

ÖLÇEK DÖNÜŞÜMÜ — NORMALIZE VE RESCALE

Birden fazla değişken aynı modele girecekse ölçek farkı sonuçları kirletir. Bir basınç sütunu 100 ile 1000 arasında, sıcaklık -20 ile 50 arasında değer alıyorsa, mesafe tabanlı analizler (kümeleme, regresyon, sinir ağı) basınca aşırı ağırlık verir. Ölçek dönüşümü bu eşitsizliği giderir.

  • normalize(x) — varsayılan z-score: ortalama 0, std 1 yapar
  • normalize(x, 'range') — [0, 1] aralığına çeker, min-max yöntemi
  • normalize(x, 'range', [-1 1]) — istenen aralığa çeker
  • normalize(x, 'center') — ortalamayı sıfırlar, ölçek değişmez
  • normalize(x, 'scale') — std=1 yapar, ortalama değişmez
  • normalize(x, 'medianiqr') — medyan/IQR robust standardizasyon, aykırıya dayanıklı
  • rescale(x, 0, 100) — ham min-max dönüşümü, hedef aralık parametre

Z-score klasik istatistik standardıdır ve makine öğrenmesi pipeline'ının çoğunda varsayılan tercihtir. Veri ağır asimetrik veya yoğun aykırıya sahipse 'medianiqr' daha kararlıdır; ortalama ve std aykırıdan etkilenirken medyan ve IQR etkilenmez. Türk finans sektöründe BIST hisse fiyat serileri gibi log-normal tabanlı verilerde önce log(x) dönüşümü uygulanır, ardından z-score; bu sıra dağılımı simetrikleştirir.

BÜTÜN HATTI BİR SCRIPT'TE BAĞLAMAK

Tek tek komutlar öğrenilince sıra hattı bir araya getirmeye gelir. Aşağıdaki sekiz adımlık iskelet, bir saha veri setini ham CSV'den temiz tabloya götürür ve aynı kodu her yeni dosya geldiğinde tekrar koşturur.

  1. TT = readtimetable('saha.csv'); — zaman damgalı içe aktarma
  2. TT0 = TT; — yedek; sorun çıkarsa karşılaştırma için
  3. TT = standardizeMissing(TT, -999); — cihaza özgü hata kodlarını NaN'a çevir
  4. fprintf('Eksik: %d\n', sum(sum(ismissing(TT)))); — sağlık göstergesi
  5. TT = rmoutliers(TT, 'movmedian', hours(2)); — lokal aykırı temizliği
  6. TT = fillmissing(TT, 'linear'); — boşluk doldurma
  7. TT.basinc = smoothdata(TT.basinc, 'gaussian', 15); — gürültü yumuşatma
  8. TT{:, 2:end} = normalize(TT{:, 2:end}); — sayısal sütunları z-score

Bu sekiz satır, her hafta gelen yeni dosya için tek bir function'a sarılır. function TTclean = veritemizle(yol) imzasıyla başlar, içeride yukarıdaki adımlar koşar, çıktıda hem temiz timetable döner hem de bir özet raporu (eksik sayısı, atılan satır sayısı, ölçek istatistikleri) disp ile yazılır. Bir teknik ekipte saatler süren manuel Excel temizliğinin yerini iki dakikalık veritemizle('yenisaha.csv') çağrısı alır.

GÖRSEL DOĞRULAMA — TEMİZLİĞİN İSPATI

Sayı tablosu doğru görünebilir ama görsel kontrolü atlanan akıştan herkes pişman olur. Temizleme adımlarının her birini öncesi-sonrası grafik ile doğrulamak ekstra zaman değil sigortadır.

  • plot(TT0.zaman, TT0.sicaklik); hold on; plot(TT.zaman, TT.sicaklik); — ham ve temiz üst üste
  • histogram(TT.basinc) — dağılımı görmek; normalize sonrası simetrik olmalı
  • boxplot(TT{:, 2:end}) — sütunlar arası ölçek karşılaştırması
  • stackedplot(TT) — timetable için çok değişkenli zaman serisi görünümü; tek komut
  • heatmap(corrcoef(TT{:, 2:end})) — sütunlar arası korelasyonun ön kontrolü

stackedplot özellikle çoklu değişken bulunan timetable'larda gözle inceleme için yapılmış komuttur; her sütun ayrı eksende ama aynı zaman çizgisinde gösterilir. Bir HVAC sisteminin sıcaklık, nem, basınç ve güç tüketimi sütunlarının saatlik davranışını tek bir komutla yan yana görmek, manuel subplot kurmaktan çok daha hızlıdır.

MATLAB stackedplot çıktısında bir zaman serisinin sıcaklık nem ve basınç sütunlarının temizlik öncesi ve sonrası karşılaştırma görünümü

HANGİ TUZAKLARA SIK DÜŞÜLÜR?

Temizleme akışını ilk kuran ekibin sık takıldığı altı nokta vardır. Bunları baştan bilmek günler değil saatler kazandırır.

  • NaN ile boş dize karışıklığı: readtable bir hücreyi boş okuduğunda string sütunda "", sayısal sütunda NaN bırakır. ismissing ikisini de yakalar ama manuel karşılaştırma yapılırken farkedilmez. Karşılaştırmaları ismissing ile yap.
  • Yanlış yönde aykırı temizleme: rmoutliers(T) tabloda her sütun için ayrı eşik hesaplar ama satırı bütün siler. Bir sütundaki tek aykırı yüzünden o satırın tüm sütun değerleri kaybolur. Karar bilinçli verilmeli.
  • Saat dilimi tutarsızlığı: Cihaz UTC, rapor TSİ (UTC+3) kabul ediyorsa zaman damgaları kayar. TT.Properties.RowTimes.TimeZone = 'Europe/Istanbul'; ile açıkça ayarla.
  • Tip karması: Bir sütunda sayı ve metin karışmışsa detectImportOptions sezgi olarak cell'e düşer. opts.VariableTypes ile elle dayatmak ön işleme zincirini stabil kılar.
  • Normalize'ı eğitim/test ayrımından önce uygulama: Makine öğrenmesi için veri ayrılacaksa normalize parametreleri (mean, std) yalnızca eğitim setinden hesaplanır, sonra teste uygulanır. [~, C, S] = normalize(X_train); ardından X_test_n = normalize(X_test, 'center', C, 'scale', S);
  • Yedek almamak: backup = T; tek satırdır, geri dönüş kolaylığı sağlar. Pahalı bir adımı geri almak için tüm script'i tekrar koşturmaktan iyidir.

Veri ön işleme bir kez yazılıp kenara konacak bir iş değil, sürekli bakım gerektiren bir disiplindir. Sahaya sürülen cihaz değişir, ölçüm aralığı güncellenir, yeni bir sütun eklenir — temizleme function'ı sürüm kontrolü altında tutulur, her değişiklik commit edilir. Mühendislik veya analitik departmanında bu hattı sağlam kuran ekipler için uygulamalı matlab eğitimi programları teori ile saha pratiğini birleştiren bir başlangıç olur; tablo, timetable, ön işleme zinciri ve görsel doğrulama adımları gerçek veri setleri üzerinden uçtan uca kurgulanır.

Veri biliminin değeri sonuçta bir karara dönüşür: bir cihaz değiştirilecek mi, bir tarife güncellenecek mi, bir parametre revize edilecek mi? Bu kararın güveni temiz veriden gelir. MATLAB'in readtable ile başlayıp normalize ile biten kısa söz dizimi, kararı hızlandırmak için tasarlanmış bir disiplin sunar — kullanan ekip için doğru sıra bir kez yerleşti mi gerisi tekrar eden komutlar dizisidir.

 CADSAY