4. ünite / 8
Gömülü veri analizi ve görselleştirme
Model kurmadan önce veriye bak: tanımlayıcı istatistik, histogram, günlük profil, korelasyon ve cihazda Welford ile sabit bellekli istatistik.
Bu ünitenin sonunda
- Bir sensör serisinin tanımlayıcı istatistiklerini hesaplayıp yorumlamak
- Histogram, günlük profil ve korelasyon matrisiyle veri hakkında hipotez kurmak
- Welford yöntemiyle cihazda diziyi saklamadan ortalama ve varyans hesaplamak
- Seri Çizici ve küçük bir OLED ekranla cihazda görselleştirme yapmak
Ders notları
Model eğitmeden önce veriye bakmak, kodu çalıştırmadan önce okumak gibidir: hataların çoğu burada yakalanır. Bu ünitede temizlenmiş sera verisine üç açıdan bakacağız ve aynı istatistiklerin bir kısmını mikrodenetleyicide hesaplayacağız.
Tanımlayıcı istatistik
- Ortalama ve σ: veri setinin merkezi ve yayılımı. Sıçramalar silinmeden hesaplanırsa tek bir 85 °C ortalamayı belirgin biçimde kaydırır; önce temizlik.
- Medyan: uç değere dayanıklı merkez. Ortalama ile medyan arasındaki büyük fark, çarpık dağılımın ya da kalmış aykırı değerin işaretidir.
- En küçük ve en büyük: sensörün fiziksel aralığıyla karşılaştır. Işık 0 ile 1023 arasında olmalı, nem %100'ü geçmemeli.
Üç bakış
- Zaman serisi ve günlük profil: her saatin ortalaması "tipik bir günü" verir. Sera sıcaklığı güneşten biraz geride kalır: ışığın tepesi 12:00'de, sıcaklığın tepesi 14:00 ile 15:00 arasındadır. Bu gecikme, sonraki ünitede gecikmeli özelliklerin neden işe yaradığının ipucudur.
- Histogram: sıcaklık sağa çarpıktır; zamanın çoğu gece ve sabah 17 ile 21 °C arasında geçer, sıcak öğleden sonralar uzun bir kuyruk oluşturur. Ortalama (21,1 °C) medyanın (20,4 °C) üstündedir. Normal dağılım varsayan bir eşik burada yanıltır.
- Korelasyon matrisi: Pearson r iki değişkenin doğrusal birlikteliğini ölçer. Sıcaklık ile nem çok güçlü negatiftir (r ≈ −0,98: ısınan havanın bağıl nemi düşer), sıcaklık ile ışık pozitiftir (r ≈ 0,71). Basınç ve su deposu mesafesi sıcaklıkla zayıf ilişkilidir.
Korelasyon nedensellik değildir ve yalnız doğrusal ilişkiyi görür. Yine de hangi sensörün tahmine yardım edeceğine dair ilk ve ucuz ipucudur.
Cihazda istatistik: Welford
Bir ESP32 günlük 144 örneği kolayca saklar, ama Uno'nun 2 KB RAM'i ya da saniyede yüz örnek alan bir titreşim sensörü için dizi saklamak lüks olur. Welford yöntemi tek geçişte, sabit bellekle ortalama ve varyans verir:
"Kareler toplamı eksi toplamın karesi" formülü float hassasiyetinde büyük sayıları çıkarırken çöker; Welford bu çıkarmayı yapmaz. Python kodu aynı döngüyü çalıştırıp NumPy ile dördüncü basamağa kadar aynı sonucu verdiğini gösterir.
Cihazda görselleştirme
Arduino Seri Çizici ad:değer çiftlerini ayrı çizgiler olarak çizer: ham ve temiz sıcaklığı ve eşiği aynı anda izlemenin en ucuz yolu. Sahada bilgisayar yoksa 128×64'lük bir SSD1306 OLED son 128 örneği bir kıvılcım çizgisi (sparkline) olarak gösterir; birlikte Welford özetini de yazdırabilirsin.
Simülasyon
Veri analizi panosu: seri, histogram, korelasyon
Temizlenmiş veriyi üç bakışla incele: zaman serisi ve günlük profil, histogram, değişkenler arası korelasyon ısı haritası. Altta Welford yöntemiyle cihaz üstünde, diziyi saklamadan hesaplanan ortalama, σ, en küçük ve en büyük değer.
| r | sıcaklık | nem | basınç | ışık | su mesafesi |
|---|---|---|---|---|---|
| sıcaklık | 1,00 | -0,98 | -0,11 | 0,71 | -0,05 |
| nem | -0,98 | 1,00 | 0,14 | -0,71 | 0,04 |
| basınç | -0,11 | 0,14 | 1,00 | -0,05 | 0,11 |
| ışık | 0,71 | -0,71 | -0,05 | 1,00 | -0,15 |
| su mesafesi | -0,05 | 0,04 | 0,11 | -0,15 | 1,00 |
Kod
struct Welford {
uint32_t n = 0;
double mean = 0, m2 = 0;
float lo = INFINITY, hi = -INFINITY;
void push(float x) {
if (isnan(x)) return; // eksik örneği atla
n++;
double d = x - mean;
mean += d / n;
m2 += d * (x - mean); // eski ve yeni ortalamayla: kararlı
lo = min(lo, x); hi = max(hi, x);
}
double var() const { return n > 1 ? m2 / (n - 1) : 0; }
};
Welford day; // 24 bayt: 144 örneklik günü RAM'de tutmaya gerek yok
void report() {
Serial.printf("ort=%.2f sigma=%.2f min=%.2f max=%.2f n=%u\n",
day.mean, sqrt(day.var()), day.lo, day.hi, day.n);
}#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 oled(128, 64, &Wire);
void plot(float raw, float clean, float limit) {
// Arduino Seri Çizici "ad:değer" çiftlerini ayrı çizgi yapar
Serial.printf("ham:%.2f temiz:%.2f esik:%.1f\n", raw, clean, limit);
}
void sparkline(const float* v, int n, float lo, float hi) {
oled.clearDisplay();
for (int i = 1; i < n; i++) { // son n örnek, 128 piksele sığar
int y0 = 63 - (v[i - 1] - lo) * 63 / (hi - lo);
int y1 = 63 - (v[i] - lo) * 63 / (hi - lo);
oled.drawLine(i - 1, y0, i, y1, SSD1306_WHITE);
}
oled.display();
}Kodu tarayıcıda çalıştırPython · NumPy · matplotlib · Pyodide
Python ve NumPy bu sayfada, tarayıcında çalışır (Pyodide). Kodu değiştirip yeniden çalıştırabilirsin; dersin veri setleri çalışma klasöründe hazır. Kod matplotlib kullanırsa grafikler çıktının altında görünür, yazdığı dosyalar (ör. egitim_gecmisi.csv) indirilebilir.
Çıktı
Çıktı burada görünecek.Kendin dene
Veri analizi panosunda önce sıcaklığın zaman serisini ve günlük profilini aç: ışığın ve sıcaklığın tepe saatlerini yaz. Histogramda kutu sayısını değiştir ve sağa çarpık kuyruğu bul. Korelasyon ısı haritasında sıcaklık ile nem, sıcaklık ile ışık değerlerini oku; hangisi negatif? Alttaki Welford özetini NumPy çıktısıyla karşılaştır. Wokwi'de ESP32 ve SSD1306 ile son 128 örneği sparkline olarak çizen kodu dene.
Sık yapılan hatalar
- Aykırı değerleri silmeden ortalama ve σ hesaplamak: tek bir 85 °C sıçraması özeti bozar.
- Korelasyonu nedensellik saymak: ışık sıcaklığı etkiler ama nemin sıcaklığı düşürdüğü söylenemez.
- Cihazda varyansı kareler toplamı formülüyle float olarak hesaplamak: büyük n'de hassasiyet kaybolur, negatif varyans bile çıkabilir.
- Histogramı tek bir kutu sayısıyla yorumlamak: çok az kutu kuyruğu ve ikinci tepeleri gizler.
- Günlük profili zaman damgası yerine satır numarasından hesaplamak: eksik satırlar saatleri kaydırır.
Yazılım mühendisliği bağlantısı
Keşifsel analiz bir kez yapılıp unutulmamalı; tekrarlanabilir bir rapor olmalıdır.
- Analizi bir betik ya da defter olarak depoda tut; aynı veri aynı grafikleri versin.
- Gözlemlerini veri varsayımı testlerine çevir: "nem 0 ile 100 arasında", "sıcaklık ile nem korelasyonu negatif". Yeni veri gelince testler kırılırsa veri değişmiştir.
- Cihazdaki Welford ile sunucudaki NumPy özetinin aynı olduğunu doğrulayan bir test, iki uç arasındaki sözleşmeyi korur.
Kendini sına
Sera verisinde sıcaklık ile bağıl nem arasındaki korelasyon için en olası işaret?
Welford yönteminin cihazdaki üstünlüğü nedir?
Sıcaklığın tepesi ışığın tepesinden yaklaşık üç saat sonra geliyor. Bu bilgi model için ne anlama gelir?
Ortalama ile medyan arasında büyük fark görüyorsun. İlk kontrol ne olmalı?
Bu üniteden sonra bitirme projesinde
- Keşifçi analiz: Histogram, günlük profil, korelasyon ısı haritası ve üç cümlelik yorum; cihaz üstü Welford istatistiği.
