Skip to content
Portfolio
Foto profil Muhammad Afif Naufal

Muhammad Afif Naufal

Full Stack Developer

Depok, Indonesia

  • Beranda
  • Tentang
  • Proyek
  • Sertifikasi
  • Pengalaman
  • Kontak
© 2026 Afif Naufal
Muhammad Afif Naufal
Foto profil Muhammad Afif Naufal

Muhammad Afif Naufal

Full Stack Developer

  • Beranda
  • Tentang
  • Proyek
  • Sertifikasi
  • Pengalaman
  • Kontak
Kembali ke Proyek
Aplikasi Full-stack · AI/ML

AnakSehat AI — Deteksi Dini Stunting

Platform web deteksi dini risiko stunting dan gangguan gizi balita untuk Posyandu. Dilengkapi prediksi AI (Deep Neural Decision Forest ~95% akurasi), dashboard analitik kader, portal orang tua, dan visualisasi indikator WHO (HAZ/WAZ/BAZ).

  • React 19
  • Vite
  • Tailwind CSS
  • Node.js
  • Express.js
  • Prisma
  • PostgreSQL
  • FastAPI
  • TensorFlow
Screenshot proyek AnakSehat AI — Deteksi Dini Stunting
Repositori GitHub

Latar Belakang

AnakSehat AI adalah proyek capstone Coding Camp 2026 (MBKM, DBS Foundation) untuk membantu kader Posyandu mendeteksi risiko stunting dan gangguan gizi balita lebih dini. Platform ini menggabungkan model prediksi AI dengan dashboard analitik untuk kader dan portal bagi orang tua.

Tanggung Jawab

  • Berperan sebagai Frontend Developer dan Team Lead pada tim capstone.
  • Membangun antarmuka dengan React 19, Vite, dan Tailwind CSS.
  • Mengintegrasikan frontend dengan API Express/Prisma dan layanan prediksi FastAPI.
  • Menyajikan visualisasi indikator WHO (HAZ/WAZ/BAZ) pada dashboard.

Pencapaian Utama

  • Model prediksi Deep Neural Decision Forest dengan akurasi sekitar 95%.
  • Dashboard analitik kader dan portal orang tua dalam satu platform.

Tantangan & Solusi

  • Menyelaraskan hasil model ML dengan antarmuka yang mudah dipahami kader non-teknis, diatasi lewat visualisasi indikator WHO yang familiar.

Cuplikan Kode

GCI Formula
Python

Growth Composite Index (GCI) — menggabungkan tiga indikator WHO (HAZ, WAZ, BAZ) dengan bobot berbeda, di-scale menggunakan MinMaxScaler untuk menghasilkan skor 0–1 yang merepresentasikan status gizi balita secara holistik.

# src/ai_service/scoring.py
import numpy as np
from sklearn.preprocessing import MinMaxScaler

# Bobot berdasarkan riset WHO:
# HAZ (stunting) = faktor dominan (45%)
# WAZ (underweight) = faktor sedang (35%)
# BAZ (wasting) = faktor terkecil (20%)
WEIGHTS = {"haz": 0.45, "waz": 0.35, "baz": 0.20}

def compute_gci(haz: float, waz: float, baz: float) -> float:
    """
    Hitung Growth Composite Index dari z-scores WHO.
    Return: float [0.0 – 1.0], semakin tinggi = semakin sehat.
    """
    raw_score = (
        haz * WEIGHTS["haz"] +
        waz * WEIGHTS["waz"] +
        baz * WEIGHTS["baz"]
    )

    # MinMaxScaler transform ke rentang [0, 1]
    # Batas: -4 SD (severe malnutrition) hingga +3 SD (healthy)
    score_min, score_max = -4.0, 3.0
    gci = (raw_score - score_min) / (score_max - score_min)

    return float(np.clip(gci, 0.0, 1.0))


def get_who_status(z_score: float, indicator: str) -> str:
    """
    Klasifikasi status gizi berdasarkan lookup table WHO.
    Menggantikan estimasi probabilistik yang tidak akurat.
    """
    thresholds = {
        "stunting":    [(-4, -3, "severely_stunted"), (-3, -2, "stunted"), (-2, 99, "normal")],
        "underweight": [(-4, -3, "severely_underweight"), (-3, -2, "underweight"), (-2, 99, "normal")],
        "wasting":     [(-4, -3, "severely_wasted"), (-3, -2, "wasted"), (-2, 99, "normal")],
    }
    for low, high, status in thresholds.get(indicator, []):
        if low <= z_score < high:
            return status
    return "normal"
Kode nyata dari proyek ini — bukan ilustrasi.
UTF-8Python