Stasiun Cuaca Lokal dengan Algoritma Decision Tree


DAFTAR ISI
1. Pendahuluan
2. Kekurangan dan Ruang Pengembangan
3. Workflow Diagram(artikel sumber)
4. Percobaan
5. Hasil
6. Download File









1. Pendahuluan



gambar 1. Stasiun Cuaca Lokal (sumber: https://www.fox13news.com/news/hyper-local-weather-stations-give-real-time-data-when-seconds-count)

Perubahan kondisi cuaca yang semakin cepat dan dinamis menuntut adanya sistem pemantauan yang akurat, real-time, dan mudah diakses pada tingkat lokal. Informasi cuaca yang presisi sangat penting, terutama bagi sektor-sektor seperti pertanian, transportasi, perikanan, serta perencanaan aktivitas harian masyarakat. Namun, penggunaan data cuaca nasional sering kali kurang memadai karena cakupan wilayah yang luas dan resolusi data yang tidak selalu mencerminkan kondisi mikroklimat suatu daerah tertentu. Oleh karena itu, diperlukan solusi berbasis stasiun cuaca lokal yang mampu merekam data lingkungan secara langsung di lokasi pengamatan.

Seiring berkembangnya teknologi Internet of Things (IoT) dan sensor murah namun akurat, pembangunan stasiun cuaca lokal menjadi semakin mudah dan terjangkau. Data lingkungan yang dikumpulkan, seperti suhu, kelembapan, tekanan udara, dan curah hujan, dapat diolah untuk menghasilkan prediksi atau klasifikasi kondisi cuaca. Untuk meningkatkan kemampuan analisis data ini, algoritma kecerdasan buatan seperti Decision Tree dapat diterapkan sebagai model prediksi yang sederhana, interpretatif, dan efektif.

Algoritma Decision Tree dipilih karena keunggulannya dalam memetakan hubungan antarvariabel cuaca secara jelas melalui struktur pohon keputusan. Dengan metode ini, sistem dapat memprediksi kondisi cuaca berdasarkan pola-pola pada data sensor yang telah direkam, sekaligus memudahkan pengguna atau peneliti untuk memahami proses pengambilan keputusannya. Kombinasi antara stasiun cuaca lokal dan algoritma Decision Tree memungkinkan terciptanya sistem monitoring dan prediksi cuaca yang tidak hanya mandiri dan hemat biaya, tetapi juga relevan dengan kondisi lokal yang spesifik.

Melalui proyek dan perancangan sistem ini, diharapkan dapat dihasilkan sebuah prototipe stasiun cuaca lokal yang cerdas, mampu memberikan informasi cuaca yang lebih akurat, serta menjadi upaya perbaikan dan koreksi dari penelitian sebelumnya, sehingga hasil yang diperoleh dapat lebih sesuai dengan kondisi lapangan dan kebutuhan pengguna.

2. Kekurangan dan Ruang Pengembangan 

Sumber pengembangan pada proyek ini mengacu pada penelitian berjudul “Weather Prediction Based on Decision Tree Algorithm Using Data Mining Techniques” (Bhatkande & Hubballi, 2016) (https://www.ijarcce.com/upload/2016/may-16/IJARCCE%20114.pdf). Penelitian tersebut menjelaskan bahwa peramalan cuaca merupakan tantangan ilmiah yang penting dan dapat ditingkatkan menggunakan teknik data mining. Dalam makalah tersebut, algoritma Decision Tree diterapkan untuk mengklasifikasikan kondisi cuaca hanya berdasarkan satu fitur utama, yaitu temperatur, sehingga model yang dihasilkan memprediksi kategori seperti cuaca panas, dingin, dan salju. Meskipun sederhana, pendekatan ini menunjukkan kemampuan Decision Tree dalam melakukan klasifikasi berbasis pola temperatur. Berdasarkan penelitian tersebut, proyek ini dikembangkan lebih lanjut dengan memperluas fitur sensor dan menyesuaikannya dengan kebutuhan lokal. Akurasi yang telah didapatkan sebelumnya menggunakan konfigurasi dan fitur yang telah dijelaskan ialah  82.62%. Adapun ruang pengembangan pada kasus ini terletak pada jumlah fitur atau atribut yang dilibatkan dalam algoritma Decision Tree, dari yang sebelumnya hanya berjumlah 1 (temperatur), sekarang ditambah menjadi 5, yakni:

  • Temp3pm → temperatur pada jam 3 PM
  • Humidity3pm → kelembaban udara pada jam 3 PM
  • Pressure3pm → tekanan udara pada jam 3 PM
  • Cloud3pm → Tingkat coverage awan pada jam 3 PM
  • RainToday → Status hujan atau tidak hujan pada hari ini

3. Workflow Diagram (artikel sumber)


Gambar 2. Workflow dan Decision Tree yang Ada pada Artikel Sumber

4. Percobaan
a. Cara Kerja/Prinsip Dasar Decision Tree
Decision Tree bekerja dengan mempelajari serangkaian aturan logis yang memecah data menjadi kelompok-kelompok yang lebih kecil dan lebih homogen untuk menghasilkan suatu prediksi. Proses dimulai dari node akar (root), di mana algoritma mengevaluasi seluruh fitur yang tersedia dan memilih fitur terbaik untuk memisahkan data berdasarkan kriteria tertentu, seperti entropi atau information gain. Setiap pemisahan (split) membagi data ke dalam cabang-cabang sesuai dengan nilai ambang (threshold) atau kondisi tertentu, dan proses ini dilakukan secara rekursif pada setiap cabang. Seiring pertumbuhan pohon, data pada setiap node menjadi semakin seragam terhadap label target. Proses pembentukan pohon akan berhenti ketika kondisi penghentian terpenuhi, misalnya kedalaman maksimum pohon tercapai atau seluruh data pada suatu node memiliki kelas yang sama. Pada akhirnya, node daun (leaf) menyimpan hasil prediksi, yang umumnya ditentukan berdasarkan kelas mayoritas. Saat melakukan prediksi, data baru akan ditelusuri dari root hingga leaf dengan mengikuti aturan-aturan keputusan yang telah dipelajari, sehingga menghasilkan klasifikasi yang mudah dipahami dan diinterpretasikan.


Gambar 3. Diagram Proses Kerja Decision Tree

b. Dataset
Dataset diambil dari: https://www.kaggle.com/datasets/jsphyg/weather-dataset-rattle-package?resource=download

Gambar 3. Dataset Kondisi Cuaca dalam Format CSV


c. Kode Program
import numpy as np
from collections import Counter

# BAGIAN 1 — LOAD DATASET CSV

def load_csv(filename):
    raw = np.genfromtxt(filename, delimiter=",", dtype=str, skip_header=1)
    header = np.genfromtxt(filename, delimiter=",", dtype=str, max_rows=1)

    # Ambil kolom fitur
    col_temp = np.where(header == "Temp3pm")[0][0]
    col_humidity = np.where(header == "Humidity3pm")[0][0]
    col_pressure = np.where(header == "Pressure3pm")[0][0]
    col_cloud = np.where(header == "Cloud3pm")[0][0]
    col_rain_today = np.where(header == "RainToday")[0][0]

    # Label
    col_label = np.where(header == "RainTomorrow")[0][0]

    temp = raw[:, col_temp]
    hum = raw[:, col_humidity]
    pres = raw[:, col_pressure]
    cloud = raw[:, col_cloud]
    rain_today = raw[:, col_rain_today]
    label = raw[:, col_label]

    # Handle missing values
    for col in [temp, hum, pres, cloud]:
        col[col == "NA"] = "0"

    rain_today[rain_today == "NA"] = "No"
    label[label == "NA"] = "No"

    # Convert type
    temp = temp.astype(float)
    hum = hum.astype(float)
    pres = pres.astype(float)
    cloud = cloud.astype(float)

    rain_today = np.where(rain_today == "Yes", 1, 0)
    label = np.where(label == "Yes", 1, 0)

    # Gabungkan fitur + label
    data = np.column_stack((
        temp,
        hum,
        pres,
        cloud,
        rain_today,
        label
    ))

    return data

# BAGIAN 2 — SPLIT DATASET

def train_test_split(data, test_size=0.2, seed=42):
    np.random.seed(seed)
    np.random.shuffle(data)
    split_idx = int(len(data) * (1 - test_size))
    return data[:split_idx], data[split_idx:]

# BAGIAN 3 — DECISION TREE

class Node:
    def __init__(self, feature=None, threshold=None, left=None, right=None, value=None):
        self.feature = feature
        self.threshold = threshold
        self.left = left
        self.right = right
        self.value = value


def entropy(labels):
    counter = Counter(labels)
    total = len(labels)
    return -sum((c/total) * np.log2(c/total) for c in counter.values())


def split_data(data, feature, threshold):
    left = data[data[:, feature] <= threshold]
    right = data[data[:, feature] > threshold]
    return left, right

def best_split(data):
    best_gain = -1
    best_feature = None
    best_threshold = None

    parent_entropy = entropy(data[:, -1])
    n_features = data.shape[1] - 1

    for feature in range(n_features):
        values = np.unique(data[:, feature])
        for i in range(len(values) - 1):
            threshold = (values[i] + values[i+1]) / 2
            left, right = split_data(data, feature, threshold)

            if len(left) == 0 or len(right) == 0:
                continue

            total = len(data)
            gain = parent_entropy \
                - (len(left)/total) * entropy(left[:, -1]) \
                - (len(right)/total) * entropy(right[:, -1])

            if gain > best_gain:
                best_gain = gain
                best_feature = feature
                best_threshold = threshold

    return best_feature, best_threshold


def build_tree(data, depth=0, max_depth=5):
    labels = data[:, -1]

    # Hentikan jika semua label sama atau depth maksimum tercapai
    if len(set(labels)) == 1 or depth >= max_depth:
        return Node(value=Counter(labels).most_common(1)[0][0])

    feature, threshold = best_split(data)

    if feature is None:
        return Node(value=Counter(labels).most_common(1)[0][0])

    left, right = split_data(data, feature, threshold)

    if len(left) == 0 or len(right) == 0:
        return Node(value=Counter(labels).most_common(1)[0][0])

    return Node(
        feature,
        threshold,
        build_tree(left, depth + 1, max_depth),
        build_tree(right, depth + 1, max_depth)
    )

# BAGIAN 4 — PREDIKSI

def predict(tree, x):
    if tree.value is not None:
        return tree.value
    if x[tree.feature] <= tree.threshold:
        return predict(tree.left, x)
    else:
        return predict(tree.right, x)


# BAGIAN 5 — AKURASI

def accuracy(tree, test_data):
    correct = 0
    for row in test_data:
        x = row[:-1]
        y = row[-1]
        if predict(tree, x) == y:
            correct += 1
    return correct / len(test_data)


# BAGIAN 6 — MAIN PROGRAM

# Load dataset
dataset = load_csv("weatherAUS.csv")

# Split data
train_data, test_data = train_test_split(dataset, test_size=0.2)

# Train decision tree
tree = build_tree(train_data, max_depth=5)

# Hitung akurasi
acc = accuracy(tree, test_data)

print("Jumlah data training:", len(train_data))
print("Jumlah data testing:", len(test_data))
print("Akurasi Decision Tree:", round(acc * 100, 2), "%")

5. Hasil

Didapatkan hasil nilai akurasi 83,37%. Hasil ini lebih tinggi daripada hasil akurasi yang dimiliki oleh percobaan pada artikel sumber, yang hanya bernilai 82,62%. Pada akhirnya ini membuktikan bahwa metode pengembangan yang dilakukan, yakni menambah jumlah fitur atau atribut, berhasil meningkatkan kualitas hasil algoritma Decision Tree, yaitu pada akurasi. Video percobaan dapat dilihat pada:

6. Download File

Tidak ada komentar:

Posting Komentar