Analisis Data Marketplace Sales
By: Devita Widyasari
Tags: Data Wrangling, Data Analysis, Pandas, Plotly

Saya mendapatkan data penjualan barang dalam sebuah marketplace. Data yang digunakan adalah data order list yang berisi record order yang dilakukan setiap harinya, data order details yang berisi detail pembelian barang, dan data sales target yang berisi target jumlah penjualan setiap bulannya untuk setiap kategori. Seluruh dataset dapat diunduh dengan klik nama datanya.

Beberapa hal yang ingin diketahui dari data-data tersebut, yaitu:

Angka transaksi, jumlah penjualan, pendapatan kotor, dan profit yang dihasilkan setiap bulannya Angka penjualan dan profit kumulatif setiap sub-kategorinya Lokasi dengan permintaan barang dan profit tertinggi maupun terendah Perbandingan angka pendapatan sebenarnya dan angka target setiap bulannya

Import library and dataset

from google.colab import drive

drive.mount('/content/drive')

Selanjutnya, import library yang dibutuhkan. Library pandas saya gunakan untuk mengeksplor dataset. sqldf saya gunakan untuk gather data sebelum visualisasi. untuk visualisasi sendiri saya gunakan library plotly.

!pip install -U pandasql import pandas as pd

from pandasql import sqldf

import plotly.express as px

import plotly.graph_objects as go

from plotly.subplots import make_subplots

Import ketiga dataset.

orderlist = pd.read_csv('drive/My Drive/Colab Notebooks/List of Orders.csv')

orderlist.head()

Order ID adalah ID untuk setiap pembelian barang. Order Date adalah tanggal pembelian barang. CustomerName adalah nama pembeli. State adalah negara bagian, dimana pembelian tersebut dilakukan. City adalah kota dimana pembelian tersebut dilakukan.



orderdetails = pd.read_csv('drive/My Drive/Colab Notebooks/Order Details.csv')

orderdetails.head()

Order ID adalah ID untuk setiap pembelian barang. Amount adalah total harga dari barang-barang yang dibeli / berhasil terjual. Profit adalah keuntungan yang didapat perusahaan dari setiap pembelian. Quantity adalah jumlah barang yang dibeli. Category adalah kategori barang. Sub-Category adalah sub-kategori barang.

salestarget = pd.read_csv('drive/My Drive/Colab Notebooks/Sales Target.csv')

salestarget.head()

Month of Order Date adalah bulan dan tahun target pembelian. Category adalah kategori barang. Target adalah angka target penjualan.

Explore Dataset

Rename (ubah nama kolom) dengan menghilangkan spasi pada nama kolom agar mudah untuk penulisan kodenya.

orderlist.rename(columns={'Order ID':'OrderID', 'Order Date':'OrderDate'}, inplace=True)

orderdetails.rename(columns={'Order ID':'OrderID', 'Sub-Category':'Sub_Category'}, inplace=True)

salestarget.rename(columns={'Month of Order Date':'Month'}, inplace=True)

gunakan function .info() untuk mengetahui informasi mengenai kolom dan tipe data, dan deteksi missing value setiap kolomnya dengan function .isnull(). sum().

print('Order List info')

print(orderlist.info())

