Memprediksikan Pemegang Polis Asuransi Kesehatan yang akan Tertarik dengan Asuransi Kendaraan

Nuraini Widyastuti
8 min readJan 15, 2021

--

Photo by Sarah Brown on Unsplash

Beberapa hari yang lalu saya dan teman saya berdiskusi tentang asuransi kesehatan. Seperti yang kita ketahui asuransi kesehatan tidak pernah lepas dari diri kita, hampir semua orang memiliki setidaknya satu asuransi kesehatan.

Polis asuransi adalah regulasi di mana perusahaan berjanji untuk memberikan jaminan kompensasi atas kerugian, kerusakan, penyakit, atau kematian tertentu dengan imbalan pembayaran premi tertentu. Premi adalah sejumlah uang yang harus dibayarkan pelanggan secara teratur kepada perusahaan asuransi untuk jaminan ini.

Misalnya, Anda dapat membayar premi sebesar Rp 500.000 setiap tahun untuk perlindungan asuransi kesehatan sebesar Rp 50.000.000 / — sehingga jika, amit-amit, anda jatuh sakit dan perlu dirawat di rumah sakit pada tahun tersebut, perusahaan penyedia asuransi akan menanggung biaya rawat inap dll sampai Rp 50.000.000. Sekarang jika Anda bertanya-tanya bagaimana perusahaan dapat menanggung biaya rawat inap yang begitu tinggi ketika membebankan premi hanya Rp 500.000 / -, di situlah konsep probabilitas muncul. Misalnya, seperti Anda, mungkin ada 100 pelanggan yang akan membayar premi sebesar Rp 500.000 setiap tahun, tetapi hanya sedikit dari mereka (katakanlah 2–3) yang akan dirawat di rumah sakit tahun itu. Dengan cara ini setiap orang berbagi risiko dengan orang lain.

Seperti halnya asuransi kesehatan, terdapat asuransi kendaraan dimana setiap tahun nasabah harus membayar premi dalam jumlah tertentu kepada perusahaan penyedia asuransi sehingga jika terjadi kecelakaan yang tidak diinginkan oleh kendaraan, perusahaan penyedia asuransi akan memberikan santunan (disebut ‘uang pertanggungan’ ) kepada pelanggan.

Membangun model untuk memprediksi apakah pelanggan akan tertarik dengan Asuransi Kendaraan sangat membantu perusahaan karena kemudian dapat merencanakan strategi komunikasinya untuk menjangkau pelanggan tersebut dan mengoptimalkan model bisnis dan pendapatannya.

Berikut adalah data train.csv yang berisi beberapa kolom data, data dapat diunduh di link berikut. (DOWNLOAD DATA)

Disini saya menggunakan python jupyter notebook. Sebelum melakukan analisis, mengimpor terlebih dahulu beberapa package library berikut.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
from matplotlib import rcParams
rcParams['figure.figsize'] = 12, 4
rcParams['lines.linewidth'] = 3
rcParams['xtick.labelsize'] = 'x-large'
rcParams['ytick.labelsize'] = 'x-large'

sama seperti analysis dengan python lainnya, disini masih diperlukan library numpy dan pandas untuk memasukkan data, mengubah string dan lain-lain.

Setelah mengimpor library, maka selanjutnya adalah mengimpor data train dengan script berikut.

train = pd.read_csv(‘train.csv’)
train
Data Train

Untuk mengecek isi dataset dapat dilakukan dengan function .info() setelah nama objek variabel seperti berikut.

train.info()
Info Data Train

Data Exploration

Selanjutnya adalah melakukan data exploration dengan targetnya yaitu “Response”. Untuk mengetahui ada berapa orang yang tertarik dan tidak tertarik dapat digunakan script berikut.

g = train['Response'].value_counts().reset_index()
g = g.rename(columns={'Response' : 'count', 'index' : 'Response'})
g['persentase'] = round((g['count']/train['Response'].count())*100,2)
display(g)
y = g['persentase']
sns.barplot(x='Response', y='count', data=g);
Persentase Response Tertarik dan Tidak Tertarik

