Penyelesaian Soal Aktuaria dengan Program R

SOAL 1: Fungsi Survival

Bagian (a): s(x) = -cos(x)

F(x) = 1 - s(x) = 1 + cos(x)

f_x(x) = -s’(x) = sin(x)

μ_x = f_x(x)/s(x) = -tan(x)

Bagian (b): s(x) = e^(-x)

F(x) = 1 - s(x) = 1 - e^(-x)

f_x(x) = -s’(x) = e^(-x)

μ_x = f_x(x)/s(x) = 1

Bagian (c): s(x) = 1/(1+x)

F(x) = 1 - s(x) = x/(1+x)

f_x(x) = -s’(x) = 1/(1+x)²

μ_x = f_x(x)/s(x) = 1/(1+x)

Fungsi untuk menghitung dan menampilkan semua fungsi aktuaria

hitung_fungsi_aktuaria <- function() {
  cat("HASIL PERHITUNGAN SOAL 1:\n")
  
  cat("\na) Untuk s(x) = -cos(x):\n")
  cat("   F(x) = 1 + cos(x)\n")
  cat("   f_x(x) = sin(x)\n")
  cat("   μ_x = -tan(x)\n")
  
  cat("\nb) Untuk s(x) = e^(-x):\n")
  cat("   F(x) = 1 - e^(-x)\n")
  cat("   f_x(x) = e^(-x)\n")
  cat("   μ_x = 1\n")
  
  cat("\nc) Untuk s(x) = 1/(1+x):\n")
  cat("   F(x) = x/(1+x)\n")
  cat("   f_x(x) = 1/(1+x)²\n")
  cat("   μ_x = 1/(1+x)\n")
}

SOAL 2: Tabel Hidup dengan Distribusi Gompertz

Program R untuk Soal Nomor 2: Tabel Hidup Menggunakan Distribusi Gompertz

Parameter

B <- 0.0001          # Parameter dasar Gompertz
C <- 1.09            # Parameter peningkatan Gompertz
populasi_awal <- 1000000  # Jumlah penduduk awal
umur_maksimum <- 60  # Umur maksimum yang diperhitungkan

Inisialisasi vektor

umur <- 0:umur_maksimum
mu_x <- B * C^umur                # Force of mortality
p_x <- exp(-mu_x)                 # Probabilitas bertahan hidup 1 tahun
q_x <- 1 - p_x                    # Probabilitas kematian dalam 1 tahun
l_x <- numeric(length(umur))      # Jumlah orang yang hidup pada umur x
l_x[1] <- populasi_awal           # Jumlah penduduk awal pada umur 0
d_x <- numeric(length(umur))      # Jumlah kematian antara umur x dan x+1

Menghitung nilai-nilai tabel hidup

for (i in 1:(length(umur)-1)) {
  d_x[i] <- l_x[i] * q_x[i]       # Jumlah kematian antara umur x dan x+1
  l_x[i+1] <- l_x[i] - d_x[i]     # Jumlah orang yang bertahan hidup sampai umur x+1
}
d_x[length(umur)] <- l_x[length(umur)]  # Semua orang tersisa meninggal setelah umur maksimum

Membuat tabel hidup

tabel_hidup <- data.frame(
  x = umur,                      # Umur
  mu_x = mu_x,                   # Force of mortality
  p_x = p_x,                     # Probabilitas bertahan hidup 1 tahun
  q_x = q_x,                     # Probabilitas kematian dalam 1 tahun
  l_x = l_x,                     # Jumlah orang yang hidup pada umur x
  d_x = d_x                      # Jumlah kematian antara umur x dan x+1
)

Menampilkan tabel hidup lengkap

