Data Analysis E-Commerce

Rivan Hasri
8 min readMay 15, 2023

--

1. Olist

Olist merupakan sebuah perusahaan unicorn yang didirikan oleh Tiago Dalvi di Brazil yang bergerak di bidang retail dan sudah berdiri dari sejak tahun 2015 [1].

Olist biasanya dikenal dengan Olist Store, yang menghubungkan pengecer ke pasar online untuk membantu para penjual dalam menjual produknya dengan mudah sehingga dapat merampingkan manajemen inventaris.

Kali ini, aku akan menganalisis data yang terdapat pada database Olist yang berisi banyak table dan berharap dapat menemukan insight yang cukup bagus selama proses analisis.

2. Dataset

2.1 Karakteristik Dataset

source: Brazilian E-Commerce Public Dataset by Olist | Kaggle

Berikut susunan relasi table dalam database Olist. Terdapat 8 table berisikan data yang berbeda-beda dan dihubungkan dengan database key. Pada analisis ini aku menggunakan table:

  • product
  • orders
  • order items
  • customers

Untuk mengetahui deskripsi tiap-tiap table sila berkunjung ke tautan yang ada pada di caption gambar.

3. Analysis

Untuk memudahkan apa yang mau dianalisis, aku membuat objective yang harus dijawab/diselesaikan selama proses analisis. Sehingga proses analisis memiliki arah topik yang jelas.

Sebelum melakukan analisis, kita perlu mengimport library yang diperlukan dan mengkoneksi jupyter kita ke file .db yang kita punya.

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import sqlite3

# buat koneksi ke file .db
conn = sqlite3.connect('olist.db')

# baca tabel yang diinginkan ke dalam dataframe
def read_db(table_name):
return pd.read_sql_query('SELECT * FROM ' + table_name, conn)

3.1 Perusahaan ingin mengetahui trend pertumbuhan penjualan (%)

Untuk menjawab ini, pertama-tama kita harus mengidentifikasi table mana yang sekiranya akan kita perlukan. Pertumbuhan penjualan sekurang-kurangnya harus memiliki variabel waktu dan pendapatan, dari situ kita bisa menghitung persentase pertumbuhan pendapatan perbulannya. Sehingga, kita memerlukan table order items dan table orders.

order_items_df = read_db('olist_order_items_dataset')
orders_df = read_db('olist_order_dataset')

# menggabungkan table order_items_df dengan orders_df menggunakan skema outer join
growth_month = pd.merge(order_items_df, orders_df, on='order_id', how='inner')

# mengambil kolom tertentu
growth_month = growth_month.loc[:, ['order_item_id', 'order_purchase_timestamp', 'price']]

kita coba cek informasi pada table

def info_table(df):
print('--- 10 Baris Teratas ---')
display(df.head(10))
print('--- Info Table ---\n')
df.info()
print('\n--- Jumlah Missing Value ---')
display(df.isnull().sum())

info_table(growth_month)

Proses yang aku lakukan ialah melakukan inner join pada kolom order_id lalu mengambil variabel yang relevan untuk dilakukan preprocessing data. Hasilnya kita memiliki 112.650 baris dan tidak ada missing value pada tiap-tiap variabel, namun yang perlu diperhatikan di sini ialah :

  • variabel order_purchase_timestamp, yang mana akan kita gunakan sebagai variabel waktu, masih belum terurut dan memiliki duplikat bulan yang sama sehingga perlu dilakukan grouping
  • variabel order_purchase_timestamp juga masih bertipe object, yang mana tidak sesuai dengan yang kita mau yaitu datetime. Kalau kita paksakan grouping dengan tipe data object, kemungkinan akan menimbulkan masalah nanti.
  • Variabel price merupakan harga tiap item produk, sehingga perlu kita kalikan dengan variabel order_item_id agar didapat total harga setiap satu kali order

Setelah menyelesaikan permasalahan tersebut, kita memiliki data revenue bulanan dan melanjutkan ke step terakhir yaitu menghitung persentase pertumbuhan pendapatan.

Untuk menghitung persentase pertumbuhan pendapatan kita bisa menggunakan rumus berikut lalu kita visualisasikan

Growth Rate = ((Present value - Past value) / Past value) * 100

revenue_per_month.head(10)

Setelah itu kita tinggal visualisasikan ke dalam bentuk line plot

#plt.plot(revenue_per_month['year_month'], revenue_per_month['growth_percentage'], marker='o')
sns.set(rc={'figure.figsize':(14,8)})
sns.lineplot(revenue_per_month['year_month'], revenue_per_month['growth_percentage'], marker='o')
plt.title('Trend Pertumbuhan Pendapatan')
plt.xlabel('Bulan')
plt.xticks(rotation=45)
plt.ylabel('Pertumbuhan (%)')
plt.show()

