Challenge

Project 2 - EDA on Vehicle Insurance Customer Data

import pandas as pd
import numpy as np

Reading .csv file

customer_details = pd.read_csv('.\customer_details.csv')

customer_policy_details = pd.read_csv('.\customer_policy_details.csv')

1) Add the column names to both datasets:

i. Column Names for customer details table

customer_details.columns=('customer_id','Gender','age','driving licence present','region code','previously insured','vehicle age','vehicle damage')
customer_details()

ii. Column Names for customer_policy table

customer_policy_details.columns=('customer_id','annual premium (in rs)','sales channel code','vintage','response')
customer_policy_details()

2) Checking and Cleaning Data Quality

i. Null values

Generate a summary of count of all the null values column wise:

summary_of_null_values_for_customer_details = customer_details.isna().sum()
summary_of_null_values_for_customer_details()

summary_of_null_values_for_customer_details.plot.bar()

summary_of_null_values_for_customer_policy_details = customer_policy_details.isna().sum()
summary_of_null_values_for_customer_policy_details.plot.bar()

null_values_for_customer_policy_details.plot.bar()

Drop Null values for customer_id because central tendencies for id’s is not feasible:

customer_details = customer_details.dropna(subset = ['customer_id'])customer_policy_details = customer_policy_details.dropna(subset = ['customer_id'])

Replace all null values for numeric columns by mean:

customer_details = customer_details.fillna(customer_details.mean(numeric_only = True))

customer_policy_details = customer_policy_details.fillna(customer_policy_details.mean(numeric_only = True))

Replace all null values for Categorical value by mode:

customer_details['Gender'] = customer_details['Gender'].fillna(customer_details.Gender.value_counts().index[0])
customer_details['vehicle age'] = customer_details['vehicle age'].fillna(customer_details['vehicle age'].value_counts().index[0])
customer_details['vehicle damage'] = customer_details['vehicle damage'].fillna(customer_details['vehicle damage'].value_counts().index[0])

customer_details.isna().sum()

customer_details.isna().sum().plot.bar()

customer_policy_details.isna().sum()

customer_policy_details.isna().sum().plot.bar()

ii. Outliers

Generate a summary of count of all the outliers column wise

customer_details.describe()

def find_outliers_IQR(df):   
    """This Method Finds the Outliers present in a DataFrame"""
    q1=df.quantile(0.25)
    q3=df.quantile(0.75)
    IQR=q3-q1
    outliers = df[((df<(q1-1.5*IQR)) | (df>(q3+1.5*IQR)))]
    return outliers

#find outliers for columns in customer_details DataFrame

outliers = find_outliers_IQR(customer_details['customer_id'])
a = outliers.value_counts().sum()
outliers1 = find_outliers_IQR(customer_details['age'])
b = outliers1.value_counts().sum()
outliers2 = find_outliers_IQR(customer_details['driving licence present'])
c = outliers2.value_counts().sum()
outliers3 = find_outliers_IQR(customer_details['region code'])
d = outliers3.value_counts().sum()
outliers4 = find_outliers_IQR(customer_details['previously insured'])
e = outliers4.value_counts().sum()

outliers_in_customer_details = pd.DataFrame([a,b,c,d,e],['customer_id','age','driving licence present','region code','previously insured'])

outliers_in_customer_details()

outliers_in_customer_policy_details = pd.DataFrame([a,b,c,d,e],['customer_id','annual premium (in rs)','sales channel code','vintage','response'])

outliers_in_customer_details.plot.bar()

#find outliers for coulmns in customer_policy_details DataFrame

outliers = find_outliers_IQR(customer_policy_details['customer_id'])
a = outliers.value_counts().sum()
outliers1 = find_outliers_IQR(customer_policy_details['annual premium (in rs)'])
b = outliers1.value_counts().sum()
outliers2 = find_outliers_IQR(customer_policy_details['sales channel code'])
c = outliers2.value_counts().sum()
outliers3 = find_outliers_IQR(customer_policy_details['vintage'])
d = outliers3.value_counts().sum()
outliers4 = find_outliers_IQR(customer_policy_details['response'])
e = outliers4.value_counts().sum()

outliers_in_customer_policy_details = pd.DataFrame([a,b,c,d,e],['customer_id','annual premium (in rs)','sales channel code','vintage','response'])

outliers_in_customer_policy_details()

outliers_in_customer_policy_details.plot.bar()

Replace all outlier values for numeric columns by mean:

def replace_outliers(df): 
    """This Method replaces the Outliers with the mean in a DataFrame"""
    q1=df.quantile(0.25)
    q3=df.quantile(0.75)
    IQR=q3-q1
    upper = df[~(df>(q3+1.5*IQR))].max()
    lower = df[~(df<(q1-1.5*IQR))].min()
    df = np.where(df > upper, df.mean(),np.where(df < lower>    return df

replace_outliers(customer_details['driving licence present'])

replace_outliers(customer_policy_details['annual premium (in rs)'])
replace_outliers(customer_policy_details['response'])

customer_details.describe()

customer_policy_details.describe()

iii. White spaces

customer_details['Gender'] = customer_details['Gender'].str.strip()

iv. case correction(lower or upper, any one

customer_details['Gender'] = customer_details['Gender'].str.upper()
customer_details['Gender']

v. Convert nominal data (categorical) into dummies

gender_dummy =pd.get_dummies(customer_details['Gender'])
gender_dummy()

vehicle_age_dummy =pd.get_dummies(customer_details['vehicle age'])
vehicle_age_dummy()

vi. Drop Duplicates (duplicated rows)

customer_details = customer_details.drop_duplicates()
customer_details()

customer_policy_details = customer_policy_details.drop_duplicates()
customer_policy_details()

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_table = pd.merge(customer_details,customer_policy_details,on = 'customer_id')

master_table()

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

print('Gender wise average annual premium')
print(master_table.groupby('Gender')['annual premium (in rs)'].mean())

master_table.groupby('Gender')['annual premium (in rs)'].mean().plot.bar(ylabel = 'Annual Premium (in Rs)')

ii. Age wise average annual premium

print('Age wise average annual premium')
print(master_table.groupby('age')['annual premium (in rs)'].mean())

master_table.groupby('age')['annual premium (in rs)'].mean().plot()

iii. Is your data balanced between the genders?

if master_table.groupby('Gender')['annual premium (in rs)'].mean().value_counts().iloc[0] == master_table.groupby('Gender')['annual premium (in rs)'].mean().value_counts().iloc[1]:
    print('Data is balanced gender wise')
else:
    print('Data is not balance gender wise')
master_table.groupby('Gender')['annual premium (in rs)'].mean().plot.bar(ylabel = 'Annual Premium (in Rs)')

iv. Vehicle age wise average annual premium

print('Vehicle age wise average annual premium')
print(master_table.groupby('vehicle age')['annual premium (in rs)'].mean())

master_table.groupby('vehicle age')['annual premium (in rs)'].mean().plot.bar()

5) Is there any relation between Person Age and annual premium

correlation_coefficient = master_table['age'].corr(master_table['annual premium (in rs)'])
correlation_coefficient()

if correlation_coefficient < -0.5:
    print('There is Strong negative relationship between Person Age and Annual Premium')
elif correlation_coefficient > 0.5:
    print('There is Strong postive relationship between Person Age and Annual Premium')
elif correlation_coefficient < 0>    print('There is no relation between Person Age and Annual Premium')
else:
    print('There is a good relation between Person Age and Annual Premium')

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.