<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[jurnalku]]></title><description><![CDATA[sekedar menyimpan script dan catatan yang sudah dikumpulkan agar tidak lupa]]></description><link>https://dionnotario.com</link><generator>RSS for Node</generator><lastBuildDate>Wed, 08 Apr 2026 11:07:02 GMT</lastBuildDate><atom:link href="https://dionnotario.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Kemiskinan dan Kelahiran]]></title><description><![CDATA[Saya bertanya:
Ada pendapat bahwa untuk memutus rantai kemiskinan, orang miskin seharusnya tidak beranak. Apakah ini solusi yang benar?
OpenAI menjawab:
Tidak. Pendapat tersebut keliru sejak awal karena salah mengidentifikasi masalah.Kemiskinan bukan...]]></description><link>https://dionnotario.com/kemiskinan-dan-kelahiran</link><guid isPermaLink="true">https://dionnotario.com/kemiskinan-dan-kelahiran</guid><category><![CDATA[birthrate]]></category><category><![CDATA[openai]]></category><category><![CDATA[poverty]]></category><dc:creator><![CDATA[dion notario]]></dc:creator><pubDate>Mon, 19 Jan 2026 09:39:47 GMT</pubDate><content:encoded><![CDATA[<p><strong>Saya bertanya:</strong></p>
<p>Ada pendapat bahwa untuk memutus rantai kemiskinan, orang miskin seharusnya tidak beranak. Apakah ini solusi yang benar?</p>
<p><strong>OpenAI menjawab:</strong></p>
<p>Tidak. Pendapat tersebut keliru sejak awal karena salah mengidentifikasi masalah.<br />Kemiskinan bukan sifat bawaan manusia, melainkan kondisi yang dihasilkan oleh sistem sosial, ekonomi, dan politik. Melarang orang miskin beranak berarti menghukum korban, bukan memperbaiki penyebabnya.</p>
<p><strong>Saya bertanya:</strong></p>
<p>Tapi bukankah sistem membutuhkan orang miskin untuk mengerjakan pekerjaan kasar seperti kurir, tukang sampah, atau kuli?</p>
<p><strong>OpenAI menjawab:</strong></p>
<p>Tidak. Sistem tidak membutuhkan <em>orang miskin</em>, sistem membutuhkan <em>pekerjaan untuk dikerjakan</em>.<br />Kesalahan berpikirnya adalah menyamakan pekerjaan fisik dengan kemiskinan. Di banyak negara maju, pekerjaan berat tetap ada, tetapi pekerjanya hidup layak. Yang dibutuhkan dunia adalah pekerjaan bermartabat, bukan kelas sosial yang sengaja dimiskinkan.</p>
<p><strong>Saya bertanya:</strong></p>
<p>Namun faktanya, di negara-negara yang dianggap lebih adil seperti Skandinavia atau Jerman, angka kelahiran justru turun drastis. Mengapa?</p>
<p><strong>OpenAI menjawab:</strong></p>
<p>Karena keadilan dan kesejahteraan membuat manusia hidup lebih rasional.<br />Di masyarakat miskin, anak sering berfungsi sebagai jaminan ekonomi dan sosial. Di masyarakat sejahtera, fungsi itu digantikan oleh negara. Anak tidak lagi menjadi kebutuhan, melainkan pilihan. Dan ketika sesuatu menjadi pilihan, manusia cenderung memilih lebih sedikit.</p>
<p><strong>Saya bertanya:</strong></p>
<p>Jadi turunnya angka kelahiran bukan tanda kegagalan sistem?</p>
<p><strong>OpenAI menjawab:</strong></p>
<p>Bukan. Itu adalah konsekuensi logis dari modernitas.<br />Pendidikan tinggi, partisipasi kerja perempuan, kesadaran kesehatan mental, dan mahalnya biaya peluang membuat banyak orang menunda atau bahkan menolak memiliki anak. Ini bukan krisis moral, melainkan perubahan nilai hidup.</p>
<p><strong>Saya bertanya:</strong></p>
<p>Kalau begitu, mengapa negara-negara tersebut justru harus mengimpor imigran untuk pekerjaan kasar?</p>
<p><strong>OpenAI menjawab:</strong></p>
<p>Karena mereka menghadapi krisis demografi.<br />Penduduk lokal menua dan jumlah usia produktif menurun. Imigran datang untuk mengisi kekosongan tenaga kerja, bukan untuk dimiskinkan. Dalam banyak kasus, imigran justru mengalami peningkatan kualitas hidup dibandingkan di negara asalnya.</p>
<p><strong>Saya bertanya:</strong></p>
<p>Bukankah ini berarti kemiskinan tetap “dipelihara”, hanya saja dipindahkan dari negara lain?</p>
<p><strong>OpenAI menjawab:</strong></p>
<p>Tidak sesederhana itu.<br />Yang terjadi bukan pemeliharaan kemiskinan, melainkan pemanfaatan ketimpangan global yang sudah ada. Selama perbedaan kesejahteraan antarnegara sangat lebar, migrasi akan terus terjadi, apa pun sistemnya.</p>
<p><strong>Saya bertanya:</strong></p>
<p>Lalu sistem seperti apa yang bisa disebut paling adil?</p>
<p><strong>OpenAI menjawab:</strong></p>
<p>Tidak ada sistem yang sepenuhnya adil.<br />Yang ada hanyalah sistem yang mengakui keterbatasannya, memiliki mekanisme koreksi, dan mampu mengurangi penderitaan sebelum menjadi krisis. Negara kesejahteraan adalah contoh sistem yang relatif paling mendekati prinsip ini, meskipun tidak sempurna.</p>
<p><strong>Saya bertanya:</strong></p>
<p>Apakah sistem yang lebih adil selalu berujung pada penurunan kelahiran?</p>
<p><strong>OpenAI menjawab:</strong></p>
<p>Hampir selalu, jika keadilan tersebut disertai pendidikan tinggi dan kebebasan memilih.<br />Manusia yang bebas dan terdidik tidak bereproduksi karena tekanan, melainkan karena makna. Dan makna tidak bisa dipaksakan oleh kebijakan negara.</p>
<p><strong>Saya bertanya:</strong></p>
<p>Jadi apa pelajaran terpenting dari hubungan antara kemiskinan dan kelahiran?</p>
<p><strong>OpenAI menjawab:</strong></p>
<p>Bahwa dunia tidak membutuhkan orang miskin agar bisa berjalan.<br />Yang dibutuhkan dunia adalah sistem yang tidak menghukum kelahiran, pekerjaan yang memungkinkan hidup layak, dan keberanian untuk menerima bahwa kemajuan selalu membawa dilema baru</p>
]]></content:encoded></item><item><title><![CDATA[Hubungan Defisit APBN dengan EPS BBRI]]></title><description><![CDATA[Di awal tahun 2026 ini muncul berita bahwa defisit APBN terhadap PDB di penutupan tahun 2025 sebesar 2,92% (cek di sini). Nilai ini hampir mendekati batas maksimum yang ditetapkan undang-undang yaitu 3%.
Rasio defisit APBN terhadap PDB ini menjadi sa...]]></description><link>https://dionnotario.com/hubungan-defisit-apbn-dengan-eps-bbri</link><guid isPermaLink="true">https://dionnotario.com/hubungan-defisit-apbn-dengan-eps-bbri</guid><category><![CDATA[macroeconomics]]></category><dc:creator><![CDATA[dion notario]]></dc:creator><pubDate>Sun, 11 Jan 2026 15:25:15 GMT</pubDate><content:encoded><![CDATA[<p>Di awal tahun 2026 ini muncul berita bahwa defisit APBN terhadap PDB di penutupan tahun 2025 sebesar 2,92% (<a target="_blank" href="https://www.youtube.com/watch?v=usN1fO5H4kU&amp;t=23s">cek di sini</a>). Nilai ini hampir mendekati batas maksimum yang ditetapkan undang-undang yaitu 3%.</p>
<p>Rasio defisit APBN terhadap PDB ini menjadi salah satu indikator bagi investor luar negeri untuk mengambil keputusan dalam berinvestasi di Indonesia. Semakin besar rasio defisit APBN terhadap PDB maka risiko semakin besar dan menyebabkan <em>capital outflow</em>.</p>
<p>Yang menarik, ternyata rasio defisit APBN terhadap PDB ini memiliki hubungan linier dengan <em>earning per share</em> (EPS) saham bank BRI (BBRI). Kami telah mengumpulkan data rasio defisit APBN terhadap PDB serta EPS per akhir tahun dari tahun 2020-2024. Data ini kemudian dianalisis dengan regresi linier sederhana.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768143512882/ebe11761-9ff2-4f79-b280-8cd73e64671c.png" alt="Hubungan antara defisit APBN dengan EPS BBRI pada akhir tahun" class="image--center mx-auto" /></p>
<p>Berdasarkan analisis regresi ini, diperoleh hubungan linier antara rasio defisit APBN (x) dengan EPS (y) sebagai berikut:</p>
<p>$$y=-59.283x+498.726$$</p><p>Persamaan ini memiliki koefisien korelasi yang cukup kuat (&gt;0,95).</p>
<p>Dengan persamaan ini, kita dapat memprediksi (<em>belum tentu benar juga ya</em>), bahwa EPS BBRI di akhir 2025 adalah sebesar 325.6211 atau turun 17% yoy. Ini nanti bisa divalidasi saat laporan keuangan Q4 BBRI sudah dirilis.</p>
<p><strong>Bagaimana dengan akhir tahun 2026?</strong></p>
<p>Menurut data terbaru, target defisit APBN 2026 adalah 2,68%. Maka dengan formula yang sama, diprediksi bahwa EPS BBRI di akhir tahun 2026 menjadi 339.8489, atau sedikit meningkat (sekitar +4,37%) dibandingkan dengan prediksi EPS di akhir tahun 2025.</p>
<p>So, apakah menguntungkan jika invest di BBRI saat ini? kok kayaknya enggak ya…kecuali ada gebrakan dari pemerintah buat perbaiki ekonomi.</p>
<p><strong>Seperti biasa, sebagai transparansi, skrip R untuk analisis data dapat dilihat di bawah ini.</strong></p>
<pre><code class="lang-plaintext">&gt; #memanggil library
&gt; library(dplyr)
&gt; library(ggplot2)
&gt; library(ggrepel)
&gt; 
&gt; #input data
&gt; data_bri &lt;- data.frame(readxl::read_excel("analisis BBRI.xlsx", sheet="input"))
&gt; data_keuangan &lt;- data_bri %&gt;%
+                  mutate(CKPNperTK = CKPN/TK*100)
&gt; 
&gt; #menampilkan data periode dan EPS
&gt; data_keuangan[,c("PERIOD","EPS")]
  PERIOD    EPS
1   2020 123.09
2   2021 204.98
3   2022 337.63
4   2023 396.54
5   2024 396.91
&gt; 
&gt; #analisis regresi linier
&gt; linear.model &lt;- lm(EPS ~ DAP, data=data_keuangan)
&gt; summary(linear.model)

Call:
lm(formula = EPS ~ DAP, data = data_keuangan)

Residuals:
     1      2      3      4      5 
  9.70 -18.08 -21.78  -4.37  34.53 

Coefficients:
            Estimate Std. Error t value Pr(&gt;|t|)    
(Intercept)  498.726     25.666  19.431 0.000298 ***
DAP          -59.283      6.523  -9.088 0.002815 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 26.5 on 3 degrees of freedom
Multiple R-squared:  0.9649,    Adjusted R-squared:  0.9533 
F-statistic: 82.59 on 1 and 3 DF,  p-value: 0.002815

&gt; 
&gt; # visualisasi
&gt; data_visualisasi &lt;- data_keuangan %&gt;%
+                     select(PERIOD, EPS, DAP)
&gt;                     
&gt; ggplot(data_visualisasi, aes(x = DAP, y = EPS, label = PERIOD)) +
+   geom_point(
+     size = 3.5,
+     shape = 21,
+     fill = "#2E86AB",
+     color = "black",
+     stroke = 0.8
+   ) +
+   geom_smooth(
+     method = "lm",
+     se = TRUE,
+     color = "#2E86AB",
+     fill = "#A6CFE2",
+     linewidth = 1.2,
+     alpha = 0.3
+   ) +
+   geom_text_repel(
+     size = 3.5,
+     color = "black",
+     box.padding = 0.5,
+     point.padding = 0.5,
+     max.overlaps = Inf,
+     segment.color = "grey50",
+     segment.size = 0.3,
+     min.segment.length = 0
+   ) +
+   labs(
+     x = "Defisit APBN pada Akhir Tahun",
+     y = "Earning per Share"
+   ) +
+   theme_classic(base_size = 12) +
+   theme(
+     # Axis styling
+     axis.line = element_line(linewidth = 1, color = "black"),
+     axis.ticks = element_line(linewidth = 0.8, color = "black"),
+     axis.ticks.length = unit(0.15, "cm"),
+     axis.text = element_text(color = "black", size = 11),
+     axis.title = element_text(color = "black", size = 12, face = "bold"),
+     axis.title.x = element_text(margin = margin(t = 10)),
+     axis.title.y = element_text(margin = margin(r = 10)),
+     
+     # Panel styling
+     panel.background = element_rect(fill = "white", color = NA),
+     panel.grid.major = element_blank(),
+     panel.grid.minor = element_blank(),
+     
+     # Plot styling
+     plot.background = element_rect(fill = "white", color = NA),
+     plot.margin = margin(10, 15, 10, 10),
+     
+     # Legend (if needed)
+     legend.position = "none"
+   )
`geom_smooth()` using formula = 'y ~ x'

