<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Data Science on kenji.blog</title><link>http://kenji.blog/id/categories/data-science/</link><description>Recent content in Data Science on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>id</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 12:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/id/categories/data-science/index.xml" rel="self" type="application/rss+xml"/><item><title>Keseharian Insinyur yang Mengelola Kondisi Fisik dengan Smart Ring dll. (Health Hack)</title><link>http://kenji.blog/id/p/engineer-health-hacks-wearables/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/id/p/engineer-health-hacks-wearables/</guid><description>&lt;img src="http://kenji.blog/p/engineer-health-hacks-wearables/img/eyecatch.jpg" alt="Featured image of post Keseharian Insinyur yang Mengelola Kondisi Fisik dengan Smart Ring dll. (Health Hack)" />&lt;h2 id="1-pendahuluan-titik-temu-antara-rekayasa-perangkat-lunak-dan-biohacking">1. Pendahuluan: Titik Temu antara Rekayasa Perangkat Lunak dan Biohacking
&lt;/h2>&lt;p>Rekayasa perangkat lunak modern adalah kerja intelektual yang berat dengan beban kognitif yang ekstrem dan jam kerja yang panjang dengan posisi duduk (Sedentary Lifestyle). Mengejar tumpukan teknologi yang selalu berubah, berburu bug di sistem terdistribusi yang kompleks, dan tekanan tenggat waktu. Untuk mengatasi hal ini, sekadar mengandalkan &amp;ldquo;semangat&amp;rdquo; atau &amp;ldquo;tekad&amp;rdquo; saja tidak cukup. Diperlukan pendekatan untuk menyetel perangkat keras berupa tubuh kita sendiri layaknya melakukan debugging pada sistem, yaitu &amp;ldquo;Biohacking&amp;rdquo;.&lt;/p>
&lt;p>Dulu kita mungkin mengandalkan perasaan subjektif (heuristik) seperti &amp;ldquo;hari ini entah kenapa merasa baik/buruk&amp;rdquo;, tetapi saat ini berkat meluasnya perangkat wearable berkinerja tinggi seperti Oura Ring, Apple Watch, dan Garmin, kita dapat memperoleh data biometrik selama 24 jam sehari, 365 hari setahun, secara non-invasif. Artikel ini akan menjelaskan cara memperoleh data biometrik (HRV, RHR, arsitektur tidur) dan data produktivitas (metrik coding dari WakaTime dll.) melalui API, serta menganalisis korelasinya menggunakan pendekatan ilmu data dengan Python dan Pandas. Selain itu, artikel ini juga akan mengupas secara sangat rinci berbagai tips kesehatan (health hack) untuk para insinyur yang didasarkan pada bukti ilmiah, seperti model matematis ritme sirkadian dan waktu optimal konsumsi kopi berdasarkan waktu paruh metabolisme kafein.&lt;/p>
&lt;h2 id="2-yang-tidak-bisa-diukur-tidak-bisa-dikelola-perangkat-keras-pengambil-data-biometrik">2. Yang Tidak Bisa Diukur Tidak Bisa Dikelola: Perangkat Keras Pengambil Data Biometrik
&lt;/h2>&lt;p>Sensor (perangkat wearable) untuk mengambil data biometrik memiliki kelebihannya masing-masing. Dalam manajemen kesehatan berbasis data, langkah pertama adalah memilih perangkat yang paling optimal sesuai dengan tujuannya.&lt;/p>
&lt;h3 id="21-oura-ring-generation-3--4">2.1 Oura Ring (Generation 3 / 4)
&lt;/h3>&lt;p>Karena mengambil data langsung dari arteri jari, perangkat ini memiliki fitur akurasi pengukuran yang sangat tinggi untuk detak jantung saat tidur, variabilitas detak jantung (HRV), dan perubahan suhu permukaan tubuh dibandingkan dengan jam tangan pintar yang mengukur di pergelangan tangan. Jari memiliki jaringan kapiler yang padat, sehingga memungkinkan pengambilan data minim noise menggunakan sensor detak jantung optik (PPG: Photoplethysmography). Selain itu, karena REST API yang disediakan sangat lengkap sehingga memungkinkan ekspor data mentah dalam format JSON dengan mudah melalui OAuth2.0, perangkat ini dapat dikatakan sebagai perangkat yang paling &amp;ldquo;hackable&amp;rdquo; bagi para insinyur.&lt;/p>
&lt;h3 id="22-apple-watch-series--ultra">2.2 Apple Watch Series / Ultra
&lt;/h3>&lt;p>Unggul dalam pelacakan selama beraktivitas, serta pengukuran saturasi oksigen darah (SpO2) dan elektrokardiogram (ECG). Ini adalah perangkat paling kuat untuk memonitor tingkat aktivitas di siang hari dan untuk pengukuran HRV sesuai permintaan (on-demand) melalui aplikasi mindfulness (aplikasi pernapasan). Namun, ekspor data memerlukan perantara HealthKit, sehingga akses langsung dari Python dll. memerlukan langkah tambahan seperti ekspor CSV melalui aplikasi iOS (seperti AutoSleep atau HealthFit).&lt;/p>
&lt;h3 id="23-garmin-fenix--forerunner">2.3 Garmin (Fenix / Forerunner)
&lt;/h3>&lt;p>Selain akurasi pelacakan GPS, indikator sisa energi eksklusif yang disebut &amp;ldquo;Body Battery&amp;rdquo; sangatlah baik. Indikator ini dihitung berdasarkan HRV dan tingkat stres. Data Garmin dapat diperoleh melalui Garmin Connect API, tetapi karena adanya batasan API yang ditujukan untuk perusahaan, pengembang perorangan perlu menggunakan pustaka open source atau memanfaatkan alat scraping yang dibuat oleh para sukarelawan.&lt;/p>
&lt;p>Dalam artikel ini, penjelasan akan difokuskan pada data dari &lt;strong>Oura Ring&lt;/strong>, yang merupakan puncak tertinggi dalam pelacakan tidur dan pemulihan serta sangat mudah diekstrak datanya melalui API, dan data dari &lt;strong>WakaTime&lt;/strong>, yang mengukur waktu coding sebagai plugin untuk IDE (seperti VS Code dan IntelliJ).&lt;/p>
&lt;h2 id="3-teori-dasar-data-biometrik-ilmu-data-tentang-hrv-dan-rhr">3. Teori Dasar Data Biometrik: Ilmu Data tentang HRV dan RHR
&lt;/h2>&lt;p>Bukan sekadar indikator sederhana seperti &amp;ldquo;waktu tidur yang lama itu bagus&amp;rdquo;, melainkan dari perspektif ilmu data, dua indikator berikut merupakan metrik utama dari &amp;ldquo;Pemulihan (Recovery)&amp;rdquo;.&lt;/p>
&lt;h3 id="31-hrv-variabilitas-detak-jantung-dan-pemodelan-saraf-otonom">3.1 HRV (Variabilitas Detak Jantung) dan Pemodelan Saraf Otonom
&lt;/h3>&lt;p>Jantung tidak berdetak dalam ritme yang konstan layaknya metronom. Sebagai contoh, meskipun detak jantung adalah 60bpm, interval antara setiap detaknya (interval R-R) selalu berfluktuasi, misalnya &amp;ldquo;0,92 detik&amp;rdquo;, &amp;ldquo;1,05 detik&amp;rdquo;, atau &amp;ldquo;0,98 detik&amp;rdquo;. Besarnya fluktuasi inilah yang dikuantifikasi menjadi HRV (Heart Rate Variability / Variabilitas Detak Jantung).&lt;/p>
&lt;p>HRV secara langsung mencerminkan sistem saraf otonom, yaitu keseimbangan antara &amp;ldquo;saraf simpatik (gas)&amp;rdquo; dan &amp;ldquo;saraf parasimpatik (rem)&amp;rdquo;. Saat dalam kondisi stres, kelelahan, atau setelah mengonsumsi alkohol, saraf simpatik akan mendominasi sehingga detak jantung menjadi lebih konstan dan HRV menurun. Sebaliknya, saat tubuh cukup rileks dan pulih, saraf parasimpatik (saraf vagus) menjadi dominan, dan karena detak jantung berfluktuasi secara dinamis seiring dengan pernapasan, maka HRV akan meningkat.&lt;/p>
&lt;p>Ada dua pendekatan untuk menghitung HRV, yaitu domain waktu (Time-domain) dan domain frekuensi (Frequency-domain). Namun yang paling umum digunakan dalam analisis domain waktu dan juga diadopsi oleh Oura Ring dan Apple Watch adalah &lt;strong>RMSSD (Root Mean Square of Successive Differences)&lt;/strong>. Ini adalah perhitungan akar kuadrat rata-rata dari selisih interval detak jantung yang berurutan (interval RR).&lt;/p>
&lt;p>Jika diekspresikan secara ketat dengan rumus matematika, maka akan menjadi sebagai berikut.&lt;/p>
$$ RMSSD = \sqrt{\frac{1}{N-1} \sum_{i=1}^{N-1} (RR_{i+1} - RR_i)^2} $$&lt;p>Di mana,&lt;/p>
&lt;ul>
&lt;li>$N$ adalah total detak jantung yang diukur&lt;/li>
&lt;li>$RR_i$ adalah interval RR ke-$i$ (dalam milidetik)&lt;/li>
&lt;/ul>
&lt;p>Bagi seorang insinyur, jika HRV (RMSSD) saat bangun di pagi hari menurun drastis dibandingkan dengan baseline pribadi (rata-rata bergerak beberapa minggu terakhir), maka memungkinkan untuk membuat keputusan berbasis data seperti: &amp;ldquo;Hari ini sebaiknya menghindari desain arsitektur dengan beban kognitif tinggi atau deployment ke lingkungan produksi, dan mengalokasikan waktu untuk pengembangan kode tes atau pembuatan dokumentasi&amp;rdquo;.&lt;/p>
&lt;h3 id="32-detak-jantung-istirahat-rhr-resting-heart-rate-dan-sinyal-pemulihan">3.2 Detak Jantung Istirahat (RHR: Resting Heart Rate) dan Sinyal Pemulihan
&lt;/h3>&lt;p>RHR adalah jumlah detak jantung per menit saat tubuh berada dalam keadaan rileks sepenuhnya (biasanya saat tidur). Setelah mengonsumsi alkohol, makan berlebihan di larut malam, atau sebagai gejala awal suatu penyakit (seperti infeksi), ketika tubuh mengalokasikan energi untuk metabolisme internal atau respons kekebalan, RHR akan meningkat beberapa hingga belasan bpm di atas baseline.&lt;/p>
&lt;p>Semakin rendah RHR, berarti otot jantung dapat memompa lebih banyak darah dalam satu denyut (volume sekuncup yang besar), yang menunjukkan tingginya kapasitas aerobik atau tingkat pemulihan dari kelelahan. Idealnya, bentuk kurva &amp;ldquo;seperti tempat tidur gantung (hammock)&amp;rdquo;, di mana RHR mencapai nilai terendah pada paruh pertama tidur (bagian awal), adalah kondisi di mana terjadi pemulihan dengan kualitas terbaik.&lt;/p>
&lt;h2 id="4-analisis-rinci-arsitektur-tidur">4. Analisis Rinci Arsitektur Tidur
&lt;/h2>&lt;p>Yang menentukan performa otak seorang insinyur bukan hanya &amp;ldquo;kuantitas&amp;rdquo; tidur, melainkan juga &amp;ldquo;kualitasnya&amp;rdquo;, yaitu arsitektur tidur (Sleep Architecture). Tidur dalam semalam biasanya mengulangi siklus 90-110 menit sebanyak 4-5 kali.&lt;/p>
&lt;h3 id="41-tidur-nrem-tahap-1-2-tidur-ringan--light-sleep">4.1 Tidur NREM Tahap 1-2 (Tidur Ringan / Light Sleep)
&lt;/h3>&lt;p>Ini adalah tahap persiapan di mana gelombang otak secara bertahap melambat dan tubuh mulai rileks. Tahap ini mencakup sekitar 50% dari total waktu tidur. Meskipun kontribusinya terhadap pemulihan kognitif tergolong kecil, namun ini menjadi jembatan penting untuk transisi ke tahap tidur dalam (deep sleep) berikutnya.&lt;/p>
&lt;h3 id="42-tidur-nrem-tahap-3-tidur-dalam--deep-sleep--slow-wave-sleep-sws">4.2 Tidur NREM Tahap 3 (Tidur Dalam / Deep Sleep / Slow Wave Sleep: SWS)
&lt;/h3>&lt;p>Gelombang delta (frekuensi rendah 0,5-2Hz) muncul dalam gelombang otak, dan ini adalah periode inti untuk pemulihan fisik tubuh. Hormon pertumbuhan disekresikan dalam jumlah besar, dan perbaikan sel berlangsung. Tahap ini sangat penting untuk memperkuat sistem kekebalan tubuh, dan berhubungan langsung tidak hanya dengan pemulihan kelelahan otot para atlet, tetapi juga perbaikan kelelahan mata serta otot leher dan bahu pada insinyur. Tidur dalam biasanya terkonsentrasi pada siklus paruh pertama tidur.&lt;/p>
&lt;h3 id="43-tidur-rem-rapid-eye-movement">4.3 Tidur REM (Rapid Eye Movement)
&lt;/h3>&lt;p>Ini adalah kondisi di mana otak sama aktifnya seperti saat terjaga, tetapi otot-otot tubuh berada dalam keadaan lumpuh. Tidur REM ini sangat penting bagi para insinyur karena berperan dalam menyusun sintaks bahasa pemrograman baru atau konsep algoritma kompleks yang dipelajari di siang hari, serta mengonsolidasikannya ke dalam ingatan jangka panjang (Memory Consolidation). Tidur REM meningkatkan plastisitas saraf (Neuroplasticity), dan kemampuan pemecahan masalah yang kreatif (seperti kilasan &amp;ldquo;tiba-tiba menemukan solusi bug saat mandi&amp;rdquo;) juga diperkuat oleh tidur REM. Tidur REM cenderung lebih panjang pada paruh kedua tidur (menjelang pagi).&lt;/p>
&lt;p>Singkatnya, &amp;ldquo;memaksa diri bangun pagi dengan alarm dan mengurangi waktu tidur&amp;rdquo; berarti memangkas secara signifikan porsi tidur REM yang terkait dengan konsolidasi memori dan kreativitas, dan ini setara dengan &amp;ldquo;bug&amp;rdquo; fatal yang akan menurunkan performa secara drastis sebagai seorang insinyur.&lt;/p>
&lt;h2 id="5-pemantauan-glukosa-berkelanjutan-cgm-dan-pertahanan-terhadap-lonjakan-spike">5. Pemantauan Glukosa Berkelanjutan (CGM) dan Pertahanan terhadap Lonjakan (Spike)
&lt;/h2>&lt;p>Dalam beberapa tahun terakhir, penggunaan CGM (Continuous Glucose Monitor / Pemantau Glukosa Berkelanjutan) telah menjadi suatu keharusan di kalangan biohacker. Perangkat yang representatif antara lain FreeStyle Libre dan Dexcom.
Saat Anda mengonsumsi makanan (terutama karbohidrat dan gula), kadar glukosa dalam darah akan meningkat drastis (lonjakan gula darah / spike), dan kemudian anjlok (crash) akibat sekresi insulin dalam jumlah besar. Pada saat terjadi &amp;ldquo;crash&amp;rdquo; inilah timbul rasa kantuk yang parah (Brain Fog) dan penurunan konsentrasi. Rasa kantuk pada &amp;ldquo;jam 2 siang yang mematikan&amp;rdquo; setelah makan siang, kemungkinan besar bukan hanya karena pengaruh jam biologis, melainkan karena lonjakan gula darah akibat konsumsi berlebihan ramen atau nasi putih.&lt;/p>
&lt;p>Kurva respons gula darah $G(t)$ dapat didekati sebagai model osilasi teredam berikut ini, yang merupakan selisih antara laju penyerapan karbohidrat yang dikonsumsi dan klirens oleh insulin.&lt;/p>
$$ G(t) = G_{base} + \Delta G \cdot e^{-\alpha t} \sin(\beta t) $$&lt;p>Di mana,&lt;/p>
&lt;ul>
&lt;li>$G_{base}$: Gula darah puasa (baseline)&lt;/li>
&lt;li>$\Delta G$: Amplitudo peningkatan gula darah akibat makanan&lt;/li>
&lt;li>$\alpha$: Koefisien redaman berdasarkan sensitivitas insulin dan laju metabolisme&lt;/li>
&lt;li>$\beta$: Komponen frekuensi dari osilasi&lt;/li>
&lt;li>$t$: Waktu yang berlalu setelah makan&lt;/li>
&lt;/ul>
&lt;p>Untuk mempertahankan performa insinyur, meminimalkan $\Delta G$ (amplitudo) sangatlah penting. Secara konkret, beberapa &amp;ldquo;hack&amp;rdquo; yang efektif antara lain &amp;ldquo;makan sayur (serat) terlebih dahulu&amp;rdquo;, &amp;ldquo;menghindari karbohidrat olahan&amp;rdquo;, dan &amp;ldquo;berjalan santai selama 15 menit setelah makan (mengaktifkan transporter GLUT4 untuk menyerap glukosa darah ke dalam otot tanpa bergantung pada insulin)&amp;rdquo;.&lt;/p>
&lt;h2 id="6-desain-arsitektur-membangun-pipa-data-lokal-local-data-pipeline">6. Desain Arsitektur: Membangun Pipa Data Lokal (Local Data Pipeline)
&lt;/h2>&lt;p>Kita akan membangun sebuah pipa data lokal untuk menganalisis dan mengintegrasikan data biometrik dengan data produktivitas.
Diagram Mermaid (diagram alir) di bawah ini menunjukkan alur mulai dari pengambilan data dari API hingga visualisasinya di dasbor.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;Oura Ring API (Biometrik)&amp;#34;] --&amp;gt;|JSON via OAuth2| C[&amp;#34;Pipeline Ingesti Data Python&amp;#34;]
B[&amp;#34;WakaTime API (Waktu Coding)&amp;#34;] --&amp;gt;|JSON via API Key| C
E[&amp;#34;SwitchBot API (Suhu Ruang / CO2)&amp;#34;] --&amp;gt;|JSON via API Key| C
C --&amp;gt;|Ekstrak &amp;amp; Transformasi| D[&amp;#34;Pandas DataFrame (Memori)&amp;#34;]
D --&amp;gt;|Muat| F[&amp;#34;TimescaleDB / PostgreSQL&amp;#34;]
F --&amp;gt; G[&amp;#34;Jupyter Notebook (Analisis Ad-hoc)&amp;#34;]
F --&amp;gt; H[&amp;#34;Aplikasi Web Streamlit (Pemantauan Harian)&amp;#34;]
&lt;/pre>
&lt;p>Dengan arsitektur ini, Anda akan dapat memantau korelasi antara kondisi fisik (input) dan performa coding (output) Anda sendiri secara otomatis setiap hari.&lt;/p>
&lt;p>Selanjutnya, mari kita lihat urutan (sekuens) antar sistem secara lebih detail.&lt;/p>
&lt;pre class="mermaid">
sequenceDiagram
participant U as &amp;#34;Pengguna (Insinyur)&amp;#34;
participant W as &amp;#34;Plugin WakaTime (VS Code)&amp;#34;
participant O as &amp;#34;Oura Ring &amp;amp; API&amp;#34;
participant S as &amp;#34;Batch ETL Python&amp;#34;
participant DB as &amp;#34;TimescaleDB&amp;#34;
U-&amp;gt;&amp;gt;W: &amp;#34;Menulis kode (Mengetik keyboard)&amp;#34;
W--&amp;gt;&amp;gt;W: &amp;#34;Mencatat heartbeat coding yang presisi&amp;#34;
U-&amp;gt;&amp;gt;O: &amp;#34;Tidur (Memakai cincin)&amp;#34;
O--&amp;gt;&amp;gt;O: &amp;#34;Merekam HRV, RHR, Suhu &amp;amp; Tahapan Tidur&amp;#34;
S-&amp;gt;&amp;gt;W: &amp;#34;GET /api/v1/users/current/summaries&amp;#34;
S-&amp;gt;&amp;gt;O: &amp;#34;GET /v2/usercollection/sleep&amp;#34;
S-&amp;gt;&amp;gt;S: &amp;#34;Membersihkan dan Menggabungkan Data (Pandas)&amp;#34;
S-&amp;gt;&amp;gt;DB: &amp;#34;INSERT INTO daily_metrics&amp;#34;
Note over S,DB: &amp;#34;Dijadwalkan melalui Cron / Airflow&amp;#34;
&lt;/pre>
&lt;h2 id="7-ingesti-data-menggunakan-python-dan-pandas">7. Ingesti Data menggunakan Python dan Pandas
&lt;/h2>&lt;p>Mari kita lihat proses aktual untuk mengambil data dari API Oura Ring dan WakaTime menggunakan skrip Python, dan mengintegrasikannya sebagai Pandas DataFrame. Kita akan membangun kode yang tangguh dan siap untuk penggunaan nyata.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;span class="lnt">54
&lt;/span>&lt;span class="lnt">55
&lt;/span>&lt;span class="lnt">56
&lt;/span>&lt;span class="lnt">57
&lt;/span>&lt;span class="lnt">58
&lt;/span>&lt;span class="lnt">59
&lt;/span>&lt;span class="lnt">60
&lt;/span>&lt;span class="lnt">61
&lt;/span>&lt;span class="lnt">62
&lt;/span>&lt;span class="lnt">63
&lt;/span>&lt;span class="lnt">64
&lt;/span>&lt;span class="lnt">65
&lt;/span>&lt;span class="lnt">66
&lt;/span>&lt;span class="lnt">67
&lt;/span>&lt;span class="lnt">68
&lt;/span>&lt;span class="lnt">69
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">pandas&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">pd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">datetime&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">datetime&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">timedelta&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Variabel Lingkungan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">OURA_TOKEN&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">getenv&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;OURA_ACCESS_TOKEN&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">WAKATIME_API_KEY&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">getenv&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;WAKATIME_API_KEY&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">fetch_oura_sleep_data&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">start_date&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">str&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">end_date&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">str&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;Mengambil ringkasan tidur harian dari Oura Ring API v2.&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://api.ouraring.com/v2/usercollection/sleep&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">params&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;start_date&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">start_date&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;end_date&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">end_date&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">headers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;Authorization&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Bearer &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">OURA_TOKEN&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">params&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">params&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">raise_for_status&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1"># Menimbulkan pengecualian untuk error 4xx/5xx&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">[])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">df&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">json_normalize&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Mengekstrak nilai yang bersarang dalam atau memilih kolom penting&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">df&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">df&lt;/span>&lt;span class="p">[[&lt;/span>&lt;span class="s1">&amp;#39;day&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;score&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;time_in_bed&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;total_sleep_duration&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;average_hrv&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;lowest_heart_rate&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;deep_sleep_duration&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;rem_sleep_duration&amp;#39;&lt;/span>&lt;span class="p">]]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Mengonversi tanggal ke objek datetime dan mengaturnya sebagai indeks&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;day&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">to_datetime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;day&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">df&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">set_index&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;day&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">inplace&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">df&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">fetch_wakatime_data&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">start_date&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">str&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">end_date&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">str&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;Mengambil ringkasan durasi coding dari WakaTime API.&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://wakatime.com/api/v1/users/current/summaries&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">params&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;start&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">start_date&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;end&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">end_date&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;api_key&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">WAKATIME_API_KEY&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">params&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">params&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">raise_for_status&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;data&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">[])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">records&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">day_data&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">date_str&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">day_data&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;range&amp;#39;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="s1">&amp;#39;date&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Mengekstrak total detik yang dihabiskan untuk coding&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">total_seconds&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">day_data&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;grand_total&amp;#39;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="s1">&amp;#39;total_seconds&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">records&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s1">&amp;#39;day&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">date_str&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;coding_hours&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">total_seconds&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="mf">3600.0&lt;/span>&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">df&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">records&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">df&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">empty&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;day&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">to_datetime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;day&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">df&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">set_index&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;day&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">inplace&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">df&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Mengambil data untuk 60 hari terakhir&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">end&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strftime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;%Y-%m-&lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">start&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">timedelta&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">days&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">60&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strftime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;%Y-%m-&lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">oura_df&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">fetch_oura_sleep_data&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">start&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">end&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">waka_df&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">fetch_wakatime_data&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">start&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">end&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Menggabungkan dataset pada indeks &amp;#39;day&amp;#39; menggunakan inner join&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">merged_df&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">merge&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">oura_df&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">waka_df&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">left_index&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">right_index&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">how&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;inner&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Menyimpan data mentah ke CSV/DB&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">merged_df&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">to_csv&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;health_productivity_raw.csv&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Ingested &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">merged_df&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> days of data.&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="8-pra-pemrosesan-data-dan-rekayasa-fitur-feature-engineering">8. Pra-pemrosesan Data dan Rekayasa Fitur (Feature Engineering)
&lt;/h2>&lt;p>Sangat berisiko jika data mentah yang diperoleh langsung digunakan untuk analisis. Perlu dilakukan penanganan nilai yang hilang (Missing Values) karena lupa mengisi daya perangkat, serta pembuatan indikator baru yang bermakna (Rekayasa Fitur / Feature Engineering).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">engineer_features&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">df&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;Menerapkan rekayasa fitur dan pembersihan pada dataframe yang digabung.&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">df&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">df&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">copy&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 1. Menangani nilai yang hilang (misalnya, forward fill)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">df&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fillna&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">method&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;ffill&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">inplace&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 2. Menghitung Efisiensi Tidur&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Rumus: (Total Waktu Tidur / Waktu di Tempat Tidur) * 100&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;sleep_efficiency_pct&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;total_sleep_duration&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;time_in_bed&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">100&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 3. Menghitung Rasio Tahap Tidur&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;rem_ratio&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;rem_sleep_duration&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;total_sleep_duration&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;deep_ratio&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;deep_sleep_duration&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;total_sleep_duration&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 4. Menghitung Rata-rata Bergerak 7 Hari (Rolling Mean) untuk menghaluskan noise harian&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;hrv_7d_ma&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;average_hrv&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">rolling&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">window&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">7&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">mean&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;rhr_7d_ma&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;lowest_heart_rate&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">rolling&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">window&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">7&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">mean&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 5. Menghitung deviasi harian dari baseline&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;hrv_deviation&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;average_hrv&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;hrv_7d_ma&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 6. Normalisasi target untuk Machine Learning (Opsional)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">from&lt;/span> &lt;span class="nn">sklearn.preprocessing&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">MinMaxScaler&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">scaler&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">MinMaxScaler&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">df&lt;/span>&lt;span class="p">[[&lt;/span>&lt;span class="s1">&amp;#39;hrv_scaled&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;coding_scaled&amp;#39;&lt;/span>&lt;span class="p">]]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">scaler&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fit_transform&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">df&lt;/span>&lt;span class="p">[[&lt;/span>&lt;span class="s1">&amp;#39;average_hrv&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;coding_hours&amp;#39;&lt;/span>&lt;span class="p">]])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Menghapus baris dengan NaN yang dihasilkan oleh rolling window&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">df&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dropna&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">inplace&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">df&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">processed_df&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">engineer_features&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">merged_df&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="9-analisis-korelasi-titik-temu-antara-produktivitas-dan-metrik-kesehatan">9. Analisis Korelasi: Titik Temu antara Produktivitas dan Metrik Kesehatan
&lt;/h2>&lt;p>Berdasarkan data yang telah diproses sebelumnya, kita akan menganalisis hubungan antara indikator kesehatan dan produktivitas coding. Sebagai hipotesis, dapat dibayangkan bahwa &amp;ldquo;semakin tinggi HRV (hari di mana saraf otonom seimbang dan tubuh pulih), semakin lama konsentrasi bertahan dan waktu coding menjadi lebih panjang, atau lebih mampu menyelesaikan tugas-tugas yang lebih kompleks.&amp;rdquo;&lt;/p>
&lt;pre class="mermaid">
xychart-beta
title HRV vs Jam Coding Harian (Dinormalisasi)
x-axis [&amp;#34;Sen&amp;#34;, &amp;#34;Sel&amp;#34;, &amp;#34;Rab&amp;#34;, &amp;#34;Kam&amp;#34;, &amp;#34;Jum&amp;#34;, &amp;#34;Sab&amp;#34;, &amp;#34;Min&amp;#34;]
y-axis &amp;#34;Output HRV &amp;amp; Coding&amp;#34; 10 --&amp;gt; 100
line [45, 52, 65, 75, 70, 58, 48]
bar [35, 42, 58, 65, 60, 20, 15]
&lt;/pre>
&lt;p>&lt;em>(Catatan: Grafik garis menunjukkan deviasi dari baseline HRV yang dinormalisasi, sedangkan grafik batang menunjukkan waktu coding dari WakaTime. Terlihat adanya korelasi di mana output coding dimaksimalkan pada hari Rabu hingga Jumat, saat pemulihan yang cukup telah tercapai)&lt;/em>&lt;/p>
&lt;p>Kita akan melakukan perhitungan koefisien korelasi (Koefisien Korelasi Product-Moment Pearson $r$) menggunakan Pandas, dan uji signifikansi statistik (nilai p) menggunakan SciPy.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">scipy.stats&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">stats&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Memilih kolom numerik untuk matriks korelasi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">cols_of_interest&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;average_hrv&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;score&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;deep_sleep_duration&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;rem_sleep_duration&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;coding_hours&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">correlation_matrix&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">processed_df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">cols_of_interest&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">corr&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Correlation with Coding Hours:&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">correlation_matrix&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;coding_hours&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sort_values&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ascending&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Menghitung koefisien korelasi Pearson dan nilai p untuk Tidur REM dan Jam Coding&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">r&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p_value&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">stats&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pearsonr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">processed_df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;rem_sleep_duration&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">processed_df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;coding_hours&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;REM Sleep vs Coding Hours: r = &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="si">:&lt;/span>&lt;span class="s2">.3f&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">, p-value = &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">p_value&lt;/span>&lt;span class="si">:&lt;/span>&lt;span class="s2">.4f&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Dalam banyak kasus, terdapat korelasi positif yang signifikan ($p &lt; 0.05$) antara &lt;code>average_hrv&lt;/code> atau &lt;code>rem_sleep_duration&lt;/code> dengan &lt;code>coding_hours&lt;/code>. Secara khusus, lamanya tidur REM pada malam sebelumnya dilaporkan berdampak kuat terhadap &amp;ldquo;waktu yang dibutuhkan untuk memecahkan error (debugging)&amp;rdquo; dan &amp;ldquo;produktivitas&amp;rdquo; pada hari tersebut, seperti yang dilaporkan dalam banyak komunitas pelacakan diri (Quantified Self) para insinyur.&lt;/p>
&lt;h2 id="10-model-matematis-ritme-sirkadian-dan-optimalisasi-puncak-kognitif">10. Model Matematis Ritme Sirkadian dan Optimalisasi Puncak Kognitif
&lt;/h2>&lt;p>Manusia dilengkapi dengan jam biologis siklus sekitar 24 jam yang disebut ritme sirkadian (Circadian Rhythm). Ritme inilah yang membuat fluktuasi pada suhu tubuh, sekresi hormon (lonjakan kortisol di pagi hari dan sekresi melatonin di malam hari), serta &amp;ldquo;kemampuan kognitif&amp;rdquo;.&lt;/p>
&lt;p>Fluktuasi ritme sirkadian sering kali direpresentasikan secara pendekatan dengan menggunakan model matematis berupa kurva kosinus (Model Cosinor), dan perubahan metrik biologis ini dapat dirumuskan sebagai berikut:&lt;/p>
$$ y(t) = M + A \cos\left(\frac{2\pi}{24}(t - \phi)\right) + e(t) $$&lt;ul>
&lt;li>$y(t)$: Indikator biometrik pada waktu $t$ (contoh: suhu inti tubuh atau tingkat kewaspadaan)&lt;/li>
&lt;li>$M$: MESOR (Midline Estimating Statistic of Rhythm) - Nilai tengah ritme (tingkat rata-rata)&lt;/li>
&lt;li>$A$: Amplitudo (Amplitude) - Besaran fluktuasi&lt;/li>
&lt;li>$\phi$: Acrophase - Fase saat mencapai puncak (waktu)&lt;/li>
&lt;li>$e(t)$: Suku kesalahan akibat faktor lingkungan dll.&lt;/li>
&lt;/ul>
&lt;p>Dalam dunia rekayasa (engineering), arti dari persamaan ini adalah &amp;ldquo;Waktu di mana performa (tingkat kewaspadaan) mencapai puncaknya dalam sehari ($\phi$) telah ditentukan secara biologis, dan pada waktu tersebut Anda harus mengalokasikan tugas-tugas dengan beban kognitif tertinggi (memperbaiki bug yang rumit, mendesain arsitektur baru)&amp;rdquo;.&lt;/p>
&lt;p>Bagi penganut kronotipe pagi (Morning Lark) pada umumnya, puncak kognitif pertama akan muncul 2-4 jam setelah bangun tidur (misalnya jam 9-11 pagi). Setelah itu, sekitar jam 2 siang akan terjadi lembah ritme sirkadian (Post-lunch dip), lalu puncak kecil lainnya akan datang di sore hari. Mengidentifikasi waktu puncak Anda ($\phi$) dari tingkat aktivitas data wearable atau tingkat konsentrasi subjektif, serta melindungi waktu tersebut dengan metode &amp;ldquo;time blocking&amp;rdquo; di jadwal seperti Google Calendar, merupakan health hack yang paling luar biasa. Memasukkan meeting tak penting di waktu puncak ibarat mengalokasikan core CPU dengan kinerja terbaik untuk idle process.&lt;/p>
&lt;h2 id="11-farmakokinetik-kafein-dan-waktu-konsumsi-yang-optimal">11. Farmakokinetik Kafein dan Waktu Konsumsi yang Optimal
&lt;/h2>&lt;p>Insinyur dan kopi memiliki hubungan yang tak terpisahkan, tetapi konsumsi kafein yang berlebihan atau pada waktu yang terlalu larut akan memblokir reseptor adenosin di otak dan merusak &amp;ldquo;Tidur Dalam (Deep Sleep)&amp;rdquo; di malam hari. Walaupun secara subjektif merasa sudah tidur, saat melihat data dari Oura Ring dapat terlihat bahwa detak jantung tidak menurun dan persentase tidur dalam turun drastis.&lt;/p>
&lt;p>Pembuangan kafein dari dalam tubuh mengikuti kinetika orde pertama (First-order kinetics). Dengan kata lain, konsentrasi dalam darah akan meluruh secara eksponensial.&lt;/p>
$$ C(t) = C_0 e^{-k t} $$&lt;p>Di mana,&lt;/p>
&lt;ul>
&lt;li>$C(t)$: Konsentrasi kafein dalam darah setelah waktu $t$ berlalu&lt;/li>
&lt;li>$C_0$: Konsentrasi awal (konsentrasi maksimum sesaat setelah dikonsumsi)&lt;/li>
&lt;li>$k$: Konstanta laju eliminasi&lt;/li>
&lt;li>$t$: Waktu yang berlalu sejak konsumsi (jam)&lt;/li>
&lt;/ul>
&lt;p>Konstanta laju eliminasi $k$ diekspresikan menggunakan waktu paruh kafein ($t_{1/2}$) sebagai berikut:&lt;/p>
$$ k = \frac{\ln(2)}{t_{1/2}} $$&lt;p>Untuk orang dewasa yang sehat, meskipun bergantung pada genetika individu (gen CYP1A2), waktu paruh kafein $t_{1/2}$ diperkirakan sekitar &lt;strong>5-6 jam&lt;/strong>.
Sebagai contoh, misalkan Anda meminum secangkir kopi tetes (sekitar 150mg kafein) pada jam 3 sore ($C_0 = 150$). Dengan asumsi waktu paruh adalah 5,5 jam, maka $k \approx 0.126$.
Jika kita menghitung konsentrasi kafein yang tersisa dalam tubuh pada waktu tidur yaitu jam 11 malam (8 jam kemudian):&lt;/p>
$$ C(8) = 150 \times e^{-0.126 \times 8} = 150 \times e^{-1.008} \approx 150 \times 0.365 = 54.75 \text{ mg} $$&lt;p>Artinya, pada saat waktu tidur tiba, masih tersisa 54mg kafein (sedikit lebih dari 1 shot espresso) di dalam tubuh Anda, dan ini akan berdampak buruk secara langsung pada arsitektur tidur.
Kesimpulan berbasis data yang ditarik dari model farmakokinetik ini adalah: &lt;strong>&amp;ldquo;Untuk memastikan tidur yang berkualitas tinggi, konsumsi kafein harus dimulai paling cepat 90 menit setelah bangun tidur (setelah lonjakan kortisol mereda), dan harus dihentikan sepenuhnya selambat-lambatnya jam 2 siang (9-10 jam sebelum waktu tidur)&amp;rdquo;.&lt;/strong>&lt;/p>
&lt;h2 id="12-hacking-variabel-lingkungan-lux-suhu-co2">12. Hacking Variabel Lingkungan (Lux, Suhu, CO2)
&lt;/h2>&lt;p>Selain sistem internal berupa tubuh sendiri, mengoptimalkan variabel lingkungan eksternal (Environment Variables) juga tak kalah penting.&lt;/p>
&lt;h3 id="121-memprogram-lingkungan-cahaya-lux">12.1 Memprogram Lingkungan Cahaya (Lux)
&lt;/h3>&lt;p>Cahaya adalah &amp;ldquo;Zeitgeber&amp;rdquo; (pemberi isyarat waktu) terkuat yang mereset ritme sirkadian. Di pagi hari, saat cahaya matahari sebesar sekitar 100.000 Lux masuk ke sel fotoreseptor (ipRGC) di retina, sekresi melatonin akan berhenti dan timer akan direset. Sebaliknya, di malam hari sangat penting untuk memblokir cahaya biru (blue light) agar tidak menghambat sekresi melatonin. Selain menurunkan suhu warna layar monitor menggunakan perangkat lunak seperti f.lux, sangat efektif untuk membuat skrip yang mengendalikan pencahayaan pintar (seperti Philips Hue) melalui API guna mengurangi kecerahan dan suhu warna ruangan secara otomatis seiring dengan terbenamnya matahari.&lt;/p>
&lt;h3 id="122-pengendalian-suhu-kamar-tidur-dan-latensi-tidur-sleep-latency">12.2 Pengendalian Suhu Kamar Tidur dan Latensi Tidur (Sleep Latency)
&lt;/h3>&lt;p>Manusia mulai tertidur ketika suhu inti tubuhnya (Core Body Temperature) turun. Dengan menjaga suhu kamar tidur dalam kondisi sejuk pada 18-19 derajat Celcius, serta mandi air hangat 90 menit sebelum tidur untuk menaikkan suhu inti tubuh sementara waktu, lalu masuk ke tempat tidur pada saat suhu tersebut turun drastis, latensi tidur (Sleep Latency: waktu yang dibutuhkan sejak berbaring di tempat tidur hingga tertidur) dapat dipersingkat secara dramatis dan tidur dalam dapat dimaksimalkan.&lt;/p>
&lt;h3 id="123-konsentrasi-co2-dan-penurunan-fungsi-kognitif">12.3 Konsentrasi CO2 dan Penurunan Fungsi Kognitif
&lt;/h3>&lt;p>Saat menambahkan API Hub SwitchBot atau Weather Station Netatmo ke dalam pipa data, dapat terlihat adanya korelasi negatif yang jelas antara konsentrasi karbon dioksida (CO2) di dalam ruangan dan produktivitas.
Seperti yang ditunjukkan oleh penelitian dari Universitas Harvard dan lainnya, ketika konsentrasi CO2 melebihi 1000ppm, fungsi kognitif (terutama kemampuan pengambilan keputusan strategis) mulai menurun secara signifikan, dan ketika melebihi 2000ppm, hal itu menyebabkan penurunan performa yang parah. Bekerja jarak jauh (remote work) di ruangan yang tertutup rapat selama musim dingin akan menurunkan performa Anda tanpa disadari.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Pseudo-code untuk ventilasi ruang cerdas menggunakan Home Assistant / SwitchBot API&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">check_and_ventilate&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Mendapatkan tingkat CO2 saat ini dari API Netatmo/SwitchBot&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">co2_ppm&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">get_sensor_data&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;co2_sensor_id&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">co2_ppm&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">1000&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Peringatan: Tingkat CO2 tinggi (&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">co2_ppm&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> ppm). Risiko penurunan kognitif.&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Memicu smart plug untuk menyalakan kipas ventilasi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">turn_on_smart_plug&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;ventilation_fan_id&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Mengirim notifikasi ke Slack/Discord&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">send_notification&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Kipas ventilasi telah dinyalakan. Konsentrasi CO2 tinggi.&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="n">co2_ppm&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">600&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">turn_off_smart_plug&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;ventilation_fan_id&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Dengan mengeksekusi skrip semacam ini secara berkala menggunakan Cron, sebuah sistem pengendalian lingkungan otonom yang selalu menjaga konsentrasi oksigen optimal pun akan terbentuk.&lt;/p>
&lt;h2 id="13-kesimpulan-cicd-pada-sistem-tubuh-manusia">13. Kesimpulan: CI/CD pada Sistem Tubuh Manusia
&lt;/h2>&lt;p>Cobalah untuk menganggap tubuh Anda sendiri sebagai sebuah sistem terdistribusi yang kompleks. Perangkat wearable (Oura Ring) adalah metrics exporter (Prometheus) untuk pemantauan, skrip Python/Pandas adalah pipa analisis log (Logstash/Fluentd), dan perubahan kondisi fisik serta performa sehari-hari adalah kesehatan sistem yang ditampilkan di dasbor (Grafana/Streamlit).&lt;/p>
&lt;p>&amp;ldquo;Bekerja dengan memotong waktu tidur&amp;rdquo; sama halnya dengan memaksakan penambahan fitur tanpa menghiraukan utang teknis (Technical Debt). Dalam jangka pendek, mungkin Anda bisa mengejar waktu rilis, tetapi dalam jangka panjang, hal itu pasti akan menyebabkan kerusakan sistem (burnout, masalah kesehatan serius, dan depresi).&lt;/p>
&lt;p>Memantau HRV, memeriksa tren RHR, dan mengoptimalkan arsitektur tidur. Lalu, sembari melihat korelasinya dengan data produktivitas dari WakaTime, Anda melakukan fine-tuning (penyetelan halus) pada &amp;ldquo;hyperparameter&amp;rdquo; seperti diet (makanan), olahraga, tidur, dan lingkungan dari hari ke hari. Ini tidak lain adalah proses &lt;strong>CI/CD (Continuous Integration / Continuous Delivery)&lt;/strong> pada tubuh manusia.&lt;/p>
&lt;p>Mari manfaatkan ilmu data dan API secara maksimal untuk merekayasa kondisi kesehatan yang mampu memberikan performa terbaik. Karena, kualitas kode yang Anda tulis berhubungan langsung dengan seberapa sehat sistem biometrik Anda sendiri.&lt;/p>
&lt;hr>
&lt;p>&lt;em>Sangkalan (Disclaimer): Artikel ini merangkum eksperimen pribadi dan pendekatan ilmu data dari penulis, dan tidak ditujukan untuk memberikan nasihat medis. Jika Anda mengalami kondisi kesehatan yang buruk atau gangguan tidur yang berkelanjutan, harap konsultasikan dengan institusi medis profesional.&lt;/em>&lt;/p></description></item><item><title>Trade-off Privasi dan Kenyamanan: Nasib Informasi Pribadi di Era Big Data</title><link>http://kenji.blog/id/p/privacy-vs-convenience-big-data/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/id/p/privacy-vs-convenience-big-data/</guid><description>&lt;img src="http://kenji.blog/p/privacy-vs-convenience-big-data/img/eyecatch.jpg" alt="Featured image of post Trade-off Privasi dan Kenyamanan: Nasib Informasi Pribadi di Era Big Data" />&lt;h1 id="trade-off-privasi-dan-kenyamanan-nasib-informasi-pribadi-di-era-big-data">Trade-off Privasi dan Kenyamanan: Nasib Informasi Pribadi di Era Big Data
&lt;/h1>&lt;p>Dalam masyarakat digital modern, kita menghasilkan jumlah data yang sangat besar dalam kehidupan sehari-hari. Berbagai macam &amp;ldquo;big data&amp;rdquo; terus dikumpulkan, mulai dari informasi lokasi ponsel pintar, postingan media sosial, riwayat pembelian belanja online, hingga data kesehatan yang direkam oleh perangkat wearable. Data ini sangat penting untuk evolusi AI (Kecerdasan Buatan) dan penyediaan layanan yang dipersonalisasi, menjadikan hidup kita lebih nyaman dan kaya.&lt;/p>
&lt;p>Namun, di sisi lain, risiko pelanggaran privasi yang menyertai pengumpulan dan penggunaan informasi pribadi telah muncul sebagai masalah sosial yang serius. Risiko yang tersembunyi di balik kenyamanan ini, seperti insiden kebocoran data, pemberian data kepada pihak ketiga tanpa persetujuan pengguna, dan kekhawatiran tentang masyarakat pengawasan oleh negara, telah mencapai skala yang tidak bisa diabaikan. Artikel ini akan memberikan penjelasan teknis yang sangat rinci mengenai pendekatan teknologi dan hukum, beserta tren terbaru, dalam menghadapi dilema modern ini, yaitu &amp;ldquo;trade-off privasi dan kenyamanan&amp;rdquo;.&lt;/p>
&lt;h2 id="1-paradigma-masyarakat-berbasis-data-dan-evolusi-arsitektur-data">1. Paradigma Masyarakat Berbasis Data dan Evolusi Arsitektur Data
&lt;/h2>&lt;p>Untuk mengumpulkan dan memanfaatkan data secara efisien, perusahaan mengadopsi berbagai arsitektur data. Transisi telah terjadi dari &amp;ldquo;Data Warehouse&amp;rdquo; (Gudang Data) yang dulunya mainstream, menuju &amp;ldquo;Data Lake&amp;rdquo; (Danau Data) yang mengelola semua data secara terpusat termasuk data tidak terstruktur, dan saat ini sedang terjadi pergeseran paradigma menuju &amp;ldquo;Data Mesh&amp;rdquo; (Jaring Data) yang merupakan arsitektur terdistribusi.&lt;/p>
&lt;h3 id="data-lake-terpusat-dan-pipeline-anonimisasi">Data Lake Terpusat dan Pipeline Anonimisasi
&lt;/h3>&lt;p>Data Lake adalah repositori penyimpanan yang menyimpan data mentah dalam jumlah besar dalam format aslinya. Namun, menggunakan data mentah yang mengandung informasi pengenal pribadi (PII: Personally Identifiable Information) langsung untuk analisis akan menyebabkan pelanggaran kepatuhan yang serius. Oleh karena itu, &amp;ldquo;Pipeline Anonimisasi&amp;rdquo; (Anonymization Pipeline) yang ketat diimplementasikan antara Data Lake dan lingkungan analisis.&lt;/p>
&lt;p>Gambar di bawah ini menunjukkan alur pipeline anonimisasi dalam Data Lake terpusat pada umumnya.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;Sumber Data (Web, IoT, Seluler)&amp;#34;] --&amp;gt;| Ingesti | B[&amp;#34;Zona Data Mentah (Belum Disentuh)&amp;#34;]
B --&amp;gt;| Proses ETL | C[&amp;#34;Pipeline Anonimisasi &amp;amp; Pembersihan&amp;#34;]
C --&amp;gt;| Pseudonimisasi / Tokenisasi | D[&amp;#34;Zona Tepercaya (k-anonim)&amp;#34;]
D --&amp;gt;| Rekayasa Fitur | E[&amp;#34;Zona Disempurnakan (Siap untuk ML)&amp;#34;]
E --&amp;gt;| Pelatihan Model | F[&amp;#34;Alat BI &amp;amp; Model ML&amp;#34;]
C --&amp;gt;| Log Audit | G[&amp;#34;Pusat Keamanan &amp;amp; Kepatuhan&amp;#34;]
&lt;/pre>
&lt;p>Dalam pipeline semacam ini, proses seperti hashing, masking, dan enkripsi diterapkan secara otomatis saat data masuk. Namun, seperti yang akan dibahas nanti, masking sederhana atau pseudonimisasi (Pseudonymization) saja tidak dapat sepenuhnya menghilangkan risiko &amp;ldquo;Re-identifikasi&amp;rdquo; (Re-identification) dengan mencocokkannya menggunakan sumber data lain.&lt;/p>
&lt;h2 id="2-pemahaman-mendalam-tentang-teknologi-peningkatan-privasi-pets">2. Pemahaman Mendalam tentang Teknologi Peningkatan Privasi (PETs)
&lt;/h2>&lt;p>Kunci untuk menyeimbangkan privasi dan pemanfaatan data adalah &amp;ldquo;Teknologi Peningkatan Privasi&amp;rdquo; (Privacy-Enhancing Technologies: PETs). Di sini, kami akan menjelaskan secara rinci definisi matematis dan implementasi teknis dari PETs utama yang memainkan peran sangat penting dalam analisis big data modern dan pembelajaran mesin.&lt;/p>
&lt;h3 id="21-k-anonimitas-k-anonymity-dan-perluasannya">2.1 k-Anonimitas (K-Anonymity) dan Perluasannya
&lt;/h3>&lt;p>&amp;ldquo;k-Anonimitas&amp;rdquo; (K-Anonymity), yang diusulkan oleh Latanya Sweeney dan Pierangela Samarati pada tahun 1998, adalah konsep dasar perlindungan privasi dalam publikasi data. Hal ini berarti membuat setiap catatan (record) dalam dataset tidak dapat dibedakan dari setidaknya $k-1$ catatan lainnya.&lt;/p>
&lt;p>Atribut dalam basis data secara garis besar dibagi menjadi 3 hal berikut:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Pengidentifikasi (Explicit Identifiers)&lt;/strong>: Informasi yang dapat mengidentifikasi individu secara langsung, seperti nama atau nomor asuransi sosial/KTP (ini biasanya dihapus atau dienkripsi).&lt;/li>
&lt;li>&lt;strong>Pengidentifikasi Kuasi (Quasi-Identifiers: QIs)&lt;/strong>: Informasi seperti usia, jenis kelamin, dan kode pos, yang tidak dapat mengidentifikasi individu secara terpisah, tetapi dapat diidentifikasi jika digabungkan.&lt;/li>
&lt;li>&lt;strong>Atribut Sensitif (Sensitive Attributes)&lt;/strong>: Informasi yang harus dilindungi, seperti nama penyakit dan pendapatan tahunan.&lt;/li>
&lt;/ol>
&lt;p>k-Anonimitas menjamin bahwa selalu ada minimal $k$ kombinasi dari pengidentifikasi kuasi (Kelas Ekivalen: Equivalence Class). Namun, k-anonimitas memiliki kerentanan terhadap &amp;ldquo;Serangan Homogenitas&amp;rdquo; (Homogeneity Attack) dan &amp;ldquo;Serangan Pengetahuan Latar Belakang&amp;rdquo; (Background Knowledge Attack). Misalnya, jika seluruh $k$ orang yang termasuk dalam kelas ekivalen yang sama memiliki penyakit (atribut sensitif) yang sama, maka nama penyakit tersebut akan teridentifikasi meskipun k-anonimitas dipertahankan.&lt;/p>
&lt;p>Untuk mengatasi hal ini, model ekstensi berikut telah diusulkan:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>l-Keanekaragaman (l-diversity)&lt;/strong>: Menjamin bahwa atribut sensitif di setiap kelas ekivalen memiliki setidaknya $l$ nilai berbeda.&lt;/li>
&lt;li>&lt;strong>t-Kekedekatan (t-closeness)&lt;/strong>: Memastikan bahwa jarak (seperti Earth Mover&amp;rsquo;s Distance) antara distribusi atribut sensitif di setiap kelas ekivalen dan distribusi atribut sensitif di seluruh dataset kurang dari atau sama dengan ambang batas $t$.&lt;/li>
&lt;/ul>
&lt;h3 id="22-privasi-diferensial-differential-privacy-dp">2.2 Privasi Diferensial (Differential Privacy: DP)
&lt;/h3>&lt;p>Mengatasi keterbatasan model k-anonimitas, &amp;ldquo;Privasi Diferensial&amp;rdquo; (Differential Privacy), yang diusulkan oleh Cynthia Dwork dan rekan-rekan pada tahun 2006, saat ini diadopsi secara luas sebagai standar privasi yang paling kuat dan ketat secara matematis. Raksasa teknologi seperti Apple, Google, dan Microsoft menerapkan $\epsilon$-Privasi Diferensial ini saat mengumpulkan data telemetri dan data statistik dari pengguna.&lt;/p>
&lt;h4 id="definisi-matematis-privasi-diferensial">Definisi Matematis Privasi Diferensial
&lt;/h4>&lt;p>Sebuah algoritma acak (Randomized Algorithm) $\mathcal{M}$ dikatakan memenuhi $\epsilon$-Privasi Diferensial jika, untuk setiap pasang kumpulan data tetangga $D$ dan $D'$ yang hanya berbeda satu catatan (yaitu $\|D - D'\|_1 = 1$), dan untuk subset output apa pun $S \subseteq \text{Range}(\mathcal{M})$, pertidaksamaan berikut terpenuhi:&lt;/p>
$$ \Pr[\mathcal{M}(D) \in S] \le e^\epsilon \Pr[\mathcal{M}(D') \in S] $$&lt;p>Di sini, $\epsilon$ (anggaran privasi/privacy budget) adalah parameter non-negatif yang mengontrol tingkat perlindungan privasi. Semakin kecil $\epsilon$, semakin kuat perlindungan privasinya, namun kegunaan (utilitas) data akan menurun.&lt;/p>
&lt;p>Selain itu, $(\epsilon, \delta)$-Privasi Diferensial, yang merupakan model relaksasi yang mengizinkan kemungkinan sangat kecil $\delta$ di mana jaminan privasi dapat dilanggar, juga banyak digunakan.&lt;/p>
$$ \Pr[\mathcal{M}(D) \in S] \le e^\epsilon \Pr[\mathcal{M}(D') \in S] + \delta $$&lt;h4 id="mekanisme-laplace-laplace-mechanism">Mekanisme Laplace (Laplace Mechanism)
&lt;/h4>&lt;p>Metode representatif untuk mencapai Privasi Diferensial adalah &amp;ldquo;Mekanisme Laplace&amp;rdquo;, yang secara sengaja menambahkan noise (angka acak) yang mengikuti distribusi tertentu ke hasil output sebenarnya dari sebuah kueri. Seberapa banyak noise yang harus ditambahkan bergantung pada &amp;ldquo;Sensitivitas Global&amp;rdquo; (Global Sensitivity) $\Delta f$ dari fungsi $f$.&lt;/p>
&lt;p>Sensitivitas global $\Delta f$ didefinisikan sebagai perubahan maksimum dalam output fungsi $f$ untuk setiap set data tetangga $D, D'$.&lt;/p>
$$ \Delta f = \max_{D, D'} \| f(D) - f(D') \|_1 $$&lt;p>Mekanisme Laplace menambahkan noise $Y$ yang diambil dari distribusi Laplace $\text{Lap}(b)$ dengan parameter skala $b = \frac{\Delta f}{\epsilon}$ pada hasil fungsi $f(D)$.&lt;/p>
$$ \mathcal{M}(D) = f(D) + Y, \quad Y \sim \text{Lap}\left(\frac{\Delta f}{\epsilon}\right) $$&lt;p>Fungsi kepadatan probabilitas distribusi Laplace adalah sebagai berikut:&lt;/p>
$$ p(x \mid b) = \frac{1}{2b} \exp\left( - \frac{|x|}{b} \right) $$&lt;p>Dengan injeksi noise ini, mustahil untuk menyimpulkan dari hasil output apakah data individu tertentu termasuk dalam dataset atau tidak. Perusahaan memanfaatkan DP sebagai teknologi untuk menutupi (masking) data mentah individu sambil mempertahankan utilitas dari tren statistik (rata-rata, varians, jumlah, dll.) dari keseluruhan data.&lt;/p>
&lt;h3 id="23-pembelajaran-federasi-federated-learning-fl">2.3 Pembelajaran Federasi (Federated Learning: FL)
&lt;/h3>&lt;p>Pembelajaran mesin konvensional menggunakan pendekatan terpusat di mana sejumlah besar data dikumpulkan pada server pusat untuk melatih model, seperti pada Data Lake yang disebutkan sebelumnya. Namun, mengirimkan data sensitif seperti gambar medis atau riwayat input ponsel pintar ke server pusat membawa risiko privasi yang signifikan.&lt;/p>
&lt;p>Oleh karena itu, Google mengusulkan &amp;ldquo;Pembelajaran Federasi&amp;rdquo; (Federated Learning) pada tahun 2016. Dalam Pembelajaran Federasi, bukan datanya yang dipindahkan, melainkan &amp;ldquo;proses komputasi model&amp;rdquo; yang dipindahkan ke sisi perangkat edge (seperti ponsel pintar atau server rumah sakit) tempat data itu berada.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
Server[&amp;#34;Server Agregasi Pusat&amp;#34;]
Device1[&amp;#34;Perangkat Edge 1 (Ponsel Pintar)&amp;#34;]
Device2[&amp;#34;Perangkat Edge 2 (Ponsel Pintar)&amp;#34;]
Device3[&amp;#34;Perangkat Edge 3 (Ponsel Pintar)&amp;#34;]
Server --&amp;gt;| 1. Siarkan Bobot Model Global | Device1
Server --&amp;gt;| 1. Siarkan Bobot Model Global | Device2
Server --&amp;gt;| 1. Siarkan Bobot Model Global | Device3
Device1 --&amp;gt;| 2. Pelatihan Lokal pada Data Pribadi | Device1
Device2 --&amp;gt;| 2. Pelatihan Lokal pada Data Pribadi | Device2
Device3 --&amp;gt;| 2. Pelatihan Lokal pada Data Pribadi | Device3
Device1 --&amp;gt;| 3. Transmisikan Gradien/Pembaruan Model | Server
Device2 --&amp;gt;| 3. Transmisikan Gradien/Pembaruan Model | Server
Device3 --&amp;gt;| 3. Transmisikan Gradien/Pembaruan Model | Server
Server --&amp;gt;| 4. Agregasi (FedAvg) | Server
Server --&amp;gt;| 5. Perbarui Model Global | Server
&lt;/pre>
&lt;h4 id="algoritma-federated-averaging-fedavg">Algoritma Federated Averaging (FedAvg)
&lt;/h4>&lt;p>Algoritma agregasi perwakilan dalam pembelajaran federasi adalah FedAvg. Setiap klien $k$ menggunakan dataset $D_k$ (ukuran $n_k$) miliknya sendiri untuk melakukan pembelajaran menggunakan metode Stochastic Gradient Descent (SGD) secara lokal selama beberapa epoch, dan menghitung bobot yang diperbarui $w_{t+1}^k$.&lt;/p>
&lt;p>Server pusat menerima bobot dari klien $K$ yang berpartisipasi dan memperbarui bobot model global $w_{t+1}$ dengan menghitung rata-rata tertimbang dari bobot-bobot tersebut sesuai dengan ukuran data. Jika jumlah total data adalah $n = \sum_{k=1}^K n_k$, maka rumus pembaruannya adalah sebagai berikut:&lt;/p>
$$ w_{t+1} = \sum_{k=1}^K \frac{n_k}{n} w_{t+1}^k $$&lt;p>Hal ini memungkinkan pembangunan model AI yang cerdas tanpa harus memindahkan data mentah pribadi (seperti riwayat pesan atau foto) keluar dari perangkat sedikit pun. Contoh aplikasi representatif termasuk fungsi prediksi kata berikutnya dari Google Keyboard (Gboard) dan peningkatan pada pengenalan suara FaceID dan Hey Siri dari Apple.&lt;/p>
&lt;h3 id="24-enkripsi-homomorfik-homomorphic-encryption-he">2.4 Enkripsi Homomorfik (Homomorphic Encryption: HE)
&lt;/h3>&lt;p>Teknologi kriptografi &amp;ldquo;ajaib&amp;rdquo; yang memungkinkan dilakukannya komputasi (seperti penjumlahan dan perkalian) sementara data masih dalam keadaan terenkripsi adalah Enkripsi Homomorfik. Dalam metode enkripsi konvensional, saat melakukan proses komputasi pada data, data tersebut harus didekripsi (dikembalikan ke teks biasa/plaintext) terlebih dahulu, tetapi melakukan dekripsi di server cloud menjadi kerentanan keamanan.&lt;/p>
&lt;p>Dengan menggunakan enkripsi homomorfik, karakteristik berikut dapat diwujudkan. Jika fungsi enkripsi adalah $E(\cdot)$, maka penjumlahan dan perkalian dari plaintext $m_1$ dan $m_2$ dapat dilakukan dengan operasi ($\oplus$ dan $\otimes$) langsung pada ciphertext (teks sandi).&lt;/p>
$$ E(m_1 + m_2) = E(m_1) \oplus E(m_2) $$$$ E(m_1 \times m_2) = E(m_1) \otimes E(m_2) $$&lt;p>Enkripsi homomorfik dibagi menjadi &amp;ldquo;Enkripsi Homomorfik Sebagian&amp;rdquo; (Partially Homomorphic Encryption: PHE), yang hanya memungkinkan salah satu dari penjumlahan atau perkalian, dan &amp;ldquo;Enkripsi Homomorfik Penuh&amp;rdquo; (Fully Homomorphic Encryption: FHE), yang memungkinkan penjumlahan dan perkalian dalam jumlah tak terbatas. Sejak Craig Gentry membangun skema FHE pertama menggunakan kriptografi berbasis kisi (Lattice-based cryptography) pada tahun 2009, ini telah menjadi terobosan besar dalam kriptografi.&lt;/p>
&lt;p>Saat ini, meskipun tantangan biaya komputasi dan peningkatan ukuran ciphertext (overhead) masih tersisa, teknologi ini diharapkan dapat diterapkan pada analisis aman dari data medis di cloud dan komputasi rahasia antar lembaga keuangan.&lt;/p>
&lt;h2 id="3-tren-regulasi-hukum-dan-kepatuhan-gdpr-vs-ccpa">3. Tren Regulasi Hukum dan Kepatuhan: GDPR vs CCPA
&lt;/h2>&lt;p>Seiring dengan perkembangan teknologi, kerangka hukum juga berkembang pesat secara global. Ketika perusahaan memanfaatkan big data, mematuhi regulasi ini menjadi syarat mutlak. Mari kita bandingkan dua kerangka regulasi yang paling berpengaruh.&lt;/p>
&lt;h3 id="peraturan-perlindungan-data-umum-uni-eropa-gdpr">Peraturan Perlindungan Data Umum Uni Eropa (GDPR)
&lt;/h3>&lt;p>GDPR (General Data Protection Regulation) Uni Eropa, yang diberlakukan pada Mei 2018, diakui sebagai &amp;ldquo;standar emas&amp;rdquo; (gold standard) global untuk perlindungan data pribadi. GDPR berlaku untuk semua organisasi yang menangani data individu dalam Uni Eropa, dan jika dilanggar, denda sangat besar hingga 4% dari total pendapatan tahunan global atau 20 juta Euro (mana yang lebih tinggi) akan dikenakan.&lt;/p>
&lt;p>&lt;strong>Fitur Utama GDPR:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Prinsip Opt-in&lt;/strong>: Membutuhkan persetujuan eksplisit, bebas, dan sebelumnya dari pengguna untuk mengumpulkan dan memproses data.&lt;/li>
&lt;li>&lt;strong>Hak untuk Dilupakan (Right to be Forgotten/Right to Erasure)&lt;/strong>: Pengguna memiliki hak untuk meminta perusahaan menghapus data pribadi mereka sepenuhnya. Data juga harus dihapus dari cadangan Data Lake, menjadikannya persyaratan yang sangat sulit secara teknis.&lt;/li>
&lt;li>&lt;strong>Pengendali Data dan Pemroses Data&lt;/strong>: Mendefinisikan secara ketat tanggung jawab mereka yang menentukan tujuan penggunaan data (pengendali) dan mereka yang memproses data sesuai dengan instruksi mereka (pemroses).&lt;/li>
&lt;/ul>
&lt;h3 id="undang-undang-privasi-konsumen-california-ccpacpra">Undang-Undang Privasi Konsumen California (CCPA/CPRA)
&lt;/h3>&lt;p>Sementara AS tidak memiliki undang-undang privasi komprehensif di tingkat federal, CCPA (California Consumer Privacy Act) yang diberlakukan di California pada tahun 2020 secara de facto berfungsi sebagai standar nasional. Ini kemudian diperkuat oleh CPRA (California Privacy Rights Act).&lt;/p>
&lt;p>&lt;strong>Fitur Utama CCPA:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Prinsip Opt-out&lt;/strong>: Berbeda dengan &amp;ldquo;persetujuan sebelumnya&amp;rdquo; GDPR, pengumpulan data dimungkinkan tanpa persetujuan sebelumnya, tetapi perusahaan diwajibkan untuk menyediakan tautan opt-out yang jelas bagi pengguna yang berbunyi &amp;ldquo;Jangan Jual Informasi Pribadi Saya&amp;rdquo; (Do Not Sell My Personal Information).&lt;/li>
&lt;li>&lt;strong>Hak Akses Data&lt;/strong>: Konsumen dapat meminta perusahaan untuk mengungkapkan informasi tertentu yang telah mereka kumpulkan, kategorinya, sumbernya, dan apakah informasi tersebut telah dijual kepada pihak ketiga.&lt;/li>
&lt;/ul>
&lt;p>Regulasi hukum ini sangat menuntut perusahaan untuk menerapkan &amp;ldquo;Privasi berdasarkan Desain&amp;rdquo; (Privacy by Design)—memasukkan perlindungan privasi sejak tahap desain sistem dan proses.&lt;/p>
&lt;h2 id="4-tantangan-implementasi-dalam-ekosistem-data">4. Tantangan Implementasi dalam Ekosistem Data
&lt;/h2>&lt;p>Mari kita lihat dari perspektif implementasi praktis ketika menerapkan teknologi perlindungan privasi dan regulasi hukum ke dalam lingkungan big data yang nyata. Misalnya, kita berasumsi pada sebuah kasus yang mengimplementasikan k-anonimitas atau privasi diferensial menggunakan Python dan Pandas, atau PySpark dalam Data Lake.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Implementasi konsep agregasi data dengan menerapkan privasi diferensial (Python)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">numpy&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">np&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">pandas&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">pd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">laplace_mechanism&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">true_value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sensitivity&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">epsilon&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> Fungsi untuk menambahkan noise Laplace ke nilai sebenarnya
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">scale&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">sensitivity&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">epsilon&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">noise&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">laplace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">loc&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">scale&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">scale&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">true_value&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">noise&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">get_dp_average_salary&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dataframe&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">epsilon&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mf">1.0&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> Perhitungan gaji rata-rata dengan jaminan privasi diferensial
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Perhitungan aktual&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">true_sum&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">dataframe&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;salary&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sum&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">true_count&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dataframe&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Penerapan privasi diferensial (berdasarkan asumsi sensitivitas)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Asumsikan fluktuasi gaji maksimum sebagai sensitivitas (perlu pemotongan/clipping agar lebih akurat)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">max_salary_diff&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">100000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Penambahan noise (Dimungkinkan juga untuk menerapkan DP ke nilai total dan hitungan secara terpisah)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">noisy_sum&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">laplace_mechanism&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">true_sum&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">max_salary_diff&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">epsilon&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">noisy_count&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">laplace_mechanism&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">true_count&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">epsilon&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">noisy_sum&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">noisy_count&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Eksekusi di dalam pipeline data&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># dp_avg_salary = get_dp_average_salary(raw_df, epsilon=0.5)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Seperti yang terlihat pada cuplikan kode ini, implementasi privasi diferensial itu sendiri sederhana hanya berupa penambahan noise, tetapi dalam operasi aktualnya, pengelolaan &amp;ldquo;anggaran privasi&amp;rdquo; (Privacy Budget: $\epsilon$) menjadi sangat sulit. Ketika kueri dijalankan beberapa kali pada kumpulan data yang sama, anggaran privasi akan terkonsumsi (berdasarkan teorema komposisi), sehingga pada akhirnya perlu dibangun suatu mekanisme (Manajemen Anggaran Privasi / Privacy Budget Management) untuk mengunci seluruh kumpulan data atau menolak kueri.&lt;/p>
&lt;h2 id="5-prospek-masa-depan-dan-tantangan-etis">5. Prospek Masa Depan dan Tantangan Etis
&lt;/h2>&lt;p>Trade-off antara big data dan privasi bukanlah permainan zero-sum. Dengan evolusi PETs seperti Privasi Diferensial, Pembelajaran Federasi, dan Enkripsi Homomorfik, paradigma pemanfaatan data baru berupa &amp;ldquo;berbagi wawasan (insight) tanpa berbagi data&amp;rdquo; sedang menjadi kenyataan.&lt;/p>
&lt;p>Selain itu, dalam beberapa tahun terakhir, sejalan dengan konsep &amp;ldquo;Data Mesh&amp;rdquo; dan &amp;ldquo;Web3&amp;rdquo; (Web Terdesentralisasi), pergerakan untuk merebut kembali kedaulatan data (Data Sovereignty) dari platform besar raksasa ke individu semakin cepat. Terdapat diskusi tentang masa depan di mana data individu disimpan di Penyimpanan Data Pribadi (Personal Data Store: PDS) atau dompet data (data wallet), dan pengguna itu sendiri mengontrol perizinan pemanfaatan data serta monetisasinya.&lt;/p>
&lt;p>Namun, solusi teknologi belum sepenuhnya sempurna. Dalam Pembelajaran Federasi, terdapat ancaman &amp;ldquo;Serangan Peracunan&amp;rdquo; (Poisoning Attack) di mana klien yang berniat jahat mengirimkan pembaruan model yang curang untuk mencemari model global. Dalam privasi diferensial, terdapat masalah etis di mana data minoritas diredam oleh noise, yang mana dapat menyebabkan bias pada model AI.&lt;/p>
&lt;h2 id="kesimpulan">Kesimpulan
&lt;/h2>&lt;p>Nasib informasi pribadi di era big data melampaui sekadar masalah teknis dan menimbulkan pertanyaan mendasar mengenai masyarakat seperti apa yang kita inginkan. Bagaimana kita melindungi martabat serta privasi individu sambil terus menikmati kenyamanan yang ada. Solusi yang berkelanjutan hanya dapat dicapai melalui trinitas antara pembentukan regulasi hukum, inovasi tanpa henti pada teknologi perlindungan privasi, dan literasi yang tinggi dari kita masing-masing sebagai penyedia data. Privasi dan kenyamanan tidak lagi menjadi trade-off, melainkan akan berevolusi menjadi &amp;ldquo;persyaratan mutlak&amp;rdquo; yang dapat berjalan seiringan berkat bantuan teknologi terbaru.&lt;/p></description></item></channel></rss>