# 💰 **Analyzing E-Commerce Business Performance with SQL**
**Tool** : PostgreSQL
**Visualization** : Microsoft Excel
**Dataset** : Rakamin Academy - [Ecommerce Data]()
**Table of Contents**
- [STAGE 0: Problem Statement](https://github.com/faizns/Analyzing-eCommerce-Business-Performance-with-SQL/blob/main/README.md#-stage-0:-problem-statement)
- [Background Story](https://github.com/faizns/Analyzing-eCommerce-Business-Performance-with-SQL/blob/main/README.md#background-story)
- [Objective](https://github.com/faizns/Analyzing-eCommerce-Business-Performance-with-SQL/blob/main/README.md#objective)
- [STAGE 1: Data Preparation](https://github.com/faizns/Analyzing-eCommerce-Business-Performance-with-SQL/blob/main/README.md#-stage-1:-Data-Preparation)
- [Create Database and ERD](https://github.com/faizns/Analyzing-eCommerce-Business-Performance-with-SQL/blob/main/README.md#create-database-and-erd)
- [STAGE 2: Data Analysis](https://github.com/faizns/Analyzing-eCommerce-Business-Performance-with-SQL/blob/main/README.md#-stage-2:-data-analysis)
- [Annual Customer Activity Growth](https://github.com/faizns/Analyzing-eCommerce-Business-Performance-with-SQL/blob/main/README.md#1-annual-customer-activity-growth)
- [Annual Product Category Quality](https://github.com/faizns/Analyzing-eCommerce-Business-Performance-with-SQL/blob/main/README.md#2-annual-product-category-quality)
- [Annual Payment Type Usage](https://github.com/faizns/Analyzing-eCommerce-Business-Performance-with-SQL/blob/main/README.md#3-annual-payment-type-usage)
- [STAGE 3: Summary](https://github.com/faizns/Analyzing-eCommerce-Business-Performance-with-SQL/blob/main/README.md#-stage-3:-summary)
---
## 📂 **STAGE 0: Problem Statement**
### **Background Story**
Mengukur performa bisnis merupakan suatu hal yang sangat penting bagi sebuah perusahaan. Ini akan membantu dalam memantau, dan menilai keberhasilan atau kegagalan dari berbagai proses bisnis. Pengukuran performa bisnis dapat dilakukan dengan memperhitungkan beberapa metrik bisnis. Dalam poyek ini akan dilakukan analisis performa bisnis suatu perusahaan eCommerce dengan dengan metrik bisnis yaitu pertumbuhan pelanggan, kualitas produk, dan tipe pembayaran berdasarkan historical data selama tiga tahun.
### **Objective**
Mengumpulkan insight dari analisis dan dengan visualisasi berupa :
1. **Annual Customer Activity Growth**
2. **Annual Product Category Quality**
3. **Annual Payment Type Usage**
---
## 📂 **STAGE 0: Data Preparation**
Dataset yang digunakan adalah dataset sebuah perusahaan eCommerce Brasil yang memiliki informasi pesanan dengan jumlah 99441 dari tahun 2016 hingga 2018. Terdapat fitur-titur yang membuat informasi seperti status pemesanan, lokasi, rincian item, jenis pembayaran, serta ulasan.
### **Create Database and ERD**
**Langkah-langkah yang dilakukan meliputi:**
1. Membuat workspace database di dalam pgAdmin dan membuat tabel menggunakan `CREATE TABLE` statement
2. Melakukan import data csv kedalam database
3. Menentukan Primary Key atau Foreign Key enggunakan statement `ALTER TABLE`
4. Membuat dan mengeksport ERD (Entity Relationship Diagram)
Click untuk melihat Queries
```sql
-- 1) Membuat database melalui klik kanan Databases > Create > Database.. dengan nama ecommerce_miniproject
-- 2) Membuat tabel menggunakan statement CREATE TABLE dengan mengikuti penamaan kolom di csv dan memastikan tipe datanya sesuai.
CREATE TABLE customers_dataset (
customer_id varchar,
customer_unique_id varchar,
customer_zip_code_prefix varchar,
customer_city varchar,
customer_state varchar
);
CREATE TABLE sellers_dataset (
seller_id varchar,
seller_zip_code_prefix varchar,
seller_city varchar,
seller_state varchar
);
CREATE TABLE geolocation_dataset (
geolocation_zip_code_prefix varchar,
geolocation_lat decimal,
geolocation_lng decimal,
geolocation_city varchar,
geolocation_state varchar
);
CREATE TABLE product_dataset (
product_id varchar,
product_category_name varchar,
product_name_lenght int,
product_description_lenght int,
product_photos_qty int,
product_weight_g decimal,
product_length_cm decimal,
product_height_cm decimal,
product_width_cm decimal
);
CREATE TABLE orders_dataset (
order_id varchar,
customer_id varchar,
order_status varchar,
order_purchase_timestamp timestamp,
order_approved_at timestamp,
order_delivered_carrier_date timestamp,
order_delivered_customer_date timestamp,
order_estimated_delivery_date timestamp
);
CREATE TABLE order_items_dataset (
order_id varchar,
order_item_id int,
product_id varchar,
seller_id varchar,
shipping_limit_date timestamp,
price decimal,
fright_value decimal
);
CREATE TABLE order_payments_dataset (
order_id varchar,
payment_sequential int,
payment_type varchar,
payment_installments int,
payment_value decimal
);
CREATE TABLE order_reviews_dataset (
review_id varchar,
order_id varchar,
review_score int,
review_comment_title varchar,
review_comment_message varchar,
review_creation_date timestamp,
review_answer_timestamp timestamp
);
-- 3) Mengimpor file csv ke dalam masing-masing tabel yang telah dibuat dengan klik kanan pada nama tabel > Import/Export Data..
-- 4) Menentukan Primary Key dan Foreign Key untuk membuat relasi antar tabelnya,
-- Sebelumnya, memastikan Primary Key memiliki nilai unik dan tipe data sesuai antara Primary Key dan Foreign Key pada dataset.
-- PRIMARY KEY
ALTER TABLE customers_dataset ADD CONSTRAINT customers_dataset_pkey ADD PRIMARY KEY(customer_id);
ALTER TABLE sellers_dataset ADD CONSTRAINT sellers_dataset_pkey ADD PRIMARY KEY(seller_id);
ALTER TABLE product_dataset ADD CONSTRAINT product_dataset_pkey ADD PRIMARY KEY(product_id);
ALTER TABLE orders_dataset ADD CONSTRAINT orders_dataset_pkey ADD PRIMARY KEY(order_id);
-- FOREIGN KEY
ALTER TABLE orders_dataset ADD FOREIGN KEY (customer_id) REFERENCES customers_dataset;
ALTER TABLE order_payments_dataset ADD FOREIGN KEY (order_id) REFERENCES orders_dataset;
ALTER TABLE order_reviews_dataset ADD FOREIGN KEY (order_id) REFERENCES orders_dataset;
ALTER TABLE order_items_dataset ADD FOREIGN KEY (order_id) REFERENCES orders_dataset;
ALTER TABLE order_items_dataset ADD FOREIGN KEY (product_id) REFERENCES product_dataset;
ALTER TABLE order_items_dataset ADD FOREIGN KEY (seller_id) REFERENCES sellers_dataset;
-- 5) Membuat ERD dengan cara klik kanan pada database ecommerce_miniproject > Gererate ERD..
```
**Hasil ERD :**
Gambar 1. Entity Relationship Diagram
---
## 📂 **STAGE 2: Data Analysis**
### **1. Annual Customer Activity Growth**
Pertumbuhan aktivitas pelanggan tahunan dapat dianalisis dari Monthly active user (MAU), pelanggan baru, pelanggan dengan repeat order, dan rata-rata order oleh pelanggan.
Click untuk melihat Queries
```sql
--1 Menampilkan rata-rata jumlah customer aktif bulanan (monthly active user) untuk setiap tahun
SELECT year, FLOOR(AVG(customer_total)) AS avg_mau
FROM (
SELECT
date_part('year', od.order_purchase_timestamp) AS year,
date_part('month', od.order_purchase_timestamp) AS month,
COUNT(DISTINCT cd.customer_unique_id) AS customer_total
FROM orders_dataset AS od
JOIN customers_dataset AS cd
ON cd.customer_id = od.customer_id
GROUP BY 1, 2
) AS sub
GROUP BY 1
ORDER BY 1
;
--2 Menampilkan jumlah customer baru pada masing-masing tahun
SELECT year, COUNT(customer_unique_id) AS total_new_customer
FROM (
SELECT
Min(date_part('year', od.order_purchase_timestamp)) AS year,
cd.customer_unique_id
FROM orders_dataset AS od
JOIN customers_dataset AS cd
ON cd.customer_id = od.customer_id
GROUP BY 2
) AS sub
GROUP BY 1
ORDER BY 1
;
--3 Menampilkan jumlah customer repeat order pada masing-masing tahun
SELECT year, count(customer_unique_id) AS total_customer_repeat
FROM (
SELECT
date_part('year', od.order_purchase_timestamp) AS year,
cd.customer_unique_id,
COUNT(od.order_id) AS total_order
FROM orders_dataset AS od
JOIN customers_dataset AS cd
ON cd.customer_id = od.customer_id
GROUP BY 1, 2
HAVING count(2) > 1
) AS sub
GROUP BY 1
ORDER BY 1
;
--4 Menampilkan rata-rata jumlah order yang dilakukan customer untuk masing-masing tahun
SELECT year, ROUND(AVG(freq), 3) AS avg_frequency
FROM (
SELECT
date_part('year', od.order_purchase_timestamp) AS year,
cd.customer_unique_id,
COUNT(order_id) AS freq
FROM orders_dataset AS od
JOIN customers_dataset AS cd
ON cd.customer_id = od.customer_id
GROUP BY 1, 2
) AS sub
GROUP BY 1
ORDER BY 1
;
--5 Menggabungkan ketiga metrik yang telah berhasil ditampilkan menjadi satu tampilan tabel
WITH cte_mau AS (
SELECT year, FLOOR(AVG(customer_total)) AS avg_mau
FROM (
SELECT
date_part('year', od.order_purchase_timestamp) AS year,
date_part('month', od.order_purchase_timestamp) AS month,
COUNT(DISTINCT cd.customer_unique_id) AS customer_total
FROM orders_dataset AS od
JOIN customers_dataset AS cd
ON cd.customer_id = od.customer_id
GROUP BY 1, 2
) AS sub
GROUP BY 1
),
cte_new_cust AS (
SELECT year, COUNT(customer_unique_id) AS total_new_customer
FROM (
SELECT
Min(date_part('year', od.order_purchase_timestamp)) AS year,
cd.customer_unique_id
FROM orders_dataset AS od
JOIN customers_dataset AS cd
ON cd.customer_id = od.customer_id
GROUP BY 2
) AS sub
GROUP BY 1
),
cte_repeat_order AS (
SELECT year, count(customer_unique_id) AS total_customer_repeat
FROM (
SELECT
date_part('year', od.order_purchase_timestamp) AS year,
cd.customer_unique_id,
COUNT(od.order_id) AS total_order
FROM orders_dataset AS od
JOIN customers_dataset AS cd
ON cd.customer_id = od.customer_id
GROUP BY 1, 2
HAVING count(2) > 1
) AS sub
GROUP BY 1
),
cte_frequency AS (
SELECT year, ROUND(AVG(freq), 3) AS avg_frequency
FROM (
SELECT
date_part('year', od.order_purchase_timestamp) AS year,
cd.customer_unique_id,
COUNT(order_id) AS freq
FROM orders_dataset AS od
JOIN customers_dataset AS cd
ON cd.customer_id = od.customer_id
GROUP BY 1, 2
) AS sub
GROUP BY 1
)
SELECT
mau.year AS year,
avg_mau,
total_new_customer,
total_customer_repeat,
avg_frequency
FROM
cte_mau AS mau
JOIN cte_new_cust AS nc
ON mau.year = nc.year
JOIN cte_repeat_order AS ro
ON nc.year = ro.year
JOIN cte_frequency AS f
ON ro.year = f.year
GROUP BY 1, 2, 3, 4, 5
ORDER BY 1
;
```
Tabel 1. Hasil Analisis Pertumbuhan Aktivitas Pelanggan Tahunan
Gambar 2. Grafik Rata-rata MAU dan Pelanggan Baru
Secara keseluruhan perusahaan mengalami peningkakatan Monthly Active User serta pelanggan baru setiap tahunnya. Peningkatan yang signifikan terjadi pada tahun 2016 ke 2017, hal ini dikarenakan data transaksi pada tahun 2016 dimulai pada bulan September.
Gambar 3. Grafik Jumlah Pelanggan yang Melakukan Repeat Order
Peningkatan yang signifikan juga terjadi pada jumlah pelanggan yang melakukan repeat order pada tahun 2016 hingga 2017. Namun pada tahun 2018 mengalami sedikit penurunan.
Gambar 4. Grafik Rata-rata Frekuensi Order Pelanggan
Dari analisis dan grafik diatas dapat diketahui bahwa rata-rata pelanggan setiap tahunnya cenderung hanya melakukan order satu kali, artinya mayoritas pelanggan tidak melakukan repeat order.
### **2. Annual Product Category Quality**
Kualitas kategori produk tahunan dapat dianalisis dari total pendapatan, total pembatalan pesanan, kategori top produk dan kategori produk yang paling banyak dibatalkan.
Click disini untuk melihat Queries
```sql
--1) Membuat tabel yang berisi informasi pendapatan/revenue perusahaan total untuk masing-masing tahun
CREATE TABLE total_revenue AS
SELECT
date_part('year', od.order_purchase_timestamp) AS year,
SUM(oid.price + oid.fright_value) AS revenue
FROM order_items_dataset AS oid
JOIN orders_dataset AS od
ON oid.order_id = od.order_id
WHERE od.order_status like 'delivered'
GROUP BY 1
ORDER BY 1;
--2) Membuat tabel yang berisi informasi jumlah cancel order total untuk masing-masing tahun
CREATE TABLE canceled_order AS
SELECT
date_part('year', order_purchase_timestamp) AS year,
COUNT(order_status) AS canceled
FROM orders_dataset
WHERE order_status like 'canceled'
GROUP BY 1
ORDER BY 1;
--3) Membuat tabel yang berisi nama kategori produk yang memberikan pendapatan total tertinggi untuk masing-masing tahun
CREATE TABLE top_product_category AS
SELECT
year,
top_category,
product_revenue
FROM (
SELECT
date_part('year', shipping_limit_date) AS year,
pd.product_category_name AS top_category,
SUM(oid.price + oid.fright_value) AS product_revenue,
RANK() OVER (PARTITION BY date_part('year', shipping_limit_date)
ORDER BY SUM(oid.price + oid.fright_value) DESC) AS ranking
FROM orders_dataset AS od
JOIN order_items_dataset AS oid
ON od.order_id = oid.order_id
JOIN product_dataset AS pd
ON oid.product_id = pd.product_id
WHERE od.order_status like 'delivered'
GROUP BY 1, 2
ORDER BY 1
) AS sub
WHERE ranking = 1;
--4) Membuat tabel yang berisi nama kategori produk yang memiliki jumlah cancel order terbanyak untuk masing-masing tahun
CREATE TABLE most_canceled_category AS
SELECT
year,
most_canceled,
total_canceled
FROM (
SELECT
date_part('year', shipping_limit_date) AS year,
pd.product_category_name AS most_canceled,
COUNT(od.order_id) AS total_canceled,
RANK() OVER (PARTITION BY date_part('year', shipping_limit_date)
ORDER BY COUNT(od.order_id) DESC) AS ranking
FROM orders_dataset AS od
JOIN order_items_dataset AS oid
ON od.order_id = oid.order_id
JOIN product_dataset AS pd
ON oid.product_id = pd.product_id
WHERE od.order_status like 'canceled'
GROUP BY 1, 2
ORDER BY 1
) AS sub
WHERE ranking = 1;
-- Tambahan - Menghapus anomali data tahun
DELETE FROM top_product_category WHERE year = 2020;
DELETE FROM most_canceled_category WHERE year = 2020;
-- Menampilkan tabel yang dibutuhkan
SELECT
tr.year,
tr.revenue AS total_revenue,
tpc.top_category AS top_product,
tpc.product_revenue AS total_revenue_top_product,
co.canceled total_canceled,
mcc.most_canceled top_canceled_product,
mcc.total_canceled total_top_canceled_product
FROM total_revenue AS tr
JOIN top_product_category AS tpc
ON tr.year = tpc.year
JOIN canceled_order AS co
ON tpc.year = co.year
JOIN most_canceled_category AS mcc
ON co.year = mcc.year
GROUP BY 1, 2, 3, 4, 5, 6, 7;
```
Tabel 2. Hasil Analisis Total Kategori Produk Tahunan
Gambar 5. Grafik Total Revenue Pertahun
Secara keseluruhan revenue perusahaan meningkat setiap tahun.
Gambar 6. Grafik Total Revenue Top Produk Pertahun
Revenue yang dihasilkan dari top produk juga meningkat untuk setiap tahunnya. Selain itu setiap tahunnya memiliki jenis kategori top produk yang berbeda. Pada tahun 2018, perusahaan menghasilkan revenue paling tinggi dengan jenis karegori top produk kesehatan dan kecantikan (`health_beauty`).
Gambar 7. Grafik Total Revenue Top Produk Pertahun
Produk yang sering dibatalkan oleh pelanggan untuk setiap tahunnya juga memiliki jenis kategori yang berbeda dan terus mengalami kenaikan. Tahun 2018 memiliki jumlah produk yang dibatalkan paling banyak dan memiliki jenis kategori yang sama dengan top produk yang paling banyak menghasilkan revenue. Hal tersebut dapat diduga karena jenis kategori kesehatan dan kecantikan sedang mendominasi pasar.
### **3. Annual Payment Type Usage**
Tipe pembayaran yang digunakan pelanggan dapat dianalisis dari jenis pembayaran favorit dan jumlah penggunaan untuk setiap jenis pembayaran pertahun.
Click untuk melihat Queries
```sql
-- 1) Menampilkan jumlah penggunaan masing-masing tipe pembayaran secara all time diurutkan dari yang terfavorit
SELECT payment_type, COUNT(1)
FROM order_payments_dataset
GROUP BY 1
ORDER BY 2 DESC;
-- 2)Menampilkan detail informasi jumlah penggunaan masing-masing tipe pembayaran untuk setiap tahun
SELECT
payment_type,
SUM(CASE WHEN year = 2016 THEN total ELSE 0 END) AS "2016",
SUM(CASE WHEN year = 2017 THEN total ELSE 0 END) AS "2017",
SUM(CASE WHEN year = 2018 THEN total ELSE 0 END) AS "2018",
SUM(total) AS sum_payment_type_usage
FROM (
SELECT
date_part('year', od.order_purchase_timestamp) as year,
opd.payment_type,
COUNT(opd.payment_type) AS total
FROM orders_dataset AS od
JOIN order_payments_dataset AS opd
ON od.order_id = opd.order_id
GROUP BY 1, 2
) AS sub
GROUP BY 1
ORDER BY 2 DESC;
```
Tabel 3. Hasil Analisis Tipe Pembayaran yang Digunakan Pelanggan
Gambar 8. Grafik Tipe Pembayaran yang Digunakan Pelanggan Pertahun
Mayoritas pelanggan melakukan pembayaran menggunakan kartu kredit dan cenderung mengalami peningkatan setiap tahunnya. Pembayaran menggunakan voucher meningkat pada tahun 2017, namun menurun pada tahun 2018. Hal tersebut dapat diduga karena ketersediaan voucher yang diberikan perusahaan lebih sedikit dari tahun lalu. Disisi lain, pelanggan yang melakukan pembayaran dengan kartu debit meningkat secara signifikan pada tahun 2018. Hal tersebut dapat diduga karena kemungkinan terdapat promosi pembayaran untuk kartu debit, sehingga banyak pelanggan yang tertarik untuk menggunakan metode tersebut.
---
## 📂 **STAGE 3: Summary**
- Dilihat dari analisis pertumbuhan tahunan pelanggan dapat disimpulkan bahwa **jumlah pelanggan baru dan aktif (MAU) meningkat setiap tahunnya**, namun pelanggan cenderung tidak repeat order atau hanya melakukan pembelian satu kali. Dari hal tersebut perlu adanya strategi bisnis untuk meningkatkan minat pelanggan agar melakukan pembelian misalnya dengan pemberian promo, *call to action*, dan lain sebagainya.
- Dari analisis kualitas produk tahunan, **revenue terus meningkat dengan kategori produk yang berbeda setiap tahunnya**. Kategori **kesehatan dan kecantikan** menjadi produk best seller sekaligus produk yang paling sering dibatalkan pembeliannya pada tahun 2018. Berdasarkan hasil analisis ini dapat dilakukan strategi bisnis berupa riset produk apa yang akan menjadi trend di tahun selanjutnya, sehingga diharapkan dapat memperbesar peluang perusahaan mendapatkan revenue.
- **Kartu kredit** merupakan tipe pembayaran mayoritas yang digunakan oleh pelanggan.