Pertumbuhan pendapatan cukup signifikan berubah-ubah, namun jika dilihat lebih detail terdapat pola dari bulan Januari 2018 hingga Agustus 2018 pertumbuhan pendapatan mulai mengalami stagnasi. Jika ini dibiarkan lebih lanjut, maka akan berpotensi mengalami penurunan. Sehingga, perlu dilakukan beberapa strategi bisnis dan marketing agar bulan-bulan selanjutnya bisa memiliki pertumbuhan yang sehat.

3.2 Perusahaan ingin mengetahui total pendapatan tiap bulan

Persentase pertumbuhan pendapatan tidak dapat melihat insight secara keseluruhan, kadang grafik menunjukkan adanya penurunan namun ternyata mengalami kenaikan dari segi total pendapatan meski tidak signifikan. Oleh sebab itu, untuk melihat secara objektif kita juga perlu menganalisis total pendapatan yang didapat tiap bulan.

Total pendapatan di sini, aku menghitung dari total penjualan barang tiap toko, aku tau itu bias karena biasanya biaya jasa aplikasi hanya beberapa persen dari total harga order tiap item. Namun, ini bisa menjadi gambaran awal sampai ketika kita memiliki data yang relevan.

Kita bisa memanfaatkan data sebelumnya, sehingga kita bisa langsung melakukan visualisasi

sns.set(rc={'figure.figsize':(14,8)})
sns.lineplot(revenue_per_month['year_month'], revenue_per_month['price'], marker='o')
sns.barplot(data = revenue_per_month, x='year_month', y='price', alpha=0.8 ,color='mediumspringgreen', dodge=False)
plt.title('Trend Total Pendapatan')
plt.xlabel('Bulan')
plt.xticks(rotation=45)
plt.ylabel('Pendapatan (Million)')
plt.show()

Ini yang aku bilang sebelumnya, meskipun terlihat mengalami penurunan pada persentase pertumbuhan pendapatan, bukan berarti pendapatan yang diterima juga mengalami penuruna. Grafik di atas memiliki trend kenaikan yang cukup sehat, namun 3 bulan terakhir terlihat tidak adanya kenaikan.

Kita tidak bisa menyimpulkan secara pasti apa penyebabnya jika tidak melihat trend data nya secara keseluruhan hingga akhir tahun 2018 dan isu ekonomi apa yang terjadi di Brazil pada waktu tersebut, sehingga seperti yang aku paparkan sebelumnya, jika hal ini tidak diatasi secara cepat maka ke depannya bisa saja trend nya akan berubah sehingga mengalami penurunan.

3.3 Perusahaan ingin mengetahui kota mana yang menjadi kunci penjualan

Untuk menentukan strategi bisnis dan marketing, kadang kala scope marketing yang kita buat tidak bisa mengcover seluruh wilayah bisnis kita, namun hanya dapat berfokus pada beberapa kota saja. Hal ini bisa terjadi karena beberapa faktor, salah satunya ialah karena terbatasnya sumber daya yang dipunya oleh perusahaan.

Oleh sebab itu, dengan menganalisis kota mana yang memiliki penjualan tertinggi, bisa menjadi insight menarik. Sehingga, kita bisa menerapkan strategi bisnis dan marketing kepada kota-kota tersebut.

Pertama-tama, kita perlu mengidentifikasi table mana yang akan kita butuhkan. Kita membutuhkan kota para customer dan total penjualan/pendapatan, maka yang digunakan adalah table customer, orders, dan order items. Semuanya akan kita lakukan inner join untuk menghindari data missing value pada kolom yang kita inginkan.

cust_df = read_db('olist_order_customer_dataset')

# menggabungkan table cust_df dengan orders_df menggunakan skema inner join
cust_order_region = pd.merge(cust_df, orders_df, on='customer_id', how='inner')
cust_order_region = pd.merge(cust_order_region, order_items_df, on='order_id', how='inner')

# mengambil kolom tertentu
cust_order_region['price'] = cust_order_region['price'] * cust_order_region['order_item_id']
cust_order_region = cust_order_region.loc[:, ['customer_id', 'customer_city', 'price']]

# menampilkan informasi table
info_table(cust_order_region)

Jika kita explore lebih jauh, kolom customer_id memiliki nilai unik sebanyak 98.666, ini artinya ada data duplikat pada kolom customer_id. Hal itu wajar, karena mungkin 1 customer pernah melakukan lebih dari 1 transaksi order. Oleh hal demikian, kita perlu grouping kolom price dengan customer_id, lalu kita grouping kembali dengan customer_city agar kita dapat memiliki kolom yang unik 100%.

Kita tinggal melakukan visualisasi, karena jumlah kotanya yang terlalu banyak mungkin akan diambil 10 kota tertinggi saja. Berikut visualisasinya

Kota Sao Paulo memiliki total penjualan yang paling tinggi dan paling signifikan dibandingkan dengan kota-kota lainnya. Ini akan menjadi bahan penelitian yang menarik selanjutnya, mengapa hal demikian bisa terjadi.

10 kota tersebut bisa menjadi pusat strategi bisnis dan marketing perusahaan Olist, namun apabila sumber daya yang dimiliki sangat terbatas, kita bisa memusatkannya lagi sehingga hanya 2 kota saja yaitu Sao Paulo dan Rio de Janeiro.