&gt; # prediksi EPS khir tahun 2025
&gt; newdata &lt;- data.frame(DAP = 2.92) # defisit APBN 2025 sebesar 2.92%
&gt; EPS_pred &lt;- predict(linear.model, newdata)
&gt; EPS_pred
       1 
325.6211 
&gt; growth_yoy &lt;- (EPS_pred[[1]] - 396.91)/396.91*100
&gt; growth_yoy
[1] -17.96099
&gt; # prediksi EPS akhir tahun 2026
&gt; newdata &lt;- data.frame(DAP = 2.68) # defisit APBN 2026 sebesar 2.68%
&gt; EPS_pred &lt;- predict(linear.model, newdata)
&gt; EPS_pred
       1 
339.8489
</code></pre>
]]></content:encoded></item><item><title><![CDATA[Memahami Hubungan US Treasury 10 Tahun dan SBN Indonesia 10 Tahun]]></title><description><![CDATA[Mengapa Tidak Selalu Bergerak Searah?
Pendahuluan
Dalam analisis pasar keuangan global, US Treasury (UST) sering dipandang sebagai risk-free benchmark, sementara Surat Berharga Negara (SBN) Indonesia merupakan obligasi emerging market dengan risk pre...]]></description><link>https://dionnotario.com/memahami-hubungan-us-treasury-10-tahun-dan-sbn-indonesia-10-tahun</link><guid isPermaLink="true">https://dionnotario.com/memahami-hubungan-us-treasury-10-tahun-dan-sbn-indonesia-10-tahun</guid><category><![CDATA[macroeconomics]]></category><category><![CDATA[obligasi negara]]></category><dc:creator><![CDATA[dion notario]]></dc:creator><pubDate>Thu, 25 Dec 2025 01:11:50 GMT</pubDate><content:encoded><![CDATA[<p><em>Mengapa Tidak Selalu Bergerak Searah?</em></p>
<h2 id="heading-pendahuluan">Pendahuluan</h2>
<p>Dalam analisis pasar keuangan global, <strong>US Treasury (UST)</strong> sering dipandang sebagai <em>risk-free benchmark</em>, sementara <strong>Surat Berharga Negara (SBN) Indonesia</strong> merupakan obligasi <em>emerging market</em> dengan <em>risk premium</em> lebih tinggi.</p>
<p>Banyak investor berasumsi sederhana:</p>
<blockquote>
<p>Jika yield US Treasury naik, maka yield SBN Indonesia pasti ikut naik.</p>
</blockquote>
<p>Kenyataannya, hubungan keduanya jauh lebih kompleks. Artikel ini membahas:</p>
<ul>
<li><p>Peran UST dan SBN dalam sistem keuangan</p>
</li>
<li><p>Hubungan struktural antara keduanya</p>
</li>
<li><p>Interpretasi dua grafik empiris: <strong>time series</strong> dan <strong>scatter plot</strong></p>
</li>
</ul>
<hr />
<h2 id="heading-apa-itu-us-treasury-10-tahun-ust-10y">Apa Itu US Treasury 10 Tahun (UST 10Y)</h2>
<p><strong>US Treasury 10Y</strong> adalah surat utang pemerintah Amerika Serikat dengan tenor 10 tahun dan berfungsi sebagai:</p>
<ul>
<li><p>Acuan suku bunga global</p>
</li>
<li><p>Instrumen bebas risiko secara internasional</p>
</li>
<li><p>Dasar penilaian obligasi dan saham global</p>
</li>
</ul>
<p>Faktor utama yang memengaruhi yield UST 10Y:</p>
<ul>
<li><p>Kebijakan The Fed</p>
</li>
<li><p>Inflasi dan ekspektasi inflasi AS</p>
</li>
<li><p>Data tenaga kerja</p>
</li>
<li><p>Sentimen risiko global (<em>risk-on / risk-off</em>)</p>
</li>
<li><p>Defisit fiskal AS</p>
</li>
</ul>
<hr />
<h2 id="heading-apa-itu-sbn-indonesia-10-tahun">Apa Itu SBN Indonesia 10 Tahun</h2>
<p><strong>SBN 10Y</strong> adalah obligasi pemerintah Indonesia dengan tenor 10 tahun yang mencerminkan:</p>
<ul>
<li><p>Ekspektasi inflasi domestik</p>
</li>
<li><p>Kebijakan moneter Bank Indonesia</p>
</li>
<li><p>Risiko fiskal dan nilai tukar</p>
</li>
<li><p>Persepsi investor terhadap Indonesia</p>
</li>
</ul>
<p>Dibanding UST, SBN memiliki:</p>
<ul>
<li><p>Yield lebih tinggi</p>
</li>
<li><p>Likuiditas lebih rendah</p>
</li>
<li><p>Sensitivitas kuat terhadap faktor domestik</p>
</li>
</ul>
<hr />
<h2 id="heading-hubungan-konseptual-ust-dan-sbn">Hubungan Konseptual UST dan SBN</h2>
<p>Secara sederhana:</p>
<p>Yield SBN = Yield UST + Risk Premium Indonesia</p>
<p>Risk premium tersebut mencakup:</p>
<ul>
<li><p>Risiko nilai tukar (USD/IDR)</p>
</li>
<li><p>Risiko fiskal</p>
</li>
<li><p>Risiko kebijakan</p>
</li>
<li><p>Risiko likuiditas</p>
</li>
</ul>
<p>Namun hubungan ini <strong>tidak bekerja secara mekanis dari hari ke hari</strong>.</p>
<hr />
<h2 id="heading-analisis-grafik-1">Analisis Grafik 1</h2>
<h2 id="heading-time-series-yield-ust-10y-vs-sbn-10y-20152025">Time Series Yield UST 10Y vs SBN 10Y (2015–2025)</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1766623082861/4e8b0d92-7859-45c4-8ab9-f0768fa340ef.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-temuan-utama">Temuan Utama</h3>
<ol>
<li><p><strong>Perbedaan level yield</strong></p>
<ul>
<li><p>UST 10Y: ±0,5%–5%</p>
</li>
<li><p>SBN 10Y: ±6%–9%</p>
</li>
</ul>
</li>
<li><p><strong>Arah jangka panjang sejalan</strong></p>
<ul>
<li><p>Keduanya turun saat krisis COVID-19</p>
</li>
<li><p>Keduanya naik saat inflasi global melonjak</p>
</li>
</ul>
</li>
<li><p><strong>Volatilitas berbeda</strong></p>
<ul>
<li><p>UST lebih reaktif terhadap data makro</p>
</li>
<li><p>SBN lebih stabil karena peran Bank Indonesia dan investor domestik</p>
</li>
</ul>
</li>
<li><p><strong>Divergensi penting</strong></p>
<ul>
<li><p>Tahun 2020: UST jatuh tajam</p>
</li>
<li><p>SBN turun terbatas → efek penyangga kebijakan domestik</p>
</li>
</ul>
</li>
</ol>
<p><strong>Kesimpulan:</strong><br />UST bertindak sebagai <em>leading indicator</em>, sedangkan SBN mencerminkan respons akhir Indonesia.</p>
<hr />
<h2 id="heading-analisis-grafik-2">Analisis Grafik 2</h2>
<h2 id="heading-scatter-plot-hubungan-yield-ust-10y-dan-sbn-10y">Scatter Plot Hubungan Yield UST 10Y dan SBN 10Y</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1766623147033/f7a1ec4e-6adb-41e4-a7dc-98c4369e0695.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-temuan-yang-terlihat">Temuan yang Terlihat</h3>
<p>Garis regresi menunjukkan <strong>hubungan negatif</strong>:</p>
<blockquote>
<p>Saat UST lebih tinggi, SBN justru cenderung lebih rendah.</p>
</blockquote>
<p>Ini sering disalahartikan sebagai hubungan sebab-akibat langsung, padahal <strong>bukan demikian</strong>.</p>
<hr />
<h2 id="heading-penjelasan-kunci-regime-effect-amp-simpsons-paradox">Penjelasan Kunci: Regime Effect &amp; Simpson’s Paradox</h2>
<p>Hubungan negatif muncul karena <strong>pergeseran rezim waktu</strong>.</p>
<h3 id="heading-pembagian-rezim-kasar">Pembagian rezim kasar:</h3>
<ul>
<li><p><strong>2015–2019</strong>: UST rendah, SBN tinggi</p>
</li>
<li><p><strong>2020</strong>: UST sangat rendah, SBN turun terbatas</p>
</li>
<li><p><strong>2022–2024</strong>: UST tinggi, SBN lebih rendah dan stabil</p>
</li>
</ul>
<p>Jika semua periode digabung:</p>
<ul>
<li><p>Masa lama: UST rendah ↔ SBN tinggi</p>
</li>
<li><p>Masa baru: UST tinggi ↔ SBN lebih rendah</p>
</li>
</ul>
<p>Hasilnya adalah <strong>slope negatif secara statistik</strong>, contoh klasik <em>Simpson’s Paradox</em> dalam data makro.</p>
<hr />
<h2 id="heading-implikasi-untuk-analisis-dan-investasi">Implikasi untuk Analisis dan Investasi</h2>
<h3 id="heading-yang-perlu-dihindari">Yang Perlu Dihindari</h3>
<ul>
<li><p>Regresi statis sederhana tanpa konteks waktu:</p>
<pre><code class="lang-r">   lm(sbn10 ~ ust10)
</code></pre>
</li>
</ul>
<h3 id="heading-pendekatan-yang-lebih-tepat">Pendekatan yang Lebih Tepat</h3>
<ul>
<li><ul>
<li><p>Analisis perubahan yield (Δ)</p>
<ul>
<li><p>Rolling correlation / rolling beta</p>
</li>
<li><p>Model VAR dan impulse response</p>
</li>
<li><p>Menambahkan variabel kontrol:</p>
<ul>
<li><p>BI Rate</p>
</li>
<li><p>USD/IDR</p>
</li>
<li><p>Inflasi</p>
</li>
<li><p>Dummy krisis</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="heading-kesimpulan">Kesimpulan</h2>
<ol>
<li><p>UST 10Y adalah jangkar suku bunga global</p>
</li>
<li><p>SBN 10Y mencerminkan interaksi global dan domestik</p>
</li>
<li><p>Hubungan keduanya tidak linear dan bergantung pada rezim</p>
</li>
<li><p>Grafik time series dan scatter harus dibaca bersama</p>
</li>
</ol>
<blockquote>
<p><strong>UST memberi sinyal awal, SBN menunjukkan hasil akhir.</strong></p>
</blockquote>
<h1 id="heading-materi-tambahan"><strong>Materi Tambahan</strong></h1>
<ul>
<li><p>Data yield SBN dan UST diperoleh dari <a target="_blank" href="https://id.investing.com/rates-bonds/">website investing.com</a></p>
</li>
<li><p>Berikut ini adalah luaran R console untuk memvisualisasikan grafik 1 dan 2 pada pembahasan ini.</p>
</li>
</ul>
<pre><code class="lang-plaintext">&gt; library(quantmod)
&gt; library(tidyverse)
&gt; library(lubridate)
&gt; library(readxl)
&gt; 
&gt; setwd("D:\\Invest\\UST dan SBN")
&gt; 
&gt; ust10 &lt;- read_excel("ust10.xlsx")%&gt;%
+   rename(date = Date2,
+        ust10 = Price) %&gt;%
+   mutate(date = as.Date(date))%&gt;%
+   select(date,ust10)
&gt; head(ust10)                                                                      
# A tibble: 6 × 2
  date       ust10
  &lt;date&gt;     &lt;dbl&gt;
