Project 2 - EDA on Vehicle Insurance Customer Data
import pandas as pd
customer_detail_df=pd.read_csv("D:\\customer_details.txt")
# ' .\ ' represent the current directory
customer_detail_df
customer_detail_df.columns=["customer_id","Gender","age","driving licence present","region code","previously insured","vehicle age","vehicle damage"]
customer_detail_df
| customer_id | Gender | age | driving licence present | region code | previously insured | vehicle age | vehicle damage | |
|---|---|---|---|---|---|---|---|---|
| 0 | 100012 | M | 45 | yes | AP39 | yes | 5 | Headlight |
| 1 | 100025 | F | 25 | yes | AP04 | yes | 2 | brakes |
| 2 | 100041 | F | 35 | NaN | AP03 | No | 8 | NaN |
| 3 | 100045 | M | 20 | yes | AP02 | No | 2 | NaN |
customer_policy_detail_df=pd.read_csv("D:\\customer_policy_details.txt")
customer_policy_detail_df
customer_policy_detail_df.columns=["customer_id","annual premium (in Rs)","sales channel code","vintage","response"]
customer_policy_detail_df
| customer_id | annual premium (in Rs) | sales channel code | vintage | response | |
|---|---|---|---|---|---|
| 0 | 100012 | 25000 | 201 | 1 | yes |
| 1 | 100025 | 20000 | 202 | 0 | no |
| 2 | 100035 | 15000 | 203 | 1 | no |
| 3 | 100042 | 30000 | 204 | 0 | yes |
# EDA on vehicle insurance
customer_detail_df.shape
print("Null value in 'customer_id' : ",customer_detail_df["customer_id"].isnull().sum())
customer_detail_df=customer_detail_df.dropna(subset=["customer_id"])
print("Null value in 'customer_id' after droping : ",customer_detail_df["customer_id"].isnull().sum())
print("Null value in 'Gender' : ",customer_detail_df["Gender"].isnull().sum())
customer_detail_df["Gender"]=customer_detail_df["Gender"].fillna(customer_detail_df["Gender"].mode()[0])
print("Null value in 'Gender' after replacing : ",customer_detail_df["Gender"].isnull().sum())
print("Null value in 'age' : ",customer_detail_df["age"].isnull().sum())
customer_detail_df["age"]=customer_detail_df["age"].fillna(customer_detail_df["age"].mean())
print("Null value in 'age' after replacing : ",customer_detail_df["age"].isnull().sum())
print("Null value in 'driving licence present' : ",customer_detail_df["driving licence present"].isnull().sum())
customer_detail_df["driving licence present"]=customer_detail_df["driving licence present"].fillna(customer_detail_df["driving licence present"].mode()[0])
print("Null value in 'driving licence present' after replacing : ",customer_detail_df["driving licence present"].isnull().sum())
print("Null value in 'region code' : ",customer_detail_df["region code"].isnull().sum())
customer_detail_df["region code"]=customer_detail_df["region code"].fillna(customer_detail_df["region code"].mode()[0])
print("Null value in 'region code' after replacing : ",customer_detail_df["region code"].isnull().sum())
print("Null value in 'previously insured' : ",customer_detail_df["previously insured"].isnull().sum())
customer_detail_df["previously insured"]=customer_detail_df["previously insured"].fillna(customer_detail_df["previously insured"].mode()[0])
print("Null value in 'previously insured' after replacing : ",customer_detail_df["previously insured"].isnull().sum())
print("Null value in 'vehicle age' : ",customer_detail_df["vehicle age"].isnull().sum())
customer_detail_df["vehicle age"]=customer_detail_df["vehicle age"].fillna(customer_detail_df["vehicle age"].mode()[0])
print("Null value in 'vehicle age' after replacing : ",customer_detail_df["vehicle age"].isnull().sum())
print("Null value in 'vehicle damage' : ",customer_detail_df["vehicle damage"].isnull().sum())
customer_detail_df["vehicle damage"]=customer_detail_df["vehicle damage"].fillna(customer_detail_df["vehicle damage"].mode()[0])
print("Null value in 'vehicle damage' after replacing : ",customer_detail_df["vehicle damage"].isnull().sum())
## Null values for customer_policy_detail
print("Null value in 'customer_id' : ",customer_policy_detail_df["customer_id"].isnull().sum())
customer_policy_detail_df=customer_policy_detail_df.dropna(subset=["customer_id"])
print("Null value in 'customer_id' after droping : ",customer_policy_detail_df["customer_id"].isnull().sum())
print("Null value in 'annual premium (in Rs)' : ",customer_policy_detail_df["annual premium (in Rs)"].isnull().sum())
customer_policy_detail_df["annual premium (in Rs)"]=customer_policy_detail_df["annual premium (in Rs)"].fillna(customer_policy_detail_df["annual premium (in Rs)"].mean())
print("Null value in 'annual premium (in Rs)' after replacing : ",customer_policy_detail_df["annual premium (in Rs)"].isnull().sum())
print("Null value in 'sales channel code' : ",customer_policy_detail_df["sales channel code"].isnull().sum())
customer_policy_detail_df["sales channel code"]=customer_policy_detail_df["sales channel code"].fillna(customer_policy_detail_df["sales channel code"].mode()[0])
print("Null value in 'sales channel code' after replacing : ",customer_policy_detail_df["sales channel code"].isnull().sum())
print("Null value in 'vintage' : ",customer_policy_detail_df["vintage"].isnull().sum())
customer_policy_detail_df["vintage"]=customer_policy_detail_df["vintage"].fillna(customer_policy_detail_df["vintage"].mean())
print("Null value in 'vintage' after replacing : ",customer_policy_detail_df["vintage"].isnull().sum())
print("Null value in 'response' : ",customer_policy_detail_df["response"].isnull().sum())
customer_policy_detail_df["response"]=customer_policy_detail_df["response"].fillna(customer_policy_detail_df["response"].mode()[0])
print("Null value in 'response' after replacing : ",customer_policy_detail_df["response"].isnull().sum())
Null value in 'customer_id' : 0 Null value in 'customer_id' after droping : 0 Null value in 'Gender' : 0 Null value in 'Gender' after replacing : 0 Null value in 'age' : 0 Null value in 'age' after replacing : 0 Null value in 'driving licence present' : 0 Null value in 'driving licence present' after replacing : 0 Null value in 'region code' : 0 Null value in 'region code' after replacing : 0 Null value in 'previously insured' : 0 Null value in 'previously insured' after replacing : 0 Null value in 'vehicle age' : 0 Null value in 'vehicle age' after replacing : 0 Null value in 'vehicle damage' : 0 Null value in 'vehicle damage' after replacing : 0 Null value in 'customer_id' : 0 Null value in 'customer_id' after droping : 0 Null value in 'annual premium (in Rs)' : 0 Null value in 'annual premium (in Rs)' after replacing : 0 Null value in 'sales channel code' : 0 Null value in 'sales channel code' after replacing : 0 Null value in 'vintage' : 0 Null value in 'vintage' after replacing : 0 Null value in 'response' : 0 Null value in 'response' after replacing : 0
## Outliers
customer_detail_df.describe()
customer_policy_detail_df.describe()
Q1=customer_detail_df.describe().loc["25%","age"]
Q3=customer_detail_df.describe().loc["75%","age"]
IQR=Q3-Q1
print(customer_detail_df.loc[customer_detail_df["age"]<(Q1-IQR*1.5),"age"].count())
print(customer_detail_df.loc[customer_detail_df["age"]>(Q3+IQR*1.5),"age"].count())
##### there are no outliers in 'age' column
Q1=customer_policy_detail_df.describe().loc["25%","annual premium (in Rs)"]
Q3=customer_policy_detail_df.describe().loc["75%","annual premium (in Rs)"]
IQR=Q3-Q1
print(customer_policy_detail_df.loc[customer_policy_detail_df["annual premium (in Rs)"]<(Q1-IQR*1.5),"annual premium (in Rs)"].count())
print(customer_policy_detail_df.loc[customer_policy_detail_df["annual premium (in Rs)"]>(Q3+IQR*1.5),"annual premium (in Rs)"].count())
customer_policy_detail_df.loc[customer_policy_detail_df["annual premium (in Rs)"]>(Q3+IQR*1.5),"annual premium (in Rs)"]=customer_policy_detail_df["annual premium (in Rs)"].mean()
print(customer_policy_detail_df.loc[customer_policy_detail_df["annual premium (in Rs)"]>(Q3+IQR*1.5),"annual premium (in Rs)"].count())
Q1=customer_policy_detail_df.describe().loc["25%","vintage"]
Q3=customer_policy_detail_df.describe().loc["75%","vintage"]
IQR=Q3-Q1
print(customer_policy_detail_df.loc[customer_policy_detail_df["vintage"]<(Q1-IQR*1.5),"vintage"].count())
print(customer_policy_detail_df.loc[customer_policy_detail_df["vintage"]>(Q3+IQR*1.5),"vintage"].count())
##### there are no outliers in 'vintage' column
0 0 0 0 0 0 0
##### there are no outliers in 'vintage' column
### White spaces
customer_detail_df["Gender"]=customer_detail_df["Gender"].str.strip()
#customer_detail_df["vehicle age"]=customer_detail_df["vehicle age"].str.strip()
customer_detail_df["vehicle damage"]=customer_detail_df["vehicle damage"].str.strip()
### case change
customer_detail_df["Gender"]=customer_detail_df["Gender"].str.lower()
#customer_detail_df["vehicle age"]=customer_detail_df["vehicle age"].str.lower()
customer_detail_df["vehicle damage"]=customer_detail_df["vehicle damage"].str.lower()
### creating dummies
dummies_gender=pd.get_dummies(customer_detail_df["Gender"])
dummies_vehicle_age=pd.get_dummies(customer_detail_df["vehicle age"])
dummies_vehicle_damage=pd.get_dummies(customer_detail_df["vehicle damage"])
dummies_d_l_p=pd.get_dummies(customer_detail_df["driving licence present"])
dummies_p_i=pd.get_dummies(customer_detail_df["previously insured"])
dummies_response=pd.get_dummies(customer_policy_detail_df["response"])
### checking for any duplicates
print(customer_detail_df.duplicated().sum())
print(customer_policy_detail_df.duplicated().sum())
0 0
### 3. Create a Master table for future use. Join the customer table and customer_policy table to get a master table using customer_id in both tables.
master_df=pd.merge(customer_detail_df,customer_policy_detail_df,on='customer_id')
master_df=pd.merge(customer_detail_df,customer_policy_detail_df,on='customer_id')
master_df
| customer_id | Gender | age | driving licence present | region code | previously insured | vehicle age | vehicle damage | annual premium (in Rs) | sales channel code | vintage | response | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 100012 | m | 45 | yes | AP39 | yes | 5 | headlight | 25000 | 201 | 1 | yes |
| 1 | 100025 | f | 25 | yes | AP04 | yes | 2 | brakes | 20000 | 202 | 0 | no |
### 4. Company needs some important information from the master table to make decisions for future growth.They needs following information:
##### i. Gender wise average annual premium
##### ii. Age wise average annual premium
##### iii. Is your data balanced between the genders?
##### iv. Vehicle age wise average annual premium.
#Gender wise average annual premium
aap_gender_df=master_df.groupby(["Gender"])["annual premium (in Rs)"].mean()
aap_gender_df
import pandas as pd
customer_detail_df=pd.read_csv("D:\\customer_details.txt")
# ' .\ ' represent the current directory
customer_detail_df
customer_detail_df.columns=["customer_id","Gender","age","driving licence present","region code","previously insured","vehicle age","vehicle damage"]
customer_detail_df
| customer_id | Gender | age | driving licence present | region code | previously insured | vehicle age | vehicle damage | |
|---|---|---|---|---|---|---|---|---|
| 0 | 100012 | M | 45 | yes | AP39 | yes | 5 | Headlight |
| 1 | 100025 | F | 25 | yes | AP04 | yes | 2 | brakes |
| 2 | 100041 | F | 35 | NaN | AP03 | No | 8 | NaN |
| 3 | 100045 | M | 20 | yes | AP02 | No | 2 | NaN |
customer_policy_detail_df=pd.read_csv("D:\\customer_policy_details.txt")
customer_policy_detail_df
customer_policy_detail_df.columns=["customer_id","annual premium (in Rs)","sales channel code","vintage","response"]
customer_policy_detail_df
| customer_id | annual premium (in Rs) | sales channel code | vintage | response | |
|---|---|---|---|---|---|
| 0 | 100012 | 25000 | 201 | 1 | yes |
| 1 | 100025 | 20000 | 202 | 0 | no |
| 2 | 100035 | 15000 | 203 | 1 | no |
| 3 | 100042 | 30000 | 204 | 0 | yes |
customer_detail_df.shape
print("Null value in 'customer_id' : ",customer_detail_df["customer_id"].isnull().sum())
customer_detail_df=customer_detail_df.dropna(subset=["customer_id"])
print("Null value in 'customer_id' after droping : ",customer_detail_df["customer_id"].isnull().sum())
print("Null value in 'Gender' : ",customer_detail_df["Gender"].isnull().sum())
customer_detail_df["Gender"]=customer_detail_df["Gender"].fillna(customer_detail_df["Gender"].mode()[0])
print("Null value in 'Gender' after replacing : ",customer_detail_df["Gender"].isnull().sum())
print("Null value in 'age' : ",customer_detail_df["age"].isnull().sum())
customer_detail_df["age"]=customer_detail_df["age"].fillna(customer_detail_df["age"].mean())
print("Null value in 'age' after replacing : ",customer_detail_df["age"].isnull().sum())
print("Null value in 'driving licence present' : ",customer_detail_df["driving licence present"].isnull().sum())
customer_detail_df["driving licence present"]=customer_detail_df["driving licence present"].fillna(customer_detail_df["driving licence present"].mode()[0])
print("Null value in 'driving licence present' after replacing : ",customer_detail_df["driving licence present"].isnull().sum())
print("Null value in 'region code' : ",customer_detail_df["region code"].isnull().sum())
customer_detail_df["region code"]=customer_detail_df["region code"].fillna(customer_detail_df["region code"].mode()[0])
print("Null value in 'region code' after replacing : ",customer_detail_df["region code"].isnull().sum())
print("Null value in 'previously insured' : ",customer_detail_df["previously insured"].isnull().sum())
customer_detail_df["previously insured"]=customer_detail_df["previously insured"].fillna(customer_detail_df["previously insured"].mode()[0])
print("Null value in 'previously insured' after replacing : ",customer_detail_df["previously insured"].isnull().sum())
print("Null value in 'vehicle age' : ",customer_detail_df["vehicle age"].isnull().sum())
customer_detail_df["vehicle age"]=customer_detail_df["vehicle age"].fillna(customer_detail_df["vehicle age"].mode()[0])
print("Null value in 'vehicle age' after replacing : ",customer_detail_df["vehicle age"].isnull().sum())
print("Null value in 'vehicle damage' : ",customer_detail_df["vehicle damage"].isnull().sum())
customer_detail_df["vehicle damage"]=customer_detail_df["vehicle damage"].fillna(customer_detail_df["vehicle damage"].mode()[0])
print("Null value in 'vehicle damage' after replacing : ",customer_detail_df["vehicle damage"].isnull().sum())
## Null values for customer_policy_detail
print("Null value in 'customer_id' : ",customer_policy_detail_df["customer_id"].isnull().sum())
customer_policy_detail_df=customer_policy_detail_df.dropna(subset=["customer_id"])
print("Null value in 'customer_id' after droping : ",customer_policy_detail_df["customer_id"].isnull().sum())
print("Null value in 'annual premium (in Rs)' : ",customer_policy_detail_df["annual premium (in Rs)"].isnull().sum())
customer_policy_detail_df["annual premium (in Rs)"]=customer_policy_detail_df["annual premium (in Rs)"].fillna(customer_policy_detail_df["annual premium (in Rs)"].mean())
print("Null value in 'annual premium (in Rs)' after replacing : ",customer_policy_detail_df["annual premium (in Rs)"].isnull().sum())
print("Null value in 'sales channel code' : ",customer_policy_detail_df["sales channel code"].isnull().sum())
customer_policy_detail_df["sales channel code"]=customer_policy_detail_df["sales channel code"].fillna(customer_policy_detail_df["sales channel code"].mode()[0])
print("Null value in 'sales channel code' after replacing : ",customer_policy_detail_df["sales channel code"].isnull().sum())
print("Null value in 'vintage' : ",customer_policy_detail_df["vintage"].isnull().sum())
customer_policy_detail_df["vintage"]=customer_policy_detail_df["vintage"].fillna(customer_policy_detail_df["vintage"].mean())
print("Null value in 'vintage' after replacing : ",customer_policy_detail_df["vintage"].isnull().sum())
print("Null value in 'response' : ",customer_policy_detail_df["response"].isnull().sum())
customer_policy_detail_df["response"]=customer_policy_detail_df["response"].fillna(customer_policy_detail_df["response"].mode()[0])
print("Null value in 'response' after replacing : ",customer_policy_detail_df["response"].isnull().sum())
Null value in 'customer_id' : 0 Null value in 'customer_id' after droping : 0 Null value in 'Gender' : 0 Null value in 'Gender' after replacing : 0 Null value in 'age' : 0 Null value in 'age' after replacing : 0 Null value in 'driving licence present' : 1 Null value in 'driving licence present' after replacing : 0 Null value in 'region code' : 0 Null value in 'region code' after replacing : 0 Null value in 'previously insured' : 0 Null value in 'previously insured' after replacing : 0 Null value in 'vehicle age' : 0 Null value in 'vehicle age' after replacing : 0 Null value in 'vehicle damage' : 2 Null value in 'vehicle damage' after replacing : 0 Null value in 'customer_id' : 0 Null value in 'customer_id' after droping : 0 Null value in 'annual premium (in Rs)' : 0 Null value in 'annual premium (in Rs)' after replacing : 0 Null value in 'sales channel code' : 0 Null value in 'sales channel code' after replacing : 0 Null value in 'vintage' : 0 Null value in 'vintage' after replacing : 0 Null value in 'response' : 0 Null value in 'response' after replacing : 0
## Outliers
customer_detail_df.describe()
customer_policy_detail_df.describe()
Q1=customer_detail_df.describe().loc["25%","age"]
Q3=customer_detail_df.describe().loc["75%","age"]
IQR=Q3-Q1
print(customer_detail_df.loc[customer_detail_df["age"]<(Q1-IQR*1.5),"age"].count())
print(customer_detail_df.loc[customer_detail_df["age"]>(Q3+IQR*1.5),"age"].count())
##### there are no outliers in 'age' column
Q1=customer_policy_detail_df.describe().loc["25%","annual premium (in Rs)"]
Q3=customer_policy_detail_df.describe().loc["75%","annual premium (in Rs)"]
IQR=Q3-Q1
print(customer_policy_detail_df.loc[customer_policy_detail_df["annual premium (in Rs)"]<(Q1-IQR*1.5),"annual premium (in Rs)"].count())
print(customer_policy_detail_df.loc[customer_policy_detail_df["annual premium (in Rs)"]>(Q3+IQR*1.5),"annual premium (in Rs)"].count())
customer_policy_detail_df.loc[customer_policy_detail_df["annual premium (in Rs)"]>(Q3+IQR*1.5),"annual premium (in Rs)"]=customer_policy_detail_df["annual premium (in Rs)"].mean()
print(customer_policy_detail_df.loc[customer_policy_detail_df["annual premium (in Rs)"]>(Q3+IQR*1.5),"annual premium (in Rs)"].count())
Q1=customer_policy_detail_df.describe().loc["25%","vintage"]
Q3=customer_policy_detail_df.describe().loc["75%","vintage"]
IQR=Q3-Q1
print(customer_policy_detail_df.loc[customer_policy_detail_df["vintage"]<(Q1-IQR*1.5),"vintage"].count())
print(customer_policy_detail_df.loc[customer_policy_detail_df["vintage"]>(Q3+IQR*1.5),"vintage"].count())
##### there are no outliers in 'vintage' column
0 0 0 0 0 0 0
##### there are no outliers in 'vintage' column
### White spaces
customer_detail_df["Gender"]=customer_detail_df["Gender"].str.strip()
#customer_detail_df["vehicle age"]=customer_detail_df["vehicle age"].str.strip()
customer_detail_df["vehicle damage"]=customer_detail_df["vehicle damage"].str.strip()
### case change
customer_detail_df["Gender"]=customer_detail_df["Gender"].str.lower()
#customer_detail_df["vehicle age"]=customer_detail_df["vehicle age"].str.lower()
customer_detail_df["vehicle damage"]=customer_detail_df["vehicle damage"].str.lower()
### creating dummies
dummies_gender=pd.get_dummies(customer_detail_df["Gender"])
dummies_vehicle_age=pd.get_dummies(customer_detail_df["vehicle age"])
dummies_vehicle_damage=pd.get_dummies(customer_detail_df["vehicle damage"])
dummies_d_l_p=pd.get_dummies(customer_detail_df["driving licence present"])
dummies_p_i=pd.get_dummies(customer_detail_df["previously insured"])
dummies_response=pd.get_dummies(customer_policy_detail_df["response"])
### checking for any duplicates
print(customer_detail_df.duplicated().sum())
print(customer_policy_detail_df.duplicated().sum())
0 0
### 3. Create a Master table for future use. Join the customer table and customer_policy table to get a master table using customer_id in both tables.
master_df=pd.merge(customer_detail_df,customer_policy_detail_df,on='customer_id')
master_df
| customer_id | Gender | age | driving licence present | region code | previously insured | vehicle age | vehicle damage | annual premium (in Rs) | sales channel code | vintage | response | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 100012 | m | 45 | yes | AP39 | yes | 5 | headlight | 25000 | 201 | 1 | yes |
| 1 | 100025 | f | 25 | yes | AP04 | yes | 2 | brakes | 20000 | 202 | 0 | no |
### 4. Company needs some important information from the master table to make decisions for future growth.They needs following information:
##### i. Gender wise average annual premium
##### ii. Age wise average annual premium
##### iii. Is your data balanced between the genders?
##### iv. Vehicle age wise average annual premium.
#Gender wise average annual premium
aap_gender_df=master_df.groupby(["Gender"])["annual premium (in Rs)"].mean()
aap_gender_df
Gender f 20000.0 m 25000.0 Name: annual premium (in Rs), dtype: float64
## Data is balanced between the two genders
#### data is balanced between the two genders because the avereages are approximately equal
# age wise average annual premium
aap_age_df=master_df.groupby(["age"])["annual premium (in Rs)"].mean()
aap_age_df
#vehicle age wise average annual premium
aap_v_age_df=master_df.groupby(["vehicle age"])["annual premium (in Rs)"].mean()
aap_v_age_df
vehicle age 2 20000.0 5 25000.0 Name: annual premium (in Rs), dtype: float64
#### 5. Is there any relation between Person Age and annual premium?
#Correlation coefficient < -0.5 - Strong negative relationship
#Correlation coefficient > 0.5 - Strong positive relationship
#0.5 < Correlation coefficient < 0.5 - There is no relationship.
Correlation_coefficient=master_df["age"].corr(master_df["annual premium (in Rs)"])
print(Correlation_coefficient)
# there is no relationship between Person age and annual premium because Corrrelation coefficient<0.5
1.0