Midterm Exam

Insurance Dataset


1 Pendahuluan

Laporan ini disusun untuk menganalisis data pelanggan dalam industri asuransi dengan tujuan mendukung pengambilan keputusan yang berbasis data. Dalam industri ini, pengelolaan risiko, penetapan harga polis, dan prediksi klaim merupakan aspek krusial yang memerlukan pemahaman mendalam terhadap karakteristik peserta. Setiap peserta memiliki kombinasi unik dari faktor demografis, perilaku, dan kesehatan yang memengaruhi profil risiko dan potensi klaim mereka. Dengan melakukan analisis tendensi sentral dan ukuran dispersi, laporan ini bertujuan memberikan pemahaman yang lebih jelas mengenai sebaran data, karakteristik peserta, dan potensi risiko, sehingga dapat mendukung strategi perusahaan dalam pengelolaan risiko dan penetapan premi.

1.1 Video Penjelasan

Berikut video YouTube terkait pembahasan:

1.2 Membaca Dataset

2 Data Visualization

Data visualisasi adalah proses menyajikan data dalam bentuk grafis atau visual—seperti grafik, diagram, atau peta—agar informasi dari data tersebut lebih mudah dipahami, dianalisis, dan diinterpretasikan. Tujuan utama dari data visualisasi adalah mengubah data mentah menjadi bentuk yang lebih intuitif, sehingga pola, tren, hubungan, dan outlier dapat terlihat dengan jelas tanpa harus membaca angka satu per satu.

Visualisasi data membantu dalam pengambilan keputusan karena manusia lebih mudah mengenali informasi melalui representasi visual dibandingkan tabel angka.

2.1 HISTOGRAM AGE

# Buat histogram interaktif
fig <- plot_ly(
  data = data,
  x = ~Age,
  type = "histogram",
  nbinsx = 20, 
  marker = list(
    color = "#4E79A7",
    line = list(color = "white", width = 1)
  )
)

# Tambahkan layout / label
fig <- fig %>%
  layout(
    title = "Distribution of Age",
    xaxis = list(title = "Age"),
    yaxis = list(title = "Count"),
    bargap = 0.05,
    plot_bgcolor = "rgba(0,0,0,0)",
    paper_bgcolor = "rgba(0,0,0,0)"
  )

fig

Interpretasi Histogram Age

Histogram usia menampilkan distribusi frekuensi berdasarkan kelompok umur dalam dataset. Grafik ini menunjukkan bagaimana usia para responden tersebar, apakah terpusat pada kelompok tertentu atau menyebar secara merata. Jika terdapat batang histogram yang lebih tinggi pada rentang usia tertentu, hal ini mengindikasikan bahwa sebagian besar individu berada pada kelompok umur tersebut. Pola distribusi ini penting untuk memahami karakteristik demografis populasi, yang dapat berpengaruh terhadap risiko kesehatan dan kecenderungan klaim asuransi. Histogram ini membantu peneliti menilai apakah komposisi usia bersifat normal, condong (skewed), atau memiliki variasi yang besar.

Insight dari Distribusi Age

Distribusi usia menunjukkan bahwa populasi dalam dataset tidak tersebar merata, melainkan terkonsentrasi pada kelompok umur tertentu. Hal ini mengindikasikan bahwa perusahaan asuransi kemungkinan menargetkan segmen demografis tertentu yang dianggap lebih stabil atau memiliki tingkat risiko tertentu. Rentang usia yang dominan juga dapat memengaruhi pola klaim dan strategi penetapan premi.

2.2 HISTOGRAM BMI

# ===============================================
# Interactive Histogram of BMI (no ggplot)
# ===============================================

# Load library
library(plotly)
library(readr)

# Baca data CSV
data <- read_csv("Midterm Exam.csv")

# Histogram interaktif dengan Plotly
fig <- plot_ly(
  data = data,
  x = ~BMI,
  type = "histogram",
  nbinsx = 15,  # mirip dengan binwidth = 2, bisa kamu ubah
  marker = list(
    color = "#59A14F",
    line = list(color = "white", width = 1)
  )
)