1 2025-12-24  4.13
2 2025-12-23  4.17
3 2025-12-22  4.17
4 2025-12-19  4.15
5 2025-12-18  4.12
6 2025-12-17  4.15
&gt; 
&gt; sbn10 &lt;- read_excel("sbn10.xlsx") %&gt;%
+   rename(date = Tanggal,
+          sbn10 = Terakhir) %&gt;%
+   mutate(date = as.Date(date)) %&gt;%
+   select(date,sbn10) %&gt;%
+   mutate(sbn10 = sbn10/1000)
&gt;                                                                                  
&gt; head(sbn10)
# A tibble: 6 × 2
  date       sbn10
  &lt;date&gt;     &lt;dbl&gt;
1 2025-12-24  6.12
2 2025-12-23  6.14
3 2025-12-22  6.14
4 2025-12-19  6.13
5 2025-12-18  6.12
6 2025-12-17  6.13
&gt; 
&gt; bond_df &lt;- ust10 %&gt;%
+   inner_join(sbn10, by = "date") %&gt;%
+   drop_na()
&gt; 
&gt; bond_df %&gt;%
+   pivot_longer(cols = c(ust10, sbn10),
+                names_to = "yield_type",
+                values_to = "yield") %&gt;%
+   ggplot(aes(x = date, y = yield, color = yield_type)) +
+   geom_line() +
+   labs(
+     title = "Yield US Treasury 10Y vs SBN Indonesia 10Y",
+     x = "Tanggal",
+     y = "Yield (%)",
+     color = ""
+   ) +
+   theme_minimal()
&gt; 
&gt; cor(bond_df$ust10, bond_df$sbn10, use = "complete.obs")
[1] -0.1703575
&gt; 
&gt; ggplot(bond_df, aes(x = ust10, y = sbn10)) +
+   geom_point(alpha = 0.5) +
+   geom_smooth(method = "lm", se = FALSE) +
+   labs(
+     title = "Hubungan Yield UST 10Y dan SBN 10Y",
+     x = "UST 10Y (%)",
+     y = "SBN 10Y (%)"
+   ) +
+   theme_minimal()
</code></pre>
]]></content:encoded></item><item><title><![CDATA[Metode Regresi Linier Bayesian untuk Menentukan Kedaluarsa Obat]]></title><description><![CDATA[Dalam artikel sebelumnya saya telah menulis beberapa metode untuk menentukan waktu kedaluarsa obat berdasarkan regresi linier sederhana. Anda dapat melihat kembali artikel tersebut pada tautan ini. Metode yang telah saya paparkan sebelumnya adalah me...]]></description><link>https://dionnotario.com/metode-regresi-linier-bayesian-untuk-menentukan-kedaluarsa-obat</link><guid isPermaLink="true">https://dionnotario.com/metode-regresi-linier-bayesian-untuk-menentukan-kedaluarsa-obat</guid><category><![CDATA[Drug Stability]]></category><category><![CDATA[Bayesian Inference]]></category><category><![CDATA[kedaluarsa]]></category><dc:creator><![CDATA[dion notario]]></dc:creator><pubDate>Thu, 08 May 2025 03:43:44 GMT</pubDate><content:encoded><![CDATA[<p>Dalam artikel sebelumnya saya telah menulis beberapa metode untuk menentukan waktu kedaluarsa obat berdasarkan regresi linier sederhana. Anda dapat melihat kembali artikel tersebut pada tautan <a target="_blank" href="https://dionnotario.com/cara-menentukan-tanggal-kedaluwarsa-obat-dengan-regresi-linier-dan-monte-carlo">ini</a>. Metode yang telah saya paparkan sebelumnya adalah metode berdasarkan pendekatan frekuentis yang memerlukan data dalam jumlah cukup besar dan lengkap.</p>
<p>Kali ini saya akan menuliskan cara menentukan waktu kedaluarsa berdasarkan pendekatan Bayesian. Pendekatan Bayesian sendiri merupakan hal yang baru bagi saya akan tetapi ini sangat menarik karena memungkinkan pengambilan sampel yang lebih kecil.</p>
<p>Dalam artikel ini saya hanya akan memberikan panduan praktisnya dalam analisis dengan R. Mari kita mulai.</p>
<ul>
<li><p>Kinetika degradasi dianggap mengikuti orde nol dengan persamaan:</p>
<p>  $$y_n=\alpha - \beta x_n + \epsilon_n$$</p>
<p>  di mana y adalah persen obat yang tersisa, alfa adalah kadar obat mula-mula (C0), beta adalah konstanta degradasi obat orde nol, x adalah waktu sejak pembuatan obat (dalam bulan), dan epsilon adalah <em>residual error</em>.</p>
</li>
<li><p>residual dianggap terdistribusi normal sehingga:</p>
<p>  $$\epsilon_n \sim \operatorname{normal}(0,\sigma),$$</p>
<p>  karena resiudal adalah selisih dari data eksperimental dengan data prediksi maka persamaan di atas ekivalen dengan:</p>
<p>  $$y_n - (\alpha + \beta X_n) \sim \operatorname{normal}(0,\sigma),$$</p>
<p>  ini masih bisa disederhanakan lagi menjadi:</p>
<p>  $$y_n \sim \operatorname{normal}(\alpha + \beta X_n, \, \sigma).$$</p>
</li>
<li><p>persmaaan inilah yang menjadi dasar dalam pemodelan dengan statistika Bayesian.</p>
</li>
</ul>
<p>Sekarang, mari kita coba implementasikan di R.</p>
<p><strong>Pertama</strong>, implementasi metode Bayesian di R dapat dilakukan dengan memanggil library rstan.</p>
<pre><code class="lang-plaintext">&gt; # memanggil library rstan
&gt; library(rstan)
&gt; rstan_options(auto_write = TRUE)
</code></pre>
<p><strong>Kedua,</strong> menginput data. Dalam pemrograman ini, kita akan membuat data sebagai list bukan sebagai data.frame. Untuk sementara ini, kita abaikan dulu pengaruh bets (dianggap antar bets seragam), sehingga data nomor bets tidak dimasukkan.</p>
<pre><code class="lang-plaintext">&gt; # memanggil library rstan
&gt; library(rstan)
&gt; rstan_options(auto_write = TRUE)
&gt; data&lt;- list(x= x, y = y, N = length(x))
&gt; data
$x
 [1]  0  0  0  3  3  3  6  6  6  9  9  9 12 12 12 18 18 18

$y
 [1] 100.0 100.0 100.0 100.0  98.0  98.1  98.0 102.0  90.6  96.1 100.0  96.2
[13]  96.1  94.1  88.7  92.2  88.2  92.5

$N
[1] 18
</code></pre>
<p><strong>Ketiga</strong>, membuat struktur model Bayesian dalam format stan. Kita dapat membuatnya dalam notepad kemudian disimpan dalam ekstensi .stan.</p>
<pre><code class="lang-plaintext">data {
  int&lt;lower=0&gt; N;
  vector[N] x;
  vector[N] y;
}
parameters {
  real alpha;
  real beta;
  real&lt;lower=0&gt; sigma;
}
model {
  y ~ normal(alpha + beta * x, sigma);
}
</code></pre>
<p>Selanjutnya, model ini dikompilasi ke dalam R.</p>
<pre><code class="lang-plaintext">&gt; linear_regression &lt;- stan_model("linear_regression.stan")
</code></pre>
<p><strong>Keempat</strong>, melakukan fitting model terhadap data.</p>
<pre><code class="lang-plaintext">&gt; fit1 &lt;- sampling(linear_regression, data = data, chains = 4, 
+                  iter = 1000, refresh = 0)
&gt; print(fit1)
Inference for Stan model: anon_model.
4 chains, each with iter=1000; warmup=500; thin=1; 
post-warmup draws per chain=500, total post-warmup draws=2000.

        mean se_mean   sd   2.5%    25%    50%    75%  97.5% n_eff Rhat
alpha 100.30    0.04 1.22  97.86  99.52 100.31 101.10 102.68   861    1
beta   -0.52    0.00 0.12  -0.76  -0.60  -0.52  -0.44  -0.27   821    1
sigma   3.13    0.02 0.61   2.20   2.71   3.04   3.43   4.55   968    1
lp__  -27.64    0.04 1.28 -31.02 -28.25 -27.30 -26.72 -26.19   842    1

Samples were drawn using NUTS(diag_e) at Thu May  8 09:52:49 2025.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).
</code></pre>
<p>lalu memastikan apakah kalkulasi parameter sudah stasioner</p>
<pre><code class="lang-plaintext">&gt; traceplot(fit1)
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746674856506/21bfc8c2-cc1a-4fc2-aa50-a35ef4848e78.png" alt class="image--center mx-auto" /></p>
<p>dari plot ini kita tahu bahwa perhitungan parameter sudah stasioner sehingga bisa lanjut ke tahap selanjutnya.</p>
<p><strong>Kelima</strong>, menghitung t90 (waktu kedaluarsa)</p>
<pre><code class="lang-plaintext">&gt; # mengekstrak distribusi posterior dari parameter
&gt; posterior &lt;- extract(fit1, pars = c('alpha', 'beta'))
&gt; # menghitung t90
&gt; t90 &lt;- (90 - posterior$alpha)/posterior$beta
&gt; summary_t90 &lt;- quantile(t90, probs=c(0.025, 0.5, 0.975))
&gt; summary_t90
    2.5%      50%    97.5% 
15.31435 19.91444 31.39603
</code></pre>
<p>berdasarkan perhitungan ini, kita tahu bahwa median waktu kedaluarsa adalah ~20 bulan dengan persentil 2,5% (dianggap batas bawah) adalah ~15 bulan. Oleh karena itu, waktu kedaluarsa ditetapkan 15 bulan.</p>
<p><strong>keenam</strong>, visualisai data</p>
<pre><code class="lang-plaintext">&gt; # Ambil 1000 nilai posterior dari alpha dan beta
&gt; alpha &lt;- posterior$alpha
&gt; beta &lt;- posterior$beta
&gt; # Buat grid x (waktu) untuk prediksi, misal dari 0 sampai 20 bulan
&gt; x_pred &lt;- seq(0, 40, by = 0.1)
&gt; # Buat matriks prediksi: untuk setiap x_pred, hitung y_pred dari setiap pasangan (alpha, beta)
&gt; y_pred_matrix &lt;- sapply(x_pred, function(x_val) alpha + beta * x_val)
&gt; # Hitung kuantil 2.5%, 50%, dan 97.5% untuk setiap titik waktu prediksi
&gt; y_lower &lt;- apply(y_pred_matrix, 2, quantile, probs = 0.025)
&gt; y_median &lt;- apply(y_pred_matrix, 2, quantile, probs = 0.5)
&gt; y_upper &lt;- apply(y_pred_matrix, 2, quantile, probs = 0.975)
&gt; # Plot hasil
&gt; library(ggplot2)
&gt; # Data asli
&gt; data_plot &lt;- data.frame(x = x, y = y)
&gt; # Data prediksi
&gt; pred_plot &lt;- data.frame(
+   x = x_pred,
+   lower = y_lower,
+   median = y_median,
+   upper = y_upper
+ )
&gt; ggplot() +
+   geom_point(data = data_plot, aes(x = x, y = y), color = "black", size = 2) +
+   geom_line(data = pred_plot, aes(x = x, y = median), color = "blue", size = 1) +
+   geom_ribbon(data = pred_plot, aes(x = x, ymin = lower, ymax = upper), fill = "skyblue", alpha = 0.4) +
+   geom_line(data = pred_plot, aes(x = x, y = lower), color = "blue", size = .5, lty=2) +
+   geom_line(data = pred_plot, aes(x = x, y = upper), color = "blue", size = .5, lty=2) +
+   
+   labs(
+     title = "Fitting Data Stabilitas Obat dengan Regresi Linear Bayesian",
+     x = "Waktu (bulan)",
+     y = "Persen Obat Tersisa"
+   ) +
+   geom_hline(yintercept=90, col='red', lty=2)+
+   theme_minimal()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746675585688/eb6a01cf-0aa8-4000-b7e3-a7bf286303f1.png" alt class="image--center mx-auto" /></p>
<p>dari visualisasi data ini terlihat bahwa model dengan data sudah cukup fit. Dan waktu kedaluarsa hasil estimasi baik median maupun pada batas bawah sudah sesuai.</p>
<p>sekian dulu penjelasan tentang perhitungan waktu kedaluarsa dengan metode Bayesian ini. Mudah-mudahan bermanfaat.</p>
]]></content:encoded></item><item><title><![CDATA[Visualisasi data stabilitas obat]]></title><description><![CDATA[Hai semua, dalam tulisan ini saya akan melanjutkan analisis data stabilitas obat dari artikel Cara Menentukan Tanggal Kedaluwarsa Obat dengan Regresi Linier dan Monte Carlo.
Data stabilitas dalam artikel tersebut akan lebih mudah dipahami bila divisu...]]></description><link>https://dionnotario.com/visualisasi-data-stabilitas-obat</link><guid isPermaLink="true">https://dionnotario.com/visualisasi-data-stabilitas-obat</guid><category><![CDATA[visualization]]></category><category><![CDATA[linearregression]]></category><category><![CDATA[Linear Regression]]></category><dc:creator><![CDATA[dion notario]]></dc:creator><pubDate>Sat, 03 May 2025 03:15:44 GMT</pubDate><content:encoded><![CDATA[<p>Hai semua, dalam tulisan ini saya akan melanjutkan analisis data stabilitas obat dari artikel <a target="_blank" href="https://hashnode.com/edit/cm9zuapyk000709l89qfd09ba">Cara Menentukan Tanggal Kedaluwarsa Obat dengan Regresi Linier dan Monte Carlo</a>.</p>
<p>Data stabilitas dalam artikel tersebut akan lebih mudah dipahami bila divisualisasikan dalam bentuk rata-rata +- standar deviasi. XY-plot yang dihasilkan lebih baik seperti ini:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746241897307/16490551-824f-4aa6-b76b-e79247ad2ceb.png" alt class="image--center mx-auto" /></p>
<p>Untuk memperoleh plot ini, jalankan perintah dengan pemrograman R berikut ini secara berurutan.</p>
<pre><code class="lang-plaintext">&gt; data1
   time assay batch