Response 0 = Tidak Tertarik, sedangkan response 1 = Tertarik. Terdapat perbedaan persentase antara response 0 dengan response 1 dimana response 0 mencapai 87%. Dari sini dapat disimpulkan bahwa mayoritas customer tidak terlalu tertarik untuk mengasuransikan kendaraannya.

Selanjutnya adalah melihat persentase laki-laki dan perempuan dengan menggunakan script berikut.

gen = train.groupby(['Gender', 'Response'])['id'].count().to_frame().rename(columns={'id' : 'count'}).reset_index()fig, ax = plt.subplots(1,2, figsize=(15,5))
af = sns.countplot(x='Gender', data=train, ax = ax[0])
bf = sns.barplot(x='Gender', y='count', data = gen, hue='Response', ax= ax[1])
Perbandingan Laki-Laki dan Perempuan

Berdasarkan gambar di atas, mayoritas customer adalah laki-laki, namun variabel gender dalam dataset masih dapat dikatakan seimbang karena terdistribusi secara merata. Gender laki-laki yang tertarik terhadap Asuransi Kendaraan sedikit lebih tinggi jika dibandingkan gender perempuan.

Selanjutnya adalah melihat variabel usia untuk melihat klasifikasi berdasarkan umur dengan script berikut.

plt.figure(figsize=(10,8))
plt.subplots(1,1, figsize = (16,8))
age1 = sns.countplot(x = 'Age', data=train);
Diagram Batang Variabel Umur
plt.subplots(1,1, figsize = (5,5))
age2 = sns.boxplot(y = 'Age', data=train);
Boxplot Berdasarkan Variabel Usia

Dari hasil diagram batang diatas, maka akan terlihat bahwa mayoritas customer berusia 24 tahun. Customer usia 21–28 cukup mendominasi.

Dari boxplot juga terlihat bahwa tidak ditemukannya outlier, garis box menandakan bahwa rata-rata usia berada di antara 30–40 tahunan dengan range terbanyak di pertengahan 20 hingga menjelang 50 tahun an.

Selanjutnya adalah melihat variabel driving license

dr = train.groupby([‘Driving_License’, ‘Response’])[‘id’].count().reset_index()
display(dr)
Tabel Groupby DrivingLicense dan Response
figd,ax = plt.subplots(1, 2, figsize = (15,5))
axdr1 = sns.countplot(x='Driving_License', data=train, ax=ax[0])
axdr2 = sns.barplot(x='Driving_License', y ='id', hue='Response', data = dr, ax = ax[1])
Grafik Groupby DrivingLicense dan Response

Driving Licence 0 = Tidak Memiliki Driving License, Driving License 1 = Memiliki Driving License.

Dari hasil di atas, maka akan terlihat jumlah berdasarkan Driving License dan Response. Terdapat lebih dari 99 % customer memiliki Driving License sehingga dapat diasumsikan bahwa semuanya sudah memiliki driving license, terlihat dari grafik diagram batang pertama dengan Driving License=1 jauh lebih banyak dari Driving License = 0. Customer yang memiliki driving license cenderung berminat untuk mengasuransikan kendaraannya. Hal ini nampak dari diagram batang kedua dimana pada driving license = 1, warna biru yang mewakili response = 0 jauh lebih tinggi dibandingkan response = 0.

Selanjutnya adalah melihat variabel Region Code untuk melihat klasifikasi berdasarkan variabel region code dengan script berikut.

plt.subplots(1,1, figsize = (20,13))
figreg1 = sns.countplot(y='Region_Code', data=train)
Diagram Batang Variabel Region Code

Pada hasil diatas, amak akan terlihat ada region code dari 0 hingga 52. Jumlah customer pada region 28 jauh lebih banyak dibandingkan region lainnya karena menunjukkan hasil mencapai lebih dari 100000

