Insurance Analysis with Probability

Yusril Ashar
9 min readMay 18, 2023

--

Latar Belakang

Asuransi kesehatan adalah salah satu hal yang patut diperhatikan karena bersangkutan dengan kebutuhan perencanaan masa depan. Pengguna asuransi kesehatan diwajibkan untuk membayar besaran uang secara rutin (premi) kepada pihak perusahaan asuransi. Premi tersebut diolah oleh perusahaan asuransi untuk membayarkan tagihan kesehatan pengguna
yang tertanggung. Penentuan nilai premi menjadi tantangan tersendiri bagi pihak asuransi mengingat ada banyak faktor yang dapat mempengaruhi & meningkatkan profil resiko pengguna. Oleh karena itu saya akan menganalisis variable-variabel yang memiliki hubungan dengan tagihan kesehatan yang diterima oleh setiap pengguna, dimana saya membagi menjadi 5 langkah analisis.

Langkah 1

Saya awali proses analisa ini dengan hal yang paling dasar, yakni merangkum karakter-karakter berdasarkan data seperti mencari rata-rata & persebaran data.

Rata-rata umur pengguna asuransi

df['age'].mean()

rata-rata umur dari pengguna asuransi yaitu 39.20 tahun, yang berarti sebagian besar pengguna asuransi berasal dari umur produktif dan sudah bekerja

Rata-rata tagihan perokok vs tidak perokok

df_mean_smoker = df.loc[df['smoker'] == 'yes', 'charges'].mean()
print('rata tagihan perokok adalah:', df_mean_smoker)

df_mean_non_smoker = df.loc[df['smoker'] == 'no', 'charges'].mean()
print('rata tagihan perokok adalah:', df_mean_non_smoker)

rata tagihan perokok adalah: 32050.23183153285
rata tagihan perokok adalah: 8434.268297856199

sementara dalam rata-rata tagihan antara pengguna perokok dan tidak merokok mempunyai jauh, dimana pengguna yang merokok mempunyai tagihan premi yang lebih tinggi dibandingkan tidak merokok. Terdapat kemungkinan bahwa perokok mempunyai resiko dan gangguan kesehatan yang lebih tinggi.

Variansi tagihan dalam perokok vs tidak merokok

df_var_smoker = df.loc[df['smoker'] == 'yes', 'charges'].var()
print('variansi tagihan perokok adalah:', df_var_smoker)

df_var_non_smoker = df.loc[df['smoker'] == 'no', 'charges'].var()
print('variansi tagihan perokok adalah:', df_var_non_smoker)

variansi tagihan perokok adalah: 133207311.20634921
variansi tagihan perokok adalah: 35925420.49611172

Varians tagihan perokok yang lebih besar dari varians tagihan bukan perokok menunjukkan bahwa tagihan perokok cenderung lebih bervariasi dan tersebar lebih jauh dari rata-rata dibandingkan dengan tagihan bukan perokok. Dengan kata lain, perokok cenderung memiliki tagihan yang lebih tinggi atau lebih rendah dari rata-rata secara signifikan, dibandingkan dengan bukan perokok.

BMI perokok vs non perokok

bmi_smoker = df.loc[df['smoker'] == 'yes', 'bmi'].mean()
print('rata-rata BMI perokok', bmi_smoker)

bmi_non_smoker = df.loc[df['smoker'] == 'no', 'bmi'].mean()
print('rata-rata BMI non perokok', bmi_non_smoker)

rata-rata BMI perokok 30.708448905109503
rata-rata BMI non perokok 30.651795112781922

Namun menariknya dari BMI antara perokok dan non-perokok ini hampir sama secara rata-rata, dimana dalam rentan 30 hanya berbeda 0.1 dengan non-perokok

BMI laki-laki dan perempuan

bmi_women = df.loc[df['sex'] == 'female', 'bmi'].mean()
print('rata-rata BMI perempuan:', bmi_women)

bmi_men = df.loc[df['sex'] == 'male', 'bmi'].mean()
print('rata-rata BMI laki-laki:', bmi_men)