# Atur tampilan dan label
fig <- fig %>%
  layout(
    title = "Distribution of BMI",
    xaxis = list(title = "BMI"),
    yaxis = list(title = "Count"),
    bargap = 0.05,
    plot_bgcolor = "rgba(0,0,0,0)",
    paper_bgcolor = "rgba(0,0,0,0)",
    font = list(size = 14)
  )

# Tampilkan hasil
fig

Interpretasi Histogram BMI

Histogram BMI menggambarkan pola distribusi indeks massa tubuh seluruh individu dalam dataset. Melalui grafik ini, dapat diamati apakah nilai BMI mayoritas responden berada pada kategori normal, overweight, atau obesitas. Rentang nilai dan kepadatan batang histogram memberikan gambaran mengenai kondisi kesehatan populasi secara umum. Jika nilai BMI terkonsentrasi pada rentang tertentu, ini menunjukkan homogenitas kesehatan dalam kelompok tersebut. Distribusi BMI yang melebar atau tidak merata dapat mengindikasikan adanya variasi besar dalam profil kesehatan, yang berpotensi memengaruhi besarnya klaim dan risiko yang ditanggung perusahaan asuransi.

Insight dari Distribusi BMI

Distribusi BMI mengungkap adanya kecenderungan nilai BMI yang mengarah pada satu kategori tertentu, misalnya overweight atau normal. Jika sebagian besar responden berada pada kategori BMI yang lebih tinggi, maka risiko kesehatan pada populasi ini juga meningkat. Hal ini berpotensi berdampak pada tingginya Claim Amount dan dapat menjadi indikator awal untuk evaluasi ulang struktur premi atau manfaat asuransi terkait.

2.3 BOXPLOT CLAIM AMOUNT

# Buat boxplot interaktif
fig <- plot_ly(
  data = data,
  y = ~ClaimAmount,
  type = "box",
  boxpoints = "outliers", # tampilkan outlier
  marker = list(color = "#E15759"),
  line = list(color = "#E15759")
)

# Tambahkan label & tema
fig <- fig %>%
  layout(
    title = "Boxplot of Claim Amount",
    yaxis = list(title = "Claim Amount"),
    plot_bgcolor = "rgba(0,0,0,0)",
    paper_bgcolor = "rgba(0,0,0,0)",
    font = list(size = 14)
  )

# Tampilkan hasil
fig

Interpretasi Boxplot Claim Amount

Boxplot ClaimAmount menyajikan ringkasan statistik yang mencakup nilai minimum, maksimum, kuartil pertama, median, dan kuartil ketiga. Keberadaan outlier yang muncul di luar garis whiskers menunjukkan adanya klaim yang jauh lebih besar dibandingkan mayoritas lainnya. Medan boxplot yang relatif lebar menandakan adanya variasi yang besar pada jumlah klaim. Jika median tidak berada tepat di tengah kotak, hal ini mengindikasikan bahwa distribusi klaim bersifat tidak simetris. Visualisasi ini sangat penting untuk mendeteksi nilai klaim ekstrem yang mungkin memerlukan perhatian lebih dalam konteks analisis risiko dan penetapan kebijakan asuransi.

Insight dari Boxplot Claim Amount

Boxplot memperlihatkan adanya outlier yang cukup menonjol pada Claim Amount. Kehadiran klaim dengan nilai sangat tinggi menunjukkan risiko finansial yang tidak merata dalam portofolio pelanggan. Kondisi ini memberikan sinyal bahwa perusahaan perlu mempertimbangkan analisis risiko lanjutan, seperti memeriksa penyebab klaim ekstrem, mendesain ulang kebijakan limit klaim, atau melakukan segmentasi risiko yang lebih

2.4 BAR CHART INSURANCE PLAN

# ===============================================
# Interactive Bar Chart: Number of Customers by Insurance Plan (no ggplot)
# ===============================================

# Load library

# Hitung jumlah pelanggan per InsurancePlan
plan_count <- data %>%
  count(InsurancePlan)