1     0    51     1
2     0    51     2
3     0    53     3
4     3    51     1
5     3    50     2
6     3    52     3
7     6    50     1
8     6    52     2
9     6    48     3
10    9    49     1
11    9    51     2
12    9    51     3
13   12    49     1
14   12    48     2
15   12    47     3
16   18    47     1
17   18    45     2
18   18    49     3
&gt; 
&gt; # memanggil paket yang diperlukan
&gt; library(dplyr)
&gt; library(MASS)
&gt; 
&gt; data2 &lt;- data1 %&gt;%
+   group_by(batch) %&gt;%                    # Kelompokkan berdasarkan bets
+   mutate(cp0 = assay[time == 0][1],  # Ambil kadar saat waktu = 0
+                       conc = (assay / cp0) * 100) # Hitung persen
&gt; data2
# A tibble: 18 × 5
# Groups:   batch [3]
    time assay batch   cp0  conc
   &lt;dbl&gt; &lt;dbl&gt; &lt;dbl&gt; &lt;dbl&gt; &lt;dbl&gt;
 1     0    51     1    51 100  
 2     0    51     2    51 100  
 3     0    53     3    53 100  
 4     3    51     1    51 100  
 5     3    50     2    51  98.0
 6     3    52     3    53  98.1
 7     6    50     1    51  98.0
 8     6    52     2    51 102. 
 9     6    48     3    53  90.6
10     9    49     1    51  96.1
11     9    51     2    51 100  
12     9    51     3    53  96.2
13    12    49     1    51  96.1
14    12    48     2    51  94.1
15    12    47     3    53  88.7
16    18    47     1    51  92.2
17    18    45     2    51  88.2
18    18    49     3    53  92.5
&gt; 
&gt; # Menghitung rata-rata dan standar deviasi untuk setiap nilai x
&gt; summary_data &lt;- aggregate(conc ~ time, data = data2, FUN = function(z) c(mean = mean(z), sd = sd(z),  n = length(z)))
&gt; 
&gt; # Memisahkan kolom rata-rata dan standar deviasi
&gt; summary_data$mean_conc &lt;- summary_data$conc[, "mean"]
&gt; summary_data$sd_conc &lt;- summary_data$conc[, "sd"]
&gt; summary_data$n_conc &lt;- summary_data$conc[, "n"]
&gt; summary_data$se_conc &lt;- summary_data$sd_conc / sqrt(summary_data$n_conc)
&gt; 
&gt; confidence_level &lt;- 0.95
&gt; alpha &lt;- 1 - confidence_level
&gt; t_critical &lt;- qt(1 - alpha/2, df = summary_data$n_conc - 1)
&gt; summary_data$ci_lower &lt;- summary_data$mean_conc - t_critical * summary_data$se_conc
&gt; summary_data$ci_upper &lt;- summary_data$mean_conc + t_critical * summary_data$se_conc
&gt; # Melakukan regresi linier pada data individual (bukan rata-rata)
&gt; lm1 &lt;- lm(conc ~ time, data = data2)
&gt; newx &lt;- data.frame(time=seq(0,30, length.out=18))
&gt; newx
        time
1   0.000000
2   1.764706
3   3.529412
4   5.294118
5   7.058824
6   8.823529
7  10.588235
8  12.352941
9  14.117647
10 15.882353
11 17.647059
12 19.411765
13 21.176471
14 22.941176
15 24.705882
16 26.470588
17 28.235294
18 30.000000
&gt; 
&gt; newy &lt;- predict(lm1, interval = "confidence", level=.95, newdata = newx)
&gt; data3 &lt;- as.data.frame(cbind(newx, newy[,-1]))
&gt; y.lwr &lt;- aggregate(lwr ~ time, data = data3, FUN = function(z) c(mean = mean(z), sd = sd(z),  n = length(z)))
&gt; y.upr &lt;- aggregate(upr ~ time, data = data3, FUN = function(z) c(mean = mean(z), sd = sd(z),  n = length(z)))
&gt; 
&gt; # Membuat plot menggunakan ggplot2
&gt; library(ggplot2)
&gt; 
&gt; plot &lt;- ggplot(summary_data, aes(x = time, y = mean_conc)) +
+   geom_point(size = 3) +  # Menampilkan titik data rata-rata
+   geom_errorbar(aes(ymin = mean_conc - sd_conc, ymax = mean_conc + sd_conc)) + # Menambahkan error bar (standar deviasi)
+   geom_abline(intercept = coef(lm1)[1], slope = coef(lm1)[2], linetype = "dashed", color = "blue") + # Menambahkan garis regresi
+   geom_line(data = y.lwr, aes(x = time, y = lwr[,1]), linetype = "dotted", color = "red")+
+   geom_line(data = y.upr, aes(x = time, y = upr[,1]), linetype = "dotted", color = "red")+
+   geom_hline(yintercept=90, linetype='dotted', color='gray')+
+   labs(
+     title = "",
+     x = "Time (month)",
+     y = "%-Remaining"
+   ) +
+   theme_bw()+
+   coord_cartesian(xlim = c(0, 30), ylim = c(80, 105))
&gt; plot
</code></pre>
]]></content:encoded></item><item><title><![CDATA[Dashboard kinerja bank]]></title><description><![CDATA[Di waktu luang coba-coba membuat dashboard untuk mengevaluasi kinerja bank dengan bantuan AI generative. Hasilnya di luar ekspektasi, ternyata mantap.

Ini kode pemrograman R yang dibuat oleh AI.
library(shiny)
library(shinydashboard)
library(readxl)...]]></description><link>https://dionnotario.com/dashboard-kinerja-bank</link><guid isPermaLink="true">https://dionnotario.com/dashboard-kinerja-bank</guid><category><![CDATA[dashboard]]></category><category><![CDATA[bank]]></category><category><![CDATA[R Language]]></category><category><![CDATA[#ai-tools]]></category><dc:creator><![CDATA[dion notario]]></dc:creator><pubDate>Sat, 03 May 2025 02:48:19 GMT</pubDate><content:encoded><![CDATA[<p>Di waktu luang coba-coba membuat dashboard untuk mengevaluasi kinerja bank dengan bantuan AI generative. Hasilnya di luar ekspektasi, ternyata mantap.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746240428962/0e7b6ef4-5c2b-4ae5-a3b9-b7c35e3c7236.png" alt class="image--center mx-auto" /></p>
<p>Ini kode pemrograman R yang dibuat oleh AI.</p>
<pre><code class="lang-plaintext">library(shiny)
library(shinydashboard)
library(readxl)
library(dplyr)
library(ggplot2)

ui &lt;- dashboardPage(
  dashboardHeader(title = "Dashboard Kinerja Bank"),
  dashboardSidebar(
    fileInput("file", "Upload File Excel", accept = c(".xlsx")),
    uiOutput("tahun_ui")
  ),
  dashboardBody(
    fluidRow(
      valueBoxOutput("roaBox"),
      valueBoxOutput("roeBox"),
      valueBoxOutput("carBox")
    ),
    fluidRow(
      box(plotOutput("nplPlot"), width = 6),
      box(plotOutput("nimPlot"), width = 6)
    )
  )
)

server &lt;- function(input, output, session) {

  data_input &lt;- reactive({
    req(input$file)
    read_excel(input$file$datapath)
  })

  output$tahun_ui &lt;- renderUI({
    req(data_input())
    selectInput("tahun", "Pilih Tahun:", choices = unique(data_input()$Tahun))
  })

  data_filtered &lt;- reactive({
    req(input$tahun)
    data_input() %&gt;% filter(Tahun == input$tahun)
  })

  output$roaBox &lt;- renderValueBox({
    valueBox(paste0(round(mean(data_filtered()$ROA, na.rm = TRUE), 2), "%"), 
             "ROA", icon = icon("chart-line"), color = "green")
  })

  output$roeBox &lt;- renderValueBox({
    valueBox(paste0(round(mean(data_filtered()$ROE, na.rm = TRUE), 2), "%"), 
             "ROE", icon = icon("percentage"), color = "blue")
  })

  output$carBox &lt;- renderValueBox({
    valueBox(paste0(round(mean(data_filtered()$CAR, na.rm = TRUE), 2), "%"), 
             "CAR", icon = icon("bank"), color = "purple")
  })

  output$nplPlot &lt;- renderPlot({
    ggplot(data_filtered(), aes(x = Bulan, y = NPL)) +
      geom_line(color = "red") +
      labs(title = "NPL Bulanan", y = "%", x = "Bulan")
  })

  output$nimPlot &lt;- renderPlot({
    ggplot(data_filtered(), aes(x = Bulan, y = NIM)) +
      geom_col(fill = "steelblue") +
      labs(title = "Net Interest Margin (NIM)", y = "%", x = "Bulan")
  })
}