rata-rata BMI perempuan: 30.377749244713023
rata-rata BMI laki-laki: 30.943128698224832

Hal yang sama jika kita lihat rata-rata BMI berdasarkan gender, laki-laki mempunyai rata-rata BMI sebesar 30.94, tidak jauh berbeda dengan perempuan dengan rata-rata 30.37

Langkah 2

Selanjutnya saya mengidentifikasi peluang kondisi tertentu yang berpotensi memiliki besaran tagihan kesehatan tertentu.

Berapa peluang seseorang tersebut adalah laki-laki diketahui dia adalah perokok?

n_smokers = (df['smoker'] == 'yes').sum()
n_total = len(df)
p_smoker = n_smokers / n_total

n_males = (df['sex'] == 'male').sum()
p_male = n_males / n_total

smokers_male = df.loc[(df['sex'] == 'male') & (df['smoker'] == 'yes')]
n_smokers_male = len(smokers_male)
p_smoker_given_male = n_smokers_male / n_males

p_male_given_smoker = (p_smoker_given_male * p_male) / p_smoker
print('Peluang seseorang adalah laki-laki diketahui dia adalah perokok:', p_male_given_smoker)

Peluang seseorang adalah laki-laki diketahui dia adalah perokok: 0.580291970802919

saya awali dengan peluang pengguna laki-laki yang merokok, karena sebagian perokok adalah laki-laki, dapat dilihat bahwa proporsi laki-laki yang merokok dalam analisis kali ini sebesar 0.580, angka yang cukup apabila sebesar 0.58 pengguna laki-laki merupakan perokok, namun bagaimana dengan perempuannya?

Berapa peluang seseorang tersebut adalah perempuan diketahui dia adalah perokok?

n_females = (df['sex'] == 'female').sum()
p_female = n_females / n_total

smokers_female = df.loc[(df['sex'] == 'female') & (df['smoker'] == 'yes')]
n_smokers_female = len(smokers_female)
p_smoker_given_female = n_smokers_female / n_females

p_female_given_smoker = (p_smoker_given_female * p_female) / p_smoker
print('Peluang seseorang adalah perempuan diketahui dia adalah perokok:', p_female_given_smoker)

Peluang seseorang adalah perempuan diketahui dia adalah perokok: 0.4197080291970803

sedangkan proposi pengguna perempuan yang merokok lebih sedikit dibandingkan laki-laki yaitu hanya sebesar 0.41, hal ini wajar karena tidak terlalu banyak perempuan yang merokok, karena perempuan lebih rentan secara fisik selain itu juga mempunyai resiko yang lebih besar apabila merokok jika sedang mengandung atau menyusui

Gender mana yang memiliki tagihan paling tinggi?

male_charges = df.loc[df['sex'] == 'male', 'charges'].sum()
female_charges = df.loc[df['sex'] == 'female', 'charges'].sum()

male_charges_avg = df.loc[df['sex'] == 'male', 'charges'].mean()
female_charges_avg = df.loc[df['sex'] == 'female', 'charges'].mean()

print('tagihan pengguna asuransi laki-laki sebesar', male_charges)
print('tagihan pengguna asuransi perempuan sebesar', female_charges)

print('tagihan pengguna asuransi laki-laki sebesar', male_charges_avg)
print('tagihan pengguna asuransi perempuan sebesar', female_charges_avg)

Apabila dijumlahkan, jumlah tagihan laki-laki lebih besar dibandingkan perempuan yaitu sebesar 9.434.76 dengan rata-rata 13.956, dibandingkan perempuan 8.321.061 dengan rata-rata sebesar 12.569. Hal ini mungkin terjadi karena dalam analisis sebelumnya bahwa laki-laki mempunyai probabilitas menjadi perokok yang tinggi dibandingkan perempuan.

Proporsi perokok dengan non perokok

n_smokers = (df['smoker'] == 'yes').sum()
n_non_smokers = (df['smoker'] == 'no').sum()
n_total = len(df)

p_smokers = n_smokers / n_total
p_non_smokers = n_non_smokers / n_total

print('proporsi pengguna perokok adalah', p_smokers)
print('proporsi pengguna non-perokok adalah', p_non_smokers)

