Data cuaca adalah contoh deret waktu yang paling akrab: teratur, bermusim, dan kadang berlubang. Proyek ini menganalisis deret waktu suhu dari data sintetis yang realistis: mengimpor data harian, membersihkan nilai hilang, memvisualisasikan tren jangka panjang, lalu mengkuantifikasi pola musiman dan tren tahunan.

Alur tahapannya:

  • import data cuaca — membaca CSV harian dan mengenali struktur deret waktu,
  • pembersihan data — menangani hari hilang dan outlier tak fisik,
  • visualisasi deret waktu — kurva harian, moving average, dan pola musiman,
  • analisis tren — tren tahunan, indeks musiman bulanan, dan delta antar tahun.

Seluruh kode sumber setiap tahap tersedia pada bagian Berkas Sumber di bawah halaman setiap bagian.

Perilaku yang Diharapkan #

Sebelum menulis kode, mari kita lihat perilaku akhir program. Satu panggilan jalankanAnalisisCuaca('hasil_cuaca') menjalankan keenam tahap — membuat data sintetis 730 hari beserta masalahnya, memuat kembali dari CSV, mendeteksi 8 hari hilang dan 3 outlier, membersihkan lewat interpolasi, menggambar tiga figur, dan menganalisis tren — lalu menutupnya dengan laporan teks. Transkrip berikut adalah hasil nyata dari program final:

text
=== Analisis Deret Waktu Cuaca ===
[1/6] Membuat data sintetis 730 hari...
Data cuaca sintetis: 730 hari ditulis ke hasil_cuaca/data_cuaca.csv
Masalah terinjeksi   : 8 hari NaN, 3 outlier tak fisik
[2/6] Memuat kembali dari CSV...
Berkas dimuat: hasil_cuaca/data_cuaca.csv
Struktur valid : 730 hari, kolom hari berurutan 1..730
Pemindaian awal: 8 nilai NaN, 3 outlier tak fisik
[3/6] Mendeteksi masalah data...
=== Deteksi Masalah Data ===
Hari hilang (NaN)         : 8 hari, posisi [47 130 262 349 478 555 640 722]
Outlier domain fisik       : 3 hari, posisi [88 365 583]
Outlier statistik (|z|>3)  : 3 hari, posisi [88 365 583]
Statistik data sah (n=722)  : mean 27.3939, std 4.6265
[4/6] Membersihkan deret...
=== Pembersihan Deret ===
Titik diganti : 11 (8 NaN + 3 outlier fisik)
   hari    nilai lama   nilai baru
     47          NaN      22.5822
     88           -5      26.6168
    130          NaN      30.7326
    262          NaN      28.6019
    349          NaN      21.4473
    365           60      21.5811
    478          NaN      29.8110
    555          NaN      33.8938
    583           45      32.6529
    640          NaN      27.5908
    722          NaN      22.0380
Sebelum: mean 27.3939, min -5.0000, max 60.0000 (722 nilai sah)
Sesudah: mean 27.3643, min 20.6081, max 34.0420 (730 nilai)
[5/6] Membuat visualisasi...
=== Visualisasi Deret Waktu ===
Gambar 1 disimpan: hasil_cuaca/deret_harian.png
Gambar 2 disimpan: hasil_cuaca/profil_musiman.png
Gambar 3 disimpan: hasil_cuaca/perbandingan_tahunan.png
Amplitudo profil musiman: 12.96 derajat (max 33.81, min 20.85)
[6/6] Menganalisis tren dan musiman...
=== Analisis Tren ===
Tren linear: +0.3612 derajat/tahun (slope 0.000988845 derajat/hari)
Rata-rata tahun 1: 27.1841 | MA30: min 21.3027, max 33.1383, mean 27.6895
Rata-rata tahun 2: 27.5445 | MA30: min 21.6564, max 33.5094, mean 28.0498
Delta rata-rata tahun 2 - tahun 1: +0.3604 derajat
Indeks musiman bulanan (rata-rata suhu, derajat):
   Bulan  1:  21.50
   Bulan  2:  23.04
   Bulan  3:  25.78
   Bulan  4:  28.88
   Bulan  5:  31.54
   Bulan  6:  33.12
   Bulan  7:  33.11
   Bulan  8:  31.54
   Bulan  9:  28.94
   Bulan 10:  25.88
   Bulan  11:  23.24
   Bulan  12:  21.82
Laporan ditulis : hasil_cuaca/laporan_cuaca.txt
Analisis selesai.

Fitur yang Dibangun #

FiturPerilaku
Data sintetis deterministik730 hari suhu dari rumus tetap tanpa angka acak; dua eksekusi menghasilkan CSV identik bit-per-bit
Masalah terinjeksi8 hari NaN dan 3 outlier tak fisik (-5, 60, 45) pada posisi tetap yang diketahui
I/O portabelGuard writematrix/readmatrix untuk MATLAB dan dlmwrite/dlmread untuk Octave, round-trip konsisten per engine
Validasi strukturalberkas hilang, jumlah kolom salah, dan hari melompat semuanya ditolak dengan pesan yang menyebut perbaikannya
Deteksi dua lapisdomain fisik 10-40 derajat dan z-score > 3, lengkap dengan mask, posisi, dan ringkasan
Pembersihan tanpa baris hilang11 titik diganti interpolasi linear; statistik sebelum/sesudah dibandingkan sebagai bukti
Tiga visualisasi headlessderet + MA 30 hari, profil musiman 365 hari, perbandingan tahun 1 vs 2; semua disimpan sebagai PNG
Tren dan musiman terkuantifikasislope derajat/tahun, delta rata-rata antar tahun, indeks 12 bulan, amplitudo musiman
Laporan otomatislaporan_cuaca.txt merangkum masalah data, pembersihan, tren, dan musiman
Test terstrukturtests/uji_cuaca.m — sembilan kasus assert; seluruh artefak uji ditulis ke /tmp

