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:
=== 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 #
| Fitur | Perilaku |
|---|---|
| Data sintetis deterministik | 730 hari suhu dari rumus tetap tanpa angka acak; dua eksekusi menghasilkan CSV identik bit-per-bit |
| Masalah terinjeksi | 8 hari NaN dan 3 outlier tak fisik (-5, 60, 45) pada posisi tetap yang diketahui |
| I/O portabel | Guard writematrix/readmatrix untuk MATLAB dan dlmwrite/dlmread untuk Octave, round-trip konsisten per engine |
| Validasi struktural | berkas hilang, jumlah kolom salah, dan hari melompat semuanya ditolak dengan pesan yang menyebut perbaikannya |
| Deteksi dua lapis | domain fisik 10-40 derajat dan z-score > 3, lengkap dengan mask, posisi, dan ringkasan |
| Pembersihan tanpa baris hilang | 11 titik diganti interpolasi linear; statistik sebelum/sesudah dibandingkan sebagai bukti |
| Tiga visualisasi headless | deret + MA 30 hari, profil musiman 365 hari, perbandingan tahun 1 vs 2; semua disimpan sebagai PNG |
| Tren dan musiman terkuantifikasi | slope derajat/tahun, delta rata-rata antar tahun, indeks 12 bulan, amplitudo musiman |
| Laporan otomatis | laporan_cuaca.txt merangkum masalah data, pembersihan, tren, dan musiman |
| Test terstruktur | tests/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
interp1tanpa 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/:
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 menyeluruhCara 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:
>> 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:
>> 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.txtFolder 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:
- Bagian 1: Import Data Cuaca — rancangan data sintetis, penulisan CSV, pembacaan dengan guard, dan validasi struktural.
- Bagian 2: Pembersihan Data — deteksi NaN dan outlier dua lapis, interpolasi, serta verifikasi statistik sebelum/sesudah.
- Bagian 3: Visualisasi Deret Waktu — moving average 30 hari, profil musiman, dan perbandingan tahunan dalam tiga PNG.
- 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.
Baca data cuaca harian dari CSV dan verifikasi kelengkapan deret waktunya.
Buka → # Bagian 2: Pembersihan DataDeteksi hari hilang dan outlier tak fisik lalu interpolasi ke deret waktu lengkap.
Buka → # Bagian 3: Visualisasi Deret WaktuGambar deret harian, moving average 30 hari, dan profil musiman tahunan.
Buka → # Bagian 4: Analisis TrenHitung tren tahunan, indeks musiman bulanan, dan laporkan delta rata-rata antar tahun.
Buka →