Challenge

Project 2 - EDA on Vehicle Insurance Customer Data

import pandas as pd
import numpy as np
In [102]:
#importing customer_details.csv
df1=pd.read_csv('Week6/customer_details.csv')
df1
Out[102]:
0 1 2 3 4 5 6 7
0 1.0 Male 44.0 1.0 28.0 0.0 > 2 Years Yes
1 2.0 Male 76.0 1.0 3.0 0.0 1-2 Year No
2 3.0 Male 47.0 1.0 28.0 0.0 > 2 Years Yes
3 4.0 Male 21.0 1.0 11.0 1.0 < 1 Year No
4 5.0 Female 29.0 1.0 41.0 1.0 < 1 Year No
... ... ... ... ... ... ... ... ...
381104 381105.0 Male 74.0 1.0 26.0 1.0 1-2 Year No
381105 381106.0 Male 30.0 1.0 37.0 1.0 < 1 Year No
381106 381107.0 Male 21.0 1.0 30.0 1.0 < 1 Year No
381107 381108.0 Female 68.0 1.0 14.0 0.0 > 2 Years Yes
381108 381109.0 Male 46.0 1.0 29.0 0.0 1-2 Year No

381109 rows × 8 columns

In [103]:
df1.columns=['customer_id', 'Gender','age',  'driving_licence_present','region_code','previously_insured','vehicle_age','vehicle_damage']
In [104]:
df1
Out[104]:
customer_id Gender age driving_licence_present region_code previously_insured vehicle_age vehicle_damage
0 1.0 Male 44.0 1.0 28.0 0.0 > 2 Years Yes
1 2.0 Male 76.0 1.0 3.0 0.0 1-2 Year No
2 3.0 Male 47.0 1.0 28.0 0.0 > 2 Years Yes
3 4.0 Male 21.0 1.0 11.0 1.0 < 1 Year No
4 5.0 Female 29.0 1.0 41.0 1.0 < 1 Year No
... ... ... ... ... ... ... ... ...
381104 381105.0 Male 74.0 1.0 26.0 1.0 1-2 Year No
381105 381106.0 Male 30.0 1.0 37.0 1.0 < 1 Year No
381106 381107.0 Male 21.0 1.0 30.0 1.0 < 1 Year No
381107 381108.0 Female 68.0 1.0 14.0 0.0 > 2 Years Yes
381108 381109.0 Male 46.0 1.0 29.0 0.0 1-2 Year No

381109 rows × 8 columns

In [ ]:
#checking and cleaning data from customer_details.csv
In [ ]:
#Null values of columns
In [105]:
print('Null Values in Cusmoter_id:',df1['customer_id'].isna().sum())
Null Values in Cusmoter_id: 386
In [106]:
print('Null Values in Gender:',df1['Gender'].isna().sum())
Null Values in Gender: 368
In [107]:
print('Null Values in age:',df1['age'].isna().sum())
Null Values in age: 368
In [108]:
print('Null Values in driving_licence_present:',df1['driving_licence_present'].isna().sum())
Null Values in driving_licence_present: 393
In [109]:
print('Null Values in region_code:',df1['region_code'].isna().sum())
Null Values in region_code: 392
In [110]:
print('Null Values in previously_insured:',df1['previously_insured'].isna().sum())
Null Values in previously_insured: 381
In [111]:
print('Null Values in vehicle_age:',df1['vehicle_age'].isna().sum())
Null Values in vehicle_age: 381
In [112]:
print('Null Values in vehicle_damage:',df1['vehicle_damage'].isna().sum())
Null Values in vehicle_damage: 407
In [ ]:
#droping and filling null values
In [113]:
df1.dropna(subset='customer_id',inplace=True)
In [114]:
print('Null Values in Cusmoter_id after droping Null values:',df1['customer_id'].isna().sum())
Null Values in Cusmoter_id after droping Null values: 0
In [32]:
df1['Gender'].fillna(df1['Gender'].mode()[0],inplace=True)
In [33]:
print('Null Values in Gender after droping Null values:',df1['Gender'].isna().sum())
Null Values in Gender after droping Null values: 0
In [35]:
df1['age'].fillna(df1['age'].mean(),inplace=True)
In [36]:
print('Null Values in age after droping Null values:',df1['age'].isna().sum())
Null Values in age after droping Null values: 0
In [37]:
df1['driving_licence_present'].fillna(df1['driving_licence_present'].mode()[0],inplace=True)
In [38]:
print('Null Values in driving_licence_present after droping Null values:',df1['driving_licence_present'].isna().sum())
Null Values in driving_licence_present after droping Null values: 0
In [39]:
df1['region_code'].fillna(df1['region_code'].mode()[0],inplace=True)
In [40]:
print('Null Values in region_code after droping Null values:',df1['region_code'].isna().sum())
Null Values in region_code after droping Null values: 0
In [41]:
df1['previously_insured'].fillna(df1['previously_insured'].mode()[0],inplace=True)
In [42]:
print('Null Values in previously_insured after droping Null values:',df1['previously_insured'].isna().sum())
Null Values in previously_insured after droping Null values: 0
In [43]:
df1['vehicle_age'].fillna(df1['vehicle_age'].mode()[0],inplace=True)
In [44]:
print('Null Values in vehicle_age after droping Null values:',df1['vehicle_age'].isna().sum())
Null Values in vehicle_age after droping Null values: 0
In [45]:
df1['vehicle_damage'].fillna(df1['vehicle_damage'].mode()[0],inplace=True)
In [46]:
print('Null Values in vehicle_damage after droping Null values:',df1['vehicle_damage'].isna().sum())
Null Values in vehicle_damage after droping Null values: 0
In [47]:
df1.describe()
Out[47]:
customer_id age driving_licence_present region_code previously_insured
count 380723.000000 380723.000000 380723.000000 380723.000000 380723.000000
mean 190548.776244 38.822788 0.997870 26.391090 0.457800
std 110016.805160 15.504826 0.046105 13.223772 0.498217
min 1.000000 20.000000 0.000000 0.000000 0.000000
25% 95269.500000 25.000000 1.000000 15.000000 0.000000
50% 190543.000000 36.000000 1.000000 28.000000 0.000000
75% 285822.500000 49.000000 1.000000 35.000000 1.000000
max 381109.000000 85.000000 1.000000 52.000000 1.000000
In [ ]:
#outliners
In [49]:
Q1=df1.describe().loc["25%","age"]
Q3=df1.describe().loc["75%","age"]