Tujuan Pembelajaran #

  • Merancang data sintetis deterministik yang meniru struktur data cuaca nyata.
  • Menulis dan membaca CSV dengan guard fungsi agar kode berjalan di MATLAB maupun Octave.
  • Mendeteksi nilai hilang dan outlier dengan dua lapis pemeriksaan: domain fisik dan statistik.
  • Memperbaiki deret lewat interpolasi interp1 tanpa mengubah panjang deret waktu.
  • Membangun moving average, profil musiman hari-dalam-tahun, dan tren linear polyfit.
  • Mengorkestrasi pipeline multi-fungsi dan menghasilkan laporan otomatis ke berkas teks.

Prasyarat #

Materi berikut perlu dikuasai sebelum memulai proyek ini:

  • Membaca File CSV dan Menulis File Data dari section Import dan Export Data
  • Missing Values dan NaN dan Logical Indexing dari section Array dan Matriks
  • For Loop dari section Struktur Kontrol
  • Membuat Function dan Local Functions dari section Fungsi
  • Structure Array dari section Struktur Data MATLAB
  • Line Plot, Subplot dan Layout, Labels, Title, dan Legend, dan Export Figures dari section Visualisasi Data
  • Interpolation dan Curve Fitting dari section Matematika dan Komputasi Numerik
  • Statistik Deskriptif dan Time Series Analysis dari section Statistik dan Analisis Data
  • Assertions dan Unit Testing dari section Debugging dan Pengujian

Struktur Proyek #

Kode dipisahkan menjadi tiga lapisan: orkestrator, fungsi-fungsi di src/, dan berkas uji di tests/:

text
analisis-deret-waktu-cuaca/
├── _index.md
├── bagian/
│   ├── import-data-cuaca/
│   │   └── index.md
│   ├── pembersihan-data/
│   │   └── index.md
│   ├── visualisasi-deret-waktu/
│   │   └── index.md
│   └── analisis-tren/
│       └── index.md
├── src/
│   ├── buatDataCuaca.m           - data sintetis deterministik + injeksi masalah
│   ├── muatDataCuaca.m           - baca CSV dengan guard readmatrix/dlmread
│   ├── deteksiMasalah.m          - mask NaN, outlier fisik, outlier z-score
│   ├── bersihkanDeret.m          - interpolasi titik bermasalah
│   ├── visualisasiDeret.m        - tiga figur PNG + MA 30 hari
│   ├── analisisTren.m            - slope tahunan, MA per tahun, indeks bulanan
│   └── jalankanAnalisisCuaca.m   - orkestrator end-to-end + laporan
└── tests/
    └── uji_cuaca.m               - sembilan kasus uji menyeluruh

Cara Menjalankan #

Buka Command Window pada folder proyek, daftarkan folder src/ ke path, lalu panggil orkestrator. Seluruh keluaran — CSV, tiga PNG, dan laporan — terkumpul dalam satu folder yang kita tentukan:

text
>> addpath('src')
>> hasil = jalankanAnalisisCuaca('hasil_cuaca');

Keluaran lengkapnya adalah transkrip pada bagian Perilaku yang Diharapkan di atas. Setelah selesai, struct hasil membawa seluruh hasil antara sehingga bisa diselidiki tanpa mengulang pipeline:

text
>> fprintf('tren per tahun : %+.4f derajat\n', hasil.tren.slopeTahun);
tren per tahun : +0.3612 derajat
>> fprintf('bulan terpanas : %d\n', find(hasil.tren.rataBulanan == max(hasil.tren.rataBulanan)));
bulan terpanas : 6
>> fprintf('laporan        : %s\n', hasil.laporan);
laporan        : hasil_cuaca/laporan_cuaca.txt

Folder hasil_cuaca/ kini berisi lima berkas: data_cuaca.csv, deret_harian.png, profil_musiman.png, perbandingan_tahunan.png, dan laporan_cuaca.txt. Tanpa argumen, jalankanAnalisisCuaca() menulis ke folder kerja saat ini. Setiap fungsi juga bisa dipanggil sendiri — misalnya deteksiMasalah(suhu) untuk memeriksa deret lain. Untuk memastikan semuanya masih sehat setelah Anda bereksperimen, jalankan berkas uji dari folder tests/: uji_cuaca memeriksa sembilan kasus dan berakhir dengan error bila ada yang gagal.

Tahapan Pengerjaan #

Proyek dikerjakan dalam empat bagian berurutan. Setiap bagian menghasilkan fungsi yang dapat dijalankan penuh pada tahapnya:

  1. Bagian 1: Import Data Cuaca — rancangan data sintetis, penulisan CSV, pembacaan dengan guard, dan validasi struktural.
  2. Bagian 2: Pembersihan Data — deteksi NaN dan outlier dua lapis, interpolasi, serta verifikasi statistik sebelum/sesudah.
  3. Bagian 3: Visualisasi Deret Waktu — moving average 30 hari, profil musiman, dan perbandingan tahunan dalam tiga PNG.
  4. Bagian 4: Analisis Tren — slope tahunan, indeks musiman bulanan, laporan otomatis, dan uji menyeluruh.

Mulailah dari Bagian 1 dan ikuti urutannya karena setiap bagian dibangun di atas struct dan kontrak data bagian sebelumnya.