print(tabel_hidup)
##     x         mu_x       p_x          q_x       l_x         d_x
## 1   0 0.0001000000 0.9999000 0.0000999950 1000000.0     99.9950
## 2   1 0.0001090000 0.9998910 0.0001089941  999900.0    108.9832
## 3   2 0.0001188100 0.9998812 0.0001188029  999791.0    118.7781
## 4   3 0.0001295029 0.9998705 0.0001294945  999672.2    129.4521
## 5   4 0.0001411582 0.9998589 0.0001411482  999542.8    141.0837
## 6   5 0.0001538624 0.9998461 0.0001538506  999401.7    153.7585
## 7   6 0.0001677100 0.9998323 0.0001676959  999247.9    167.5698
## 8   7 0.0001828039 0.9998172 0.0001827872  999080.4    182.6191
## 9   8 0.0001992563 0.9998008 0.0001992364  998897.8    199.0168
## 10  9 0.0002171893 0.9997828 0.0002171657  998698.7    216.8832
## 11 10 0.0002367364 0.9997633 0.0002367083  998481.9    236.3490
## 12 11 0.0002580426 0.9997420 0.0002580094  998245.5    257.5567
## 13 12 0.0002812665 0.9997188 0.0002812269  997988.0    280.6611
## 14 13 0.0003065805 0.9996935 0.0003065335  997707.3    305.8307
## 15 14 0.0003341727 0.9996659 0.0003341169  997401.5    333.2487
## 16 15 0.0003642482 0.9996358 0.0003641819  997068.2    363.1142
## 17 16 0.0003970306 0.9996030 0.0003969518  996705.1    395.6439
## 18 17 0.0004327633 0.9995673 0.0004326697  996309.5    431.0729
## 19 18 0.0004717120 0.9995284 0.0004716008  995878.4    469.6570
## 20 19 0.0005141661 0.9994860 0.0005140340  995408.7    511.6739
## 21 20 0.0005604411 0.9994397 0.0005602841  994897.1    557.4250
## 22 21 0.0006108808 0.9993893 0.0006106942  994339.6    607.2375
## 23 22 0.0006658600 0.9993344 0.0006656384  993732.4    661.4664
## 24 23 0.0007257874 0.9992745 0.0007255241  993070.9    720.4969
## 25 24 0.0007911083 0.9992092 0.0007907955  992350.4    784.7462
## 26 25 0.0008623081 0.9991381 0.0008619364  991565.7    854.6665
## 27 26 0.0009399158 0.9990605 0.0009394742  990711.0    930.7474
## 28 27 0.0010245082 0.9989760 0.0010239836  989780.3   1013.5187
## 29 28 0.0011167140 0.9988839 0.0011160907  988766.7   1103.5533
## 30 29 0.0012172182 0.9987835 0.0012164777  987663.2   1201.4702
## 31 30 0.0013267678 0.9986741 0.0013258881  986461.7   1307.9378
## 32 31 0.0014461770 0.9985549 0.0014451317  985153.8   1423.6770
## 33 32 0.0015763329 0.9984249 0.0015750911  983730.1   1549.4646
## 34 33 0.0017182028 0.9982833 0.0017167276  982180.6   1686.1366
## 35 34 0.0018728411 0.9981289 0.0018710884  980494.5   1834.5919
## 36 35 0.0020413968 0.9979607 0.0020393146  978659.9   1995.7954
## 37 36 0.0022251225 0.9977774 0.0022226488  976664.1   2170.7813
## 38 37 0.0024253835 0.9975776 0.0024224447  974493.3   2360.6562
## 39 38 0.0026436680 0.9973598 0.0026401766  972132.7   2566.6020
## 40 39 0.0028815982 0.9971225 0.0028774504  969566.1   2789.8783
## 41 40 0.0031409420 0.9968640 0.0031360144  966776.2   3031.8241
## 42 41 0.0034236268 0.9965822 0.0034177729  963744.4   3293.8594
## 43 42 0.0037317532 0.9962752 0.0037247989  960450.5   3577.4850
## 44 43 0.0040676110 0.9959407 0.0040593495  956873.0   3884.2820
## 45 44 0.0044336960 0.9955761 0.0044238817  952988.8   4215.9095
## 46 45 0.0048327286 0.9951789 0.0048210698  948772.8   4574.1001
## 47 46 0.0052676742 0.9947462 0.0052538243  944198.7   4960.6543
## 48 47 0.0057417649 0.9942747 0.0057253124  939238.1   5377.4315
## 49 48 0.0062585237 0.9937610 0.0062389799  933860.7   5826.3379
## 50 49 0.0068217908 0.9932014 0.0067985752  928034.3   6309.3111
## 51 50 0.0074357520 0.9925918 0.0074081752  921725.0   6828.3003
## 52 51 0.0081049697 0.9919278 0.0080722130  914896.7   7385.2411
## 53 52 0.0088344170 0.9912045 0.0087955082  907511.5   7982.0245
## 54 53 0.0096295145 0.9904167 0.0095832992  899529.4   8620.4598
## 55 54 0.0104961708 0.9895587 0.0104412782  890909.0   9302.2285
## 56 55 0.0114408262 0.9886244 0.0113756288  881606.8  10028.8312
## 57 56 0.0124705005 0.9876069 0.0123930660  871577.9  10801.5228
## 58 57 0.0135928456 0.9864991 0.0135008800  860776.4  11621.2389
## 59 58 0.0148162017 0.9852930 0.0147069818  849155.2  12488.5095
## 60 59 0.0161496598 0.9839800 0.0160199532  836666.7  13403.3606
## 61 60 0.0176031292 0.9825509 0.0174490992  823263.3 823263.2910