IQR=Q3-Q1

print('Outliners in age:',df1.loc[df1["age"]<(Q1-IQR*1.5),"age"].count())
print('Outliners in age:',df1.loc[df1["age"]>(Q3+IQR*1.5),"age"].count())
Outliners in age: 0
Outliners in age: 0
In [50]:
Q1=df1.describe().loc["25%","region_code"]
Q3=df1.describe().loc["75%","region_code"]

IQR=Q3-Q1

print('Outliners in region_code:',df1.loc[df1["region_code"]<(Q1-IQR*1.5),"region_code"].count())
print('Outliners in region_code:',df1.loc[df1["region_code"]>(Q3+IQR*1.5),"region_code"].count())
Outliners in region_code: 0
Outliners in region_code: 0
In [ ]:
#Remove spaces
In [52]:
df1["Gender"]=df1["Gender"].str.strip()
df1["vehicle_age"]=df1["vehicle_age"].str.strip()
df1["vehicle_damage"]=df1["vehicle_damage"].str.strip()
In [ ]:
#case correction
In [53]:
df1["Gender"]=df1["Gender"].str.lower()
df1["vehicle_age"]=df1["vehicle_age"].str.lower()
df1["vehicle_damage"]=df1["vehicle_damage"].str.lower()
In [ ]:
#Convert nominal into dummies
In [65]:
dummies_gender=pd.get_dummies(df1["Gender"])
dummies_vehicle_age=pd.get_dummies(df1["vehicle_age"])
dummies_vehicle_damage=pd.get_dummies(df1["vehicle_damage"])
dummies_dlp=pd.get_dummies(df1["driving_licence_present"])
dummies_pi=pd.get_dummies(df1["previously_insured"])
In [ ]:
#Drop duplicates
In [67]:
print(df1.duplicated().sum())
0
In [ ]:
 
In [ ]:
 
In [ ]:
#importing customer_policy_details.csv
In [296]:
df2=pd.read_csv('Week6/customer_policy_details.csv')
df2
Out[296]:
0 1 2 3 4
0 1.0 40454.0 26.0 217.0 1.0
1 2.0 33536.0 26.0 183.0 0.0
2 3.0 38294.0 26.0 27.0 1.0
3 4.0 28619.0 152.0 203.0 0.0
4 5.0 27496.0 152.0 39.0 0.0
... ... ... ... ... ...
381104 381105.0 30170.0 26.0 88.0 0.0
381105 381106.0 40016.0 152.0 131.0 0.0
381106 381107.0 35118.0 160.0 161.0 0.0
381107 381108.0 44617.0 124.0 74.0 0.0
381108 381109.0 41777.0 26.0 237.0 0.0

381109 rows × 5 columns