plt.subplots(1,1, figsize = (5,6))
figreg2 = sns.boxplot(y='Region_Code', data=train)
Boxplot Berdasarkan Region Code

Selanjutnya adalah melihat variabel Asuransi Sebelumnya untuk melihat klasifikasi berdasarkan variabel Asuransi Sebelumnya dengan script berikut.

fig, ax = plt.subplots(1,2, figsize=(15,5))
figpi1 = sns.countplot(x='Previously_Insured', data=train, ax = ax[0])
pi = train.groupby(['Previously_Insured', 'Response'])['id'].count().to_frame().rename(columns={'id': 'count'}).reset_index()
figpi2 = sns.barplot(x='Previously_Insured', y = 'count', hue='Response', data= pi, ax = ax[1])
display(pi)
Tabel dan Grafik Berdasarkan Asuransi Sebelumnya

Previously Insured 0 = Sudah Punya Asurasi Kendaraan, Previously Insured 1= Belum Punya Asurasi Kendaraan.

Berdasarkan hasil diatas, maka akan terlihat customer yang sebelumnya sudah memiliki asuransi kendaraan dan yang belum hampir sama jumlahnya (grafik diagram batang sebelah kiri). Customer yang sebelumnya sudah memiliki asuransi kendaraan cenderung tidak berminat untuk mengasuransikan kendaraannya lagi, sedangkan customer yang belum memiliki asuransi kendaraan masih ada kemungkinan berminat membeli polis asuransi kendaraan.

Selanjutnya adalah melihat variabel Usia Kendaraan untuk melihat klasifikasi berdasarkan variabel Usia Kendaraan dengan script berikut.

fig, ax = plt.subplots(1,2, figsize=(15,5))
figva1 = sns.countplot(x='Vehicle_Age', data=train, ax = ax[0])
pi = train.groupby(['Vehicle_Age', 'Response'])['id'].count().to_frame().rename(columns={'id': 'count'}).reset_index()
figva2 = sns.barplot(x='Vehicle_Age', y = 'count', hue='Response', data= pi, ax = ax[1])
display(pi)
Tabel dan Grafik Berdasarkan Usia Kendaraan

Usia kendaraan dibedakan menjadi 3 kelompok yaitu < 1 tahun, 1–2 tahun, dan > 2 tahun.

Berdasarkan hasil diatas, maka dapat diketahui bahwa customer dengan usia kendaraan lebih dari 2 tahun jauh lebih sedikit dibandingkan 2 kelompok lainnya. Customer dengan usia kendaraan 1–2 tahun cenderung lebih tertarik dengan asuransi kendaraan dibandingkan 2 kelompok lainnya.

Selanjutnya adalah melihat variabel Kerusakan Kendaraan untuk melihat berapa banyak kendaraan customer yang mengalami kerusakan sebelumnya dengan script berikut.

fig, ax = plt.subplots(1,2, figsize=(15,5))
figvd1 = sns.countplot(x='Vehicle_Damage', data=train, ax = ax[0])
pi = train.groupby(['Vehicle_Damage', 'Response'])['id'].count().to_frame().rename(columns={'id': 'count'}).reset_index()
figvd2 = sns.barplot(x='Vehicle_Damage', y = 'count', hue='Response', data= pi, ax = ax[1])
display(pi)
Tabel dan Grafik Berdasarkan Kerusakan Kendaraan

Kerusakan Kendaraan dibedakan menjadi 2 yaitu Yes apabila pernah mengalami kerusakan kendaraan dan No jika belum pernah mengalami kerusakan kendaraan.

Berdasarkan hasil diatas, maka dapat diketahui bahwa customer dengan kendaraan pernah rusak dan tidak pernah rusak relatif seimbang namun customer dengan kendaraan pernah rusak sedikit lebih banyak dibandingkan yang belum pernah. Pada grafik kedua akan terlihat bahwa customer yang pernah mengalami kerusakan pada kendaraannya lebih berminat dengan asuransi kesehatan dibandingkan customer yang belum pernah.