Menampilkan beberapa statistik ringkas

cat("\nStatistik Ringkas:\n")
## 
## Statistik Ringkas:
cat("Total kematian dari umur 0-60:", sum(d_x[1:60]), "\n")
## Total kematian dari umur 0-60: 176736.7
cat("Persentase populasi yang bertahan hingga umur 60:", round(l_x[61]/l_x[1]*100, 2), "%\n")
## Persentase populasi yang bertahan hingga umur 60: 82.33 %

Membuat grafik untuk visualisasi

par(mfrow=c(2,2))  # Membagi area plot menjadi 2x2

Plot 1: Force of Mortality (μ_x)

plot(umur, mu_x, type="l", col="red", 
     main="Force of Mortality (μ_x)", 
     xlab="Umur (x)", ylab="μ_x",
     lwd=2)

# Plot 2: Probabilitas Kematian dalam 1 Tahun (q_x)

plot(umur, q_x, type="l", col="blue", 
     main="Probabilitas Kematian (q_x)", 
     xlab="Umur (x)", ylab="q_x",
     lwd=2)

# Plot 3: Jumlah Orang Hidup pada Umur x (l_x)

plot(umur, l_x, type="l", col="green", 
     main="Jumlah Orang Hidup (l_x)", 
     xlab="Umur (x)", ylab="l_x",
     lwd=2)

# Plot 4: Jumlah Kematian antara Umur x dan x+1 (d_x)

plot(umur, d_x, type="l", col="purple", 
     main="Kematian per Umur (d_x)", 
     xlab="Umur (x)", ylab="d_x",
     lwd=2)

# SOAL 3: Anuitas Jiwa # Fungsi untuk anuitas jiwa seumur hidup model kontinu

anuitas_seumur_hidup_kontinu <- function(x, delta) {
  integrate(function(t) exp(-delta * t) * (100 - (x + t))/(100 - x), 
            lower = 0, upper = 100 - x)$value
}

Fungsi untuk anuitas jiwa seumur hidup model diskrit

anuitas_seumur_hidup_diskrit <- function(x, delta) {
  v <- exp(-delta)
  k_max <- 100 - x
  sum(sapply(1:k_max, function(k) v^k * (100 - (x + k))/(100 - x)))
}

Fungsi untuk anuitas jiwa berjangka model kontinu

anuitas_berjangka_kontinu <- function(x, n, delta) {
  integrate(function(t) exp(-delta * t) * (100 - (x + t))/(100 - x), 
            lower = 0, upper = min(n, 100 - x))$value
}

Fungsi untuk anuitas jiwa berjangka model diskrit

anuitas_berjangka_diskrit <- function(x, n, delta) {
  v <- exp(-delta)
  k_max <- min(n, 100 - x)
  sum(sapply(1:k_max, function(k) v^k * (100 - (x + k))/(100 - x)))
}