In [298]:
df2.columns=['customer_id','annual_premium(Rs)','sales_channel_code','vintage','response']
In [299]:
df2
Out[299]:
customer_id annual_premium(Rs) sales_channel_code vintage response
0 1.0 40454.0 26.0 217.0 1.0
1 2.0 33536.0 26.0 183.0 0.0
2 3.0 38294.0 26.0 27.0 1.0
3 4.0 28619.0 152.0 203.0 0.0
4 5.0 27496.0 152.0 39.0 0.0
... ... ... ... ... ...
381104 381105.0 30170.0 26.0 88.0 0.0
381105 381106.0 40016.0 152.0 131.0 0.0
381106 381107.0 35118.0 160.0 161.0 0.0
381107 381108.0 44617.0 124.0 74.0 0.0
381108 381109.0 41777.0 26.0 237.0 0.0

381109 rows × 5 columns

In [ ]:
#checking and cleaning data from customer_details.csv
In [ ]:
#Null values of columns
In [300]:
print('Null Values in Cusmoter_id:',df2['customer_id'].isna().sum())
Null Values in Cusmoter_id: 387
In [301]:
print('Null Values in annual_premium(Rs):',df2['annual_premium(Rs)'].isna().sum())
Null Values in annual_premium(Rs): 346
In [302]:
print('Null Values in sales_channel_code:',df2['sales_channel_code'].isna().sum())
Null Values in sales_channel_code: 400
In [303]:
print('Null Values in vintage:',df2['vintage'].isna().sum())
Null Values in vintage: 388
In [304]:
print('Null Values in response:',df2['response'].isna().sum())
Null Values in response: 361
In [ ]:
#droping and filling null values
In [305]:
df2.dropna(subset='customer_id',inplace=True)
In [306]:
print('Null Values in Cusmoter_id after droping Null values:',df2['customer_id'].isna().sum())
Null Values in Cusmoter_id after droping Null values: 0
In [307]:
df2['annual_premium(Rs)'].fillna(df2['annual_premium(Rs)'].mean(),inplace=True)
In [308]:
print('Null Values in annual_premium(Rs) after droping Null values:',df2['annual_premium(Rs)'].isna().sum())
Null Values in annual_premium(Rs) after droping Null values: 0
In [309]:
df2['sales_channel_code'].fillna(df2['sales_channel_code'].mean,inplace=True)
In [310]:
print('Null Values in sales_channel_code after droping Null values:',df2['sales_channel_code'].isna().sum())
Null Values in sales_channel_code after droping Null values: 0
In [311]:
df2['vintage'].fillna(df2['vintage'].mean,inplace=True)
In [312]:
print('Null Values in vintage after droping Null values:',df2['vintage'].isna().sum())
Null Values in vintage after droping Null values: 0
In [313]:
df2['response'].fillna(df2['response'].mean,inplace=True)
In [314]:
print('Null Values in response after droping Null values:',df2['response'].isna().sum())
Null Values in response after droping Null values: 0
In [315]:
df2.describe()
Out[315]:
customer_id annual_premium(Rs)
count 380722.000000 380722.000000
mean 190547.491663 30563.999774
std 110013.824148 17190.147550
min 1.000000 2630.000000
25% 95276.250000 24416.000000
50% 190536.500000 31656.000000
75% 285818.750000 39391.750000
max 381109.000000 540165.000000
In [ ]:
#outliners
In [316]:
Q1=df2.describe().loc["25%","annual_premium(Rs)"]
Q3=df2.describe().loc["75%","annual_premium(Rs)"]

IQR=Q3-Q1

print('Outliners in annual_premium(Rs):',df2.loc[df2["annual_premium(Rs)"]<(Q1-IQR*1.5),"annual_premium(Rs)"].count())
print('Outliners in annual_premium(Rs):',df2.loc[df2["annual_premium(Rs)"]>(Q3+IQR*1.5),"annual_premium(Rs)"].count())
Outliners in annual_premium(Rs): 0
Outliners in annual_premium(Rs): 10332
In [330]:
mean=df2["annual_premium(Rs)"].mean()
In [352]:
mean
Out[352]:
30563.99977390893
In [332]:
df2.loc[df2["annual_premium(Rs)"]>(Q3+IQR*1.5),"annual_premium(Rs)"]=np.nan
In [333]:
df2.fillna(mean,inplace=True)
In [353]:
print('Outliners in annual_premium(Rs):',df2.loc[df2["annual_premium(Rs)"]>(Q3+IQR*1.5),"annual_premium(Rs)"].count())
Outliners in annual_premium(Rs): 0
In [335]:
df2['annual_premium(Rs)']
Out[335]:
0         40454.0
1         33536.0
2         38294.0
3         28619.0
4         27496.0
           ...   