proporsi pengguna perokok adalah 0.20478325859491778
proporsi pengguna non-perokok adalah 0.7952167414050823

jika kita lihat proporsi pengguna asuransi yang merokok masih jauh lebih rendah dibandingkan perokok yaitu hanya sebesar 0.204 atau 20,4% dari total pengguna asuransi.

Apakah setiap region memiliki proporsi data banyak orang yang sama?

Proporsi pengguna asuransi setiap region

Southeast menjadi region dengan pengguna asuransi terbanyak dengan proporsi 0.272048, namun region lain mempunyai proporsi yang hampir sama seperti nortwest dan southwest mempunyai proporsi pengguna sebesar 0.242900, selain itu norteast menjadi region dengan proporsi terkecil yaitu 0.2421

LANGKAH 3

Berbeda dengan langkah sebelumnya, dalam memahami kemungkinan kondisi variabel bernilai kontinu terhadap tagihan kesehatan, kita bisa melakukan analisa CDF pada data.

Mencari peluang besar tagihan berdasarkan BMI

charges = df['charges']
bmi = df['bmi']

mean = charges.mean()
var = charges.var()

from scipy.stats import norm

x = 0
std = np.sqrt(var)

P_1 = 1 - norm.cdf(x, mean, std)

print('Peluang tagihan:', P_1)

Peluang tagihan: 0.8634217605600918

peluang sebesar 0.86 tagihan berdasarkan BMI bisa diartikan bahwa BMI cukup mempengaruhi tingkat tagihan seseorang, dimana apabila BMI semakin tinggi, maka tagihan juga akan semakin tinggi.

Mencari kemungkin terjadi, seorang perokok dengan BMI diatas 25 akan mendapatkan tagihan kesehatan di atas 16.700

from scipy.stats import norm

x = 16700
std = np.sqrt(var)

# filter bmi greater than 25 and charges greater than x
bmi_filtered = bmi[(bmi > 25) & (charges > x)]
mean_filtered = charges[(bmi > 25) & (charges > x)].mean()
var_filtered = charges[(bmi > 25) & (charges > x)].var()

P_bmi_above_25 = 1 - norm.cdf(x, mean_filtered, np.sqrt(var_filtered))

print('Peluang tagihan di atas 16.700 untuk BMI di atas 25:', P_bmi_above_25)

Peluang tagihan di atas 16.700 untuk BMI di atas 25: 0.93470

peluang tagihan di atas 16.700 untuk orang-orang yang memiliki BMI di atas 25 adalah 0.9347. Dalam konteks masalah ini, peluang ini dapat diinterpretasikan sebagai tingkat risiko seseorang dalam membayar tagihan yang tinggi jika dia memiliki BMI di atas 25.

Berapa peluang seseorang acak tagihan kesehatannya diatas 16.7k diketahui dia adalah perokok

smoker = df['smoker']

x = 16700
std = np.sqrt(var)

# filter smokers
smoker_filtered = smoker[smoker == 'yes']
mean_filtered = charges[smoker == 'yes'].mean()
var_filtered = charges[smoker == 'yes'].var()

P_rokok = 1 - norm.cdf(x, mean_filtered, np.sqrt(var_filtered))

print('Peluang tagihan di atas 16.700 untuk pengguna asuransi yang merokok:', P_rokok)

Peluang tagihan di atas 16.700 untuk pengguna asuransi yang merokok: 0.9082404944909883

Sedangkan jika variabel BMI diganti menggunakan pengguna perokok atau tidak dapat dilihat bahwa probabilitas tingkat tagihan dari pengguna perokok yaitu sebesar 0.9082, dimana angka tersebut cukup tinggi bahwa pengguna yang merokok dapat mempunyai tagihan yang besar. Coba kita bandingkan dengan pengguna tidak merokok

Seseorang dengan BMI dibawah 25 mendapatkan tagihan kesehatan diatas 16.7k

# filter bmi greater than 25 and charges greater than x
bmi_filtered = bmi[(bmi < 25) & (charges > x)]
mean_filtered = charges[(bmi < 25) & (charges > x)].mean()
var_filtered = charges[(bmi < 25) & (charges > x)].var()