# Buat bar chart interaktif
fig <- plot_ly(
  data = plan_count,
  x = ~InsurancePlan,
  y = ~n,
  type = "bar",
  text = ~n,                  # tampilkan nilai saat hover
  textposition = "auto",
  marker = list(
    color = "#4E79A7"
  )
)

# Atur layout dan gaya
fig <- fig %>%
  layout(
    title = "Number of Customers by Insurance Plan",
    xaxis = list(title = "Insurance Plan"),
    yaxis = list(title = "Count"),
    showlegend = FALSE,
    plot_bgcolor = "rgba(0,0,0,0)",
    paper_bgcolor = "rgba(0,0,0,0)",
    font = list(size = 14)
  )

# Tampilkan grafik
fig

Interpretasi Bar Chart Insurance Plan

Bar chart ini menunjukkan jumlah pelanggan pada masing-masing kategori InsurancePlan. Perbedaan tinggi batang pada setiap kategori menggambarkan tingkat popularitas atau tingkat adopsi dari setiap rencana asuransi. Jika salah satu kategori memiliki jumlah pelanggan yang jauh lebih banyak, hal tersebut mengindikasikan adanya preferensi yang kuat terhadap rencana tersebut. Informasi ini penting bagi pihak penyedia asuransi untuk mengevaluasi strategi pemasaran, keseimbangan portofolio, serta pemerataan risiko di antara berbagai jenis rencana. Grafik ini juga membantu mengidentifikasi apakah terdapat ketimpangan dalam distribusi pelanggan antar rencana.

Insight dari Bar Chart Insurance Plan

Ketidakseimbangan jumlah pelanggan di berbagai kategori InsurancePlan mengindikasikan adanya preferensi kuat terhadap rencana tertentu. Hal ini dapat menjadi sinyal bahwa rencana tersebut menawarkan manfaat yang lebih menarik atau lebih terjangkau dibandingkan rencana lainnya. Namun, konsentrasi pelanggan pada satu rencana juga dapat meningkatkan risiko akumulatif bagi perusahaan jika rencana tersebut memiliki struktur klaim yang lebih tinggi. Evaluasi komparatif antar rencana perlu dilakukan untuk menjaga keseimbangan portofolio.

2.5 SCATTERPLOT RISK SCORE vs CLAIM AMOUNT

library(plotly)
library(readr)

data <- read_csv("Midterm Exam.csv")

fig <- plot_ly(
  data = data,
  x = ~RiskScore,
  y = ~ClaimAmount,
  type = "scatter",
  mode = "markers",
  marker = list(
    color = "#F28E2B",
    size = 8,
    opacity = 0.6
  )
)

# Auto regression line (sama seperti geom_smooth(method = "lm"))
fig <- fig %>%
  add_trace(
    type = "scatter",
    mode = "lines",
    x = data$RiskScore,
    y = fitted(lm(ClaimAmount ~ RiskScore, data = data)),
    line = list(color = "black", width = 3),
    name = "Linear Regression"
  )

fig <- fig %>%
  layout(
    title = "Relationship Between Risk Score and Claim Amount",
    xaxis = list(title = "Risk Score"),
    yaxis = list(title = "Claim Amount"),
    plot_bgcolor = "rgba(0,0,0,0)",
    paper_bgcolor = "rgba(0,0,0,0)",
    font = list(size = 14)
  )

fig

interpretasi Scatterplot Risk Score vs Claim Amount

Scatterplot ini memperlihatkan hubungan antara RiskScore dan ClaimAmount. Penyebaran titik pada grafik menunjukkan bagaimana nilai klaim bervariasi berdasarkan tingkat risiko. Garis regresi linear yang ditambahkan memberikan indikasi arah hubungan antara kedua variabel. Jika garis regresi memiliki kemiringan positif, hal ini mengindikasikan bahwa semakin tinggi skor risiko, semakin besar kecenderungan jumlah klaim yang diajukan. Pola penyebaran yang padat mengindikasikan hubungan yang lebih konsisten, sedangkan penyebaran yang luas menunjukkan hubungan yang lebih lemah. Visualisasi ini sangat penting dalam analisis prediksi risiko karena membantu menentukan apakah skor risiko merupakan indikator yang valid untuk memprediksi besar kecilnya klaim.