Fungsi untuk anuitas jiwa tertunda model kontinu

anuitas_tertunda_kontinu <- function(x, m, n, delta) {
  if (x + m >= 100) return(0)  # Jika periode penundaan melebihi harapan hidup
  integrate(function(t) exp(-delta * t) * (100 - (x + t))/(100 - x), 
            lower = m, upper = min(m + n, 100 - x))$value
}

Fungsi untuk anuitas jiwa tertunda model diskrit

anuitas_tertunda_diskrit <- function(x, m, n, delta) {
  v <- exp(-delta)
  k_start <- m + 1
  k_end <- min(m + n, 100 - x)
  if (k_start > k_end) return(0)  # Jika periode penundaan melebihi harapan hidup
  sum(sapply(k_start:k_end, function(k) v^k * (100 - (x + k))/(100 - x)))
}

Fungsi untuk anuitas jiwa berjangka dan pasti model kontinu

anuitas_pasti_kontinu <- function(x, n, delta) {
  # Bagian pasti
  pasti <- (1 - exp(-delta * n))/delta
  
  # Bagian bersyarat hidup
  bersyarat <- anuitas_berjangka_kontinu(x, n, delta)
  
  # Gabungan: ā_x:n¯ = ā_n + (ā_x - ā_x:n)
  return(pasti - bersyarat + anuitas_seumur_hidup_kontinu(x, delta))
}

Fungsi untuk anuitas jiwa berjangka dan pasti model diskrit

anuitas_pasti_diskrit <- function(x, n, delta) {
  v <- exp(-delta)
  # Bagian pasti
  pasti <- sum(v^(1:n))
  
  # Bagian bersyarat hidup
  bersyarat <- anuitas_berjangka_diskrit(x, n, delta)
  
  # Gabungan: a_x:n¯ = a_n + (a_x - a_x:n)
  return(pasti - bersyarat + anuitas_seumur_hidup_diskrit(x, delta))
}

Fungsi untuk menjalankan semua perhitungan untuk soal 3

hitung_anuitas <- function(delta = 0.05) {
  hasil <- list()
  
  # a) Anuitas jiwa seumur hidup untuk umur 45
  hasil$a_kontinu_45 <- anuitas_seumur_hidup_kontinu(45, delta)
  hasil$a_diskrit_45 <- anuitas_seumur_hidup_diskrit(45, delta)
  
  # b) Anuitas jiwa berjangka 15 tahun untuk umur 45
  hasil$b_kontinu_45_15 <- anuitas_berjangka_kontinu(45, 15, delta)
  hasil$b_diskrit_45_15 <- anuitas_berjangka_diskrit(45, 15, delta)
  
  # c) Anuitas jiwa berjangka 25 tahun tertunda 5 tahun untuk umur 75
  hasil$c_kontinu_75_5_25 <- anuitas_tertunda_kontinu(75, 5, 25, delta)
  hasil$c_diskrit_75_5_25 <- anuitas_tertunda_diskrit(75, 5, 25, delta)
  
  # d) Anuitas jiwa berjangka dan pasti 15 tahun untuk umur 55
  hasil$d_kontinu_55_15 <- anuitas_pasti_kontinu(55, 15, delta)
  hasil$d_diskrit_55_15 <- anuitas_pasti_diskrit(55, 15, delta)
  
  return(hasil)
}

Jalankan semua fungsi dan tampilkan hasilnya