Selanjutnya adalah melihat premi tahunan yaitu jumlah biaya yang harus dibayarkan oleh customer sebagai premi pada tahun tersebut dengan menggunakan script berikut.

Grafik Histogram dan Boxplot Premi Tahunan

Berdasarkan histogram, maka akan terlihat bahwa premi tahunan berdistribusi positively skewed karena sebagian besar value nya berkerumun disekitar left -tail yaitu 0–100000. Pada boxplot juga menunjukkan banyaknya outlier diluar batas boxplot yaitu 100000–500000. Hal ini menunjukkan bahwa premi tahunan cukup beragam dari 0- 500000, namun mayoritas berada di kisaran 0–100000.

Selanjutnya adalah melihat Policy Sales Channel yaitu kode anonim untuk saluran penjangkauan ke pelanggan seperti melalui Surat, telepon, tatap muka, dll.

fig, ax = plt.subplots(1,2, figsize = (20,4))
figap1 = sns.distplot(train['Policy_Sales_Channel'], ax = ax[0])
#plt.subplots(1,1, figsize=(10,4))
figap2 = sns.boxplot(x='Policy_Sales_Channel', data=train, ax = ax[1])
Grafik Histogram dan Boxplot Policy Sales Channel

Selanjutnya adalah melihat Vintage Number of Days yaitu jumlah hari, customer telah terkait dengan perusahaan.

fig, ax = plt.subplots(1,2, figsize = (20,4))
figap1 = sns.distplot(train['Vintage'], ax = ax[0])
#plt.subplots(1,1, figsize=(10,4))
figap2 = sns.boxplot(x='Vintage', data=train, ax = ax[1])
Grafik Histogram dan Boxplot Vintage Number of Days

Berdasarkan hasil tersebut, maka akan terlihat bahwa lama customer telah bergabung dengan perusahaan cukup beragam dari 0–300 hari dan tersebar cukup merata terlihat dari bentuk histogram yang cenderung seimbang. Dari boxplot juga dapat dilihat rata-rata lama customer bergabung dengan perusahaan adalah 150 an hari.

Exploratory Data Analysis (EDA)

Selanjutnya adalah memisahkan feature numerik dan kategori.

nums = ['Age', 'Driving_License', 'Region_Code','Previously_Insured','Annual_Premium','Policy_Sales_Channel',
'Vintage','Response']
cats = ['Gender','Vehicle_Age','Vehicle_Damage']

nums merupakan numerik, sedangkan cats adalah kategori.

Setelah dikelompokkan antara data numerik dan kategori, selanjutnya adalah melihat statistical summary dari numerik dan kategori tersebut.

train[nums].describe()
Statistical Summary (Numerik)

Dari hasil diatas, maka dapat diketahui beberapa informasi secara umum dari customer yaitu
- rata-rata usia customer adalah 39 tahun
- hampir semua customer memiliki driving license karena mean menunjukkan 0.99
- rata-rata premi tahunan customer adalah 30564
- lama waktu customer memiliki asuransi di perusahaan yaitu 10 sampai 299 hari
- rata-rata hari customer bergabung dengan polis asuransi ini adalah 154 hari

train[cats].describe()
Statistical Summary (Kategorik)

Selanjutnya adalah melakukan penghitungan berapa banyak customer pada masing-masing kategori.

for col in cats:
print(f'''Value count kolom {col}:''')
print(train[col].value_counts())
print()
Jumlah Penghitungan Masing — Masing Kelompok Kategori

Dari hasil diatas maka dapat diketahui bahwa gender terbanyak adalah customer laki-laki, mayoritas usia kendaraan customer adalah 1–2 tahun, dan umumnya pernah mengalami kerusakan pada kendaraannya.

--

--