shinyApp(ui, server)
</code></pre>
]]></content:encoded></item><item><title><![CDATA[Cara Praktis Membuat Diagram XY dan Menambah Kesalahan Standar]]></title><description><![CDATA[Halo semuanya,
dalam tulisan singkat ini, saya akan membagikan cara membuat plot XY dengan menambahkan kesalahan standard dari Y.
Misalkan kita mempunyai dataset sebagai berikut:
> # input data https://catalog.data.gov/dataset/in-vivo-plasma-concentr...]]></description><link>https://dionnotario.com/cara-praktis-membuat-diagram-xy-dan-menambah-kesalahan-standar</link><guid isPermaLink="true">https://dionnotario.com/cara-praktis-membuat-diagram-xy-dan-menambah-kesalahan-standar</guid><category><![CDATA[scatterplot]]></category><category><![CDATA[standarderror]]></category><category><![CDATA[visualization]]></category><dc:creator><![CDATA[dion notario]]></dc:creator><pubDate>Mon, 28 Apr 2025 15:19:42 GMT</pubDate><content:encoded><![CDATA[<p>Halo semuanya,</p>
<p>dalam tulisan singkat ini, saya akan membagikan cara membuat plot XY dengan menambahkan kesalahan standard dari Y.</p>
<p>Misalkan kita mempunyai dataset sebagai berikut:</p>
<pre><code class="lang-plaintext">&gt; # input data https://catalog.data.gov/dataset/in-vivo-plasma-concentration-for-lindane-after-6-hour-exposure-in-human-skin
&gt; time &lt;- c(1.029411765,
+           2.205882353,
+           3.235294118,
+           4.117647059,
+           5.073529412,
+           6.102941176,
+           7.205882353,
+           8.161764706,
+           12.05882353,
+           24.19117647,
+           32.42647059,
+           48.38235294,
+           79.04411765
+ )
&gt; cp &lt;- c(0.118055556,
+           0.309027778,
+           0.295138889,
+           0.309027778,
+           0.302083333,
+           0.336805556,
+           0.392361111,
+           0.395833333,
+           0.340277778,
+           0.173611111,
+           0.180555556,
+           0.131944444,
+           0.076388889
+ )
&gt; sem &lt;- c(0.045861286,
+          0.201592285,
+          0.208510595,
+          0.2209973,
+          0.21122832,
+          0.2431814,
+          0.248706332,
+          0.272317046,
+          0.24019267,
+          0.138240919,
+          0.136563753,
+          0.076203673,
+          0.048711957
+   )
&gt; dataset01 &lt;- data.frame(cbind(time, cp, sem))
&gt; dataset01
        time         cp        sem
1   1.029412 0.11805556 0.04586129
2   2.205882 0.30902778 0.20159229
3   3.235294 0.29513889 0.20851059
4   4.117647 0.30902778 0.22099730
5   5.073529 0.30208333 0.21122832
6   6.102941 0.33680556 0.24318140
7   7.205882 0.39236111 0.24870633
8   8.161765 0.39583333 0.27231705
9  12.058824 0.34027778 0.24019267
10 24.191176 0.17361111 0.13824092
11 32.426471 0.18055556 0.13656375
12 48.382353 0.13194444 0.07620367
13 79.044118 0.07638889 0.04871196

# time adalah waktu (jam), cp adalah kadar obat dalam plasma (mg/L), 
# dan sem adalah standard error measurement dari cp
</code></pre>
<p>maka kita dapat membuat plot dengan standard error menggunakan ggplot sebagai berikut:</p>
<pre><code class="lang-plaintext">&gt; library(ggplot2)
&gt; ggplot(dataset01, aes(x = time, y = cp)) +
+   geom_point(size = 3) +
+   geom_line() +
+   geom_errorbar(aes(ymin = cp - sem, ymax = cp + sem), width = 0.1) +
+   labs(x = "Time", y = "CP", title = "") +
+   theme_bw()
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745853486395/c148a1e7-4a69-4927-9d0f-ee948f23f797.png" alt class="image--center mx-auto" /></p>
<p>Mudah sekali bukan?</p>
<p>Demikian yang dapat saya bagikan dalam tulisan singkat ini. Semoga bermanfaat.</p>
]]></content:encoded></item><item><title><![CDATA[Cara Menentukan Tanggal Kedaluwarsa Obat dengan Regresi Linier dan Monte Carlo]]></title><description><![CDATA[Halo para pejuang Industri Farmasi,
Setelah sebelumnya menulis artikel tentang Cara Menentukan Kedaluarsa Obat dengan Model Efek Campuran Linier, kini saya akan menulis cara menentukan tanggal kedaluarsa yang lebih sederhana. Perhitungan dengan cara ...]]></description><link>https://dionnotario.com/cara-menentukan-tanggal-kedaluwarsa-obat-dengan-regresi-linier-dan-monte-carlo</link><guid isPermaLink="true">https://dionnotario.com/cara-menentukan-tanggal-kedaluwarsa-obat-dengan-regresi-linier-dan-monte-carlo</guid><category><![CDATA[Drug Stability]]></category><category><![CDATA[shelf-life]]></category><category><![CDATA[linearregression]]></category><category><![CDATA[monte carlo]]></category><dc:creator><![CDATA[dion notario]]></dc:creator><pubDate>Sun, 27 Apr 2025 16:04:15 GMT</pubDate><content:encoded><![CDATA[<p>Halo para pejuang Industri Farmasi,</p>
<p>Setelah sebelumnya menulis artikel tentang <a target="_blank" href="https://hashnode.com/post/cm9y7vcrc000209ju6rj8en8i">Cara Menentukan Kedaluarsa Obat dengan Model Efek Campuran Linier</a>, kini saya akan menulis cara menentukan tanggal kedaluarsa yang lebih sederhana. Perhitungan dengan cara ini dapat dilakukan bila variasi antar bets dapat dianggap homogen dan dengan data yang lengkap.</p>
<p>Sebagai contoh kasus, mari kita cermati data uji stabilitas obat berikut ini:</p>
<pre><code class="lang-plaintext">&gt; # menyiapkan data
&gt; batch &lt;- factor(rep(c(1:3), 3))
&gt; time &lt;- rep(c(0, 3, 6, 9, 12, 18), each = 3)
&gt; assay &lt;- c(51, 51, 53, 
+            51, 50, 52, 
+            50, 52, 48,
+            49, 51, 51,
+            49, 48, 47,
+            47, 45, 49) 
&gt; data1 &lt;- as.data.frame(cbind(time, assay, batch))
&gt; data1
   time assay batch
1     0    51     1
2     0    51     2
3     0    53     3
4     3    51     1
5     3    50     2
6     3    52     3
7     6    50     1
8     6    52     2
9     6    48     3
10    9    49     1
11    9    51     2
12    9    51     3
13   12    49     1
14   12    48     2
15   12    47     3
16   18    47     1
17   18    45     2
18   18    49     3
</code></pre>
<p>Dataset ini terdiri dari tiga kolom (tiga variabel) yaitu <em>time</em> atau waktu pengukuran kadar obat (bulan), <em>assay</em> yaitu hasil penetapan kadar obat (mg/tablet), dan nomor <em>batch</em>. Pada data ini, tidak ada data yang hilang dan diasumsikan bahwa variasi antar bets adalah homogen (<em>bisa diuji dengan uji homogenitas varian dengan metode Bartlett atau Levene, dalam tulisan ini di skip dulu ya</em>).</p>
<p>Dalam metode estimasi waktu kedaluarsa ini, kinetika degradasi obat dianggap mengikuti kinetika orde nol. Langkah-langkah estimasinya adalah seperti ini:</p>
<p><strong>pertama</strong>, memanggil paket-paket yang dibutuhkan</p>
<pre><code class="lang-plaintext">&gt; # memanggil paket yang diperlukan
&gt; library(dplyr)
&gt; library(MASS)
</code></pre>
<p><strong>kedua</strong>, menghitung konsentrasi obat yang tersisa dalam satuan persen yaitu dengan membagi nilai <em>assay</em> pada waktu tertentu dengan <em>assay</em> pada waktu ke-nol sesuai dengan masing-masing bets.</p>
<pre><code class="lang-plaintext">&gt; data2 &lt;- data1 %&gt;%
+   group_by(batch) %&gt;%                    # Kelompokkan berdasarkan bets
+   mutate(cp0 = assay[time == 0][1],  # Ambil kadar saat waktu = 0
+          conc = (assay / cp0) * 100) # Hitung persen
&gt; data2
# A tibble: 18 × 5
# Groups:   batch [3]
    time assay batch   cp0  conc
   &lt;dbl&gt; &lt;dbl&gt; &lt;dbl&gt; &lt;dbl&gt; &lt;dbl&gt;
 1     0    51     1    51 100  
 2     0    51     2    51 100  
 3     0    53     3    53 100  
 4     3    51     1    51 100  
 5     3    50     2    51  98.0
 6     3    52     3    53  98.1
 7     6    50     1    51  98.0
 8     6    52     2    51 102. 
 9     6    48     3    53  90.6
10     9    49     1    51  96.1
11     9    51     2    51 100  
12     9    51     3    53  96.2
13    12    49     1    51  96.1
14    12    48     2    51  94.1
15    12    47     3    53  88.7
16    18    47     1    51  92.2
17    18    45     2    51  88.2
18    18    49     3    53  92.5
</code></pre>
<p>Pada data tersebut yaitu data2, nilai konsentrasi obat yang tersisa (dalam persen) telah dihitung dan dituliskan pada kolom kelima yaitu conc.</p>
<p><strong>ketiga</strong>, melakukan analisis regresi linier dan memvisualisasikan hasil <em>fitting</em>.</p>
<pre><code class="lang-plaintext">&gt; # regresi linier
&gt; lm1 &lt;- lm(conc ~ time, data=data2)
&gt; summary(lm1)

Call:
lm(formula = conc ~ time, data = data2)

Residuals:
    Min      1Q  Median      3Q     Max 
-6.6202 -0.5396  0.2378  1.2407  4.7746 

Coefficients:
            Estimate Std. Error t value Pr(&gt;|t|)    
(Intercept) 100.2875     1.1470  87.436  &lt; 2e-16 ***
time         -0.5169     0.1153  -4.484 0.000376 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.893 on 16 degrees of freedom
Multiple R-squared:  0.5569,    Adjusted R-squared:  0.5292 
F-statistic: 20.11 on 1 and 16 DF,  p-value: 0.0003758

&gt; # visualisasi data
&gt; newx &lt;- seq(min(time), max(25), by = .05)
&gt; conf_interval &lt;- predict(lm1, newdata= data.frame(time=newx), 
+                          interval = "confidence", level=.95)
&gt; plot(time, data2$conc, ylim=c(80, 120), xlim=c(0, 25), xlab='time (month)', 
+      ylab = 'percent remaining')
&gt; lines(newx, conf_interval[,2], col='blue', lty=2)
&gt; lines(newx, conf_interval[,3], col='blue', lty=2)
&gt; abline(lm1)
&gt; abline(h=c(90,110), col=2)
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745769051089/adb6bbb3-67cb-440a-89a5-f639d1c6e5dd.png" alt class="image--center mx-auto" /></p>
<p>berdasarkan hasil analisis regresi dan visualisasi data, kita dapat mengetahui bahwa terdapat hubungan linier yang signifikan antara konsentrasi obat tersisa dengan waktu penyimpanan.</p>
<p>Sebenarnya, dari plot ini kita bisa mengetahui bahwa secara rata-rata (garis kontinyu warna hitam), waktu kedaluarsa ada di sekitar 20 bulan. Akan tetapi, jika mengacu pada <em>lower 95%-confidence interval</em>, waktu kedaluarsa di sekitar 15 bulan lebih sedikit.</p>
<p>Selanjutnya, kita periksa lebih lanjut dengan uji formal.</p>
<p><strong>keempat</strong>, mensimulasikan slope dan intercept (dalam tulisan ini digunakan 10 ribu kali simulasi)</p>
<pre><code class="lang-plaintext">&gt; ## Ambil rata-rata dan variansi kovarians dari koefisien
&gt; coef_mean &lt;- coef(lm1)
&gt; coef_var  &lt;- vcov(lm1)
&gt; ## Simulasi 10.000 kombinasi slope dan intercept
&gt; set.seed(123)
&gt; sim_coef &lt;- mvrnorm(n = 10000, mu = coef_mean, Sigma = coef_var)
</code></pre>
<p><strong>kelima</strong>, menghitung t90 dan mengeluarkan hasil perhitungan negatif</p>
<pre><code class="lang-plaintext">&gt; ## Hitung t90 untuk masing-masing simulasi
&gt; t90_sim &lt;- (90 - sim_coef[,1]) / sim_coef[,2]
&gt; ## Filter hanya t90 positif
&gt; t90_sim &lt;- t90_sim[t90_sim &gt; 0]
</code></pre>
<p><strong>keenam</strong>, memeriksa ringkasan dan distribusi hasil perhitungan t90</p>
<pre><code class="lang-plaintext">&gt; ## Lihat ringkasan hasil
&gt; summary(t90_sim)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  13.25   18.16   19.96   20.63   22.24   64.97
</code></pre>
<p>dari ringkasan ini, diketahui bahwa estimasi waktu kedaluarsa sekitar 20 bulan sama seperti pengamatan visual di atas.</p>
<pre><code class="lang-plaintext">&gt; hist(t90_sim)
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745769511919/ee029252-d71d-4aab-a425-54c505a17537.png" alt class="image--center mx-auto" /></p>
<pre><code class="lang-plaintext">&gt; hist(log(t90_sim))
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745769549631/f4e5d777-7d84-40c1-a288-9a4efef47c61.png" alt class="image--center mx-auto" /></p>
<p>berdasarkan pengamatan histogram distribusi frekuensi, diketahui bahwa t90 mengikuti distribusi log-normal. Selain itu, terdapat outlier dalam data ini.</p>
<p><strong>ketujuh</strong>, menghilangkan outlier</p>
<pre><code class="lang-plaintext">&gt; ## menghilangkan outlier
&gt; Q1 &lt;- quantile(log(t90_sim), .25)
&gt; Q3 &lt;- quantile(log(t90_sim), .75)
&gt; IQR &lt;- IQR(log(t90_sim))
&gt; no_outliers &lt;- subset(log(t90_sim), 
+                       log(t90_sim) &gt; (Q1 - 1.5*IQR) &amp; 
+                         log(t90_sim) &lt; (Q3 + 1.5*IQR))
&gt; hist(no_outliers)
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745769657878/20b2c88e-ffdd-4b89-a4ef-af0db66d146d.png" alt class="image--center mx-auto" /></p>
<p><strong>kedelapan</strong>, menghitung nilai rata-rata dan <em>confidence interval</em> (95%)</p>
<pre><code class="lang-plaintext">&gt; ## estimasi t90 berdasarkan ci 95%
&gt; log_ci &lt;- quantile(no_outliers, probs = c(0.025, 0.975))
&gt; exp(log_ci)
    2.5%    97.5% 
