<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>curah hujan | Irpan Chumaedi</title><link>https://www.irpanchumaedi.com/tag/curah-hujan/</link><atom:link href="https://www.irpanchumaedi.com/tag/curah-hujan/index.xml" rel="self" type="application/rss+xml"/><description>curah hujan</description><generator>Wowchemy (https://wowchemy.com)</generator><language>en-us</language><lastBuildDate>Fri, 02 Feb 2024 00:00:00 +0000</lastBuildDate><image><url>https://www.irpanchumaedi.com/images/icon_huc8b49dbecede763dad003ee9bbdb929f_244914_512x512_fill_lanczos_center_2.png</url><title>curah hujan</title><link>https://www.irpanchumaedi.com/tag/curah-hujan/</link></image><item><title>Analisa Frekuensi Curah Hujan</title><link>https://www.irpanchumaedi.com/post/materi-analisa-frekuensi-hujan/</link><pubDate>Fri, 02 Feb 2024 00:00:00 +0000</pubDate><guid>https://www.irpanchumaedi.com/post/materi-analisa-frekuensi-hujan/</guid><description>
&lt;style>
.materi-frekuensi {
--navy:#0A2342; --blue:#185fa5; --blue-mid:#378add; --blue-light:#85b7eb; --blue-pale:#e6f1fb;
--red:#B91C1C; --red-light:#fee2e2; --navy2:#1A5276;
--amber:#B45309; --amber-light:#fef3c7;
--purple:#6D28D9; --purple-light:#ede9fe;
--green:#1d6f42; --green-light:#d1fae5;
--gray-100:#f8fafc; --gray-200:#e2e8f0; --gray-300:#cbd5e1;
--gray-500:#64748b; --gray-600:#475569; --gray-700:#334155; --gray-900:#0f172a;
--radius:10px; --radius-sm:6px;
--shadow:0 2px 12px rgba(0,0,0,0.07);
--shadow-md:0 4px 20px rgba(0,0,0,0.10);
--code-bg:#1e1e2e;
}
.materi-frekuensi, .materi-frekuensi *::before, .materi-frekuensi *::after {box-sizing:border-box;margin:0;padding:0;}
/.materi-frekuensi * STICKY NAV */
.sticky-nav {position:sticky;top:0;z-index:200;background:#fff;border-bottom:1px solid var(--gray-200);box-shadow:var(--shadow);}
.materi-frekuensi .sticky-inner {max-width:960px;margin:0 auto;padding:0 1.25rem;display:flex;align-items:center;gap:1rem;height:52px;}
.materi-frekuensi .sticky-title {font-size:13px;font-weight:600;color:var(--navy);white-space:nowrap;}
.materi-frekuensi .progress-track {flex:1;height:4px;background:var(--gray-200);border-radius:2px;}
.materi-frekuensi .progress-fill {height:100%;background:linear-gradient(90deg,var(--blue),var(--purple));border-radius:2px;width:0%;transition:width 0.3s;}
.materi-frekuensi .sticky-pct {font-size:12px;color:var(--gray-500);min-width:32px;}
/.materi-frekuensi * FLOATING TOC */
.toc-float {position:fixed;top:80px;right:0;width:195px;background:#fff;border:1px solid var(--gray-200);border-right:none;border-radius:var(--radius) 0 0 var(--radius);box-shadow:-2px 4px 16px rgba(0,0,0,0.09);z-index:150;transition:all 0.28s cubic-bezier(0.4,0,0.2,1);overflow:hidden;}
.materi-frekuensi .toc-float.collapsed {width:32px;}
.materi-frekuensi .toc-head {display:flex;align-items:center;justify-content:space-between;padding:8px 10px 8px 12px;border-bottom:1px solid var(--gray-200);cursor:pointer;user-select:none;background:var(--navy);border-radius:var(--radius) 0 0 0;}
.materi-frekuensi .toc-head:hover {background:#1a3a5c;}
.materi-frekuensi .toc-title {font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:0.07em;color:rgba(255,255,255,0.9);white-space:nowrap;overflow:hidden;}
.materi-frekuensi .toc-chevron {font-size:11px;color:rgba(255,255,255,0.7);flex-shrink:0;transition:transform 0.25s;margin-left:6px;}
.materi-frekuensi .toc-float.collapsed .toc-chevron {transform:rotate(180deg);}
.materi-frekuensi .toc-float.collapsed .toc-title {opacity:0;width:0;margin:0;}
.materi-frekuensi .toc-body {padding:8px 6px;max-height:calc(100vh - 140px);overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--gray-300) transparent;}
.materi-frekuensi .toc-body::-webkit-scrollbar {width:3px;}
.materi-frekuensi .toc-body::-webkit-scrollbar-thumb {background:var(--gray-300);border-radius:2px;}
.materi-frekuensi .toc-float.collapsed .toc-body {display:none;}
.materi-frekuensi .toc-link {display:block;font-size:11px;color:var(--gray-600);text-decoration:none;padding:3px 8px;border-radius:4px;border-left:2px solid transparent;margin-bottom:1px;transition:all 0.15s;line-height:1.4;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.materi-frekuensi .toc-link:hover {background:var(--blue-pale);color:var(--blue);border-left-color:var(--blue);}
.materi-frekuensi .toc-link.active {background:var(--blue-pale);color:var(--blue);border-left-color:var(--blue);font-weight:600;}
.materi-frekuensi .toc-link.sub {padding-left:14px;font-size:10px;color:var(--gray-500);}
.materi-frekuensi .toc-link.sub.active {color:var(--blue);}
.materi-frekuensi .toc-toggle {display:none;position:fixed;bottom:20px;right:16px;width:40px;height:40px;border-radius:50%;background:var(--navy);color:#fff;border:none;font-size:16px;cursor:pointer;box-shadow:var(--shadow-md);z-index:160;align-items:center;justify-content:center;}
@.materi-frekuensi media(max-width:1100px) {.toc-float{display:none;}.materi-frekuensi .toc-toggle {display:flex;}.materi-frekuensi }
/* HERO */
.hero {background:linear-gradient(135deg,#0A2342 0%,#1A3a5c 55%,#2d1065 100%);color:#fff;padding:3rem 1.5rem 2.5rem;border-radius:0 0 var(--radius) var(--radius);margin-bottom:2rem;position:relative;overflow:hidden;}
.materi-frekuensi .hero::before {content:'';position:absolute;top:-80px;right:-60px;width:300px;height:300px;border-radius:50%;background:rgba(55,138,221,0.12);}
.materi-frekuensi .hero::after {content:'';position:absolute;bottom:-100px;left:10%;width:250px;height:250px;border-radius:50%;background:rgba(109,40,217,0.10);}
.materi-frekuensi .hero-inner {max-width:960px;margin:0 auto;position:relative;z-index:1;}
.materi-frekuensi .hero-badge {display:inline-block;background:rgba(55,138,221,0.25);color:#85b7eb;font-size:11px;padding:3px 10px;border-radius:20px;margin-bottom:0.75rem;letter-spacing:0.04em;}
.materi-frekuensi .hero h1 {font-size:clamp(22px,4vw,30px);font-weight:700;line-height:1.3;margin-bottom:0.5rem;}
.materi-frekuensi .hero-sub {font-size:14px;color:rgba(255,255,255,0.65);margin-bottom:1.5rem;}
.materi-frekuensi .hero-pills {display:flex;flex-wrap:wrap;gap:8px;margin-top:1rem;}
.materi-frekuensi .hero-pill {display:inline-block;font-size:11px;padding:4px 10px;border-radius:20px;font-weight:600;border:1px solid;}
.materi-frekuensi .pill-red {background:rgba(185,28,28,0.25);color:#fca5a5;border-color:rgba(185,28,28,0.4);}
.materi-frekuensi .pill-blue {background:rgba(26,82,118,0.3);color:#85b7eb;border-color:rgba(26,82,118,0.5);}
.materi-frekuensi .pill-amber {background:rgba(180,83,9,0.25);color:#fcd34d;border-color:rgba(180,83,9,0.4);}
.materi-frekuensi .pill-purple {background:rgba(109,40,217,0.25);color:#c4b5fd;border-color:rgba(109,40,217,0.4);}
.materi-frekuensi .pill-green {background:rgba(29,111,66,0.25);color:#6ee7b7;border-color:rgba(29,111,66,0.4);}
.materi-frekuensi .hero-meta {display:flex;flex-wrap:wrap;gap:1.25rem;margin-top:1rem;}
.materi-frekuensi .hero-meta-item {font-size:12px;color:rgba(255,255,255,0.55);}
/.materi-frekuensi * LAYOUT */
.wrap {max-width:960px;margin:0 auto;padding:0 1.25rem 4rem;}
/.materi-frekuensi * SECTIONS */
.section {margin-bottom:3rem;}
.materi-frekuensi .section-header {display:flex;align-items:center;gap:12px;margin-bottom:1.25rem;}
.materi-frekuensi .section-num {width:32px;height:32px;border-radius:50%;background:var(--navy);color:#fff;font-size:13px;font-weight:600;display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.materi-frekuensi .section-header h2 {font-size:20px;font-weight:700;color:var(--gray-900);}
.materi-frekuensi .subsection {margin:1.5rem 0 1rem;}
.materi-frekuensi .subsection h3 {font-size:15px;font-weight:700;color:var(--gray-700);padding-left:10px;border-left:3px solid var(--blue-mid);margin-bottom:0.75rem;}
/.materi-frekuensi * CARDS */
.card {background:#fff;border-radius:var(--radius);padding:1.25rem 1.5rem;box-shadow:var(--shadow);margin-bottom:1rem;}
.materi-frekuensi .card-navy {border-left:4px solid var(--navy);}
.materi-frekuensi .card-blue {border-left:4px solid var(--blue-mid);}
.materi-frekuensi .card-red {border-left:4px solid var(--red);}
.materi-frekuensi .card-amber {border-left:4px solid var(--amber);}
.materi-frekuensi .card-green {border-left:4px solid var(--green);}
.materi-frekuensi .card-purple {border-left:4px solid var(--purple);}
.materi-frekuensi .card-label {font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.07em;color:var(--gray-500);margin-bottom:6px;}
.materi-frekuensi .card p, .materi-frekuensi .card-body {font-size:13px;color:var(--gray-600);line-height:1.65;}
.materi-frekuensi .card strong {color:var(--gray-800);}
/.materi-frekuensi * GRID */
.grid-2 {display:grid;grid-template-columns:1fr 1fr;gap:1rem;margin-bottom:1rem;}
.materi-frekuensi .grid-3 {display:grid;grid-template-columns:1fr 1fr 1fr;gap:1rem;margin-bottom:1rem;}
.materi-frekuensi .grid-4 {display:grid;grid-template-columns:repeat(4,1fr);gap:1rem;margin-bottom:1.5rem;}
@.materi-frekuensi media(max-width:700px) {.grid-2,.grid-3,.grid-4{grid-template-columns:1fr;}.materi-frekuensi }
@media(max-width:900px) {.grid-3{grid-template-columns:1fr 1fr;}.materi-frekuensi }
/* METRIC CARDS */
.metric-card {background:#fff;border-radius:var(--radius);padding:1rem 1.1rem;box-shadow:var(--shadow);text-align:center;position:relative;overflow:hidden;}
.materi-frekuensi .metric-card::before {content:'';position:absolute;top:0;left:0;right:0;height:3px;}
.materi-frekuensi .metric-card.blue::before {background:var(--blue);}
.materi-frekuensi .metric-card.green::before {background:var(--green);}
.materi-frekuensi .metric-card.amber::before {background:var(--amber);}
.materi-frekuensi .metric-card.purple::before {background:var(--purple);}
.materi-frekuensi .metric-card.red::before {background:var(--red);}
.materi-frekuensi .metric-label {font-size:11px;color:var(--gray-500);font-weight:600;margin-bottom:4px;}
.materi-frekuensi .metric-val {font-size:18px;font-weight:700;color:var(--navy);}
.materi-frekuensi .metric-sub {font-size:11px;color:var(--gray-500);margin-top:3px;}
/.materi-frekuensi * INFO BOXES */
.info-box {display:flex;gap:10px;background:var(--blue-pale);border:1px solid #b5d4f4;border-radius:var(--radius-sm);padding:.9rem 1rem;font-size:13px;color:#0c447c;margin:1rem 0;line-height:1.55;}
.materi-frekuensi .warn-box {display:flex;gap:10px;background:var(--amber-light);border:1px solid #fac775;border-radius:var(--radius-sm);padding:.9rem 1rem;font-size:13px;color:var(--amber);margin:1rem 0;line-height:1.55;}
.materi-frekuensi .success-box {display:flex;gap:10px;background:var(--green-light);border:1px solid #a7f3d0;border-radius:var(--radius-sm);padding:.9rem 1rem;font-size:13px;color:var(--green);margin:1rem 0;line-height:1.55;}
.materi-frekuensi .purple-box {display:flex;gap:10px;background:var(--purple-light);border:1px solid #c4b5fd;border-radius:var(--radius-sm);padding:.9rem 1rem;font-size:13px;color:var(--purple);margin:1rem 0;line-height:1.55;}
.materi-frekuensi .box-icon {font-size:18px;flex-shrink:0;line-height:1.3;}
/.materi-frekuensi * FORMULA */
.formula-block {background:#0f172a;border-radius:var(--radius-sm);padding:1rem 1.25rem;margin:.75rem 0;font-family:'Consolas','Courier New',monospace;font-size:14px;color:#e2e8f0;letter-spacing:0.02em;border-left:4px solid var(--purple);}
.materi-frekuensi .formula-block .eq-label {font-size:11px;color:#94a3b8;display:block;margin-bottom:4px;}
.materi-frekuensi .formula-block .eq-main {color:#c4b5fd;font-size:15px;display:block;text-align:center;margin:6px 0;}
.materi-frekuensi .formula-block .eq-desc {font-size:11px;color:#64748b;display:block;margin-top:6px;}
/.materi-frekuensi * STEP FLOW */
.step-flow {margin:1rem 0;}
.materi-frekuensi .step-item {display:flex;gap:14px;}
.materi-frekuensi .step-line {display:flex;flex-direction:column;align-items:center;}
.materi-frekuensi .step-dot {width:30px;height:30px;border-radius:50%;background:var(--blue-mid);color:#fff;font-size:12px;font-weight:600;display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.materi-frekuensi .step-dot.navy {background:var(--navy);}
.materi-frekuensi .step-dot.green {background:var(--green);}
.materi-frekuensi .step-dot.purple {background:var(--purple);}
.materi-frekuensi .step-dot.amber {background:var(--amber);}
.materi-frekuensi .step-connector {width:2px;background:var(--gray-200);flex:1;min-height:16px;margin:3px 0;}
.materi-frekuensi .step-body {padding-bottom:20px;flex:1;}
.materi-frekuensi .step-title {font-size:14px;font-weight:600;color:var(--gray-800);margin-bottom:4px;}
.materi-frekuensi .step-desc {font-size:13px;color:var(--gray-600);line-height:1.6;}
/.materi-frekuensi * CODE */
.code-wrap {background:var(--code-bg);border-radius:var(--radius-sm);overflow:hidden;margin:.75rem 0;box-shadow:var(--shadow-md);}
.materi-frekuensi .code-header {background:#2a2a3e;padding:7px 14px;display:flex;align-items:center;justify-content:space-between;}
.materi-frekuensi .code-lang {font-size:11px;color:#a0aec0;font-weight:600;letter-spacing:0.05em;display:flex;align-items:center;gap:6px;}
.materi-frekuensi .code-lang .dot {width:8px;height:8px;border-radius:50%;}
.materi-frekuensi .copy-btn {font-size:11px;color:#a0aec0;cursor:pointer;background:none;border:none;padding:2px 8px;border-radius:4px;transition:all 0.2s;}
.materi-frekuensi .copy-btn:hover {background:rgba(255,255,255,0.1);color:#fff;}
.materi-frekuensi pre {padding:1rem 1.25rem;overflow-x:auto;font-family:'Consolas','Courier New',monospace;font-size:12.5px;line-height:1.75;color:#cdd6f4;}
.materi-frekuensi pre::-webkit-scrollbar {height:4px;}
.materi-frekuensi pre::-webkit-scrollbar-thumb {background:#4a4a6a;border-radius:2px;}
.materi-frekuensi .kw {color:#cba6f7;}.materi-frekuensi .fn {color:#89b4fa;}.materi-frekuensi .str {color:#a6e3a1;}.materi-frekuensi .num {color:#fab387;}.materi-frekuensi .cm {color:#6c7086;font-style:italic;}.materi-frekuensi .op {color:#89dceb;}.materi-frekuensi .pkg {color:#f38ba8;}
/.materi-frekuensi * TABLE */
.tbl-wrap {overflow-x:auto;margin-bottom:1rem;}
.materi-frekuensi .data-tbl {width:100%;border-collapse:collapse;font-size:13px;min-width:380px;}
.materi-frekuensi .data-tbl th {background:var(--navy);color:#fff;padding:8px 12px;text-align:center;font-weight:600;font-size:12px;}
.materi-frekuensi .data-tbl td {padding:7px 12px;border-bottom:1px solid var(--gray-200);text-align:center;font-family:'Consolas',monospace;font-size:12px;color:var(--gray-700);}
.materi-frekuensi .data-tbl td.td-label {text-align:left;font-family:inherit;font-weight:600;color:var(--gray-700);}
.materi-frekuensi .data-tbl tr:hover td {background:var(--blue-pale);}
.materi-frekuensi .data-tbl .best {color:var(--green);font-weight:700;}
.materi-frekuensi .data-tbl .pass {color:var(--green);}
.materi-frekuensi .data-tbl .fail {color:var(--red);font-weight:700;}
.materi-frekuensi .data-tbl .highlight {background:rgba(26,82,118,0.06)!important;}
.materi-frekuensi .data-tbl .th-blue {background:var(--navy2)!important;}
.materi-frekuensi .data-tbl .th-red {background:var(--red)!important;}
.materi-frekuensi .data-tbl .th-green {background:var(--green)!important;}
.materi-frekuensi .data-tbl .th-purple {background:var(--purple)!important;}
.materi-frekuensi .data-tbl .th-amber {background:var(--amber)!important;}
/.materi-frekuensi * CHART */
.chart-card {background:#fff;border-radius:var(--radius);padding:1.25rem 1.5rem 1rem;box-shadow:var(--shadow);margin-bottom:1.25rem;}
.materi-frekuensi .chart-title {font-size:13px;font-weight:700;color:var(--gray-700);margin-bottom:2px;}
.materi-frekuensi .chart-sub {font-size:11px;color:var(--gray-500);margin-bottom:1rem;}
.materi-frekuensi .chart-wrap {position:relative;width:100%;}
.materi-frekuensi .legend-row {display:flex;flex-wrap:wrap;gap:12px;margin-top:10px;font-size:11px;color:var(--gray-500);}
.materi-frekuensi .legend-item {display:flex;align-items:center;gap:5px;}
.materi-frekuensi .legend-sq {width:10px;height:10px;border-radius:2px;flex-shrink:0;}
/.materi-frekuensi * TAG */
.tag {display:inline-block;font-size:11px;padding:3px 10px;border-radius:20px;margin:2px;font-weight:500;}
.materi-frekuensi .tag-blue {background:var(--blue-pale);color:#0c447c;}
.materi-frekuensi .tag-red {background:var(--red-light);color:var(--red);}
.materi-frekuensi .tag-purple {background:var(--purple-light);color:var(--purple);}
.materi-frekuensi .tag-green {background:var(--green-light);color:var(--green);}
.materi-frekuensi .tag-amber {background:var(--amber-light);color:var(--amber);}
/.materi-frekuensi * RETURN PERIOD VISUAL */
.rp-grid {display:grid;grid-template-columns:repeat(6,1fr);gap:6px;margin:1rem 0;}
.materi-frekuensi .rp-card {background:#fff;border-radius:8px;padding:0.8rem 0.5rem;box-shadow:var(--shadow);text-align:center;border-top:3px solid;}
.materi-frekuensi .rp-T {font-size:15px;font-weight:700;}
.materi-frekuensi .rp-prob {font-size:11px;color:var(--gray-500);margin:3px 0;}
.materi-frekuensi .rp-use {font-size:10px;color:var(--gray-500);line-height:1.4;}
@.materi-frekuensi media(max-width:700px) {.rp-grid{grid-template-columns:repeat(3,1fr);}.materi-frekuensi }
/* DIST GRID */
.dist-grid {display:grid;grid-template-columns:1fr 1fr;gap:1rem;margin:1rem 0;}
@.materi-frekuensi media(max-width:600px) {.dist-grid{grid-template-columns:1fr;}.materi-frekuensi }
/* FLOW DIAGRAM */
.flow-row {display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:1rem 0;}
.materi-frekuensi .flow-box {padding:0.6rem 1rem;border-radius:8px;font-size:12px;font-weight:600;text-align:center;flex-shrink:0;}
.materi-frekuensi .flow-arrow {color:var(--gray-400);font-size:18px;flex-shrink:0;}
/.materi-frekuensi * DIVIDER */
.divider {height:1px;background:var(--gray-200);margin:2.5rem 0;}
/.materi-frekuensi * ANALOGY BOX */
.analogy-box {background:linear-gradient(135deg,#f0f7ff,#f8f0ff);border:1px solid #c4d9f7;border-radius:var(--radius);padding:1.1rem 1.3rem;margin:1rem 0;position:relative;}
.materi-frekuensi .analogy-badge {font-size:10px;font-weight:700;letter-spacing:0.07em;text-transform:uppercase;color:var(--blue);margin-bottom:6px;}
.materi-frekuensi .analogy-box p {font-size:13px;color:var(--gray-700);line-height:1.7;font-style:italic;}
/.materi-frekuensi * ANIMATE */
@keyframes fadeUp {from{opacity:0;transform:translateY(16px);}.materi-frekuensi to {opacity:1;transform:translateY(0);}.materi-frekuensi }
.anim-in {opacity:1;}
.materi-frekuensi .anim-in.visible {animation:fadeUp 0.45s ease both;}
/.materi-frekuensi * NEXT ARTICLES */
.nav-link {display:flex;align-items:center;gap:1rem;padding:0.9rem 1.2rem;background:#fff;border:1px solid var(--gray-200);border-radius:10px;text-decoration:none;transition:all 0.2s;margin-bottom:0.5rem;box-shadow:var(--shadow);}
.materi-frekuensi .nav-link:hover {border-color:var(--blue-mid);box-shadow:var(--shadow-md);}
.materi-frekuensi .nav-link-label {font-size:10px;font-weight:700;letter-spacing:0.09em;text-transform:uppercase;color:var(--gray-500);margin-bottom:3px;}
.materi-frekuensi .nav-link-title {font-size:14px;font-weight:700;color:var(--navy);}
.materi-frekuensi .nav-link-dim {opacity:0.5;cursor:default;}
.materi-frekuensi .nav-link-dim:hover {border-color:var(--gray-200);box-shadow:var(--shadow);}
/* === LAYOUT FIX: integrasi Wowchemy === */
.materi-frekuensi { box-sizing: border-box; width: 100%; overflow-x: hidden; }
.materi-frekuensi * { box-sizing: border-box; }
.materi-frekuensi .wrap, .materi-frekuensi .section { max-width: 100%; }
/* === DARK MODE === */
body.dark .materi-frekuensi { color:#8e94b5; }
/* Heading &amp; teks utama */
body.dark .materi-frekuensi h1,
body.dark .materi-frekuensi h2,
body.dark .materi-frekuensi h3,
body.dark .materi-frekuensi h4 { color:#e8eaf6 !important; }
body.dark .materi-frekuensi p { color:#8e94b5; }
body.dark .materi-frekuensi strong { color:#e8eaf6; }
body.dark .materi-frekuensi li { color:#8e94b5; }
/* Section header */
body.dark .materi-frekuensi .section-header { border-color:#343858; }
body.dark .materi-frekuensi .section-header h2 { color:#e8eaf6 !important; }
body.dark .materi-frekuensi .section-num {
background:#1e3a6e !important;
color:#5b8fff !important;
border-color:#2a4a8e !important;
}
body.dark .materi-frekuensi .subsection h3 { color:#c8ccdf !important; }
/* Cards — background &amp; border */
body.dark .materi-frekuensi [class*="card"],
body.dark .materi-frekuensi .card,
body.dark .materi-frekuensi .metric-card {
background:#222638 !important;
border-color:#343858 !important;
box-shadow: 0 2px 12px rgba(0,0,0,0.3) !important;
}
/* Card teks — SEMUA varian label &amp; nilai */
body.dark .materi-frekuensi .card-label,
body.dark .materi-frekuensi .metric-label,
body.dark .materi-frekuensi .metric-sub {
color:#8e94b5 !important;
}
body.dark .materi-frekuensi .card p,
body.dark .materi-frekuensi .card-body {
color:#8e94b5 !important;
}
body.dark .materi-frekuensi .metric-val {
/* warna nilai (biru/amber/dll) tetap — biarkan dari CSS asli */
filter: brightness(1.2);
}
/* Teks dengan var gray-* — override via CSS variable remapping */
body.dark .materi-frekuensi {
--gray-100:#1b1d27;
--gray-200:#222638;
--gray-300:#2a2e42;
--gray-500:#8e94b5;
--gray-600:#a0a8cc;
--gray-700:#c8ccdf;
--gray-900:#e8eaf6;
--navy:#e8eaf6;
--navy2:#c8ccdf;
--blue:#5b8fff;
--blue-mid:#7aa5ff;
--blue-pale:#1e2a42;
--red:#e05a5a;
--red-light:#2d1515;
--amber:#f4a642;
--amber-light:#2d2010;
--purple:#9d7cf8;
--purple-light:#1e1530;
--green:#3ecf8e;
--green-light:#0d2418;
--shadow: 0 2px 12px rgba(0,0,0,0.35);
--shadow-md: 0 4px 20px rgba(0,0,0,0.45);
--code-bg:#12151f;
}
/* Table */
body.dark .materi-frekuensi table { border-color:#343858; }
body.dark .materi-frekuensi th {
background:#2a2e42 !important;
color:#8e94b5 !important;
border-color:#343858 !important;
}
body.dark .materi-frekuensi td {
border-color:#343858 !important;
color:#8e94b5 !important;
}
body.dark .materi-frekuensi tr:nth-child(even) { background:#1e2235 !important; }
body.dark .materi-frekuensi tr:hover td { background:#252840 !important; }
/* Code */
body.dark .materi-frekuensi code,
body.dark .materi-frekuensi pre {
background:#12151f !important;
color:#a8b4ff !important;
}
/* Form inputs */
body.dark .materi-frekuensi select,
body.dark .materi-frekuensi input[type=number],
body.dark .materi-frekuensi input[type=text] {
background:#2a2e42 !important;
border-color:#343858 !important;
color:#e8eaf6 !important;
}
/* Result/output boxes */
body.dark .materi-frekuensi [class*="result"],
body.dark .materi-frekuensi [id*="result"],
body.dark .materi-frekuensi [class*="output"],
body.dark .materi-frekuensi [id*="output"] {
background:#222638 !important;
border-color:#343858 !important;
color:#8e94b5 !important;
}
/* Grid boxes */
body.dark .materi-frekuensi .grid-2>*,
body.dark .materi-frekuensi .grid-3>*,
body.dark .materi-frekuensi .grid-4>* {
background:#222638 !important;
border-color:#343858 !important;
}
/* Info/alert boxes */
body.dark .materi-frekuensi [class*="info-"],
body.dark .materi-frekuensi [class*="alert-"],
body.dark .materi-frekuensi [class*="note-"] {
background:#1e2235 !important;
border-color:#343858 !important;
color:#8e94b5 !important;
}
/* Links */
body.dark .materi-frekuensi a { color:#5b8fff; }
body.dark .materi-frekuensi hr { border-color:#343858; }
/* Fix teks inline style hardcoded */
body.dark .materi-frekuensi [style*="color:#0f172a"],
body.dark .materi-frekuensi [style*="color:#1e293b"],
body.dark .materi-frekuensi [style*="color:#334155"],
body.dark .materi-frekuensi [style*="color:#475569"] {
color:#e8eaf6 !important;
}
body.dark .materi-frekuensi [style*="background:#fff"],
body.dark .materi-frekuensi [style*="background:#f4f6f9"],
body.dark .materi-frekuensi [style*="background:#f8fafc"],
body.dark .materi-frekuensi [style*="background:#f1f5f9"] {
background:#222638 !important;
}
&lt;/style>
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.1/chart.umd.js">&lt;/script>
&lt;div class="materi-frekuensi">
&lt;!-- ===== S1: LATAR BELAKANG ===== -->
&lt;section class="section anim-in" id="s1">
&lt;div class="section-header">&lt;div class="section-num">1&lt;/div>&lt;h2>Latar Belakang — Mengapa Perlu?&lt;/h2>&lt;/div>
&lt;div class="card card-navy">
&lt;div class="card-label">Skenario Nyata&lt;/div>
&lt;p>Tahun 2019, sebuah jembatan baru dibangun di atas sungai. Desainnya menggunakan data hujan 5 tahun terakhir — terasa cukup. Tiga tahun kemudian, banjir merusak fondasinya. Bukan karena cuaca ekstrem yang luar biasa, tapi karena pertanyaan yang salah diajukan sejak awal.&lt;/p>
&lt;p style="margin-top:8px;">Bukan &lt;em>"Berapa besar banjir tahun lalu?"&lt;/em> — melainkan &lt;strong>"Berapa besar banjir yang mungkin terjadi dalam 50 tahun ke depan?"&lt;/strong>&lt;/p>
&lt;/div>
&lt;div class="grid-2">
&lt;div class="card card-red">
&lt;div class="card-label">❌ Tanpa Analisa Frekuensi&lt;/div>
&lt;p>Desain drainase berdasarkan banjir yang pernah dilihat. Tiga tahun kemudian meluap saat hujan yang terasa "biasa saja" — karena hujan itu nyatanya adalah kejadian 25 tahunan yang belum pernah terjadi selama pengamatan singkat itu.&lt;/p>
&lt;/div>
&lt;div class="card card-green">
&lt;div class="card-label">✅ Dengan Analisa Frekuensi&lt;/div>
&lt;p>Desain berdasarkan curah hujan kala ulang 25 tahun dari &lt;strong>30 tahun data historis&lt;/strong>. Saluran tetap berfungsi normal bahkan saat hujan besar yang "25 tahunan" itu akhirnya datang — karena kita sudah memperhitungkannya.&lt;/p>
&lt;/div>
&lt;/div>
&lt;div class="analogy-box">
&lt;div class="analogy-badge">💡 Analogi Sederhana&lt;/div>
&lt;p>Bayangkan kamu mau membeli jas hujan. Kalau kamu tinggal di kota yang hujan 10 hari setahun, payung biasa sudah cukup. Tapi kalau tinggal di Banjarmasin yang bisa hujan deras terus-terusan, kamu butuh jas hujan tebal dan sepatu boots. Analisa frekuensi adalah cara kita "membaca cuaca jangka panjang" supaya bisa memilih perlengkapan yang tepat untuk setiap jenis infrastruktur.&lt;/p>
&lt;/div>
&lt;p style="font-size:13px;color:var(--gray-600);line-height:1.7;margin-top:1rem;">Setiap infrastruktur yang berhubungan dengan air — jembatan, bendung, saluran drainase, tanggul, gorong-gorong — dirancang untuk menghadapi hujan atau banjir dengan &lt;strong>tingkat bahaya tertentu yang ditetapkan secara ilmiah&lt;/strong>, bukan berdasarkan ingatan atau pengalaman singkat.&lt;/p>
&lt;div class="success-box">&lt;span class="box-icon">🎯&lt;/span>&lt;span>Analisa frekuensi curah hujan adalah proses &lt;strong>menemukan hubungan antara besarnya hujan dan seberapa sering hujan itu terjadi&lt;/strong>, berdasarkan data historis jangka panjang. Output-nya digunakan sebagai angka desain di hampir seluruh perencanaan infrastruktur air.&lt;/span>&lt;/div>
&lt;/section>
&lt;div class="divider">&lt;/div>
&lt;!-- ===== S2: KONSEP KALA ULANG ===== -->
&lt;section class="section anim-in" id="s2">
&lt;div class="section-header">&lt;div class="section-num">2&lt;/div>&lt;h2>Konsep Dasar: Kala Ulang &amp; Probabilitas&lt;/h2>&lt;/div>
&lt;div id="s2a">&lt;/div>
&lt;div class="subsection">&lt;h3>Apa Itu Kala Ulang?&lt;/h3>&lt;/div>
&lt;div class="card card-blue">
&lt;div class="card-label">📖 Definisi&lt;/div>
&lt;p>&lt;strong>Kala ulang&lt;/strong> (bahasa Inggris: &lt;em>return period&lt;/em>, simbol &lt;strong>T&lt;/strong>) adalah rata-rata selang waktu antara dua kejadian hujan yang besarnya &lt;em>sama atau lebih besar&lt;/em> dari nilai tertentu. Kala ulang T tahun artinya rata-rata, hujan sebesar itu terjadi &lt;strong>sekali setiap T tahun&lt;/strong>.&lt;/p>
&lt;p style="margin-top:8px;color:#555;font-style:italic;font-size:12px;">Ini bukan berarti hujan itu pasti terjadi persis setiap T tahun — ini adalah rata-rata statistik jangka panjang.&lt;/p>
&lt;/div>
&lt;div class="analogy-box">
&lt;div class="analogy-badge">💡 Analogi Dadu&lt;/div>
&lt;p>"Hujan 25 tahunan terjadi tahun ini — berarti 24 tahun lagi aman dong?" — SALAH. Setiap tahun, hujan 25 tahunan punya probabilitas 4%, tidak peduli apa yang terjadi tahun lalu. Sama seperti dadu: meski sudah 5 kali tidak keluar angka 6, peluang keluar angka 6 tetap 1/6 di lemparan berikutnya. Setiap tahun adalah "lemparan baru".&lt;/p>
&lt;/div>
&lt;div class="formula-block">
&lt;span class="eq-label">Hubungan Kala Ulang dengan Probabilitas Tahunan&lt;/span>
&lt;span class="eq-main">P = 1 / T&lt;/span>
&lt;span class="eq-desc">P = probabilitas kejadian dalam satu tahun (0–1) | T = kala ulang (tahun)
Contoh: T = 25 tahun → P = 1/25 = 0.04 = 4% per tahun&lt;/span>
&lt;/div>
&lt;div id="s2b">&lt;/div>
&lt;div class="subsection">&lt;h3>Kala Ulang yang Umum Digunakan di Indonesia&lt;/h3>&lt;/div>
&lt;div class="rp-grid">
&lt;div class="rp-card" style="border-color:#64748b;">
&lt;div class="rp-T" style="color:#475569;">T = 2&lt;/div>
&lt;div class="rp-prob">P = 50%/thn&lt;/div>
&lt;div class="rp-use">Gorong-gorong sederhana, drainase lahan pertanian&lt;/div>
&lt;/div>
&lt;div class="rp-card" style="border-color:#2563eb;">
&lt;div class="rp-T" style="color:#2563eb;">T = 5&lt;/div>
&lt;div class="rp-prob">P = 20%/thn&lt;/div>
&lt;div class="rp-use">Saluran drainase perkotaan kecil, perumahan&lt;/div>
&lt;/div>
&lt;div class="rp-card" style="border-color:#0284c7;">
&lt;div class="rp-T" style="color:#0284c7;">T = 10&lt;/div>
&lt;div class="rp-prob">P = 10%/thn&lt;/div>
&lt;div class="rp-use">Saluran drainase utama kota, jalan raya&lt;/div>
&lt;/div>
&lt;div class="rp-card" style="border-color:#d97706;">
&lt;div class="rp-T" style="color:#d97706;">T = 25&lt;/div>
&lt;div class="rp-prob">P = 4%/thn&lt;/div>
&lt;div class="rp-use">Sungai perkotaan, jembatan, irigasi utama&lt;/div>
&lt;/div>
&lt;div class="rp-card" style="border-color:#dc2626;">
&lt;div class="rp-T" style="color:#dc2626;">T = 50&lt;/div>
&lt;div class="rp-prob">P = 2%/thn&lt;/div>
&lt;div class="rp-use">Tanggul banjir, bendung, pelabuhan&lt;/div>
&lt;/div>
&lt;div class="rp-card" style="border-color:#7c3aed;">
&lt;div class="rp-T" style="color:#7c3aed;">T = 100&lt;/div>
&lt;div class="rp-prob">P = 1%/thn&lt;/div>
&lt;div class="rp-use">Bendungan besar, infrastruktur vital kritis&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="warn-box">&lt;span class="box-icon">⚠️&lt;/span>&lt;span>Semakin panjang kala ulang, semakin besar dan semakin jarang hujannya — dan semakin mahal infrastruktur yang dibutuhkan. Pemilihan kala ulang adalah keputusan &lt;strong>teknis sekaligus ekonomis&lt;/strong>: seberapa besar risiko yang masih dapat diterima?&lt;/span>&lt;/div>
&lt;/section>
&lt;div class="divider">&lt;/div>
&lt;!-- ===== S3: DATA ===== -->
&lt;section class="section anim-in" id="s3">
&lt;div class="section-header">&lt;div class="section-num">3&lt;/div>&lt;h2>Data yang Dibutuhkan&lt;/h2>&lt;/div>
&lt;div id="s3a">&lt;/div>
&lt;div class="subsection">&lt;h3>Annual Maximum Series (AMS)&lt;/h3>&lt;/div>
&lt;p style="font-size:13px;color:var(--gray-600);line-height:1.7;margin-bottom:1rem;">Dari sekian banyak data hujan harian, yang kita gunakan adalah &lt;strong>satu nilai maksimum per tahun&lt;/strong> — metode ini disebut &lt;em>Annual Maximum Series (AMS)&lt;/em>. Mengapa hanya nilai maksimum? Karena kita hanya tertarik memodelkan &lt;em>kejadian ekstrem&lt;/em> — kandidat banjir tahunan.&lt;/p>
&lt;div class="grid-2">
&lt;div class="card card-amber">
&lt;div class="card-label">🗂️ Sumber Data&lt;/div>
&lt;p>&lt;strong>Data BMKG:&lt;/strong> Stasiun terdekat, rekam harian manual atau otomatis (ARR/AWLR).&lt;br>&lt;br>&lt;strong>Data GPM IMERG V07:&lt;/strong> Alternatif bila data BMKG tidak cukup panjang. Perlu dikalibrasi terlebih dahulu — lihat artikel Kalibrasi GPM.&lt;/p>
&lt;/div>
&lt;div class="card card-blue">
&lt;div class="card-label">📏 Panjang Data Minimum&lt;/div>
&lt;p>
&lt;span class="tag tag-red">⚠️ &amp;lt; 15 tahun&lt;/span> — tidak representatif, hasil tidak stabil&lt;br>&lt;br>
&lt;span class="tag tag-amber">⚠️ 15–20 tahun&lt;/span> — bisa dipakai, hasil perlu dicatat ketidakpastiannya&lt;br>&lt;br>
&lt;span class="tag tag-green">✅ 20–30 tahun&lt;/span> — standar minimum analisis teknis Indonesia&lt;br>&lt;br>
&lt;span class="tag tag-blue">🏆 &amp;gt; 30 tahun&lt;/span> — ideal, estimasi kala ulang panjang lebih andal
&lt;/p>
&lt;/div>
&lt;/div>
&lt;div class="card-label" style="font-size:11px;margin-bottom:8px;">📊 Contoh Data Annual Maximum Series — 25 Tahun (2000–2024)&lt;/div>
&lt;div class="tbl-wrap">
&lt;table class="data-tbl" id="tblAMS">&lt;/table>
&lt;/div>
&lt;div id="s3b">&lt;/div>
&lt;div class="subsection">&lt;h3>Statistik Dasar — Fondasi Semua Distribusi&lt;/h3>&lt;/div>
&lt;p style="font-size:13px;color:var(--gray-600);line-height:1.7;margin-bottom:1rem;">Sebelum memilih distribusi, kita wajib menghitung &lt;strong>4 parameter statistik&lt;/strong> dari data AMS. Parameter ini menggambarkan "karakter" data hujan kita.&lt;/p>
&lt;div class="grid-4" id="statCards">&lt;/div>
&lt;div class="formula-block">
&lt;span class="eq-label">Rumus 4 Parameter Statistik Dasar&lt;/span>
&lt;span class="eq-main">x̄ = (1/n)·Σxᵢ &amp;nbsp;|&amp;nbsp; S = √[(1/(n-1))·Σ(xᵢ−x̄)²]&lt;/span>
&lt;span class="eq-main">Cs = [n·Σ(xᵢ−x̄)³] / [(n-1)(n-2)·S³] &amp;nbsp;|&amp;nbsp; CV = S / x̄&lt;/span>
&lt;span class="eq-desc">x̄ = rata-rata | S = standar deviasi | Cs = koefisien kemencengan (skewness) | CV = koefisien variasi&lt;/span>
&lt;/div>
&lt;div class="info-box">&lt;span class="box-icon">ℹ️&lt;/span>&lt;span>Nilai &lt;strong>Cs (koefisien kemencengan)&lt;/strong> adalah panduan awal pemilihan distribusi. Cs ≈ 0 → Normal; Cs ≈ 1.14 → Gumbel; Cs bebas → Log-Pearson III dapat menyesuaikan. Data hujan tropis umumnya memiliki Cs positif (ekor distribusi condong ke kanan — ada nilai ekstrem yang jarang tapi besar).&lt;/span>&lt;/div>
&lt;/section>
&lt;div class="divider">&lt;/div>
&lt;!-- ===== S4: DISTRIBUSI ===== -->
&lt;section class="section anim-in" id="s4">
&lt;div class="section-header">&lt;div class="section-num">4&lt;/div>&lt;h2>Empat Distribusi Teoritis&lt;/h2>&lt;/div>
&lt;p style="font-size:13px;color:var(--gray-600);line-height:1.7;margin-bottom:1rem;">Distribusi teoritis adalah "model matematika" yang mencoba merepresentasikan pola data hujan kita. Bayangkan seperti sketsa wajah dari foto — kita mencoba 4 seniman berbeda, lalu pilih yang paling mirip dengan aslinya.&lt;/p>
&lt;div class="dist-grid">
&lt;div class="card card-navy">
&lt;div class="card-label">① Distribusi Normal&lt;/div>
&lt;p>Bentuk "lonceng simetris" yang paling dikenal. Nilai besar dan kecil sama-sama jarang; nilai tengah paling sering muncul. Jarang cocok untuk data hujan tropis yang biasanya miring ke kanan.&lt;/p>
&lt;div class="formula-block" style="margin-top:10px;padding:0.7rem 1rem;">
&lt;span class="eq-label">Curah Hujan Rencana&lt;/span>
&lt;span class="eq-main" style="font-size:13px;">x_T = x̄ + K_T · S&lt;/span>
&lt;span class="eq-desc">K_T dari tabel distribusi Normal standar (z-score)&lt;/span>
&lt;/div>
&lt;p style="margin-top:6px;">&lt;span class="tag tag-blue">Syarat: Cs ≈ 0&lt;/span> &lt;span class="tag tag-blue">Ck ≈ 3&lt;/span>&lt;/p>
&lt;/div>
&lt;div class="card card-blue">
&lt;div class="card-label">② Log-Normal 2 Parameter&lt;/div>
&lt;p>Transformasi logaritmik diterapkan ke data, lalu data log-nya dianggap berdistribusi Normal. Bagus untuk data positif yang miring ke kanan — tipikal curah hujan. Sangat umum dalam hidrologi.&lt;/p>
&lt;div class="formula-block" style="margin-top:10px;padding:0.7rem 1rem;">
&lt;span class="eq-label">Curah Hujan Rencana&lt;/span>
&lt;span class="eq-main" style="font-size:13px;">ln(x_T) = ȳ + K_T · Sy&lt;/span>
&lt;span class="eq-desc">ȳ = mean(ln x) | Sy = std.dev(ln x)&lt;/span>
&lt;/div>
&lt;p style="margin-top:6px;">&lt;span class="tag tag-blue">Cs ≈ 3·CV + CV³&lt;/span>&lt;/p>
&lt;/div>
&lt;div class="card card-amber">
&lt;div class="card-label">③ Distribusi Gumbel (EV Type I)&lt;/div>
&lt;p>Dirancang khusus secara teori untuk memodelkan nilai-nilai &lt;em>maksimum&lt;/em>. Sangat populer untuk analisis banjir dan hujan ekstrem. Secara teori adalah pilihan yang tepat untuk data Annual Maximum Series.&lt;/p>
&lt;div class="formula-block" style="margin-top:10px;padding:0.7rem 1rem;border-left-color:var(--amber);">
&lt;span class="eq-label">Parameter &amp; Curah Hujan Rencana&lt;/span>
&lt;span class="eq-main" style="font-size:12px;">α = S·π/√6 &amp;nbsp;|&amp;nbsp; μ = x̄ − 0.5772·α&lt;/span>
&lt;span class="eq-main" style="font-size:12px;">K_T = −(√6/π)·[0.5772 + ln(ln(T/(T-1)))]&lt;/span>
&lt;span class="eq-desc">Rumus K_T ini khusus untuk distribusi Gumbel&lt;/span>
&lt;/div>
&lt;p style="margin-top:6px;">&lt;span class="tag tag-amber">Syarat: Cs ≈ 1.14&lt;/span> &lt;span class="tag tag-amber">Ck ≈ 5.40&lt;/span>&lt;/p>
&lt;/div>
&lt;div class="card card-green">
&lt;div class="card-label">④ Log-Pearson III (LP3)&lt;/div>
&lt;p>Yang paling fleksibel dari keempatnya. Menggunakan tiga parameter dari data log (mean, std dev, skewness) — bisa mengikuti hampir semua bentuk distribusi data hidrologi. Standar wajib di banyak negara.&lt;/p>
&lt;div class="formula-block" style="margin-top:10px;padding:0.7rem 1rem;border-left-color:var(--green);">
&lt;span class="eq-label">Curah Hujan Rencana&lt;/span>
&lt;span class="eq-main" style="font-size:13px;">ln(x_T) = ȳ + K_T · Sy&lt;/span>
&lt;span class="eq-desc">K_T = f(T, Cs_y) dari tabel Pearson III | Cs_y dihitung dari data y = ln(x)&lt;/span>
&lt;/div>
&lt;p style="margin-top:6px;">&lt;span class="tag tag-green">Cs bebas — paling adaptif&lt;/span>&lt;/p>
&lt;/div>
&lt;/div>
&lt;div class="chart-card">
&lt;div class="chart-title">Perbandingan CDF: Empiris vs 4 Distribusi Teoritis&lt;/div>
&lt;div class="chart-sub">Titik = plotting position empiris (P = i/(n+1)) · Garis = CDF teoritis masing-masing distribusi&lt;/div>
&lt;div class="chart-wrap" style="height:320px;">&lt;canvas id="chartCDF">&lt;/canvas>&lt;/div>
&lt;div class="legend-row">
&lt;div class="legend-item">&lt;div class="legend-sq" style="background:#64748b;">&lt;/div> Data Empiris&lt;/div>
&lt;div class="legend-item">&lt;div class="legend-sq" style="background:#2563eb;">&lt;/div> Normal&lt;/div>
&lt;div class="legend-item">&lt;div class="legend-sq" style="background:#0891b2;">&lt;/div> Log-Normal&lt;/div>
&lt;div class="legend-item">&lt;div class="legend-sq" style="background:#d97706;">&lt;/div> Gumbel&lt;/div>
&lt;div class="legend-item">&lt;div class="legend-sq" style="background:#16a34a;">&lt;/div> Log-Pearson III&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;div class="divider">&lt;/div>
&lt;!-- ===== S5: UJI KECOCOKAN ===== -->
&lt;section class="section anim-in" id="s5">
&lt;div class="section-header">&lt;div class="section-num">5&lt;/div>&lt;h2>Uji Kecocokan (Goodness of Fit Test)&lt;/h2>&lt;/div>
&lt;p style="font-size:13px;color:var(--gray-600);line-height:1.7;margin-bottom:1rem;">Setelah mencoba keempat distribusi, kita perlu menjawab secara objektif: &lt;strong>distribusi mana yang paling baik merepresentasikan data?&lt;/strong> Jawabannya dari dua uji statistik.&lt;/p>
&lt;div id="s5a">&lt;/div>
&lt;div class="subsection">&lt;h3>Uji Kolmogorov-Smirnov (KS Test)&lt;/h3>&lt;/div>
&lt;div class="card card-purple">
&lt;div class="card-label">Prinsip Uji KS&lt;/div>
&lt;p>Uji KS mengukur &lt;strong>selisih terbesar (D)&lt;/strong> antara CDF empiris dari data kita dengan CDF teoritis dari distribusi yang diuji. Semakin kecil D, semakin cocok distribusinya. Distribusi diterima jika D-hitung &amp;lt; D-kritis (dari tabel, tergantung n dan α).&lt;/p>
&lt;/div>
&lt;div class="step-flow">
&lt;div class="step-item">
&lt;div class="step-line">&lt;div class="step-dot navy">1&lt;/div>&lt;div class="step-connector">&lt;/div>&lt;/div>
&lt;div class="step-body">
&lt;div class="step-title">Urutkan data dari kecil ke besar&lt;/div>
&lt;div class="step-desc">x₁ ≤ x₂ ≤ ... ≤ xₙ. Beri ranking i = 1, 2, ..., n.&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="step-item">
&lt;div class="step-line">&lt;div class="step-dot navy">2&lt;/div>&lt;div class="step-connector">&lt;/div>&lt;/div>
&lt;div class="step-body">
&lt;div class="step-title">Hitung probabilitas empiris (plotting position)&lt;/div>
&lt;div class="step-desc">P_emp(xᵢ) = i / (n+1) — rumus Weibull. Ini adalah "probabilitas seharusnya" berdasarkan posisi data dalam ranking.&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="step-item">
&lt;div class="step-line">&lt;div class="step-dot navy">3&lt;/div>&lt;div class="step-connector">&lt;/div>&lt;/div>
&lt;div class="step-body">
&lt;div class="step-title">Hitung CDF teoritis untuk setiap data&lt;/div>
&lt;div class="step-desc">P_teo(xᵢ) dari fungsi distribusi yang diuji (Normal, Log-Normal, Gumbel, atau LP3).&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="step-item">
&lt;div class="step-line">&lt;div class="step-dot navy">4&lt;/div>&lt;div class="step-connector">&lt;/div>&lt;/div>
&lt;div class="step-body">
&lt;div class="step-title">Hitung D = selisih maksimum&lt;/div>
&lt;div class="step-desc">D = max |P_emp(xᵢ) − P_teo(xᵢ)| untuk semua i.&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="step-item">
&lt;div class="step-line">&lt;div class="step-dot green">5&lt;/div>&lt;div class="step-connector">&lt;/div>&lt;/div>
&lt;div class="step-body">
&lt;div class="step-title">Bandingkan dengan D-kritis&lt;/div>
&lt;div class="step-desc">Untuk n=25, α=5%: D-kritis = 0.264. Jika D-hitung &amp;lt; 0.264 → &lt;strong style="color:var(--green);">distribusi DITERIMA ✅&lt;/strong>&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div id="s5b">&lt;/div>
&lt;div class="subsection">&lt;h3>Uji Chi-Kuadrat (χ²)&lt;/h3>&lt;/div>
&lt;div class="card card-blue">
&lt;div class="card-label">Prinsip Uji Chi-Kuadrat&lt;/div>
&lt;p>Data dibagi ke dalam beberapa kelas (bin), lalu dibandingkan berapa banyak data yang &lt;em>sebenarnya&lt;/em> jatuh di setiap kelas (Oᵢ) versus berapa banyak yang &lt;em>diharapkan&lt;/em> oleh distribusi teoritis (Eᵢ).&lt;/p>
&lt;/div>
&lt;div class="formula-block">
&lt;span class="eq-label">Statistik Uji Chi-Kuadrat&lt;/span>
&lt;span class="eq-main">χ² = Σ [ (Oᵢ − Eᵢ)² / Eᵢ ]&lt;/span>
&lt;span class="eq-desc">Oᵢ = frekuensi observasi kelas ke-i | Eᵢ = frekuensi yang diharapkan dari distribusi teoritis
Derajat kebebasan: dk = k − m − 1 (k = jumlah kelas, m = jumlah parameter distribusi)
Jika χ²-hitung &amp;lt; χ²-kritis(α, dk) → distribusi DITERIMA&lt;/span>
&lt;/div>
&lt;div id="s5c">&lt;/div>
&lt;div class="subsection">&lt;h3>Hasil Uji dan Pemilihan Distribusi Terbaik&lt;/h3>&lt;/div>
&lt;div class="tbl-wrap">
&lt;table class="data-tbl">
&lt;thead>
&lt;tr>
&lt;th>Distribusi&lt;/th>
&lt;th>D-hitung (KS)&lt;/th>
&lt;th>D-kritis (5%)&lt;/th>
&lt;th>Status KS&lt;/th>
&lt;th>χ²-hitung&lt;/th>
&lt;th>χ²-kritis (5%)&lt;/th>
&lt;th>Status χ²&lt;/th>
&lt;th>Keputusan&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td class="td-label">Normal&lt;/td>
&lt;td>0.091&lt;/td>&lt;td>0.264&lt;/td>
&lt;td class="pass">✅ Diterima&lt;/td>
&lt;td>3.12&lt;/td>&lt;td>5.991&lt;/td>
&lt;td class="pass">✅ Diterima&lt;/td>
&lt;td>&lt;span class="tag tag-blue">Layak&lt;/span>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td class="td-label">Log-Normal&lt;/td>
&lt;td>0.074&lt;/td>&lt;td>0.264&lt;/td>
&lt;td class="pass">✅ Diterima&lt;/td>
&lt;td>2.47&lt;/td>&lt;td>5.991&lt;/td>
&lt;td class="pass">✅ Diterima&lt;/td>
&lt;td>&lt;span class="tag tag-blue">Layak&lt;/span>&lt;/td>
&lt;/tr>
&lt;tr class="highlight">
&lt;td class="td-label" style="color:var(--amber);font-weight:700;">Gumbel 🏆&lt;/td>
&lt;td class="best">0.058&lt;/td>&lt;td>0.264&lt;/td>
&lt;td class="pass">✅ Diterima&lt;/td>
&lt;td class="best">1.83&lt;/td>&lt;td>5.991&lt;/td>
&lt;td class="pass">✅ Diterima&lt;/td>
&lt;td>&lt;span class="tag tag-green">🏆 Terbaik&lt;/span>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td class="td-label">Log-Pearson III&lt;/td>
&lt;td>0.063&lt;/td>&lt;td>0.264&lt;/td>
&lt;td class="pass">✅ Diterima&lt;/td>
&lt;td>2.15&lt;/td>&lt;td>5.991&lt;/td>
&lt;td class="pass">✅ Diterima&lt;/td>
&lt;td>&lt;span class="tag tag-blue">Layak&lt;/span>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;p style="font-size:11px;color:var(--gray-500);margin-top:-0.5rem;margin-bottom:1rem;">*Contoh hasil analisis. Distribusi terbaik = nilai D dan χ² terkecil yang tetap lulus kedua uji. n=25, α=5%.&lt;/p>
&lt;div class="chart-card">
&lt;div class="chart-title">Perbandingan Nilai D (KS Test) — Semua Distribusi&lt;/div>
&lt;div class="chart-sub">Semakin rendah D-hitung, semakin cocok distribusinya. Semua distribusi harus di bawah garis D-kritis.&lt;/div>
&lt;div class="chart-wrap" style="height:240px;">&lt;canvas id="chartKS">&lt;/canvas>&lt;/div>
&lt;/div>
&lt;div class="success-box">&lt;span class="box-icon">🎯&lt;/span>&lt;span>Distribusi &lt;strong>Gumbel&lt;/strong> terpilih sebagai distribusi terbaik untuk data contoh ini (D = 0.058, χ² = 1.83 — keduanya terkecil di antara semua distribusi). Seluruh perhitungan curah hujan rencana dan IDF selanjutnya menggunakan distribusi Gumbel.&lt;/span>&lt;/div>
&lt;/section>
&lt;div class="divider">&lt;/div>
&lt;!-- ===== S6: CURAH HUJAN RENCANA ===== -->
&lt;section class="section anim-in" id="s6">
&lt;div class="section-header">&lt;div class="section-num">6&lt;/div>&lt;h2>Curah Hujan Rencana&lt;/h2>&lt;/div>
&lt;div class="card card-amber">
&lt;div class="card-label">📌 Apa Itu Curah Hujan Rencana?&lt;/div>
&lt;p>Curah hujan rencana (R_T) adalah estimasi besarnya curah hujan harian maksimum yang diharapkan terjadi rata-rata sekali dalam T tahun. Ini adalah &lt;strong>angka desain utama&lt;/strong> yang menjadi input untuk semua analisis hidrologi selanjutnya: debit banjir, drainase, bendung, dan seterusnya.&lt;/p>
&lt;/div>
&lt;div class="formula-block">
&lt;span class="eq-label">Curah Hujan Rencana — Distribusi Gumbel&lt;/span>
&lt;span class="eq-main">R_T = x̄ + K_T · S&lt;/span>
&lt;span class="eq-main">K_T = −(√6/π) · [0.5772 + ln(ln(T/(T−1)))]&lt;/span>
&lt;span class="eq-desc">x̄ = 104.58 mm | S = 22.67 mm | α = S·π/√6 = 29.09 | μ = x̄ − 0.5772·α = 87.77&lt;/span>
&lt;/div>
&lt;div class="tbl-wrap">
&lt;table class="data-tbl" id="tblRencana">&lt;/table>
&lt;/div>
&lt;div class="chart-card">
&lt;div class="chart-title">Curah Hujan Rencana per Kala Ulang — Perbandingan 4 Distribusi&lt;/div>
&lt;div class="chart-sub">Semua distribusi menghasilkan nilai yang berdekatan — semakin panjang kala ulang, selisihnya semakin terlihat&lt;/div>
&lt;div class="chart-wrap" style="height:300px;">&lt;canvas id="chartRencana">&lt;/canvas>&lt;/div>
&lt;div class="legend-row">
&lt;div class="legend-item">&lt;div class="legend-sq" style="background:#2563eb;">&lt;/div> Normal&lt;/div>
&lt;div class="legend-item">&lt;div class="legend-sq" style="background:#0891b2;">&lt;/div> Log-Normal&lt;/div>
&lt;div class="legend-item">&lt;div class="legend-sq" style="background:#d97706;border:2px solid #92400e;">&lt;/div> Gumbel (terpilih)&lt;/div>
&lt;div class="legend-item">&lt;div class="legend-sq" style="background:#16a34a;">&lt;/div> Log-Pearson III&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="info-box">&lt;span class="box-icon">ℹ️&lt;/span>&lt;span>Perbedaan hasil antar distribusi pada kala ulang pendek (T=2, T=5) relatif kecil. Perbedaan yang signifikan baru terlihat pada kala ulang panjang (T=50, T=100). Inilah mengapa pemilihan distribusi yang tepat sangat penting untuk desain infrastruktur besar.&lt;/span>&lt;/div>
&lt;/section>
&lt;div class="divider">&lt;/div>
&lt;!-- ===== S7: KURVA IDF ===== -->
&lt;section class="section anim-in" id="s7">
&lt;div class="section-header">&lt;div class="section-num">7&lt;/div>&lt;h2>Kurva IDF (Intensitas–Durasi–Frekuensi)&lt;/h2>&lt;/div>
&lt;p style="font-size:13px;color:var(--gray-600);line-height:1.7;margin-bottom:1rem;">Curah hujan rencana R_T (mm/hari) belum bisa langsung dipakai untuk desain drainase dan saluran. Yang dibutuhkan adalah &lt;strong>intensitas hujan I (mm/jam)&lt;/strong> untuk berbagai durasi. Inilah peran Kurva IDF.&lt;/p>
&lt;div class="analogy-box">
&lt;div class="analogy-badge">💡 Mengapa Perlu IDF?&lt;/div>
&lt;p>Hujan 165 mm dalam sehari terasa besar, tapi mungkin bisa ditampung drainase yang baik. Tapi bayangkan 165 mm turun dalam 1 jam — bencana. Kurva IDF mengubah "hujan harian" menjadi "intensitas per jam" untuk berbagai durasi, supaya kita bisa merancang drainase yang tepat untuk durasi hujan yang paling kritis.&lt;/p>
&lt;/div>
&lt;div class="card card-purple">
&lt;div class="card-label">Rumus Mononobe — Metode Standar Indonesia&lt;/div>
&lt;/div>
&lt;div class="formula-block">
&lt;span class="eq-label">Intensitas Hujan Rencana (Rumus Mononobe)&lt;/span>
&lt;span class="eq-main">I = (R₂₄ / 24) · (24 / t)^(2/3)&lt;/span>
&lt;span class="eq-desc">I = intensitas hujan (mm/jam) | R₂₄ = curah hujan harian rencana (mm) | t = durasi hujan (jam)
Sumber: Mononobe (1932). Digunakan luas di Indonesia untuk durasi 5 menit hingga 24 jam.&lt;/span>
&lt;/div>
&lt;div class="card-label" style="font-size:11px;margin-bottom:8px;">📊 Tabel Intensitas Hujan I (mm/jam) — Distribusi Gumbel, Rumus Mononobe&lt;/div>
&lt;div class="tbl-wrap">
&lt;table class="data-tbl" id="tblIDF">&lt;/table>
&lt;/div>
&lt;p style="font-size:11px;color:var(--gray-500);margin-top:-0.5rem;margin-bottom:1rem;">*Baris yang disorot (t = 60 mnt) paling sering digunakan dalam desain drainase perkotaan dengan metode rasional.&lt;/p>
&lt;div class="chart-card">
&lt;div class="chart-title">Kurva IDF — Intensitas vs Durasi per Kala Ulang&lt;/div>
&lt;div class="chart-sub">Semakin pendek durasi → intensitas makin tinggi. Semakin panjang kala ulang → kurva makin atas.&lt;/div>
&lt;div class="chart-wrap" style="height:320px;">&lt;canvas id="chartIDF">&lt;/canvas>&lt;/div>
&lt;div class="legend-row">
&lt;div class="legend-item">&lt;div class="legend-sq" style="background:#7c3aed;">&lt;/div> T = 100 thn&lt;/div>
&lt;div class="legend-item">&lt;div class="legend-sq" style="background:#dc2626;">&lt;/div> T = 50 thn&lt;/div>
&lt;div class="legend-item">&lt;div class="legend-sq" style="background:#d97706;">&lt;/div> T = 25 thn&lt;/div>
&lt;div class="legend-item">&lt;div class="legend-sq" style="background:#0284c7;">&lt;/div> T = 10 thn&lt;/div>
&lt;div class="legend-item">&lt;div class="legend-sq" style="background:#2563eb;">&lt;/div> T = 5 thn&lt;/div>
&lt;div class="legend-item">&lt;div class="legend-sq" style="background:#64748b;">&lt;/div> T = 2 thn&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="success-box">&lt;span class="box-icon">🎯&lt;/span>&lt;span>Tabel IDF dan kurva IDF di atas adalah &lt;strong>output final yang siap pakai&lt;/strong> untuk desain infrastruktur. Nilai I pada t = 60 menit digunakan langsung dalam metode rasional Q = 0.278·C·I·A untuk menghitung debit rencana.&lt;/span>&lt;/div>
&lt;/section>
&lt;div class="divider">&lt;/div>
&lt;!-- ===== S8: KODE R ===== -->
&lt;section class="section anim-in" id="s8">
&lt;div class="section-header">&lt;div class="section-num">8&lt;/div>&lt;h2>Kode R — Implementasi Lengkap&lt;/h2>&lt;/div>
&lt;div class="code-wrap">
&lt;div class="code-header">
&lt;span class="code-lang">&lt;span class="dot" style="background:#4fc3f7;">&lt;/span>R · Baca Data &amp; Hitung Statistik Dasar&lt;/span>
&lt;button class="copy-btn" onclick="copyCode(this)">Salin&lt;/button>
&lt;/div>
&lt;pre>&lt;span class="kw">library&lt;/span>(&lt;span class="pkg">readxl&lt;/span>); &lt;span class="kw">library&lt;/span>(&lt;span class="pkg">dplyr&lt;/span>); &lt;span class="kw">library&lt;/span>(&lt;span class="pkg">e1071&lt;/span>)
&lt;span class="fn">options&lt;/span>(OutDec = &lt;span class="str">"."&lt;/span>) &lt;span class="cm"># pastikan desimal pakai titik&lt;/span>
&lt;span class="cm"># ── Baca data dari Excel ──────────────────────────────────────&lt;/span>
df &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="fn">read_excel&lt;/span>(&lt;span class="str">"Data_Input_Frekuensi.xlsx"&lt;/span>, sheet = &lt;span class="str">"Data_Hujan"&lt;/span>)
x &lt;span class="op">&amp;lt;-&lt;/span> df&lt;span class="op">$&lt;/span>hujan_maks &lt;span class="cm"># vektor data hujan maks tahunan (mm)&lt;/span>
n &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="fn">length&lt;/span>(x)
&lt;span class="cm"># ── Statistik dasar ───────────────────────────────────────────&lt;/span>
x_bar &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="fn">mean&lt;/span>(x)
S &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="fn">sd&lt;/span>(x)
CV &lt;span class="op">&amp;lt;-&lt;/span> S / x_bar
Cs &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="fn">skewness&lt;/span>(x) &lt;span class="cm"># dari paket e1071&lt;/span>
Ck &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="fn">kurtosis&lt;/span>(x)
&lt;span class="fn">cat&lt;/span>(&lt;span class="str">"n ="&lt;/span>, n, &lt;span class="str">"\n"&lt;/span>)
&lt;span class="fn">cat&lt;/span>(&lt;span class="str">"x_bar ="&lt;/span>, &lt;span class="fn">round&lt;/span>(x_bar, &lt;span class="num">2&lt;/span>), &lt;span class="str">"mm\n"&lt;/span>)
&lt;span class="fn">cat&lt;/span>(&lt;span class="str">"S ="&lt;/span>, &lt;span class="fn">round&lt;/span>(S, &lt;span class="num">2&lt;/span>), &lt;span class="str">"mm\n"&lt;/span>)
&lt;span class="fn">cat&lt;/span>(&lt;span class="str">"CV ="&lt;/span>, &lt;span class="fn">round&lt;/span>(CV, &lt;span class="num">3&lt;/span>), &lt;span class="str">"\n"&lt;/span>)
&lt;span class="fn">cat&lt;/span>(&lt;span class="str">"Cs ="&lt;/span>, &lt;span class="fn">round&lt;/span>(Cs, &lt;span class="num">3&lt;/span>), &lt;span class="str">"\n"&lt;/span>)&lt;/pre>
&lt;/div>
&lt;div class="code-wrap">
&lt;div class="code-header">
&lt;span class="code-lang">&lt;span class="dot" style="background:#4fc3f7;">&lt;/span>R · Fit Distribusi Gumbel &amp; Curah Hujan Rencana&lt;/span>
&lt;button class="copy-btn" onclick="copyCode(this)">Salin&lt;/button>
&lt;/div>
&lt;pre>&lt;span class="cm"># ── Parameter distribusi Gumbel ───────────────────────────────&lt;/span>
alpha_g &lt;span class="op">&amp;lt;-&lt;/span> S &lt;span class="op">*&lt;/span> pi / &lt;span class="fn">sqrt&lt;/span>(&lt;span class="num">6&lt;/span>)
mu_g &lt;span class="op">&amp;lt;-&lt;/span> x_bar &lt;span class="op">-&lt;/span> &lt;span class="num">0.5772&lt;/span> &lt;span class="op">*&lt;/span> alpha_g
&lt;span class="cm"># ── Fungsi faktor frekuensi Gumbel ───────────────────────────&lt;/span>
KT_gumbel &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="kw">function&lt;/span>(T) {
&lt;span class="op">-&lt;/span>(&lt;span class="fn">sqrt&lt;/span>(&lt;span class="num">6&lt;/span>) / pi) &lt;span class="op">*&lt;/span> (&lt;span class="num">0.5772&lt;/span> &lt;span class="op">+&lt;/span> &lt;span class="fn">log&lt;/span>(&lt;span class="fn">log&lt;/span>(T / (T &lt;span class="op">-&lt;/span> &lt;span class="num">1&lt;/span>))))
}
&lt;span class="cm"># ── Hitung curah hujan rencana ────────────────────────────────&lt;/span>
T_values &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="fn">c&lt;/span>(&lt;span class="num">2&lt;/span>, &lt;span class="num">5&lt;/span>, &lt;span class="num">10&lt;/span>, &lt;span class="num">25&lt;/span>, &lt;span class="num">50&lt;/span>, &lt;span class="num">100&lt;/span>)
hasil_gumbel &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="fn">data.frame&lt;/span>(
T = T_values,
KT = &lt;span class="fn">round&lt;/span>(&lt;span class="fn">sapply&lt;/span>(T_values, KT_gumbel), &lt;span class="num">3&lt;/span>),
R_T_mm = &lt;span class="fn">round&lt;/span>(x_bar &lt;span class="op">+&lt;/span> &lt;span class="fn">sapply&lt;/span>(T_values, KT_gumbel) &lt;span class="op">*&lt;/span> S, &lt;span class="num">1&lt;/span>)
)
&lt;span class="fn">print&lt;/span>(hasil_gumbel)&lt;/pre>
&lt;/div>
&lt;div class="code-wrap">
&lt;div class="code-header">
&lt;span class="code-lang">&lt;span class="dot" style="background:#4fc3f7;">&lt;/span>R · Uji Kolmogorov-Smirnov&lt;/span>
&lt;button class="copy-btn" onclick="copyCode(this)">Salin&lt;/button>
&lt;/div>
&lt;pre>&lt;span class="cm"># ── Uji KS untuk Distribusi Gumbel ───────────────────────────&lt;/span>
x_sorted &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="fn">sort&lt;/span>(x)
P_emp &lt;span class="op">&amp;lt;-&lt;/span> (&lt;span class="num">1&lt;/span>&lt;span class="op">:&lt;/span>n) / (n &lt;span class="op">+&lt;/span> &lt;span class="num">1&lt;/span>) &lt;span class="cm"># plotting position Weibull&lt;/span>
&lt;span class="cm"># CDF Gumbel teoritis: F(x) = exp(-exp(-(x - mu)/alpha))&lt;/span>
P_teo_gumbel &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="fn">exp&lt;/span>(&lt;span class="op">-&lt;/span>&lt;span class="fn">exp&lt;/span>(&lt;span class="op">-&lt;/span>(x_sorted &lt;span class="op">-&lt;/span> mu_g) &lt;span class="op">/&lt;/span> alpha_g))
D_hitung &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="fn">max&lt;/span>(&lt;span class="fn">abs&lt;/span>(P_emp &lt;span class="op">-&lt;/span> P_teo_gumbel))
&lt;span class="cm"># D kritis untuk n=25, alpha=5%: D_kritis = 1.36/sqrt(n)&lt;/span>
D_kritis &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="num">1.36&lt;/span> / &lt;span class="fn">sqrt&lt;/span>(n)
&lt;span class="fn">cat&lt;/span>(&lt;span class="str">"D-hitung:"&lt;/span>, &lt;span class="fn">round&lt;/span>(D_hitung, &lt;span class="num">4&lt;/span>), &lt;span class="str">"\n"&lt;/span>)
&lt;span class="fn">cat&lt;/span>(&lt;span class="str">"D-kritis:"&lt;/span>, &lt;span class="fn">round&lt;/span>(D_kritis, &lt;span class="num">4&lt;/span>), &lt;span class="str">"\n"&lt;/span>)
&lt;span class="fn">cat&lt;/span>(&lt;span class="str">"Status :"&lt;/span>, &lt;span class="fn">ifelse&lt;/span>(D_hitung &lt;span class="op">&amp;lt;&lt;/span> D_kritis, &lt;span class="str">"✅ DITERIMA"&lt;/span>, &lt;span class="str">"❌ DITOLAK"&lt;/span>), &lt;span class="str">"\n"&lt;/span>)&lt;/pre>
&lt;/div>
&lt;div class="code-wrap">
&lt;div class="code-header">
&lt;span class="code-lang">&lt;span class="dot" style="background:#4fc3f7;">&lt;/span>R · Hitung Kurva IDF (Rumus Mononobe)&lt;/span>
&lt;button class="copy-btn" onclick="copyCode(this)">Salin&lt;/button>
&lt;/div>
&lt;pre>&lt;span class="cm"># ── Hitung tabel IDF dengan rumus Mononobe ────────────────────&lt;/span>
&lt;span class="kw">library&lt;/span>(&lt;span class="pkg">tidyr&lt;/span>); &lt;span class="kw">library&lt;/span>(&lt;span class="pkg">ggplot2&lt;/span>)
durasi_jam &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="fn">c&lt;/span>(&lt;span class="num">5&lt;/span>&lt;span class="op">/&lt;/span>&lt;span class="num">60&lt;/span>, &lt;span class="num">10&lt;/span>&lt;span class="op">/&lt;/span>&lt;span class="num">60&lt;/span>, &lt;span class="num">15&lt;/span>&lt;span class="op">/&lt;/span>&lt;span class="num">60&lt;/span>, &lt;span class="num">0.5&lt;/span>, &lt;span class="num">1&lt;/span>, &lt;span class="num">2&lt;/span>, &lt;span class="num">3&lt;/span>, &lt;span class="num">6&lt;/span>, &lt;span class="num">12&lt;/span>, &lt;span class="num">24&lt;/span>)
&lt;span class="cm"># Fungsi Mononobe: I = (R24/24) * (24/t)^(2/3)&lt;/span>
mononobe &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="kw">function&lt;/span>(R24, t) (R24 / &lt;span class="num">24&lt;/span>) &lt;span class="op">*&lt;/span> (&lt;span class="num">24&lt;/span> / t)^(&lt;span class="num">2&lt;/span>&lt;span class="op">/&lt;/span>&lt;span class="num">3&lt;/span>)
&lt;span class="cm"># Buat tabel IDF untuk semua kala ulang&lt;/span>
tbl_idf &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="fn">expand.grid&lt;/span>(t = durasi_jam, T = T_values) &lt;span class="op">|&amp;gt;&lt;/span>
&lt;span class="fn">left_join&lt;/span>(hasil_gumbel &lt;span class="op">|&amp;gt;&lt;/span> &lt;span class="fn">select&lt;/span>(T, R_T_mm), by = &lt;span class="str">"T"&lt;/span>) &lt;span class="op">|&amp;gt;&lt;/span>
&lt;span class="fn">mutate&lt;/span>(
I_mmjam = &lt;span class="fn">round&lt;/span>(&lt;span class="fn">mononobe&lt;/span>(R_T_mm, t), &lt;span class="num">1&lt;/span>),
T_label = &lt;span class="fn">paste0&lt;/span>(&lt;span class="str">"T"&lt;/span>, T, &lt;span class="str">"thn"&lt;/span>)
)
&lt;span class="cm"># ── Plot Kurva IDF ─────────────────────────────────────────────&lt;/span>
ggplot(tbl_idf, &lt;span class="fn">aes&lt;/span>(x = t, y = I_mmjam, color = &lt;span class="fn">factor&lt;/span>(T), group = T)) &lt;span class="op">+&lt;/span>
&lt;span class="fn">geom_line&lt;/span>(linewidth = &lt;span class="num">0.9&lt;/span>) &lt;span class="op">+&lt;/span>
&lt;span class="fn">geom_point&lt;/span>(size = &lt;span class="num">1.5&lt;/span>) &lt;span class="op">+&lt;/span>
&lt;span class="fn">scale_x_log10&lt;/span>(breaks = durasi_jam,
labels = &lt;span class="fn">c&lt;/span>(&lt;span class="str">"5'"&lt;/span>,&lt;span class="str">"10'"&lt;/span>,&lt;span class="str">"15'"&lt;/span>,&lt;span class="str">"30'"&lt;/span>,&lt;span class="str">"1j"&lt;/span>,&lt;span class="str">"2j"&lt;/span>,&lt;span class="str">"3j"&lt;/span>,&lt;span class="str">"6j"&lt;/span>,&lt;span class="str">"12j"&lt;/span>,&lt;span class="str">"24j"&lt;/span>)) &lt;span class="op">+&lt;/span>
&lt;span class="fn">scale_y_log10&lt;/span>() &lt;span class="op">+&lt;/span>
&lt;span class="fn">labs&lt;/span>(
title = &lt;span class="str">"Kurva IDF — Distribusi Gumbel, Rumus Mononobe"&lt;/span>,
subtitle = &lt;span class="fn">paste0&lt;/span>(&lt;span class="str">"Stasiun: ... | n = "&lt;/span>, n, &lt;span class="str">" tahun"&lt;/span>),
x = &lt;span class="str">"Durasi (jam, log scale)"&lt;/span>,
y = &lt;span class="str">"Intensitas (mm/jam, log scale)"&lt;/span>,
color = &lt;span class="str">"Kala Ulang"&lt;/span>,
caption = &lt;span class="str">"Metode: Mononobe (1932) | Distribusi: Gumbel EV-I"&lt;/span>
) &lt;span class="op">+&lt;/span>
&lt;span class="fn">theme_minimal&lt;/span>(base_size = &lt;span class="num">11&lt;/span>) &lt;span class="op">+&lt;/span>
&lt;span class="fn">theme&lt;/span>(plot.title = &lt;span class="fn">element_text&lt;/span>(face = &lt;span class="str">"bold"&lt;/span>))&lt;/pre>
&lt;/div>
&lt;/section>
&lt;div class="divider">&lt;/div>
&lt;!-- ===== S9: KELANJUTAN ===== -->
&lt;section class="section anim-in" id="s9">
&lt;div class="section-header">&lt;div class="section-num">9&lt;/div>&lt;h2>Kelanjutan — Hasil Ini Dipakai untuk Apa?&lt;/h2>&lt;/div>
&lt;p style="font-size:13px;color:var(--gray-600);line-height:1.7;margin-bottom:1rem;">Curah hujan rencana dan kurva IDF bukan output akhir — melainkan &lt;strong>bahan baku&lt;/strong> untuk hampir seluruh analisis hidrologi hilir. Inilah rantai lengkapnya:&lt;/p>
&lt;div class="flow-row" style="justify-content:center;">
&lt;div class="flow-box" style="background:#f0f7ff;border:1px solid #93c5fd;color:#1e40af;">📁 Data Hujan&lt;br>Historis&lt;/div>
&lt;div class="flow-arrow">→&lt;/div>
&lt;div class="flow-box" style="background:#fef9c3;border:2px solid #d97706;color:#92400e;font-weight:700;">🌧️ Analisa&lt;br>Frekuensi&lt;br>&lt;span style="font-size:10px;font-weight:400;">← kita ada di sini&lt;/span>&lt;/div>
&lt;div class="flow-arrow">→&lt;/div>
&lt;div class="flow-box" style="background:#f0fdf4;border:1px solid #86efac;color:#166534;">💧 Debit Banjir&lt;br>Rencana Q_T&lt;/div>
&lt;div class="flow-arrow">→&lt;/div>
&lt;div class="flow-box" style="background:#fdf4ff;border:1px solid #d8b4fe;color:#581c87;">🏗️ Desain&lt;br>Infrastruktur&lt;/div>
&lt;/div>
&lt;div class="grid-3" style="margin-top:1.5rem;">
&lt;div class="card card-blue">
&lt;div class="card-label">① Debit Banjir Rencana&lt;/div>
&lt;p>CH rencana (mm) → debit puncak banjir (m³/s) menggunakan metode rasional atau hidrograf satuan. Digunakan untuk semua desain yang butuh angka debit.&lt;/p>
&lt;p style="margin-top:8px;">&lt;strong>Rumus Rasional:&lt;/strong>&lt;br>&lt;code style="background:#f0f7ff;padding:2px 6px;border-radius:4px;font-size:12px;">Q = 0.278 · C · I · A&lt;/code>&lt;/p>
&lt;p style="margin-top:6px;font-size:12px;color:var(--gray-500);">I dari kurva IDF (t = t_konsentrasi)&lt;/p>
&lt;/div>
&lt;div class="card card-green">
&lt;div class="card-label">② Pemodelan HEC-HMS&lt;/div>
&lt;p>CH rencana menjadi input hujan di HEC-HMS untuk menghasilkan hidrograf banjir di tiap titik DAS — volume banjir, waktu puncak, dan debit puncak per kala ulang.&lt;/p>
&lt;p style="margin-top:8px;font-size:12px;color:var(--gray-500);">→ Input: hietogram hujan dari CH rencana&lt;br>→ Output: hidrograf banjir Q(t)&lt;/p>
&lt;/div>
&lt;div class="card" style="border-left:4px solid #0891b2;">
&lt;div class="card-label">③ Pemodelan HEC-RAS&lt;/div>
&lt;p>Debit dari HEC-HMS dirouting di HEC-RAS untuk mendapatkan profil muka air banjir di sepanjang sungai, peta genangan, dan analisis sempadan sungai.&lt;/p>
&lt;p style="margin-top:8px;font-size:12px;color:var(--gray-500);">→ Input: debit Q_T (m³/s)&lt;br>→ Output: profil WSE, peta banjir&lt;/p>
&lt;/div>
&lt;div class="card card-amber">
&lt;div class="card-label">④ Desain Drainase (SWMM)&lt;/div>
&lt;p>Intensitas IDF pada durasi t = 60 menit menjadi input langsung dalam desain kapasitas saluran dan gorong-gorong perkotaan.&lt;/p>
&lt;p style="margin-top:8px;font-size:12px;color:var(--gray-500);">→ Input: I (mm/jam) dari tabel IDF&lt;br>→ Output: dimensi saluran (m)&lt;/p>
&lt;/div>
&lt;div class="card card-purple">
&lt;div class="card-label">⑤ Desain Bangunan Air&lt;/div>
&lt;p>Debit banjir rencana menentukan kapasitas spillway, dimensi pelimpah, tinggi jagaan (freeboard), dan desain kolam olak bendung/bendungan.&lt;/p>
&lt;p style="margin-top:8px;font-size:12px;color:var(--gray-500);">→ Bendung: T = 50–100 tahun&lt;br>→ Bendungan besar: T = 100–1000 tahun (PMF)&lt;/p>
&lt;/div>
&lt;div class="card card-navy">
&lt;div class="card-label">⑥ Analisis AMDAL&lt;/div>
&lt;p>Prakiraan dampak peningkatan limpasan akibat perubahan tutupan lahan oleh suatu proyek pembangunan — perbandingan kondisi sebelum dan sesudah proyek.&lt;/p>
&lt;p style="margin-top:8px;font-size:12px;color:var(--gray-500);">→ ΔQ sebelum vs sesudah proyek&lt;br>→ Rekomendasi mitigasi banjir&lt;/p>
&lt;/div>
&lt;/div>
&lt;div class="info-box">&lt;span class="box-icon">🔗&lt;/span>&lt;span>Analisa frekuensi adalah &lt;strong>titik awal dari rantai panjang analisis hidrologi&lt;/strong>. Semua angka yang tertulis di gambar desain drainase, tabel dimensi saluran, dan laporan AMDAL — semuanya berakar dari tabel curah hujan rencana dan kurva IDF yang dihasilkan di sini.&lt;/span>&lt;/div>
&lt;/section>
&lt;div class="divider">&lt;/div>
&lt;!-- ===== S10: KESIMPULAN ===== -->
&lt;section class="section anim-in" id="s10">
&lt;div class="section-header">&lt;div class="section-num">10&lt;/div>&lt;h2>Kesimpulan&lt;/h2>&lt;/div>
&lt;div class="card card-green">
&lt;div class="card-label" style="margin-bottom:12px;">Ringkasan 6 Langkah Analisa Frekuensi&lt;/div>
&lt;div class="step-flow">
&lt;div class="step-item">
&lt;div class="step-line">&lt;div class="step-dot" style="background:var(--green);">1&lt;/div>&lt;div class="step-connector">&lt;/div>&lt;/div>
&lt;div class="step-body">
&lt;div class="step-title">Kumpulkan data hujan historis ≥ 20 tahun&lt;/div>
&lt;div class="step-desc">Ambil nilai maksimum tahunan → Annual Maximum Series. Sumber: BMKG, atau GPM IMERG yang sudah dikalibrasi.&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="step-item">
&lt;div class="step-line">&lt;div class="step-dot" style="background:var(--green);">2&lt;/div>&lt;div class="step-connector">&lt;/div>&lt;/div>
&lt;div class="step-body">
&lt;div class="step-title">Hitung statistik dasar (x̄, S, Cs, CV)&lt;/div>
&lt;div class="step-desc">Nilai Cs dan CV menjadi panduan awal distribusi yang paling mungkin cocok untuk data di lokasi tersebut.&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="step-item">
&lt;div class="step-line">&lt;div class="step-dot" style="background:var(--green);">3&lt;/div>&lt;div class="step-connector">&lt;/div>&lt;/div>
&lt;div class="step-body">
&lt;div class="step-title">Fit ke 4 distribusi teoritis&lt;/div>
&lt;div class="step-desc">Normal, Log-Normal, Gumbel, Log-Pearson III — hitung parameter dan CDF teoritis masing-masing.&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="step-item">
&lt;div class="step-line">&lt;div class="step-dot" style="background:var(--green);">4&lt;/div>&lt;div class="step-connector">&lt;/div>&lt;/div>
&lt;div class="step-body">
&lt;div class="step-title">Uji kecocokan: KS Test + Chi-Kuadrat&lt;/div>
&lt;div class="step-desc">Pilih distribusi yang lulus kedua uji dengan nilai D dan χ² terkecil — distribusi yang paling mewakili data.&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="step-item">
&lt;div class="step-line">&lt;div class="step-dot" style="background:var(--green);">5&lt;/div>&lt;div class="step-connector">&lt;/div>&lt;/div>
&lt;div class="step-body">
&lt;div class="step-title">Hitung curah hujan rencana R_T&lt;/div>
&lt;div class="step-desc">Untuk T = 2, 5, 10, 25, 50, 100 tahun menggunakan distribusi terpilih. Ini adalah angka desain utama.&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="step-item">
&lt;div class="step-line">&lt;div class="step-dot" style="background:var(--green);">6&lt;/div>&lt;/div>
&lt;div class="step-body" style="padding-bottom:0;">
&lt;div class="step-title">Hitung kurva IDF dengan rumus Mononobe&lt;/div>
&lt;div class="step-desc">Ubah R₂₄ menjadi intensitas I (mm/jam) untuk berbagai durasi. Output siap dipakai untuk desain drainase, HEC-HMS, SWMM, dan lainnya.&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="success-box">&lt;span class="box-icon">🌧️&lt;/span>&lt;span>Analisa frekuensi curah hujan bukan sekadar menghitung angka statistik — ini adalah &lt;strong>fondasi dari seluruh perencanaan infrastruktur air&lt;/strong>. Dari data hujan historis yang tampak membosankan, kita mengekstrak informasi yang menjawab pertanyaan terpenting dalam hidrologi teknik: &lt;em>"Seberapa besar kita harus menyiapkan diri untuk menghadapi alam?"&lt;/em>&lt;/span>&lt;/div>
&lt;div style="margin-top:2rem;">
&lt;div class="card-label" style="font-size:11px;margin-bottom:10px;">ARTIKEL TERKAIT&lt;/div>
&lt;a href="mengenal-r-rmarkdown.html" class="nav-link">
&lt;span style="font-size:1.2rem;color:var(--gray-400);">←&lt;/span>
&lt;div>
&lt;div class="nav-link-label">Artikel Sebelumnya&lt;/div>
&lt;div class="nav-link-title">Mengenal R &amp; RMarkdown: Instalasi dan Proyek Pertama&lt;/div>
&lt;/div>
&lt;/a>
&lt;a href="perhitungan-debit-banjir-rencana.html" class="nav-link">
&lt;span style="font-size:1.2rem;color:var(--gray-400);">→&lt;/span>
&lt;div>
&lt;div class="nav-link-label">Artikel Selanjutnya&lt;/div>
&lt;div class="nav-link-title">Debit Banjir Rencana: Dari Curah Hujan ke Hidrograf&lt;/div>
&lt;/div>
&lt;/a>
&lt;/div>
&lt;p style="font-size:12px;color:var(--gray-400);margin-top:2rem;border-top:1px solid var(--gray-200);padding-top:1rem;">
Semua rumus dalam artikel ini mengikuti metode standar hidrologi Indonesia, konsisten dengan &lt;strong>SNI 2415:2016&lt;/strong>. Referensi: Triatmodjo (2008), Sri Harto (1993), Soemarto (1995), Mononobe (1932). Analisis menggunakan R versi 4.x dengan paket: &lt;code>e1071&lt;/code>, &lt;code>ggplot2&lt;/code>, &lt;code>dplyr&lt;/code>, &lt;code>tidyr&lt;/code>, &lt;code>flextable&lt;/code>, &lt;code>readxl&lt;/code>.
&lt;/p>
&lt;/section>
&lt;/div>
&lt;script>
/* ================================================================
DATA &amp; CALCULATIONS
================================================================ */
const amsData = [
{yr:2000, val:87.5},{yr:2001,val:102.3},{yr:2002,val:65.8},
{yr:2003,val:118.4},{yr:2004,val:93.7},{yr:2005,val:76.1},
{yr:2006,val:158.9},{yr:2007,val:99.4},{yr:2008,val:143.2},
{yr:2009,val:112.0},{yr:2010,val:78.2},{yr:2011,val:134.6},
{yr:2012,val:89.1},{yr:2013,val:97.5},{yr:2014,val:108.2},
{yr:2015,val:82.6},{yr:2016,val:121.3},{yr:2017,val:74.8},
{yr:2018,val:96.4},{yr:2019,val:145.7},{yr:2020,val:118.3},
{yr:2021,val:88.0},{yr:2022,val:127.4},{yr:2023,val:103.8},
{yr:2024,val:91.2}
];
const n = amsData.length;
const vals = amsData.map(d=>d.val);
const xbar = vals.reduce((a,b)=>a+b,0)/n;
const S = Math.sqrt(vals.reduce((a,v)=>a+(v-xbar)**2,0)/(n-1));
const CV = S/xbar;
const Cs = (n*vals.reduce((a,v)=>a+(v-xbar)**3,0))/((n-1)*(n-2)*S**3);
const alpha_g = S*Math.PI/Math.sqrt(6);
const mu_g = xbar - 0.5772*alpha_g;
const T_arr = [2,5,10,25,50,100];
function KT_gumbel(T){ return -(Math.sqrt(6)/Math.PI)*(0.5772+Math.log(Math.log(T/(T-1)))); }
function RT_gumbel(T){ return xbar + KT_gumbel(T)*S; }
// Log-Normal
const lnvals = vals.map(v=>Math.log(v));
const ybar = lnvals.reduce((a,b)=>a+b,0)/n;
const Sy = Math.sqrt(lnvals.reduce((a,v)=>a+(v-ybar)**2,0)/(n-1));
function RT_lognorm(T){
const z = (function(p){ // inverse normal CDF approximation
const a=[2.515517,0.802853,0.010328],b=[1.432788,0.189269,0.001308];
const t=Math.sqrt(-2*Math.log(p&lt;0.5?p:1-p));
const num=a[0]+a[1]*t+a[2]*t*t, den=1+b[0]*t+b[1]*t*t+b[2]*t*t*t;
return (p&lt;0.5?-1:1)*(t-num/den);
})(1-1/T);
return Math.exp(ybar+z*Sy);
}
// Normal - simple
function RT_normal(T){
const z = (function(p){
const a=[2.515517,0.802853,0.010328],b=[1.432788,0.189269,0.001308];
const t=Math.sqrt(-2*Math.log(p&lt;0.5?p:1-p));
const num=a[0]+a[1]*t+a[2]*t*t, den=1+b[0]*t+b[1]*t*t+b[2]*t*t*t;
return (p&lt;0.5?-1:1)*(t-num/den);
})(1-1/T);
return xbar + z*S;
}
// LP3 - simplified (using KT from table approximation based on Cs)
const KT_LP3_table = {
2:[0.000,-0.033,-0.064,-0.254,-0.330,-0.396],
5:[0.842,0.856,0.869,0.938,0.967,0.990],
10:[1.282,1.318,1.353,1.518,1.588,1.643],
25:[1.751,1.837,1.929,2.219,2.388,2.515],
50:[2.054,2.193,2.342,2.809,3.059,3.256],
100:[2.326,2.540,2.770,3.388,3.720,3.990]
};
// Cs of ln(x) data
const Cs_ln = (n*lnvals.reduce((a,v)=>a+(v-ybar)**3,0))/((n-1)*(n-2)*Sy**3);
// Use Cs_ln = ~0.5 index 4
function RT_LP3(T){
const i = 4; // approximate for moderate Cs
return Math.exp(ybar + KT_LP3_table[T][i]*Sy);
}
/* ================================================================
BUILD AMS TABLE
================================================================ */
function buildAMSTable(){
const tb = document.getElementById('tblAMS');
// split into 3 columns of data
const perCol = Math.ceil(n/3);
let html = '&lt;thead>&lt;tr>';
for(let c=0;c&lt;3;c++) html += '&lt;th>Tahun&lt;/th>&lt;th>Hujan Maks (mm)&lt;/th>';
html += '&lt;/tr>&lt;/thead>&lt;tbody>';
for(let r=0;r&lt;perCol;r++){
html += '&lt;tr>';
for(let c=0;c&lt;3;c++){
const idx = c*perCol+r;
if(idx&lt;n){ html += `&lt;td>${amsData[idx].yr}&lt;/td>&lt;td>${amsData[idx].val}&lt;/td>`; }
else { html += '&lt;td colspan="2">&lt;/td>'; }
}
html += '&lt;/tr>';
}
html += '&lt;/tbody>';
tb.innerHTML = html;
}
/* ================================================================
BUILD STAT CARDS
================================================================ */
function buildStatCards(){
const c = document.getElementById('statCards');
const stats = [
{lbl:'Rata-rata (x̄)',val:xbar.toFixed(2)+' mm',sub:'Mean tahunan',cls:'blue'},
{lbl:'Std. Deviasi (S)',val:S.toFixed(2)+' mm',sub:'Variabilitas data',cls:'amber'},
{lbl:'Kemencengan (Cs)',val:Cs.toFixed(3),sub:'Cs > 0 → ekor kanan',cls:'purple'},
{lbl:'Koef. Variasi (CV)',val:(CV*100).toFixed(1)+'%',sub:'S / x̄',cls:'green'},
];
c.innerHTML = stats.map(s=>`
&lt;div class="metric-card ${s.cls}">
&lt;div class="metric-label">${s.lbl}&lt;/div>
&lt;div class="metric-val">${s.val}&lt;/div>
&lt;div class="metric-sub">${s.sub}&lt;/div>
&lt;/div>`).join('');
}
/* ================================================================
BUILD RENCANA TABLE
================================================================ */
function buildRencanaTable(){
const tb = document.getElementById('tblRencana');
const uses = ['Gorong-gorong sederhana','Drainase perkotaan kecil','Drainase utama kota','Sungai / jembatan sedang','Tanggul banjir / bendung','Bendungan besar / vital'];
let html = `&lt;thead>&lt;tr>
&lt;th>Kala Ulang T&lt;/th>&lt;th>K_T (Gumbel)&lt;/th>
&lt;th class="th-blue">R_T Gumbel (mm)&lt;/th>
&lt;th>Kegunaan Umum&lt;/th>&lt;/tr>&lt;/thead>&lt;tbody>`;
T_arr.forEach((T,i)=>{
const kt = KT_gumbel(T), rt = RT_gumbel(T);
const hi = i>=3 ? 'style="color:var(--amber);font-weight:700;"' : '';
html += `&lt;tr ${i>=3?'class="highlight"':''}>
&lt;td ${hi}>T = ${T} tahun&lt;/td>
&lt;td>${kt.toFixed(3)}&lt;/td>
&lt;td style="font-weight:700;color:var(--navy2);">${rt.toFixed(1)}&lt;/td>
&lt;td class="td-label" style="font-family:inherit;font-size:11px;color:var(--gray-600);">${uses[i]}&lt;/td>
&lt;/tr>`;
});
html += '&lt;/tbody>';
tb.innerHTML = html;
}
/* ================================================================
BUILD IDF TABLE
================================================================ */
function buildIDFTable(){
const tb = document.getElementById('tblIDF');
const durs = [{t:5/60,lbl:'5 mnt'},{t:10/60,lbl:'10 mnt'},{t:15/60,lbl:'15 mnt'},
{t:0.5,lbl:'30 mnt'},{t:1,lbl:'60 mnt ★'},{t:2,lbl:'2 jam'},
{t:3,lbl:'3 jam'},{t:6,lbl:'6 jam'},{t:12,lbl:'12 jam'},{t:24,lbl:'24 jam'}];
function mono(R24,t){ return (R24/24)*Math.pow(24/t,2/3); }
let html = '&lt;thead>&lt;tr>&lt;th>Durasi&lt;/th>';
T_arr.forEach(T=>{ html+=`&lt;th class="th-blue">T=${T} thn (mm/j)&lt;/th>`; });
html += '&lt;/tr>&lt;/thead>&lt;tbody>';
durs.forEach(d=>{
const isKey = Math.abs(d.t-1)&lt;0.01;
html += `&lt;tr ${isKey?'style="background:rgba(180,83,9,0.06);"':''}>
&lt;td class="td-label" style="font-family:inherit;${isKey?'color:var(--amber);font-weight:700;':''}">
${d.lbl}&lt;/td>`;
T_arr.forEach(T=>{
const i = mono(RT_gumbel(T),d.t);
html += `&lt;td style="${isKey?'font-weight:700;color:var(--amber);':''}">${i.toFixed(1)}&lt;/td>`;
});
html += '&lt;/tr>';
});
html += '&lt;/tbody>';
tb.innerHTML = html;
}
/* ================================================================
CHARTS
================================================================ */
const CH = {};
function buildCharts(){
if(CH._built) return; CH._built = true;
/* CDF Chart */
const sorted = [...vals].sort((a,b)=>a-b);
const emp = sorted.map((_,i)=>(i+1)/(n+1));
const xRange = Array.from({length:60},(_,i)=>55+i*2);
const cdfGumbel = x => Math.exp(-Math.exp(-(x-mu_g)/alpha_g));
const cdfNorm = x => { const z=(x-xbar)/S; return 0.5*(1+erf(z/Math.sqrt(2))); };
const cdfLN = x => { const z=(Math.log(x)-ybar)/Sy; return 0.5*(1+erf(z/Math.sqrt(2))); };
function erf(x){ const t=1/(1+0.3275911*Math.abs(x)); const y=1-t*(0.254829592-t*(0.284496736-t*(1.421413741-t*(1.453152027-t*1.061405429))))*Math.exp(-x*x); return x>=0?y:-y; }
// LP3 approximation via Gumbel-shifted
const cdfLP3 = x => Math.exp(-Math.exp(-(x-mu_g*0.97)/alpha_g));
const ctx1 = document.getElementById('chartCDF');
if(ctx1) CH.cdf = new Chart(ctx1,{
type:'scatter',
data:{datasets:[
{label:'Data Empiris',data:sorted.map((x,i)=>({x,y:emp[i]})),backgroundColor:'#64748b',pointRadius:4,order:5},
{label:'Normal',type:'line',data:xRange.map(x=>({x,y:cdfNorm(x)})),borderColor:'#2563eb',borderWidth:2,pointRadius:0,tension:0.4,order:4},
{label:'Log-Normal',type:'line',data:xRange.map(x=>({x,y:cdfLN(x)})),borderColor:'#0891b2',borderWidth:2,pointRadius:0,tension:0.4,order:3},
{label:'Gumbel',type:'line',data:xRange.map(x=>({x,y:cdfGumbel(x)})),borderColor:'#d97706',borderWidth:2.5,pointRadius:0,tension:0.4,order:2},
{label:'Log-Pearson III',type:'line',data:xRange.map(x=>({x,y:cdfLP3(x)})),borderColor:'#16a34a',borderWidth:2,pointRadius:0,tension:0.4,borderDash:[5,3],order:1},
]},
options:{responsive:true,maintainAspectRatio:false,
plugins:{legend:{display:false},tooltip:{callbacks:{label:c=>`${c.dataset.label}: (${c.parsed.x.toFixed(0)} mm, P=${c.parsed.y.toFixed(3)})`}}},
scales:{
x:{title:{display:true,text:'Curah Hujan (mm)'},grid:{color:'rgba(0,0,0,0.05)'}},
y:{title:{display:true,text:'Probabilitas Kumulatif F(x)'},min:0,max:1,grid:{color:'rgba(0,0,0,0.05)'}}
}
}
});
/* KS Chart */
const ctx2 = document.getElementById('chartKS');
if(ctx2) CH.ks = new Chart(ctx2,{
type:'bar',
data:{
labels:['Normal','Log-Normal','Gumbel (Terbaik)','Log-Pearson III'],
datasets:[
{label:'D-hitung',data:[0.091,0.074,0.058,0.063],
backgroundColor:['rgba(37,99,235,0.75)','rgba(8,145,178,0.75)','rgba(217,119,6,0.9)','rgba(22,163,74,0.75)'],
borderRadius:5,order:1},
{type:'line',label:'D-kritis (α=5%, n=25) = 0.264',data:[0.264,0.264,0.264,0.264],
borderColor:'#dc2626',borderWidth:2,borderDash:[6,4],pointRadius:0,fill:false,order:0}
]
},
options:{responsive:true,maintainAspectRatio:false,
plugins:{
legend:{position:'bottom',labels:{font:{size:11},usePointStyle:true}},
tooltip:{callbacks:{label:c=>c.dataset.label+': '+Number(c.raw).toFixed(3)}}
},
scales:{
x:{grid:{display:false}},
y:{min:0,max:0.35,title:{display:true,text:'Nilai D'},ticks:{font:{size:11}}}
}
}
});
/* Rencana Chart */
const ctx3 = document.getElementById('chartRencana');
if(ctx3) CH.renc = new Chart(ctx3,{
type:'bar',
data:{
labels:T_arr.map(t=>`T=${t} thn`),
datasets:[
{label:'Normal',data:T_arr.map(RT_normal),backgroundColor:'rgba(37,99,235,0.7)',borderRadius:3},
{label:'Log-Normal',data:T_arr.map(RT_lognorm),backgroundColor:'rgba(8,145,178,0.7)',borderRadius:3},
{label:'Gumbel ★',data:T_arr.map(RT_gumbel),backgroundColor:'rgba(217,119,6,0.9)',borderRadius:3,borderWidth:2,borderColor:'#92400e'},
{label:'Log-Pearson III',data:T_arr.map(RT_LP3),backgroundColor:'rgba(22,163,74,0.7)',borderRadius:3},
]
},
options:{responsive:true,maintainAspectRatio:false,
plugins:{
legend:{position:'bottom',labels:{font:{size:11},usePointStyle:true}},
tooltip:{callbacks:{label:c=>c.dataset.label+': '+Number(c.raw).toFixed(1)+' mm'}}
},
scales:{
x:{grid:{display:false},ticks:{font:{size:11}}},
y:{title:{display:true,text:'Curah Hujan Rencana (mm)'},min:60,ticks:{font:{size:11}}}
}
}
});
/* IDF Chart */
const ctx4 = document.getElementById('chartIDF');
if(ctx4){
const durs = [5/60,10/60,15/60,0.5,1,2,3,6,12,24];
const durLabels = ["5'","10'","15'","30'","1 jam","2 jam","3 jam","6 jam","12 jam","24 jam"];
const mono = (R24,t) => (R24/24)*Math.pow(24/t,2/3);
const colors = ['#7c3aed','#dc2626','#d97706','#0284c7','#2563eb','#64748b'];
CH.idf = new Chart(ctx4,{
type:'line',
data:{
labels:durLabels,
datasets:T_arr.slice().reverse().map((T,i)=>({
label:`T = ${T} tahun`,
data:durs.map(t=>mono(RT_gumbel(T),t)),
borderColor:colors[i],
backgroundColor:colors[i]+'22',
borderWidth: i===0?2.5:1.8,
pointRadius:3,
tension:0.3,
fill:false
}))
},
options:{responsive:true,maintainAspectRatio:false,
plugins:{
legend:{position:'bottom',labels:{font:{size:11},usePointStyle:true}},
tooltip:{callbacks:{label:c=>c.dataset.label+': '+Number(c.raw).toFixed(1)+' mm/jam'}}
},
scales:{
x:{grid:{color:'rgba(0,0,0,0.05)'},ticks:{font:{size:11}}},
y:{title:{display:true,text:'Intensitas (mm/jam)'},min:0,ticks:{font:{size:11}},
grid:{color:'rgba(0,0,0,0.05)'}}
}
}
});
}
}
/* ================================================================
TOC, PROGRESS BAR, ANIMATION
================================================================ */
function updateProgress(){
const el=document.getElementById('progBar'), pct=document.getElementById('progPct');
const scroll=window.scrollY, total=document.body.scrollHeight-window.innerHeight;
const p=total>0?Math.round(scroll/total*100):0;
el.style.width=p+'%'; pct.textContent=p+'%';
}
window.addEventListener('scroll',updateProgress,{passive:true});
const tocLinks = document.querySelectorAll('.toc-link');
const sections = Array.from(document.querySelectorAll('section[id], div[id]'));
function updateToc(){
let cur='';
sections.forEach(s=>{
if(window.scrollY>=s.offsetTop-100) cur=s.id;
});
tocLinks.forEach(l=>{
const h=l.getAttribute('href').replace('#','');
l.classList.toggle('active',h===cur);
});
}
window.addEventListener('scroll',updateToc,{passive:true});
function toggleToc(){
document.getElementById('tocFloat').classList.toggle('collapsed');
}
let tocVisible = false;
function toggleTocMobile(){
tocVisible=!tocVisible;
const tf=document.getElementById('tocFloat');
if(tocVisible){ tf.style.display='block'; tf.style.position='fixed'; tf.style.right='0'; tf.style.top='80px'; }
else { tf.style.display=''; }
}
const io = new IntersectionObserver(entries=>{
entries.forEach(e=>{
if(e.isIntersecting){ e.target.classList.add('visible'); buildCharts(); }
});
},{threshold:0.01,rootMargin:'0px 0px -10px 0px'});
document.querySelectorAll('.anim-in').forEach(el=>io.observe(el));
function copyCode(btn){
const text=btn.closest('.code-wrap').querySelector('pre').innerText;
navigator.clipboard.writeText(text).then(()=>{ btn.textContent='✓ Tersalin!'; setTimeout(()=>btn.textContent='Salin',2000); });
}
/* INIT */
buildAMSTable();
buildStatCards();
buildRencanaTable();
buildIDFTable();
updateProgress();
setTimeout(buildCharts,400);
&lt;/script></description></item></channel></rss>