Insight dari Scatterplot Risk Score vs Claim Amount

Scatterplot menunjukkan kecenderungan adanya hubungan positif antara RiskScore dan ClaimAmount, meskipun hubungan tersebut perlu diuji lebih lanjut melalui analisis statistik formal. Pola ini menggambarkan bahwa skor risiko memiliki potensi sebagai indikator prediktif terhadap jumlah klaim. Dengan demikian, perusahaan dapat mempertimbangkan penggunaan RiskScore dalam proses underwriting, perhitungan premi, atau sebagai parameter untuk segmentasi pelanggan berisiko tinggi.

3 Central Tendency Analysis

Central Tendency Analysis adalah proses analisis statistik yang bertujuan untuk menggambarkan nilai pusat atau nilai yang mewakili keseluruhan distribusi data. Analisis ini digunakan untuk memahami bagaimana kecenderungan umum dari suatu variabel, apakah datanya cenderung tinggi, rendah, atau berada di sekitar suatu titik tertentu.

Pada umumnya, analisis ini menggunakan tiga ukuran utama, yaitu *mean, median, dan mode** :

  • Mean (Rata-rata) memberikan gambaran nilai rata-rata dari seluruh data dan sensitif terhadap nilai ekstrem (outlier).
  • Median menunjukkan nilai tengah dari data yang telah diurutkan, sehingga lebih stabil saat data memiliki penyimpangan ekstrem atau distribusi tidak simetris.
  • Mode adalah nilai yang paling sering muncul dan berguna ketika ingin mengetahui pola kemunculan nilai tertentu.

3.1 central tendency table

# ---------------------------------------------------------
# Import library
# ---------------------------------------------------------
library(readr)
library(dplyr)
library(knitr)
library(kableExtra)
library(DT)
library(tidyr)

# ---------------------------------------------------------
# Baca data
# ---------------------------------------------------------
data <- read_csv("Midterm Exam.csv")

# ---------------------------------------------------------
# Hapus kolom nomor urut jika ada
# ---------------------------------------------------------
data <- data %>%
  select(where(~ !all(.x == seq_len(nrow(data)))))


# ---------------------------------------------------------
# Fungsi mode
# ---------------------------------------------------------
get_mode <- function(x) {
  uniq_x <- unique(x)
  uniq_x[which.max(tabulate(match(x, uniq_x)))]
}

# ---------------------------------------------------------
# Mean, Median, Mode
# ---------------------------------------------------------
central_tendency_all <- data %>%
  summarise(across(where(is.numeric),
                   list(
                     Mean = ~mean(.x, na.rm = TRUE),
                     Median = ~median(.x, na.rm = TRUE),
                     Mode = ~get_mode(.x)
                   ),
                   .names = "{.col}_{.fn}"
  ))

# ---------------------------------------------------------
# Format tabel rapi
# ---------------------------------------------------------
central_tendency_table <- central_tendency_all %>%
  pivot_longer(cols = everything(),
               names_to = c("Variable", "Statistic"),
               names_sep = "_",
               values_to = "Value") %>%
  pivot_wider(names_from = Statistic, values_from = Value)

# ---------------------------------------------------------
# Tampilkan seperti screenshot (pakai DT)
# ---------------------------------------------------------
datatable(
  central_tendency_table,
  options = list(
    pageLength = 10,
    autoWidth = TRUE,
    dom = 'tip',
    columnDefs = list(
      list(className = "dt-center", targets = "_all")
    )
  ),
  rownames = FALSE,
  class = "stripe hover row-border order-column",
  caption = htmltools::tags$caption(
    style = "caption-side: top; text-align: center; font-weight: bold;",
    "Tabel Central Tendency (Mean, Median, Mode)"
  )
)
# ---------------------------------------------------------
# (2) Bandingkan Age & BMI
# ---------------------------------------------------------
compare_vars <- c("Age", "BMI")
# ---------------------------------------------------------
# Fungsi mode
# ---------------------------------------------------------
get_mode <- function(x) {
  uniq_x <- unique(x)
  uniq_x[which.max(tabulate(match(x, uniq_x)))]
}