P_bmi_under_25 = 1 - norm.cdf(x, mean_filtered, np.sqrt(var_filtered))

print('Peluang tagihan di atas 16.700 untuk BMI di atas 25:', P_bmi_under_25)

Peluang tagihan di atas 16.700 untuk BMI di atas 25: 0.9207283261604335

sebelumnya kita sudah menganalisis bagaimana pengguna BMI > 25 dan tagihan diatas 16.700, selanjutnya kita menganalisis bagaimana jika BMI < 25, dan hasilnya tidak jauh berbeda dengan sebelumnya yaitu sebesar 0.92. Hal ini dapat disimpulkan bahwa memang BMI berpengaruh besar terhadap tagihan walaupun dibawah maupun diatas 25.

Seseorang perokok vs non-perokok dengan BMI diatas 25 mendapatkan tagihan kesehatan diatas 16.7k,

# filter BMI and smokers
bmi_filtered = bmi[bmi > 25]
smoker_filtered = smoker[smoker == 'yes']
mean_filtered = charges[(bmi > 25) & (smoker == 'yes')].mean()
var_filtered = charges[(bmi > 25) & (smoker == 'yes')].var()

P_tidak_rokok_bmi_above_25 = 1 - norm.cdf(x, mean_filtered, np.sqrt(var_filtered))

print('Peluang tagihan di atas 16.700 untuk pengguna asuransi yang merokok dan BMI di atas 25:', P_tidak_rokok_bmi_above_25)

Peluang tagihan di atas 16.700 untuk pengguna asuransi yang merokok dan BMI di atas 25: 0.9573559499024568

jika ditambahkan dengan kondisi BMI >25, maka probabilitas tingginya tagihan meningkat menjadi 0.957, dimana lebih besar dibandingkan hanya merokok atau BMI diatas 25. Namun bagaimana jika pengguna tersebut tidak merokok?

smoker_filtered = smoker[smoker == 'no']
mean_filtered = charges[(bmi > 25) & (smoker == 'no')].mean()
var_filtered = charges[(bmi > 25) & (smoker == 'no')].var()

P_tidak_rokok_bmi_above_25 = 1 - norm.cdf(x, mean_filtered, np.sqrt(var_filtered))

print('Peluang tagihan di atas 16.700 untuk pengguna asuransi yang tidak merokok dan BMI di atas 25:', P_tidak_rokok_bmi_above_25)

Peluang tagihan di atas 16.700 untuk pengguna asuransi yang tidak merokok dan BMI di atas 25: 0.09076840690505361

Bisa dilihat bahwa terjadi perubahan signifikan apabila pengguna tidak merokok dengan probabilitasnya hanya 0.09 jauh dibandingkan pengguna yang merokok.

LANGKAH 4

Analisa Korelasi Variabel

Setelah menjawab kondisi-kondisi yang lebih mungkin memiliki tagihan kesehatan yang tinggi dari langkah sebelumnya. Saya juga akan mencari keterhubungan antara kondisi-kondisi tersebut dengan tagihan kesehatan.

Grafik diatas merupakan korelasi dari beberapa variabel, dapat dilihat bahwa variabel antara charges dan smoker mempunyai korelasi yang kuat dibandingkan dengan antar variabel lain yaitu sebesar 0.787, disusul dengan age yaitu 0.299 dan BMI 0.198. Hal ini bisa terjadi kemungkinan pengguna yang merokok mempunyai charges yang lebih besar, selain itu umur yang semakin matang dan BMI yang tinggi juga dapat mempengaruhi charges. Namun hal ini perlu diteliti lebih lanjut menggunakan kausalitas dan test, tetapi untuk analisis ini saya hanya akan menggunakan z-test dalam pengujian.

LANGKAH 5

Langkah terakhir, saya akan mencari apakah ada bukti statistik yang cukup terhadap klaim atau hipotesis tentang tagihan kesehatan.

Tagihan kesehatan perokok lebih tinggi daripada tagihan kesehatan non perokok

from statsmodels.stats.weightstats import ztest