3.4 Perusahaan ingin mengetahui RCR (Return Customer Rate) setiap bulan

Return Customer Rate (RCR) merupakan sebuah metrik yang mengukur jumlah persentase customer yang kembali untuk melakukan pembelian lebih lanjut setelah melakukan transaksi pertamanya [2]. RCR berguna untuk mengetahui seberapa loyal dan puas customer terhadap produk atau layanan yang kita tawarkan.

RCR dapat dihitung menggunakan rumus berikut.

RCR = (Jumlah customer berulang / Total customer) * 100

Berdasarkan rumus di atas, kira-kira variabel yang kita butuhkan ialah customer id dan tanggal order.

return_cust_rate = pd.merge(cust_df, orders_df, on='customer_id', how='outer')
return_cust_rate = pd.merge(return_cust_rate, order_items_df, on='order_id', how='outer')

# mengambil kolom tertentu
return_cust_rate = return_cust_rate.loc[:, ['customer_id', 'order_purchase_timestamp']]

variabel order_purchase_timestamp perlu kita ubah menjadi tipe datetime sebelum kita lakukan grouping. Setelah itu, kita akan memfilter customer yang memiliki duplikat atau berulang, lalu kita lakukan grouping dengan variabel time sehingga kita bisa mendapatkan jumlah pelanggan berulang.

Jika kita telah mendapatkan semua syarat pada rumus RCR, yang tinggal kita lakukan hanyalah kalkulasi dan hasil table nya seperti ini.

Setelah itu kita lakukan visualisasi lineplot.

Dapat dilihat, pergerakannya cukup berubah-ubah dan tidak memiliki kecenderungan trend apapun. Bulan Juli dan Desember merupakan 2 bulan yang terburuk bagi Olist. Tiga grafik yang telah kita buat memiliki pola yang sama, pertengahan dan akhir tahun merupakan suatu tantangan bagi perusahaan Olist. Namun, selalu ada pola yang sama yaitu awal tahun selalu mengalami kenaikan dibanding bulan sebelumnya.

3.5 Perusahaan ingin mengetaui AOV (Average Order Value) setiap bulannya

Average Order Value adalah sebuah metrik untuk mengukur jumlah rata-rata uang yang dikeluarkan oleh customer per 1 order [3]. Dengan meningkatkan AOV, perusahaan dapat meningkatakan pendapatan tanpa harus mencari pelanggan baru.

Rumus AOV sebagai berikut.

AOV = Total revenue / Number of orders

Untuk mendapatkan nilai AOV, kita memerlukan kolom order_id, price, dan tanggal order. Total revenue perbulan sudah kita dapatkan pada objektif sebelumnya yaitu variabel revenue_per_month. Sehingga, kita hanya mencari jumlah order perbulan. Caranya masih sama dengan cara-cara di atas, yaitu dengan grouping kolom order_id dengan order_purchase_timestamp, namun sebelumnya variabel order_purchase_timestamp perlu diubah ke tipe datetime.

Setelah dilakuakan preprocessing, maka hasil nya akan menjadi seperti ini

3.6 Perusahaan ingin melihat kategori produk yang paling diminati

Sekarang, kita ingin melihat kategori produk apa yang paling banyak terjual sehingga perusahaan dapat memberikan strategi marketing pada produk-produk tersebut.

Caranya sangat mudah, yang aku lakukan hanya grouping jumlah item tiap order dengan kategori produk lalu dijumlahkan. Sehingga didapat hasil seperti berikut.

Cama_mesa_banho jika diterjemahkan ialah bed_bath_table atau dengan kata lain produk peralatan rumah tangga menjadi salah satu kategori produk yang laris terjual dibandingkan produk lainnya.

Sebenarnya grafik ini belum bisa menggambarkan permasalahan secara utuh, kita perlu melihat pertumbuhan sales di tiap-tiap kategori produk.

4. Konklusi

Dapat disimpulkan, perusahaan perlu membuat strategi bisnis dan marketing secepatnya mengingat pertumbuhan pendapatan yang mengalami penurunan dibandingkan awal tahun 2017, jika dibiarkan kemungkinan perusahaan akan mengalami kerugian di tahun mendatang.

Strategi bisnis dan marketing perlu dilakukan dengan memerhatikan beberapa faktor, salah satunya sumber daya yang perusahaan punya. Oleh sebab itu, dengan menganalisis kota yang memiliki sales tertinggi, atau menganalisis segmentasi customer bisa menjadi acuan yang sangat penting dalam memulai strategi tersebut.

5. Referensi

[1] Analysis of Brazilian E-Commerce Datasets — Olist | by Owen | Medium
[2] Return Customer Rate — Vibetrace
[3] What is Average Order Value? — Storyly

Terima kasih!

--

--

Rivan Hasri
Rivan Hasri

Written by Rivan Hasri

just the sidekick character who's into data

No responses yet