# ---------------------------------------------------------
# Tabel Central Tendency untuk Age & BMI saja
# ---------------------------------------------------------
central_age_bmi <- data %>%
  summarise(across(c(Age, BMI),
                   list(
                     Mean = ~mean(.x, na.rm = TRUE),
                     Median = ~median(.x, na.rm = TRUE),
                     Mode = ~get_mode(.x)
                   ),
                   .names = "{.col}_{.fn}"
  )) %>%
  tidyr::pivot_longer(cols = everything(),
                      names_to = c("Variable", "Statistic"),
                      names_sep = "_",
                      values_to = "Value") %>%
  tidyr::pivot_wider(names_from = Statistic, values_from = Value)

# ---------------------------------------------------------
# Tampilkan tabel rapi
# ---------------------------------------------------------
central_age_bmi %>%
  kable(caption = "Summary of Central Tendency Measures for Age and BMI") %>%
  kable_styling(full_width = FALSE, position = "center",
                bootstrap_options = c("striped", "hover"))
Summary of Central Tendency Measures for Age and BMI
Variable Mean Median Mode
Age 46.75400 47.0 70.0
BMI 26.16875 26.1 24.2

Interpretasi Tabel Age dan BMI

Untuk variabel Age, nilai Mean menunjukkan rata-rata usia peserta, Median menunjukkan usia tengah, dan Mode menunjukkan usia yang paling sering muncul. Jika nilai Mean dan Median relatif dekat, maka distribusi usia cukup simetris; adanya Mode yang berbeda menunjukkan bahwa ada beberapa usia yang muncul lebih sering.

Untuk variabel BMI, nilai Mean menunjukkan rata-rata indeks massa tubuh peserta, Median menunjukkan nilai tengah BMI, dan Mode menunjukkan nilai BMI yang paling umum. Jika terdapat perbedaan yang signifikan antara Mean dan Median, hal ini bisa menunjukkan adanya outlier atau individu dengan BMI ekstrem. Secara umum, tabel ini membantu melihat pola umum dan penyebaran data untuk Age dan BMI, serta mempermudah identifikasi kelompok peserta yang berada di luar rentang normal.

Insight dari Tabel Age dan BMI

Mayoritas peserta berada di rentang usia tertentu, sementara beberapa individu lebih muda atau lebih tua dari kelompok utama, yang dapat menjadi fokus untuk analisis risiko.

Sebagian besar peserta memiliki BMI normal atau sedikit berlebih, namun ada beberapa outlier yang perlu diperhatikan untuk penilaian risiko kesehatan.

Informasi Mean, Median, dan Mode membantu mengenali pola umum dan nilai yang sering muncul, sehingga lebih mudah dalam perencanaan analisis lanjutan, misalnya segmentasi peserta berdasarkan usia dan BMI.

3.2 Histogram Age dengan Garis Mean dan Median

# ---------------------------------------------------------
# (3) Histogram untuk mendeteksi skewness
# ---------------------------------------------------------
library(plotly)

# Hitung mean & median
mean_age <- mean(data$Age, na.rm = TRUE)
median_age <- median(data$Age, na.rm = TRUE)

# Histogram interaktif
fig <- plot_ly(
  data = data,
  x = ~Age,
  type = "histogram",
  nbinsx = 20,
  marker = list(color = "skyblue", line = list(color = "black", width = 1))
)

# Hitung tinggi maksimal histogram (otomatis dari data histogram)
max_y <- max(hist(data$Age, breaks = 20, plot = FALSE)$counts)

# Garis Mean (Merah, dashed)
fig <- fig %>%
  add_lines(
    x = c(mean_age, mean_age),
    y = c(0, max_y),
    line = list(color = "red", width = 3, dash = "dash"),
    name = "Mean"
  )