381104    30170.0
381105    40016.0
381106    35118.0
381107    44617.0
381108    41777.0
Name: annual_premium(Rs), Length: 380722, dtype: float64
In [ ]:
# white space,case correction,creating dummies not because there is no nominal data
In [ ]:
#drop dupicates
In [336]:
print(df2.duplicated().sum())
0
In [ ]:
#Merging
In [337]:
master_data=pd.merge(df1,df2,on='customer_id')
In [338]:
master_data
Out[338]:
customer_id Gender age driving_licence_present region_code previously_insured vehicle_age vehicle_damage annual_premium(Rs) sales_channel_code vintage response
0 1.0 Male 44.0 1.0 28.0 0.0 > 2 Years Yes 40454.0 26.0 217.0 1.0
1 2.0 Male 76.0 1.0 3.0 0.0 1-2 Year No 33536.0 26.0 183.0 0.0
2 3.0 Male 47.0 1.0 28.0 0.0 > 2 Years Yes 38294.0 26.0 27.0 1.0
3 4.0 Male 21.0 1.0 11.0 1.0 < 1 Year No 28619.0 152.0 203.0 0.0
4 5.0 Female 29.0 1.0 41.0 1.0 < 1 Year No 27496.0 152.0 39.0 0.0
... ... ... ... ... ... ... ... ... ... ... ... ...
380331 381105.0 Male 74.0 1.0 26.0 1.0 1-2 Year No 30170.0 26.0 88.0 0.0
380332 381106.0 Male 30.0 1.0 37.0 1.0 < 1 Year No 40016.0 152.0 131.0 0.0
380333 381107.0 Male 21.0 1.0 30.0 1.0 < 1 Year No 35118.0 160.0 161.0 0.0
380334 381108.0 Female 68.0 1.0 14.0 0.0 > 2 Years Yes 44617.0 124.0 74.0 0.0
380335 381109.0 Male 46.0 1.0 29.0 0.0 1-2 Year No 41777.0 26.0 237.0 0.0

380336 rows × 12 columns

In [ ]:
#Gender wise average annual premium
In [341]:
gwap=master_data.groupby(["Gender"])["annual_premium(Rs)"].mean()
In [342]:
gwap
Out[342]:
Gender
Female    29273.474247
Male      29323.022594
Name: annual_premium(Rs), dtype: float64
In [ ]:
#Age wise average annual premium
In [345]:
awap=master_data.groupby(["age"])["annual_premium(Rs)"].mean()
In [346]:
awap
Out[346]:
age
20.0    26342.073517
21.0    29751.791916
22.0    29946.848634
23.0    29838.344763
24.0    30125.557096
            ...     
81.0    29287.910702
82.0    36480.586199
83.0    28995.818172
84.0    35440.818182
85.0    26637.454525
Name: annual_premium(Rs), Length: 66, dtype: float64
In [ ]:
#Is your data balanced between the genders?
In [347]:
master_data.groupby('Gender').count()
Out[347]:
customer_id age driving_licence_present region_code previously_insured vehicle_age vehicle_damage annual_premium(Rs) sales_channel_code vintage response
Gender
Female 174485 174332 174306 174330 174321 174309 174300 174485 174485 174485 174485
Male 205484 205272 205272 205250 205267 205279 205266 205484 205484 205484 205484
In [354]:
gwap=master_data.groupby(["Gender"])["annual_premium(Rs)"].mean()
In [355]:
gwap
Out[355]:
Gender
Female    29273.474247
Male      29323.022594
Name: annual_premium(Rs), dtype: float64
In [ ]:
#Vehicle age wise average annual premium
In [348]:
vwap=master_data.groupby(["vehicle_age"])["annual_premium(Rs)"].mean()
In [349]:
vwap
Out[349]:
vehicle_age
1-2 Year     29099.066738
< 1 Year     29188.150594
> 2 Years    32943.540830
Name: annual_premium(Rs), dtype: float64
In [ ]:
#relation between Person Age and annual premium
In [350]:
master_data['age'].corr(master_data["annual_premium(Rs)"])
Out[350]:
0.050679480061170575
In [351]:
master_data[['age','annual_premium(Rs)']].corr()
Out[351]:
age annual_premium(Rs)
age 1.000000 0.050679
annual_premium(Rs) 0.050679 1.000000
Your portfolio, next

Ship work like this
in your own course.

Talk to a career counsellor

Free 20-minute call. We'll map the right course to where you want to work.

By submitting you agree to our Terms and Privacy Policy.

Talk to a career counsellor

Free 20-minute call. We'll map the right course to where you want to work.

By submitting you agree to our Terms and Privacy Policy.