smoker_charges = df[df['smoker'] == 'yes']['charges']
non_smoker_charges = df[df['smoker'] == 'no']['charges']

z_score, p_value = ztest(x1=smoker_charges, x2=non_smoker_charges, alternative='larger')

print('Z-score:', z_score)
print('P-value:', p_value)

Z-score: 46.66492117272371
P-value: 0.0

Saya melakukan menggunakan uji Z-Test karena jumlah observasi lebih dari 30 observasi dari analisis asuransi ini. Hasil yang dihasilkan menunjukkan bahwa nilai Z-score adalah 46.66, yang berarti rata-rata biaya pengguna asuransi perokok jauh lebih tinggi daripada rata-rata biaya pengguna asuransi yang tidak merokok. Nilai P-value sangat kecil (<0,05), yang menunjukkan bahwa hipotesis nol (rata-rata biaya pengguna asuransi perokok sama dengan yang tidak perokok) ditolak pada tingkat signifikansi 0.05. Oleh karena itu, dapat menyimpulkan bahwa ada perbedaan yang signifikan antara rata-rata biaya pengguna asuransi perokok dan tidak perokok.

Tagihan kesehatan dengan BMI diatas 25 lebih tinggi daripada tagihan kesehatan dengan BMI dibawah 25

from statsmodels.stats.weightstats import ztest

bmi_above_25_charges = df[df['bmi'] > 25]['charges']
bmi_below_25_charges = df[df['bmi'] < 25]['charges']

z_score1, p_value1 = ztest(x1=bmi_above_25_charges, x2=bmi_below_25_charges, alternative='larger')

print('Z-score:', z_score1)
print('P-value:', p_value1)

Z-score: 4.305033989510502
P-value: 8.348004956755111e-06

Selanjutnya menguji perbedaan rata-rata tagihan (charges) antara kelompok yang memiliki BMI di atas 25 dan kelompok yang memiliki BMI di bawah 25. Nilai alternative di set sebagai ‘larger’ yang artinya akan mencari apakah rata-rata tagihan pada kelompok BMI di atas 25 lebih besar dari kelompok BMI di bawah 25.

Hasilnya menunjukkan bahwa Z-score adalah 4.305 dan P-value-nya sangat kecil, yaitu sekitar 8.348004956755111e-06 atau 0.000008348004956755111, yang artinya kita dapat menolak hipotesis nol bahwa rata-rata tagihan kelompok BMI di atas 25 sama dengan kelompok BMI di bawah 25 pada tingkat signifikansi yang ditetapkan. Dengan kata lain, terdapat perbedaan yang signifikan antara rata-rata tagihan pada kedua kelompok tersebut, dan rata-rata tagihan pada kelompok BMI di atas 25 lebih tinggi daripada kelompok BMI di bawah 25.

BMI laki-laki dan perempuan sama

from statsmodels.stats.weightstats import ztest

bmi_male = df[df['sex'] == 'male']['bmi']
bmi_female = df[df['sex'] == 'female']['bmi']

z_score2, p_value2 = ztest(x1=bmi_male, x2=bmi_female, alternative='larger')

print('Z-score:', z_score2)
print('P-value:', p_value2)

Z-score: 1.6967526357522242
P-value: 0.04487171839971956

Terakhir saya menganalsis apakah BMI laki-laki dan perempuan sama, dapat dilihat dari Z score dan P-value yang cukup untuk menyimpulkan bahwa BMI antara laki-laki dan perempuan berbeda.

Kesimpulan

Setelah saya menganalsis dari langkah 1 sampai 5, dapat disimpulkan bahwa tagihan premi pada pengguna asuransi dipengaruhi oleh berbagai kondisi dari setiap pengguna asuransi tersebut. Besaran BMI dan merokok tidaknya pengguna asuransi menjadi kondisi yang berkolerasi paling tinggi dan signifikan dengan tagihan. Namun perlu analsis lebih lanjut menggunakan analisis yang lebih mendalam dan akurat seperti regresi dan kausalitas untuk membuktikan apakah memang berpengaruh dengan tagihan.

Source:

--

--