# Garis Median (Biru, dotted)
fig <- fig %>%
  add_lines(
    x = c(median_age, median_age),
    y = c(0, max_y),
    line = list(color = "blue", width = 3, dash = "dot"),
    name = "Median"
  )

# Layout
fig <- fig %>%
  layout(
    title = "Histogram Age (Red = Mean, Blue = Median)",
    xaxis = list(title = "Age"),
    yaxis = list(title = "Frequency"),
    bargap = 0.05
  )

fig

Interpretasi Histogram Age

Pada variabel Age, diperoleh nilai mean dan median yang berbeda. Jika mean lebih besar dari median, hal ini menunjukkan bahwa terdapat beberapa peserta dengan usia jauh lebih tinggi dibandingkan yang lain sehingga menarik rata-rata menjadi lebih besar. Kondisi ini biasanya menandakan bahwa distribusi usia cenderung **miring ke kanan (right-skewed). Sebaliknya, jika mean dan median berada pada posisi yang cukup dekat, maka usia responden cenderung merata atau mendekati distribusi normal.

Insight Distribusi Age cenderung tidak simetris Jika mean > median pada hasil kami, ini menunjukkan distribusi usia condong ke kanan, artinya ada beberapa peserta yang secara signifikan lebih tua dari mayoritas.

Histogram BMI dengan Garis Mean dan Median

# Hitung mean & median
mean_bmi <- mean(data$BMI, na.rm = TRUE)
median_bmi <- median(data$BMI, na.rm = TRUE)

# Buat histogram dulu untuk ambil max_y dari Plotly
h <- hist(data$BMI, breaks = "FD", plot = FALSE)
max_y <- max(h$counts)

# Histogram interaktif (binwidth = 1)
fig <- plot_ly(
  data = data,
  x = ~BMI,
  type = "histogram",
  xbins = list(size = 1),
  marker = list(color = "lightgreen",
                line = list(color = "black", width = 1))
)

# Garis Mean
fig <- fig %>%
  add_lines(
    x = c(mean_bmi, mean_bmi),
    y = c(0, max_y),
    line = list(color = "red", width = 3, dash = "dash"),
    name = "Mean"
  )

# Garis Median
fig <- fig %>%
  add_lines(
    x = c(median_bmi, median_bmi),
    y = c(0, max_y),
    line = list(color = "blue", width = 3, dash = "dot"),
    name = "Median"
  )

# Layout
fig <- fig %>%
  layout(
    title = "Histogram BMI (Red = Mean, Blue = Median)",
    xaxis = list(title = "BMI"),
    yaxis = list(title = "Frequency"),
    bargap = 0.05
  )

fig

Interpretasi Histogram BMI Hal yang sama juga terlihat pada variabel BMI, di mana mean dan median tidak selalu sama. Perbedaan antara keduanya memberi petunjuk bahwa terdapat peserta dengan BMI yang lebih tinggi atau lebih rendah dari rata-rata sehingga memengaruhi persebaran data. Histogram BMI memperlihatkan bagaimana data tersebut menyebar, apakah menumpuk di satu rentang tertentu atau justru tersebar lebih luas. Garis mean (merah) dan median (biru) pada histogram membantu memperjelas pola distribusi. Jika garis mean berada di sebelah kanan garis median, artinya distribusi data condong ke kanan. Sebaliknya, jika berada di sisi kiri, datanya condong ke kiri. Hasil visualisasi ini penting karena dapat membantu menentukan metode analisis lanjutan yang tepat, terutama jika data tidak berdistribusi normal.

Insight Variabilitas BMI cukup terlihat Perbedaan antara mean dan median BMI memberikan indikasi bahwa distribusi BMI mungkin tidak simetris penuh, menandakan adanya peserta dengan nilai BMI lebih tinggi yang dapat memengaruhi rata-rata.

4 Measures of Dispersion

