Challenge

Project 2 - EDA on Vehicle Insurance Customer Data

import pandas as pd

import numpy as np

# Load customer details and customer policy data

customer_details_path = "/mnt/data/customer_details.csv"

customer_policy_path = "/mnt/data/customer_policy_details.csv"

customer_details = pd.read_csv(customer_details_path, header=None)

customer_policy = pd.read_csv(customer_policy_path, header=None)

# 1. Adding Column Names

customer_details.columns = [

"customer_id", "Gender", "age", "driving_licence_present", "region_code",

"previously_insured", "vehicle_age", "vehicle_damage"

]

customer_policy.columns = [

"customer_id", "annual_premium", "sales_channel_code", "vintage", "response"

]

# 2. Data Cleaning

## i. Handling Null Values

# Drop rows where customer_id is null

customer_details.dropna(subset=["customer_id"], inplace=True)

customer_policy.dropna(subset=["customer_id"], inplace=True)

# Replace null values in numeric columns with mean

numeric_cols_customer = ["age", "region_code"]

numeric_cols_policy = ["annual_premium", "sales_channel_code", "vintage"]

for col in numeric_cols_customer:

customer_details[col].fillna(customer_details[col].mean(), inplace=True)

for col in numeric_cols_policy:

customer_policy[col].fillna(customer_policy[col].mean(), inplace=True)

# Replace null values in categorical columns with mode

categorical_cols_customer = ["Gender", "vehicle_age", "vehicle_damage"]

categorical_cols_policy = ["response"]

for col in categorical_cols_customer:

customer_details[col].fillna(customer_details[col].mode()[0], inplace=True)

for col in categorical_cols_policy:

customer_policy[col].fillna(customer_policy[col].mode()[0], inplace=True)

## ii. Handling Outliers using IQR Method

def replace_outliers_with_mean(df, column):

Q1 = df[column].quantile(0.25)

Q3 = df[column].quantile(0.75)

IQR = Q3 - Q1

lower_bound = Q1 - 1.5 * IQR

upper_bound = Q3 + 1.5 * IQR

mean_value = df[column].mean()

df[column] = np.where((df[column] < lower_bound) | (df[column] > upper_bound), mean_value, df[column])

for col in numeric_cols_customer:

replace_outliers_with_mean(customer_details, col)

for col in numeric_cols_policy:

replace_outliers_with_mean(customer_policy, col)

## iii. Removing White Spaces

customer_details = customer_details.applymap(lambda x: x.strip() if isinstance(x, str) else x)

customer_policy = customer_policy.applymap(lambda x: x.strip() if isinstance(x, str) else x)

## iv. Case Correction (Converting to Lowercase)

customer_details = customer_details.applymap(lambda x: x.lower() if isinstance(x, str) else x)

customer_policy = customer_policy.applymap(lambda x: x.lower() if isinstance(x, str) else x)

## v. Convert Categorical Columns to Dummies

customer_details = pd.get_dummies(customer_details, columns=categorical_cols_customer, drop_first=True)

customer_policy = pd.get_dummies(customer_policy, columns=categorical_cols_policy, drop_first=True)

## vi. Dropping Duplicates

customer_details.drop_duplicates(inplace=True)

customer_policy.drop_duplicates(inplace=True)

# 3. Create Master Table by merging datasets

master_table = pd.merge(customer_details, customer_policy, on="customer_id", how="inner")

# Restoring Gender column

master_table["Gender"] = master_table.apply(lambda row: "male" if row["Gender_male"] == 1 else "female", axis=1)

# 4. Company Insights

## i. Gender wise average annual premium

gender_wise_premium = master_table.groupby("Gender")["annual_premium"].mean()

## ii. Age wise average annual premium

age_wise_premium = master_table.groupby("age")["annual_premium"].mean()

## iii. Checking data balance between genders

gender_balance = master_table["Gender"].value_counts(normalize=True)

## iv. Vehicle age wise average annual premium

vehicle_age_wise_premium = master_table.groupby("vehicle_age_< 1 year")["annual_premium"].mean()

# 5. Correlation between Age and Annual Premium

correlation = master_table["age"].corr(master_table["annual_premium"])

# Save results

gender_wise_premium.to_csv("/mnt/data/Gender_Wise_Premium.csv")

age_wise_premium.to_csv("/mnt/data/Age_Wise_Premium.csv")

gender_balance.to_csv("/mnt/data/Gender_Balance.csv")

vehicle_age_wise_premium.to_csv("/mnt/data/Vehicle_Age_Wise_Premium.csv")

master_table.to_csv("/mnt/data/Master_Table.csv", index=False)

# Print correlation result

print("Correlation between Age and Annual Premium:", correlation)

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.