15.63450 27.52062 
&gt; mean &lt;- mean(no_outliers)
&gt; exp(mean)
[1] 20.10318
</code></pre>
<p>Berdasarkan hasil perhitungan ini, nilai rata-rata waktu kedaluarsa (t90) adalah ~20 bulan. Batas bawah interval kepercayaan adalah ~15. Dengan demikian, waktu kedaluarsa dapat dianggap 15 bulan.</p>
]]></content:encoded></item><item><title><![CDATA[Cara Menentukan Kedaluarsa Obat dengan Model Efek Campuran Linier]]></title><description><![CDATA[Pendahuluan
Dalam dunia farmasi, waktu kedaluarsa (shelf-life) adalah janji mutu dari produsen kepada pasien: selama periode ini, kualitas, keamanan, dan efektivitas obat tetap terjamin. Setelah melewati batas ini, produsen tidak lagi bertanggung jaw...]]></description><link>https://dionnotario.com/cara-menentukan-kedaluarsa-obat-dengan-model-efek-campuran-linier</link><guid isPermaLink="true">https://dionnotario.com/cara-menentukan-kedaluarsa-obat-dengan-model-efek-campuran-linier</guid><category><![CDATA[lme]]></category><category><![CDATA[shelf-life]]></category><category><![CDATA[kedaluarsa]]></category><category><![CDATA[model efek campuran linier]]></category><category><![CDATA[Drug Stability]]></category><dc:creator><![CDATA[dion notario]]></dc:creator><pubDate>Sat, 26 Apr 2025 12:48:41 GMT</pubDate><content:encoded><![CDATA[<h2 id="heading-pendahuluan">Pendahuluan</h2>
<p>Dalam dunia farmasi, <strong>waktu kedaluarsa</strong> (shelf-life) adalah janji mutu dari produsen kepada pasien: selama periode ini, kualitas, keamanan, dan efektivitas obat tetap terjamin. Setelah melewati batas ini, produsen tidak lagi bertanggung jawab atas mutu produk tersebut. Itulah sebabnya, sangat penting bagi apoteker, tenaga kesehatan, maupun pasien untuk selalu memeriksa tanggal kedaluarsa sebelum menggunakan obat.</p>
<p>Penetapan waktu kedaluarsa tidak dilakukan sembarangan. Industri farmasi wajib mengikuti standar yang ketat, salah satunya yang diatur dalam <strong>International Conference on Harmonization (ICH) Q1A (R2)</strong>. Pedoman ini menguraikan prosedur lengkap, mulai dari desain uji stabilitas, kondisi penyimpanan, hingga analisis data untuk memastikan keakuratan estimasi waktu kedaluarsa.</p>
<h2 id="heading-bagaimana-waktu-kedaluarsa-ditetapkan">Bagaimana Waktu Kedaluarsa Ditetapkan?</h2>
<p>Dalam analisis data stabilitas, salah satu pendekatan yang banyak digunakan adalah <strong>model efek campuran linier (linear mixed effect model)</strong>. Model ini sangat berguna ketika kita memiliki data dari <strong>lima batch atau lebih</strong>, dan memperlakukan <em>batch</em> sebagai faktor acak (random effect). Pendekatan ini mencerminkan variasi alami antar batch, membuat hasil estimasi menjadi lebih realistis dan andal.</p>
<p><strong>Masa simpan</strong> produk obat ditentukan berdasarkan konsep statistik yang cukup sederhana namun kuat:</p>
<ul>
<li><p>Kita ingin yakin, dengan tingkat kepercayaan 90%, bahwa <strong>paling tidak 95%</strong> dari semua batch masih memenuhi standar kualitas (<strong>Critical Quality Attributes</strong>, CQA).</p>
</li>
<li><p>Secara visual, ini digambarkan sebagai <strong>batas bawah</strong> dari grafik prediksi. Selama batas bawah ini masih berada di atas ambang batas mutu (acceptance limit), maka obat masih dianggap stabil.</p>
</li>
</ul>
<h3 id="heading-analogi-sederhana">Analogi Sederhana</h3>
<p>Bayangkan Anda memiliki <strong>100 botol obat</strong> dari berbagai batch. Tugas Anda adalah memastikan, sampai bulan ke berapa obat-obat ini masih bisa disimpan, sambil tetap yakin bahwa <strong>minimal 95 botol</strong> tetap memenuhi standar.</p>
<p>Namun, Anda juga menginginkan keputusan ini cukup pasti — setidaknya <strong>90% yakin</strong>.</p>
<p>Dengan model efek campuran, Anda dapat memperkirakan kapan kualitas "terburuk" dari obat mulai menyentuh batas mutu. Titik itulah yang kita sebut sebagai <strong>akhir masa simpan</strong>.</p>
<h2 id="heading-contoh-kasus">Contoh Kasus</h2>
<p>Mari kita lihat sebuah contoh kasus sederhana untuk memahami penerapan konsep ini.</p>
<p>Misalnya, sebuah studi stabilitas dilakukan dengan menyimpan produk obat selama <strong>6 bulan</strong> dalam kondisi real-time, dan dilakukan pengukuran kadar zat aktif pada beberapa waktu tertentu. Data dikumpulkan dari <strong>lima batch berbeda</strong>.</p>
<pre><code class="lang-plaintext">&gt; runOrder &lt;- 1:14
&gt; month &lt;- c(rep(c(0,3), each=5), rep(6,4))
&gt; batch &lt;- factor(c(4, 3, 5, 2, 1, 2, 4, 1, 5, 3, 2, 5, 1, 3))
&gt; concDrug &lt;- c(99.27, 100.026, 100.403, 100.108, 99.903, 
+               99.478, 99.759, 99.432, 100.596, 99.619, 
+               98.001, 98.957, 99.048, 99.808)
&gt; dataStab &lt;- as.data.frame(cbind(runOrder, month, batch, concDrug))
&gt; dataStab
   runOrder month batch concDrug
1         1     0     4   99.270
2         2     0     3  100.026
3         3     0     5  100.403
4         4     0     2  100.108
5         5     0     1   99.903
6         6     3     2   99.478
7         7     3     4   99.759
8         8     3     1   99.432
9         9     3     5  100.596
10       10     3     3   99.619
11       11     6     2   98.001
12       12     6     5   98.957
13       13     6     1   99.048
14       14     6     3   99.808

# runOrder : urutan pengujian; month : waktu pengujian; 
# batch : nomor bets; concDrug : konsentrasi obat yang tersisa
</code></pre>
<p>Menggunakan model efek campuran linier, kita dapat mengestimasi penurunan kadar zat aktif dari waktu ke waktu, serta menentukan kapan batas kualitas minimum tercapai.</p>
<h2 id="heading-estimasi-waktu-kedaluarsa-berdasarkan-kinetika-orde-nol">Estimasi Waktu Kedaluarsa Berdasarkan Kinetika Orde Nol</h2>
<p>Berdasarkan data yang tersedia, kita melakukan estimasi waktu kedaluarsa menggunakan model <strong>kinetika orde nol</strong>, yang dirumuskan sebagai:</p>
<p>$$C = C_0 - k \times t$$</p><p>Di mana:</p>
<ul>
<li><p>C = konsentrasi obat pada waktu t  (persen)</p>
</li>
<li><p>C0 = konsentrasi awal (persen)</p>
</li>
<li><p>k = laju penurunan konsentrasi (persen per bulan)</p>
</li>
<li><p>t = waktu yang dihitung sejak obat selesai dibuat (bulan)</p>
</li>
</ul>
<p>Waktu kedaluarsa, yaitu saat konsentrasi turun hingga 90% dari kadar awal, dapat dihitung dengan rumus:</p>
<p>$$t_{90} = \frac{90 - C_0}{k}$$</p><p>Namun, dalam studi ini ada <strong>data yang tidak lengkap</strong> — tepatnya, data pengujian bulan ke-6 pada batch ke-4 tidak tersedia. Kondisi ini menyebabkan metode konvensional (menghitung regresi per batch lalu dirata-rata) <strong>tidak bisa digunakan</strong>.</p>
<p>Sebagai gantinya, pendekatan yang lebih tepat adalah menggunakan <strong>model efek campuran linier</strong> yang bisa mengatasi ketidaklengkapan data.</p>
<hr />
<h2 id="heading-alur-perhitungan-waktu-kedaluarsa">Alur Perhitungan Waktu Kedaluarsa</h2>
<p>Langkah-langkah analisisnya adalah sebagai berikut:</p>
<ol>
<li><p>Panggil semua paket yang diperlukan untuk analisis data</p>
<pre><code class="lang-plaintext"> &gt; # load packages
 &gt; library(nlme)
 &gt; library(lme4)
 &gt; library(dplyr)
 &gt; library(ggplot2)
 &gt; library(lattice)
 &gt; library(outliers)
 &gt; library(tidyverse)
 &gt; library(modelr)
 &gt; library(arm)
</code></pre>
</li>
<li><p><strong>Menyiapkan data</strong> uji stabilitas.</p>
<pre><code class="lang-plaintext"> # membuat data terkelompok
 dataStabGrouped &lt;- groupedData(concDrug ~ month | batch,
                         data = dataStab,
                         labels=list(x="time (month)",
                                     y = "remaining concentration (%)"))
 # plotting data
 xyplot(concDrug ~ month | batch, data = dataStabGrouped,
        type = c("p", "r"))
</code></pre>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745667448299/8c6f8e57-36db-4cbc-9fbc-df58436c0d00.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Membuat model efek campuran:</p>
<ul>
<li><p>Menyertakan <strong>slope</strong> (k) dan <strong>intercept</strong> (C0) sebagai efek acak, dan menganggap keduanya <strong>saling berkorelasi</strong>.</p>
<pre><code class="lang-plaintext">  &gt; # fitting with linear mixed effect model  with random slopes and intercepts 
  &gt; model_lme_01 &lt;- lmer(concDrug ~ month + (month | batch),
  +                  data = dataStabGrouped)
  &gt; summary(model_lme_01)
  Linear mixed model fit by REML ['lmerMod']
  Formula: concDrug ~ month + (month | batch)
     Data: dataStabGrouped

  REML criterion at convergence: 25.6

  Scaled residuals: 
      Min      1Q  Median      3Q     Max 
  -1.1938 -0.3105 -0.1690  0.2685  2.1239 

  Random effects:
   Groups   Name        Variance Std.Dev. Corr 
   batch    (Intercept) 0.08874  0.2979        
            month       0.01719  0.1311   -0.84
   Residual             0.18090  0.4253        
  Number of obs: 14, groups:  batch, 5

  Fixed effects:
               Estimate Std. Error t value
  (Intercept) 100.03268    0.22004 454.620
  month        -0.14574    0.07724  -1.887

  Correlation of Fixed Effects:
        (Intr)
  month -0.772
</code></pre>
</li>
</ul>
</li>
<li><p><strong>Membuat model alternatif</strong>:</p>
<ul>
<li><p>Menyertakan slope dan intercept sebagai efek acak, namun menganggap keduanya <strong>tidak berkorelasi</strong>.</p>
<pre><code class="lang-plaintext">  &gt; model_lme_02 &lt;- lmer(concDrug ~ month + (month || batch),
  +                      data = dataStabGrouped)
  &gt; summary(model_lme_02)
  Linear mixed model fit by REML ['lmerMod']
  Formula: concDrug ~ month + ((1 | batch) + (0 + month | batch))
     Data: dataStabGrouped

  REML criterion at convergence: 25.9

  Scaled residuals: 
       Min       1Q   Median       3Q      Max 
  -1.61444 -0.28110 -0.01999  0.31604  1.97477 

  Random effects:
   Groups   Name        Variance  Std.Dev. 
   batch    (Intercept) 4.583e-08 0.0002141
   batch.1  month       5.515e-03 0.0742602
   Residual             2.302e-01 0.4798174
  Number of obs: 14, groups:  batch, 5

  Fixed effects:
               Estimate Std. Error t value
  (Intercept) 100.04464    0.19718 507.370
  month        -0.15770    0.06458  -2.442

  Correlation of Fixed Effects:
        (Intr)
  month -0.643