Measures of Dispersion* atau ukuran penyebaran data adalah sekumpulan metode statistik yang digunakan untuk melihat seberapa jauh nilai–nilai dalam suatu dataset tersebar dari pusat data (misalnya mean atau median). Jika Measures of Central Tendency menggambarkan titik tengah data, maka Measures of Dispersion menunjukkan seberapa bervariasi data tersebut.

Ukuran penyebaran sangat penting karena dua dataset bisa saja memiliki nilai rata-rata yang sama, tetapi tingkat variasinya sangat berbeda. Dengan mengetahui penyebaran data, kita dapat memahami konsistensi data, mendeteksi outlier, dan menilai apakah data tersebut homogen atau tidak.

Beberapa ukuran penyebaran yang umum digunakan antara lain:

  • Range: selisih antara nilai maksimum dan minimum, menunjukkan rentang total data.
  • Variance (Varians): mengukur rata-rata kuadrat selisih setiap data terhadap mean.
  • Standard Deviation (Standar Deviasi): akar dari varians, menunjukkan besarnya penyimpangan data dari rata-rata dalam satuan asli.
  • Interquartile Range (IQR): selisih antara Q3 dan Q1, menggambarkan penyebaran data di bagian tengah (50% data), serta sangat berguna untuk mendeteksi outlier.

4.1 Measures of Dispersion Table

library(dplyr)

library(dplyr)
library(kableExtra)

# Fungsi untuk summary dispersion
dispersion_summary <- function(x) {
  tibble(
    Range  = max(x, na.rm = TRUE) - min(x, na.rm = TRUE),
    Variance = var(x, na.rm = TRUE),
    SD = sd(x, na.rm = TRUE),
    IQR = IQR(x, na.rm = TRUE)
  )
}

# Buat tabel untuk Age dan BMI dari dataset kamu
dispersion_table <- tibble(
  Variable = c("Age", "BMI")
) %>%
  bind_cols(
    bind_rows(
      dispersion_summary(data$Age),
      dispersion_summary(data$BMI)
    )
  )

# Tampilkan kable dengan judul
dispersion_table %>%
  kable("html", caption = "Measures of Dispersion for Age and BMI") %>%
  kable_styling(full_width = FALSE)
Measures of Dispersion for Age and BMI
Variable Range Variance SD IQR
Age 57.0 277.32615 16.653112 29.0
BMI 27.7 16.21474 4.026752 5.5
library(ggplot2)

Tabel Measures of Dispersion menunjukkan sebaran data Age dan BMI peserta. Usia relatif terkonsentrasi di sekitar rata-rata dengan Range = 57, SD = 16.65, dan IQR = 29, sehingga Age menjadi variabel paling konsisten. Sebaliknya, BMI memiliki penyebaran yang lebih sempit secara absolut, tetapi relatif lebih bervariasi dibanding distribusi normal dengan Range = 27.7, SD = 4.03, dan IQR = 5.5, menunjukkan adanya beberapa individu dengan BMI ekstrem.

Mayoritas peserta berada di usia menengah, sementara beberapa individu memiliki BMI yang sangat rendah atau tinggi. Variabilitas yang lebih besar pada BMI, meski SD lebih kecil daripada Age secara absolut, tetap menunjukkan perbedaan yang signifikan dari median, yang penting untuk menilai risiko kesehatan. Informasi ini membantu perusahaan asuransi mengidentifikasi kelompok peserta yang stabil dan kelompok berisiko tinggi, sehingga strategi underwriting dan penetapan premi bisa lebih tepat sasaran.

4.2 Boxplot Visualization Age

# ---------------------------
# 1. Boxplot Age
# ---------------------------
plot_ly(data, y = ~Age, type = "box",
        boxpoints = "outliers",
        marker = list(color = "#4E79A7")) %>%
  layout(
    title = "Interactive Boxplot of Age",
    yaxis = list(title = "Age")
  )

Interpretasi Boxplot Age

Boxplot interaktif dari variabel Age menunjukkan distribusi usia peserta dalam dataset. Garis tengah kotak merepresentasikan median usia, sedangkan kotak itu sendiri menampilkan rentang interquartile (50% data di tengah). Titik-titik di luar kotak menandakan outlier, yaitu peserta yang usianya jauh dari mayoritas.

