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 |