jalankan_semua <- function() {
  # Menjalankan dan menampilkan hasil soal 1
  hitung_fungsi_aktuaria()
  
  # Menjalankan dan menampilkan hasil soal 2
  cat("\n\nHASIL PERHITUNGAN SOAL 2:\n")
  print(head(tabel_hidup, 10))  # Tampilkan 10 baris pertama
  cat("\n... (tabel lengkap memiliki 61 baris)\n")
  
  # Menjalankan dan menampilkan hasil soal 3
  cat("\n\nHASIL PERHITUNGAN SOAL 3:\n")
  hasil_anuitas <- hitung_anuitas()
  
  cat("\na) Anuitas jiwa seumur hidup untuk seseorang berusia 45 tahun:\n")
  cat("   Model Kontinu: ", hasil_anuitas$a_kontinu_45, "\n")
  cat("   Model Diskrit: ", hasil_anuitas$a_diskrit_45, "\n")
  
  cat("\nb) Anuitas jiwa berjangka 15 tahun untuk seseorang berusia 45 tahun:\n")
  cat("   Model Kontinu: ", hasil_anuitas$b_kontinu_45_15, "\n")
  cat("   Model Diskrit: ", hasil_anuitas$b_diskrit_45_15, "\n")
  
  cat("\nc) Anuitas jiwa berjangka 25 tahun tertunda 5 tahun untuk seseorang berusia 75 tahun:\n")
  cat("   Model Kontinu: ", hasil_anuitas$c_kontinu_75_5_25, "\n")
  cat("   Model Diskrit: ", hasil_anuitas$c_diskrit_75_5_25, "\n")
  
  cat("\nd) Anuitas jiwa berjangka dan pasti 15 tahun untuk seseorang berusia 55 tahun:\n")
  cat("   Model Kontinu: ", hasil_anuitas$d_kontinu_55_15, "\n")
  cat("   Model Diskrit: ", hasil_anuitas$d_diskrit_55_15, "\n")
}

Jalankan program

jalankan_semua()
## HASIL PERHITUNGAN SOAL 1:
## 
## a) Untuk s(x) = -cos(x):
##    F(x) = 1 + cos(x)
##    f_x(x) = sin(x)
##    μ_x = -tan(x)
## 
## b) Untuk s(x) = e^(-x):
##    F(x) = 1 - e^(-x)
##    f_x(x) = e^(-x)
##    μ_x = 1
## 
## c) Untuk s(x) = 1/(1+x):
##    F(x) = x/(1+x)
##    f_x(x) = 1/(1+x)²
##    μ_x = 1/(1+x)
## 
## 
## HASIL PERHITUNGAN SOAL 2:
##    x         mu_x       p_x          q_x       l_x      d_x
## 1  0 0.0001000000 0.9999000 0.0000999950 1000000.0  99.9950
## 2  1 0.0001090000 0.9998910 0.0001089941  999900.0 108.9832
## 3  2 0.0001188100 0.9998812 0.0001188029  999791.0 118.7781
## 4  3 0.0001295029 0.9998705 0.0001294945  999672.2 129.4521
## 5  4 0.0001411582 0.9998589 0.0001411482  999542.8 141.0837
## 6  5 0.0001538624 0.9998461 0.0001538506  999401.7 153.7585
## 7  6 0.0001677100 0.9998323 0.0001676959  999247.9 167.5698
## 8  7 0.0001828039 0.9998172 0.0001827872  999080.4 182.6191
## 9  8 0.0001992563 0.9998008 0.0001992364  998897.8 199.0168
## 10 9 0.0002171893 0.9997828 0.0002171657  998698.7 216.8832
## 
## ... (tabel lengkap memiliki 61 baris)
## 
## 
## HASIL PERHITUNGAN SOAL 3:
## 
## a) Anuitas jiwa seumur hidup untuk seseorang berusia 45 tahun:
##    Model Kontinu:  13.1922 
##    Model Diskrit:  12.69779 
## 
## b) Anuitas jiwa berjangka 15 tahun untuk seseorang berusia 45 tahun:
##    Model Kontinu:  9.29188 
##    Model Diskrit:  8.967184 
## 
## c) Anuitas jiwa berjangka 25 tahun tertunda 5 tahun untuk seseorang berusia 75 tahun:
##    Model Kontinu:  4.584077 
##    Model Diskrit:  4.276793 
## 
## d) Anuitas jiwa berjangka dan pasti 15 tahun untuk seseorang berusia 55 tahun:
##    Model Kontinu:  13.58896 
##    Model Diskrit:  13.17188