print('

Order List missing value')

print(orderlist.isnull().sum()) print('Order Details info')

print(orderdetails.info())

print('

Order Details missing value')

print(orderdetails.isnull().sum()) print('Sales Target info')

print(salestarget.info())

print('

Sales Target missing value')

print(salestarget.isnull().sum())

Dalam dataset Order List terdapat 60 baris kosong di setiap kolomnya. jika ingin menghapusnya, bisa menggunakan function .dropna(), namun tidak di-drop pun tidak berpengaruh karena selanjutnya dilakukan inner merge dengan dataset orderdetails. Lalu ubah tipe data dan format tanggal OrderDate menjadi datetime mm-YYYY untuk memudahkan agregasi selanjutnya, lalu rename menjadi ‘Month’ karena telah menjadi data bulan pembelian. Selain itu, hapus kolom CustomerName karena tidak akan digunakan untuk analisis selanjutnya.



orders = pd.merge(orderlist, orderdetails, on="OrderID", how="inner") orders['OrderDate'] = pd.to_datetime(orders['OrderDate']).dt.strftime('%m-%Y') orders.rename(columns={'OrderDate':'Month'}, inplace=True) orders.drop(columns='CustomerName', inplace=True) orders.head()

Q1. Transaction, Sales, Revenue and Profit per month

Customer Transaction = seberapa banyak transaksi yang terjadi (count orderID)

Number of sales = seberapa banyak jumlah kuantitas barang yang terjual (sum quantity)

Revenue = seberapa banyak pendapatan kotor yang dihasilkan (sum amount)

Profit = seberapa banyak keuntungan yang dihasilkan (sum profit)

query = """SELECT Month, Category,

count(OrderID) as 'Customer Transactions',

sum(Quantity) as 'Total Sales',

sum(Amount) as 'Total Revenue',

sum(Profit) as 'Total Profit'

FROM orders

GROUP BY Month, Category

ORDER BY (substr(Month,4,4) ||'-'|| substr(Month,1,2)) ASC""" value = sqldf(query)

value.head()

Visualisasi

value['Month'] = pd.to_datetime(value['Month'])

fig = px.line(value, x="Month", y="Customer Transactions", color="Category", title="Customer Transactions per Month")

fig.show()

value['Month'] = pd.to_datetime(value['Month'])

fig = px.line(value, x="Month", y="Total Sales", color="Category", title="Total Sales per Month")

fig.show()

value['Month'] = pd.to_datetime(value['Month'])

fig = px.line(value, x="Month", y="Total Revenue", color="Category", title="Total Revenue per Month")

fig.show()

value['Month'] = pd.to_datetime(value['Month'])

fig = px.line(value, x="Month", y="Total Profit", color="Category", title="Total Profit per Month")

fig.show()

Q2. Cumulative Sales and Profit

sales_sub = sqldf("SELECT Category, Sub_Category, sum(Quantity) as Total_Sales FROM orders GROUP BY Sub_Category") fig = px.bar(sales_sub, x="Sub_Category", y="Total_Sales", color="Category", title="Total Sales in 2 Years")

fig.update_layout(xaxis={'categoryorder':'total descending'})

fig.show()

profit_sub = sqldf("SELECT Category, Sub_Category, sum(Profit) as Total_Profit FROM orders GROUP BY Sub_Category") fig = px.bar(profit_sub, x="Sub_Category", y="Total_Profit", color="Category", title="Total Profit in 2 Years")

fig.update_layout(xaxis={'categoryorder':'total descending'})

fig.show()

cat = pd.pivot_table(orders, index="Category", values="Profit", aggfunc="sum")

subcat = pd.pivot_table(orders, index="Sub_Category", values="Profit", aggfunc="sum") fig = make_subplots(rows=1, cols=2, specs=[[{'type':'domain'}, {'type':'domain'}]])

fig.add_trace(go.Pie(labels=cat.index, values=cat["Profit"]), row=1, col=1)

fig.add_trace(go.Pie(labels=subcat.index, values=subcat["Profit"]), row=1, col=2)

fig.update_layout(title_text='Cummulative Profit in Percentage')

fig.show()

Q3 : Locations With Highest or Lowest Profit and Demand

state_sales = sqldf("SELECT DISTINCT State, sum(Quantity) as Total_Sales FROM orders GROUP BY State ORDER BY Total_Sales DESC") city_sales = sqldf("SELECT DISTINCT City, sum(Quantity) as Total_Sales FROM orders GROUP BY City ORDER BY Total_Sales DESC")

Visualisasi

fig = make_subplots(rows=2, cols=2, start_cell="top-left", shared_yaxes=True, subplot_titles=("Top 5 states in highest demand", "Bottom 5 states of lowest demand", "Top 5 cities in highest demand", "Bottom 5 cities of lowest demand")) fig.add_trace(go.Bar(x=state_sales.head()["State"], y=state_sales.head()["Total_Sales"]),row=1, col=1)

fig.add_trace(go.Bar(x=state_sales.tail()["State"], y=state_sales.tail()["Total_Sales"]),row=1, col=2)

fig.add_trace(go.Bar(x=city_sales.head()["City"], y=city_sales.head()["Total_Sales"]),row=2, col=1)

fig.add_trace(go.Bar(x=city_sales.tail()["City"], y=city_sales.tail()["Total_Sales"]),row=2, col=2) fig.show()

state_profit = sqldf("SELECT DISTINCT State, sum(Profit) as Total_Profit FROM orders GROUP BY State ORDER BY Total_Profit DESC") city_profit = sqldf("SELECT DISTINCT City, sum(Profit) as Total_Profit FROM orders GROUP BY City ORDER BY Total_Profit DESC")

Visualisasi

fig = make_subplots(rows=2, cols=2, start_cell="top-left", shared_yaxes=True, subplot_titles=("Top 5 states Profits", "Bottom 5 states Profits", "Top 5 cities Profits", "Bottom 5 cities Profits")) fig.add_trace(go.Bar(x=state_profit.head()["State"], y=state_profit.head()["Total_Profit"]), row=1, col=1)

fig.add_trace(go.Bar(x=state_profit.tail()["State"], y=state_profit.tail()["Total_Profit"]), row=1, col=2)

fig.add_trace(go.Bar(x=city_profit.head()["City"], y=city_profit.head()["Total_Profit"]), row=2, col=1)

fig.add_trace(go.Bar(x=city_profit.tail()["City"], y=city_profit.tail()["Total_Profit"]), row=2, col=2) fig.show()

Q4. Difference Between Actual and Target Amount

Sebelum menggabungkan table orders dan salestarget, terlebih dahulu mengubah tipe data kolom Month dari object menjadi datetime dengan format yang sama yaitu mm-YYYY. Karena sebelumnya pada data salestarget, kolom Month berformat bbb-YYYY.

salestarget['Month'] = pd.to_datetime(salestarget['Month'],format='%b-%y').dt.strftime('%m-%Y') orders['Month'] = pd.to_datetime(orders['Month']).dt.strftime('%m-%Y')

Join-kan kedua table dengan key Month dan Category.

query = """SELECT o.Month, o.Category, sum(o.Amount) as Actual_Sales, s.Target as Target_Sales, s.Target - sum(o.Amount) as Difference

FROM orders o JOIN salestarget s

ON o.Month = s.Month AND o.Category = s.Category

GROUP BY o.Month, o.Category

ORDER BY (substr(o.Month,4,4) ||'-'|| substr(o.Month,1,2)) ASC""" diff = sqldf(query)

diff.head()

Visualisasi