</code></pre>
</li>
</ul>
</li>
<li><p><strong>Membuat model ketiga</strong>:</p>
<ul>
<li><p>Hanya menyertakan <strong>intercept</strong> sebagai efek acak.</p>
<pre><code class="lang-plaintext">  &gt; # fitting with linear mixed effect model  with random intercepts only and uncorrelated
  &gt; model_lme_03 &lt;- lmer(concDrug ~ month + (1 | batch),
  +                      data = dataStabGrouped)
  &gt; summary(model_lme_03)
  Linear mixed model fit by REML ['lmerMod']
  Formula: concDrug ~ month + (1 | batch)
     Data: dataStabGrouped

  REML criterion at convergence: 26.6

  Scaled residuals: 
       Min       1Q   Median       3Q      Max 
  -1.90012 -0.23099 -0.01921  0.40027  1.79832 

  Random effects:
   Groups   Name        Variance Std.Dev.
   batch    (Intercept) 0.02309  0.1519  
   Residual             0.27846  0.5277  
  Number of obs: 14, groups:  batch, 5

  Fixed effects:
               Estimate Std. Error t value
  (Intercept) 100.04895    0.22677 441.193
  month        -0.16202    0.05908  -2.742

  Correlation of Fixed Effects:
        (Intr)
  month -0.722
</code></pre>
</li>
</ul>
</li>
<li><p><strong>Membandingkan ketiga model</strong>:</p>
<ul>
<li><p>Memilih model terbaik berdasarkan kriteria statistik (seperti AIC atau BIC).</p>
<pre><code class="lang-plaintext">  &gt; anova(model_lme_01, model_lme_02, model_lme_03)
  refitting model(s) with ML (instead of REML)
  Data: dataStabGrouped
  Models:
  model_lme_03: concDrug ~ month + (1 | batch)
  model_lme_02: concDrug ~ month + ((1 | batch) + (0 + month | batch))
  model_lme_01: concDrug ~ month + (month | batch)
               npar    AIC    BIC   logLik deviance  Chisq Df Pr(&gt;Chisq)
  model_lme_03    4 28.693 31.249 -10.3463   20.692                     
  model_lme_02    5 30.106 33.301 -10.0528   20.106 0.5869  1     0.4436
  model_lme_01    6 31.926 35.760  -9.9628   19.926 0.1801  1     0.6713
</code></pre>
<p>  berdasarkan nilai probabilitas (p-value) dari uji Chi-square, tidak ditemukan perbedaan yang signifikan antara ketiga model tersebut (p&gt;0,05). Pada kasus seperti ini, dipilih model yang paling sederhana yaitu model_lme_03.</p>
</li>
</ul>
</li>
<li><p><strong>Memeriksa plot diagnostik</strong>:</p>
<ul>
<li><p>Memastikan model sesuai dengan asumsi statistik (misal: normalitas residu, homoskedastisitas).</p>
</li>
<li><p>plot residual terstandard vs hasil prediksi (fitted value)</p>
<pre><code class="lang-plaintext">  &gt; # standardized residuals versus fitted values by batch
  &gt; plot(model_lme_03, resid(., scaled=TRUE) ~ fitted(.) | batch, abline = 0)
</code></pre>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745668572030/3d131d21-34f6-434f-9ccf-ddf5338bb9b3.png" alt class="image--center mx-auto" /></p>
<p>  pada plot ini terlihat bahwa residual terstandard tidak berada di luar rentang -1,96 sampai +1,96 yang berarti bahwa residual terdistribusi normal. selain itu residual berada di sekitar nol dan tersebar secara acak yang menunjukkan tidak adanya masalah heteroskedastisitas.</p>
</li>
<li><p>plot hasil prediksi vs eksperimental</p>
<pre><code class="lang-plaintext">  &gt; #observed versus fitted values 
  &gt; plot(model_lme_03, concDrug ~ fitted(.) , abline = c(0,1))
  &gt; plot(model_lme_03, concDrug ~ fitted(.) | batch, abline = c(0,1))
</code></pre>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745668926457/4d6cd4b2-4a54-4f38-8ee7-0d92b71d416e.png" alt class="image--center mx-auto" /></p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745668967622/d9e4109e-1294-4858-83eb-bada1a7fb6f9.png" alt class="image--center mx-auto" /></p>
<p>  Dari plot antara konsentrasi terprediksi dan data eksperimental, diketahui bahwa keduanya memiliki korelasi linier yang baik. Dengan demikian, model_lme_03 dapat memodelkan hubungan antara konsentrasi vs waktu penyimpanan pada lima bets berdasarkan data percobaan.</p>
</li>
<li><p>hubungan antara konsentrasi tersisa vs waktu penyimpanan pada lima bets obat dapat divisualisasikan sebagai berikut:</p>
<pre><code class="lang-plaintext">  &gt; predicted_values&lt;- data_grid(dataStabGrouped, month, batch) %&gt;% 
  +                    add_predictions(model_lme_03)
  &gt; predicted_values %&gt;% 
  +   ggplot(aes(month, pred, color = batch)) +
  +   geom_line() +
  +   geom_point(data = dataStabGrouped, aes(month, concDrug, color = batch)) +
  +   facet_wrap(~ batch) +  # Ini memisahkan per batch
  +   labs(title = "Prediction per batch",
  +        x = "month",
  +        y = "concentration (%)") +
  +   theme_minimal()
</code></pre>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745669282746/fde66d88-f1d0-4730-aa22-00d0784e09f4.png" alt class="image--center mx-auto" /></p>
</li>
</ul>
</li>
<li><p><strong>Estimasi waktu kedaluarsa berdasarkan efek tetap</strong>:</p>
<ul>
<li><p>Menggunakan efek tetap dari parameter model (fixed-effect)</p>
<pre><code class="lang-plaintext">  &gt; # Ambil koefisien tetap (fixed effects)
  &gt; coef_fix &lt;- fixed.effects(model_lme_03)
  &gt; intercept &lt;- coef_fix[[1]]
  &gt; slope &lt;- coef_fix[[2]]
  &gt; # Tentukan batas minimal kadar obat (misalnya 90%)
  &gt; threshold &lt;- 90
  &gt; # Hitung waktu kedaluwarsa (shelf life)
  &gt; shelf_life &lt;- (threshold - intercept) / slope
  &gt; shelf_life
  [1] 62.02263
</code></pre>
<p>  berdasarkan fixed-effect maka waktu kedaluarsa adalah sekitar 62 bulan.</p>
</li>
</ul>
</li>
<li><p><strong>Estimasi waktu kedaluarsa berdasarkan simulasi Monte Carlo pada parameter efek tetap (fixed-effect)</strong></p>
<ul>
<li><p>Dalam tulisan ini, pembahasan dibatasi pada estimasi shelf-life berdasarkan confidence interval yang diperoleh dari simulasi Monte Carlo terhadap fixed-effect. Untuk estimasi dengan random-effect (<em>berarti tiap bets akan memiliki hasil estimasi yang berbeda</em>), nanti bisa dibuatkan jika banyak yang <em>request</em>.</p>
</li>
<li><p>pertama, dibuat dulu simulasi 1000 data virtual</p>
<pre><code class="lang-plaintext">  ## membuat simulasi 1000 data virtual
  set.seed(123)
  sim_model &lt;- sim(model_lme_03, n.sims = 1000)
</code></pre>
</li>
<li><p>kedua, ekstrak data slope dan intercept hasil simulasi dari fixed-effect</p>
<pre><code class="lang-plaintext">  intercepts &lt;- sim_model@fixef[,1]
  slopes &lt;- sim_model@fixef[,2]
</code></pre>
</li>
<li><p>ketiga, hitung t90, dan gunakan fungsi pmax( , 0) untuk mengubah hasil estimasi negatif menjadi nol, kemudian periksa histogram distribusi frekuensi datanya</p>
<pre><code class="lang-plaintext">  &gt; shelf_life_sim &lt;- (threshold - intercepts) / slopes
  &gt; shelf_life_sim &lt;- shelf_life_sim[shelf_life_sim &gt; 0]
  &gt; hist(shelf_life_sim)
</code></pre>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745670950956/d9eaf645-88b3-46f1-8058-5205c1aff6ad.png" alt class="image--center mx-auto" /></p>
<pre><code class="lang-plaintext">  &gt; hist(log(shelf_life_sim))
</code></pre>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745767076605/a8cb3a7e-89b3-44c4-a628-ae52dc908e70.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>berdasarkan histogram ini, kita tahu bahwa data t90 terdistribusi log-normal dan memiliki <em>outlier</em>.</p>
</li>
<li><p>keempat, hilangkan <em>outlier</em> dari data logaritma natural t90</p>
<pre><code class="lang-plaintext">  &gt; Q1 &lt;- quantile(log(shelf_life_sim), .25)
  &gt; Q3 &lt;- quantile(log(shelf_life_sim), .75)
  &gt; IQR &lt;- IQR(log(shelf_life_sim))
  &gt; no_outliers &lt;- subset(log(shelf_life_sim), 
  +                       log(shelf_life_sim) &gt; (Q1 - 1.5*IQR) &amp; 
  +                         log(shelf_life_sim) &lt; (Q3 + 1.5*IQR))
  &gt; hist(no_outliers)
</code></pre>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745767200026/3bcfa372-f5c1-4583-94eb-371ee4bf2c8e.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>kelima, hitung nilai rata-rata dan confidence interval dari data yang ditransformasikan, kemudian kembalikan ke skala linier dengan fungsi eksponensial atau exp()</p>
<pre><code class="lang-plaintext">  &gt; # Hitung mean dan CI 95%
  &gt; log_ci &lt;- quantile(no_outliers, probs = c(0.025, 0.975))
  &gt; log_ci
      2.5%    97.5% 
  3.550765 4.914701 
  &gt; exp(log_ci)
       2.5%     97.5% 
   34.83996 136.27861 
  &gt; mean.t90 &lt;- mean(no_outliers)
  &gt; exp(mean.t90)
  [1] 63.29042
