Skip to content
Customer Engagement and Retention Challenges
Name: Geraldo Enrico Semen
Technical Test Data Analyst
Note: `Filing on Behalf of Someone': merupakan customer yang menggunakan layanan berdasarkan rekomendasi orang lain (as per email)
Disclaimer: Better view on light mode
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import csv
import plotly.express as px
from wordcloud import WordCloud# Read the data
df= pd.read_csv('datasets/raw.csv')
df.head()1. Preprocessing Steps
df.info()1.1 Checking missing values
Pertama-tama dilakukan inspeksi terhadap data yang diberikan terlebih dahulu, untuk mengecek apa terdapat missing value atau tidak
df.isna().sum()Ada sekitar 118 baris dengan missing value. Selanjutnya akan diinspeksi lebih lanjut apa masalahnya.
df_missing = df[df.isnull().any(axis=1)]
missing_indexes = df_missing.index.tolist()
df_missingError sepertinya pada kolom ticket, dimana terdapat nilai yang tidak konsisten atau tidak sesuai dengan format. Selanjutnya, akan di fix hal tersebut!
def fix_error(df, row_index):
"""
Memproses dataframe dengan memisahkan string yang ada di kolom pertama.
Parameters:
df (pd.DataFrame): dataframe yang akan diproses
row_index (int): Index baris yang akan di cek
Returns:
pd.DataFrame: Dataframe baru yang telah di update
"""
if df.iloc[row_index, 1:].isnull().all():
# Split string di kolom ticket berdasarkan delimiter ",".
# Set quotechar untuk menghindari lib csv membaca ',' yang ada di dalam tanda petik
first_column_value = df.iloc[row_index, 0]
split_values = next(csv.reader([str(first_column_value)], delimiter=',', quotechar='"'))
# Update string yang sudah di split, assign ke kolom yang bersesuaian
df.iloc[row_index, :len(split_values)] = split_values
return df
# Apply the function only to the rows listed in missing_indexes
for i in missing_indexes:
df_temp_cleaned = fix_error(df, i)
df_temp_cleaned.head()Cek kembali df_temp_cleaned dengan index yang ada pada missing_indexes
df_temp_cleaned.loc[missing_indexes]df_temp_cleaned.isna().sum()