Insight Dari visualisasi ini terlihat bahwa sebagian besar peserta berada pada rentang usia tertentu, sementara ada beberapa individu yang sangat muda atau sangat tua, yang bisa menjadi fokus analisis risiko atau strategi penawaran produk asuransi.

4.3 Boxplot Visualization BMI

library(plotly)

plot_ly(data, y = ~BMI, type = "box",
        boxpoints = "outliers",
        marker = list(color = "#59A14F")) %>%
  layout(
    title = "Interactive Boxplot of BMI",
    yaxis = list(title = "BMI")
  )

Interpretasi Boxplot BMI

Median BMI menunjukkan nilai tengah dari dataset, dan kotak mewakili rentang interquartile. Titik-titik outlier menandakan peserta dengan BMI yang sangat rendah atau sangat tinggi.

Insight

Mayoritas peserta memiliki BMI normal atau sedikit berlebih, namun ada beberapa individu dengan BMI yang sangat tinggi atau rendah, yang dapat menjadi fokus perhatian dalam penilaian risiko kesehatan atau klaim asuransi.

4.4 Scatterplot Visualization

# ---------------------------
# 3. Scatterplot Age vs BMI
# ---------------------------
library(plotly)

plot_ly(
  data,
  x = ~Age,
  y = ~BMI,
  type = "scatter",
  mode = "markers",
  marker = list(size = 6, opacity = 0.7)
) %>%
  layout(
    title = "Interactive Scatterplot of Age vs BMI",
    xaxis = list(title = "Age"),
    yaxis = list(title = "BMI")
  )

Interpretasi Scatterplot Age vs BMI

Scatterplot interaktif yang memvisualisasikan hubungan antara Age dan BMI menunjukkan bahwa tidak ada pola linear yang sangat kuat. Titik-titik menyebar, menunjukkan bahwa setiap kelompok usia memiliki variasi BMI yang berbeda. Beberapa tren ringan terlihat, seperti peserta yang lebih tua cenderung memiliki BMI sedikit lebih tinggi.”

Insight

Informasi ini membantu dalam segmentasi risiko, misalnya untuk menilai kelompok peserta yang lebih rentan terhadap masalah kesehatan terkait BMI atau untuk menyesuaikan produk asuransi berdasarkan usia dan kondisi tubuh.

5 Summary and Interpretation

Analisis data menunjukkan bahwa mayoritas peserta memiliki usia (Age) yang relatif konsisten, dengan sebagian besar berada pada rentang usia menengah. Nilai mean dan median Age cukup dekat, menunjukkan distribusi yang simetris, sementara outlier usia yang sangat muda atau sangat tua sedikit dan tidak terlalu memengaruhi keseluruhan data. Sebaliknya, BMI menunjukkan variasi yang lebih besar, dengan beberapa individu memiliki BMI sangat tinggi atau rendah. Hal ini terlihat dari range, SD, dan IQR yang lebih besar dibanding Age, menandakan penyebaran data yang lebih luas dan potensi outlier lebih signifikan.

Visualisasi interaktif mendukung temuan ini: Histogram Age dan Boxplot memperlihatkan konsentrasi mayoritas peserta di rentang tertentu, sedangkan Histogram BMI dan Boxplot BMI menyoroti adanya nilai ekstrem. Bar chart Insurance Plan mengungkap preferensi pelanggan terhadap jenis rencana tertentu, sementara Scatterplot Risk Score vs Claim Amount menunjukkan kecenderungan hubungan positif: semakin tinggi RiskScore, semakin besar kemungkinan ClaimAmount meningkat.

Secara keseluruhan, Age merupakan variabel yang paling konsisten, sedangkan BMI dan ClaimAmount menunjukkan variasi yang lebih besar. Visualisasi membantu mengidentifikasi pola, outlier, dan hubungan antar variabel, memberikan insight penting untuk strategi underwriting, penetapan premi, dan pengelolaan risiko di perusahaan asuransi.