</code></pre>
</li>
<li><p>Rata-rata waktu kedaluarsa yang diperoleh adalah sekitar 63 bulan dengan batas bawah ~34 bulan dan batas atas ~136 bulan. Dalam konteks penjaminan mutu untuk keamanan pasien, dipilih batas bawah sebagai waktu kedaluarsa yaitu 34 bulan.</p>
</li>
<li><p>Dengan pendekatan ini, hasil estimasi waktu kedaluarsa akan lebih robust, realistis, dan sesuai dengan standar industri farmasi.</p>
</li>
</ul>
</li>
</ol>
]]></content:encoded></item><item><title><![CDATA[Pengalaman diskusi kesehatan lansia]]></title><description><![CDATA[Beberapa waktu lalu, saya mendapat undangan yang sangat berharga: sebuah focused-group discussion (FGD) di sebuah universitas yang fokus membahas seluk-beluk kesehatan lansia. Bayangkan, di sana berkumpul para "sesepuh" di bidangnya—dokter, perawat, ...]]></description><link>https://dionnotario.com/pengalaman-diskusi-kesehatan-lansia</link><guid isPermaLink="true">https://dionnotario.com/pengalaman-diskusi-kesehatan-lansia</guid><category><![CDATA[geriatri]]></category><category><![CDATA[healthcare]]></category><dc:creator><![CDATA[dion notario]]></dc:creator><pubDate>Fri, 25 Apr 2025 06:15:24 GMT</pubDate><content:encoded><![CDATA[<p>Beberapa waktu lalu, saya mendapat undangan yang sangat berharga: sebuah <em>focused-group discussion</em> (FGD) di sebuah universitas yang fokus membahas seluk-beluk kesehatan lansia. Bayangkan, di sana berkumpul para "sesepuh" di bidangnya—dokter, perawat, fisioterapis, peneliti, hingga para pembuat kebijakan yang dedikasinya pada kesehatan lansia tak diragukan lagi. Jujur, obrolan dengan mereka bagai kuliah lapangan yang penuh dengan ilmu "daging" yang tak pernah saya baca di buku atau jurnal perkuliahan.</p>
<p>Ada beberapa "PR" besar terkait kesehatan lansia yang berhasil saya rangkum dari diskusi tersebut:</p>
<p>Kita sering mendengar bahwa lansia identik dengan berbagai penyakit, seperti diabetes, hipertensi, dan demensia. Fakta yang cukup mencengangkan adalah, idealnya satu lansia membutuhkan penanganan dari minimal tiga dokter spesialis! Tak heran, "koktail" obat yang harus mereka minum bisa mencapai lebih dari sepuluh jenis sehari—sebuah kondisi yang disebut polifarmasi.</p>
<p>Lebih mengkhawatirkan lagi, di tengah banyaknya obat yang dikonsumsi, kita masih kekurangan data yang solid untuk memantau bagaimana obat-obatan ini benar-benar bekerja. Ini memunculkan pertanyaan penting: sistem pemantauan terapi obat seperti apa yang paling efektif untuk lansia? Adakah <em>best practice</em> yang bisa kita terapkan?</p>
<p>Satu cerita yang cukup memprihatinkan adalah kesalahpahaman keluarga pasien terkait obat antipsikotik. Obat yang seharusnya membantu menenangkan pasien justru dianggap sebagai "obat gila," sehingga seringkali tidak diberikan. Padahal, obat ini sangat dibutuhkan untuk menjaga perilaku pasien tetap terkontrol.</p>
<p>Selain itu, regulasi yang belum sepenuhnya mendukung juga menjadi batu sandungan.</p>
<p>Sebagai seorang apoteker, benak saya langsung dipenuhi pertanyaan: bagaimana cara kita "merapikan" masalah obat pada lansia, terutama soal polifarmasi ini? Bisakah kita membuat dosis obat jadi lebih sederhana, meminimalisir efek samping yang mungkin timbul, dan pada akhirnya memaksimalkan manfaat terapi? Jujur, rasanya perjalanan kita masih panjang.</p>
]]></content:encoded></item><item><title><![CDATA[Cara Lengkap Melakukan Pemodelan Farmakokinetika bagi Individu]]></title><description><![CDATA[Dalam pemodelan farmakokinetika, salah satu model yang paling populer adalah model satu kompartemen dengan kinetika eliminasi dan absorpsi mengikuti orde pertama. Salah satu obat yang mengikuti model ini adalah teofilin. Dalam tulisan ini, kita akan ...]]></description><link>https://dionnotario.com/cara-lengkap-melakukan-pemodelan-farmakokinetika-bagi-individu</link><guid isPermaLink="true">https://dionnotario.com/cara-lengkap-melakukan-pemodelan-farmakokinetika-bagi-individu</guid><category><![CDATA[pharmacokinetics]]></category><category><![CDATA[Pharmacokinetics and Pharmacodynamics Market]]></category><dc:creator><![CDATA[dion notario]]></dc:creator><pubDate>Fri, 25 Apr 2025 03:49:19 GMT</pubDate><content:encoded><![CDATA[<p>Dalam pemodelan farmakokinetika, salah satu model yang paling populer adalah model satu kompartemen dengan kinetika eliminasi dan absorpsi mengikuti orde pertama. Salah satu obat yang mengikuti model ini adalah teofilin. Dalam tulisan ini, kita akan mempelajari bagaimana pemodelan farmakokinetika teofilin dengan model satu kompartemen.</p>
<p><strong>Contoh kasus</strong></p>
<p><em>Seorang pasien (79,6 kg) diberi teofilin secara oral dengan dosis 4,02 mg/kg berat badan. Kemudian dilakukan pengambilan sampel darah pada waktu 0 sampai 24 jam setelah pemberian dan dilakukan penetapan kadar. Pada akhir studi, diperoleh data sebagai berikut:</em></p>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>Waktu (jam)</strong></td><td><strong>Cp (mg/L)</strong></td></tr>
</thead>
<tbody>
<tr>
<td>0</td><td>0.74</td></tr>
<tr>
<td>0.25</td><td>2.84</td></tr>
<tr>
<td>0.57</td><td>6.57</td></tr>
<tr>
<td>1.12</td><td>10.5</td></tr>
<tr>
<td>2.02</td><td>9.66</td></tr>
<tr>
<td>3.82</td><td>8.58</td></tr>
<tr>
<td>5.1</td><td>8.36</td></tr>
<tr>
<td>7.03</td><td>7.47</td></tr>
<tr>
<td>9.05</td><td>6.89</td></tr>
<tr>
<td>12.12</td><td>5.94</td></tr>
<tr>
<td>24.37</td><td>3.28</td></tr>
</tbody>
</table>
</div><p>Cp adalah konsentrasi obat di dalam plasma pada waktu tertentu yang dihitung sejak pemberian dosis.</p>
<p>Apabila teofilin dianggap mengikuti model satu kompartemen, maka secara matematis, model farmakokinetikanya dapat dituliskan sebagai berikut:</p>
<p>$$Cp = \frac{F k_a D_0}{V(k_a - k_{el})} (e^{-k_{el}} - e^{-k_a})$$</p><p>Bioavailabilitas teofilin diketahui 96%. Dengan data-data ini, maka parameter farmakokinetika teofilin dapat dihitung sebagai berikut:</p>
<pre><code class="lang-plaintext">Cp0 &lt;- c(0.74, 2.84, 6.57, 10.5, 9.66, 8.58, 8.36, 7.47, 6.89, 5.94, 3.28)
time0 &lt;- c(0,0.25, 0.57, 1.12, 2.02, 3.82, 5.1, 7.03, 9.05, 12.12, 24.37)
model00 &lt;- nls(Cp0 ~ 0.96*ka*(4.02*79.6)/(V*(ka-kel))*(exp(-kel*time0)-exp(-ka*time0)), 
               start=list(ka=1.2, kel=0.01, V = 10))
summary(model00)
</code></pre>
<pre><code class="lang-plaintext">Formula: Cp0 ~ 0.96 * ka * (4.02 * 79.6)/(V * (ka - kel)) * (exp(-kel * 
    time0) - exp(-ka * time0))

Parameters:
    Estimate Std. Error t value Pr(&gt;|t|)    
ka   1.77742    0.30717   5.787 0.000411 ***
kel  0.05396    0.00922   5.852 0.000382 ***
V   28.21770    1.69935  16.605 1.75e-07 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.732 on 8 degrees of freedom

Number of iterations to convergence: 11 
Achieved convergence tolerance: 3.068e-06
</code></pre>
<p>Nilai parameter farmakokinetika pasien tersebut yaitu: - ka = 1,778 per jam - kel = 0.054 per jam - V = 28,218 L. Nilai p-value di bawah 0,05 yang berarti bahwa masing-masing parameter farmakokinetika ini signifikan secara statistik.</p>
<p>untuk melihat kedekatan antara hasil pemodelan dengan data, dapat dilakukan visualisasi sebagai berikut:</p>
<pre><code class="lang-plaintext">plot(time0 , Cp0, xlab="Waktu (jam)", ylab="konsentrasi dalam plasma (mg/L)",
     pch=15)
lines(time0, predict(model00), col=2, lty=2, lwd=2)
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745552575049/618e7204-d292-4632-960a-77fce854492d.png" alt class="image--center mx-auto" /></p>
<p>perbedaan antara konsentrasi hasil pengukuran/eksperimental (titik-titik data) dengan hasil prediksi (garis regresi) disebut dengan residual.</p>
<p>Residual dapat divisualisasikan sebagai berikut:</p>
<pre><code class="lang-plaintext">plot(resid(model00)~time0, xlab="waktu (jam)", ylab="residual")
abline(h=0)
plot(resid(model00)~Cp0,xlab="waktu (jam)", ylab="residual")
abline(h=0)
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1745552665289/a28a8c62-2779-4dd7-b8fd-6e93d52ab248.png" alt class="image--center mx-auto" /></p>
<p>Nilai residual tersebar secara acak di sekitar nol. Ini berarti bahwa nilai prediksi cukup dekat dengan nilai eksperimental. Sehingga model satu kompartemen ini dapat digunakan untuk menggambarkan farmakokinetika teofilin pada individu tersebut.</p>
]]></content:encoded></item><item><title><![CDATA[Rahasia Arsitektur Portofolio Ala Peter Lynch]]></title><description><![CDATA[Kalau kamu pernah dengar nama Peter Lynch, kamu sedang membaca tulisan yang tepat. Lynch bukan sekadar investor sukses, tapi legenda yang mengelola Fidelity Magellan Fund dari tahun 1977–1990 dengan return tahunan rata-rata 29%! Gokil, kan? Nah, di a...]]></description><link>https://dionnotario.com/rahasia-arsitektur-portofolio-ala-peter-lynch</link><guid isPermaLink="true">https://dionnotario.com/rahasia-arsitektur-portofolio-ala-peter-lynch</guid><category><![CDATA[Investment]]></category><dc:creator><![CDATA[dion notario]]></dc:creator><pubDate>Fri, 25 Apr 2025 03:08:43 GMT</pubDate><content:encoded><![CDATA[<p>Kalau kamu pernah dengar nama Peter Lynch, kamu sedang membaca tulisan yang tepat. Lynch bukan sekadar investor sukses, tapi legenda yang mengelola Fidelity Magellan Fund dari tahun 1977–1990 dengan return tahunan rata-rata 29%! Gokil, kan? Nah, di artikel ini aku mau kupas tuntas arsitektur portofolio ala Peter Lynch. Bukan cuma teori, tapi juga cara realistis membangun portofolio seperti beliau.</p>
<h2 id="heading-invest-in-what-you-know-mulai-dari-hal-yang-kamu-kenal">"Invest in What You Know" — Mulai dari Hal yang Kamu Kenal</h2>
<p>Lynch percaya investor ritel bisa punya keunggulan dibanding profesional, asalkan jeli. Misalnya, kamu tiap hari pakai Shopee? Atau tiap minggu nongkrong di Starbucks? Nah, kenapa nggak cek sahamnya?</p>
<p>Kuncinya: Kamu nggak harus jadi ahli keuangan. Cukup peka terhadap tren di sekitarmu.</p>
<h2 id="heading-bagi-portofolio-jadi-6-tipe-saham">Bagi Portofolio Jadi 6 Tipe Saham</h2>
<p>Peter Lynch suka klasifikasikan saham ke dalam 6 kategori biar nggak bingung saat analisis dan alokasi.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Tipe Saham</td><td>Contoh Umum</td><td>Ciri Khas</td></tr>
</thead>
<tbody>
<tr>
<td>Fast Growers</td><td>Startup bertumbuh cepat</td><td>laba naik pesat, biasanya kecil-menengah</td></tr>
<tr>
<td>Stalwarts</td><td>Perusahaan besar stabil</td><td>aman dan tahan krisis</td></tr>
<tr>
<td>Cyclicals</td><td>Otomotif, properti</td><td>naik turun ikut ekonomi</td></tr>
<tr>
<td>Turnarrounds</td><td>Perusahaan bangkit lagi</td><td>Sedang krisis tapi punya potensi</td></tr>
<tr>
<td>Asset Plays</td><td>Aset tersembunyi</td><td>misalnya punya tanah strategis</td></tr>
<tr>
<td>Slow Growers</td><td>Emiten dividen tinggi</td><td>Lambat tapi stabil dan aman</td></tr>
</tbody>
</table>
</div><h1 id="heading-ukur-nilai-saham-dengan-peg-ratio">Ukur nilai saham dengan PEG Ratio</h1>
<p>Rumus andalan Peter Lynch: PEG = PER/Growth Rate Kalau PEG &lt;1, berrti sahamnya murah dibanding laju pertumbuhannya. Simpel tapi powerful.</p>
<h1 id="heading-bangun-portofolio-dengan-gaya-peter-lynch">Bangun Portofolio dengan Gaya Peter Lynch</h1>
<p>Lynch suka diversifikasi, tapi bukan asal beli banyak. Setiap saham punya alasan kuat kenapa dipilih.</p>
<p>Contoh alokasi saham</p>
<ul>
<li><p>Fast Growers: 40%</p>
</li>
<li><p>Stalwarts: 25%</p>
</li>
<li><p>Turnarounds + Asset Plays: 25%</p>
</li>
<li><p>Cyclicals + Slow Growers: 10%</p>
</li>
</ul>
<p>Evaluasi rutin: Lihat laporan keuangan, pantau berita, dan jangan ragu rebalancing.</p>
<h1 id="heading-sumber-belajar-ala-lynch">Sumber Belajar Ala Lynch</h1>
<p>Mulai dari buku, video, sampai latihan langsung:</p>
<ul>
<li><p>Buku: One Up on Wall Street, Beating the Street</p>
</li>
<li><p>Podcast: We Study Billionaires</p>
</li>
<li><p>Aplikasi: RTI Business, Stockbit, TradingView (buat latihan analisis)</p>
</li>
<li><p>Catatan: Buat jurnal investasi pribadi</p>
</li>
</ul>
<h1 id="heading-penutup-kamu-punya-keunggulan-gunakan">Penutup: Kamu Punya Keunggulan, Gunakan!</h1>
<p>Peter Lynch percaya bahwa investor ritel seperti kamu bisa menang, asal mau riset, sabar, dan konsisten. Jadi, yuk bangun portofolio dengan pendekatan cerdas — dimulai dari apa yang kamu tahu dan kamu yakini!</p>
<p>Kalau kamu suka artikel ini, jangan lupa share ya, dan follow blog ini biar nggak ketinggalan update strategi investasi lainnya!</p>
<p><em>disclaimer: Artikel ini dibuat dengn tujuan edukasi bukan ajakan jual beli saham dan dibuat dengan AI generatif</em></p>
]]></content:encoded></item></channel></rss>