Series bài viết này được thiết kế một cách đơn giản để hướng dẫn bạn cách sử dụng Python. Bạn có thể áp dụng phương pháp predictive cho các hoạt động của công ty từ đó thúc đẩy sự phát triển của nó. Quá trình này là sự kết hợp của kiến thức lập trình, phân tích dữ liệu và machine learning.
Trong từng bài viết sẽ có các đoạn code ví dụ để bạn có thể dễ dàng áp dụng kiến thức hơn. Nếu bạn chưa quen với lập trình, bạn có thể bắt đầu tìm hiểu về Pandas (một thư viện nổi tiếng của python). Nếu bạn cũng không muốn đụng gì tới code thì cũng không sao cả. Series này sẽ cung cấp cho bạn các khái niệm, cách để sử dụng dữ liệu và tạo ra giá trị từ những dữ liệu thô đó.
Tony Stark từng nói: “ Đôi khi bạn phải chạy trước khi có thể đi bộ”
Như một điều kiện tiên quyết, hãy đảm bảo rằng Jupyter Notebook và Python đã được cài đặt trên máy tính của bạn. Các code snippets sẽ chỉ chạy trên Jupyter Notebook.
Các bạn đã sẵn sàng chưa, chúng ta cùng bắt đầu thôi nào!
Bạn còn nhớ chiếc là bàn nổi tiếng của thuyền trưởng Sparrpow không? Chiếc la bàn ấy đã giúp anh ta thấy được vị trí mà ảnh muốn đến. Chỉ số North Star Metric là chỉ số giúp chúng ta nhìn ra được phương hướng giống như chiếc là bàn của Sparrow.
Trước khi đi vào viết code, bạn cần hiểu chính xác North Star Metric là gì? Nếu bạn đã biết và theo dõi chỉ số này từ trước thì bài viết dưới đây sẽ giúp bạn thực hiện phân tích sâu hơn với Python. Hoặc nếu bạn chưa biết thì cũng không sao cả, vì có thể bạn đã biết đến khái niệm này rồi nhưng nó không được đặt tên là North Star. Dưới đây là cách Sean Ellis mô tả nó:
Chỉ số North Star Metric là chỉ số duy nhất nắm bắt tốt nhất giá trị cốt lõi mà sản phẩm của bạn mang lại cho khách hàng.
Chỉ số này phụ thuộc vào sản phẩm, định vị, mục tiêu và nhiều yếu tố khác của công ty bạn. Trong những ví dụ dưới đây, chúng ta sẽ sử dụng tập dữ liệu mẫu của một cửa hàng bán lẻ trực tuyến. Hãy xem dữ liệu của chúng ta sẽ trông như thế nào trên jupyter notebook nhé!
Doanh thu hàng tháng
Hãy import những thư viện cần thiết và đọc dữ liệu từ file CSV với sự trở giúp của pandas nhé:
# import libraries
from datetime import datetime, timedelta
import pandas as pd
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from __future__ import division
import plotly.plotly as py
import plotly.offline as pyoff
import plotly.graph_objs as go
#initiate visualization library for jupyter notebook
pyoff.init_notebook_mode()
tx_data = pd.read_csv('data.csv')
tx_data.head(10)
Dữ liệu sẽ trông như thế này:
Chúng có tất cả thông tin quan trọng mà chúng ta cần:
- Customer ID (ID khách hàng)
- Unit Price (Đơn giá)
- Quantity (Định lượng)
- Invoice Date (Ngày lập hóa đơn)
Với tất cả các tính năng này, chúng ta có thể xây dựng phương trình North Star Metric của mình theo công thức:
Doanh thu = Số lượng khách hàng đang hoạt động * Số lượng đơn đặt hàng * Doanh thu trung bình trên mỗi đơn hàng
Đã đến lúc chúng ta phải tự bắt tay vào làm nếu muốn xem doanh thu hàng tháng vì không có bữa trưa nào là miễn phí cả. Hãy tự thiết kế dữ liệu của chính mình.
#converting the type of Invoice Date Field from string to datetime.
tx_data['InvoiceDate'] = pd.to_datetime(tx_data['InvoiceDate'])
#creating YearMonth field for the ease of reporting and visualization
tx_data['InvoiceYearMonth'] = tx_data['InvoiceDate'].map(lambda date: 100*date.year + date.month)
#calculate Revenue for each row and create a new dataframe with YearMonth - Revenue columns
tx_data['Revenue'] = tx_data['UnitPrice'] * tx_data['Quantity']
tx_revenue = tx_data.groupby(['InvoiceYearMonth'])['Revenue'].sum().reset_index()
tx_revenue
Dưới đây là ví dụ về dữ liệu hiển thị doanh thu hàng tháng:
Bước tiếp theo, chúng ta sẽ hình dung về một biểu đồ đường
Jupyter notebook output:
Điều này cho thấy rõ ràng doanh thu của chúng ta đang tăng lên, đặc biệt là ngày 11 tháng 8 trở đi ( dữ liệu trong tháng 12 chưa đầy đủ). Con số này khá ổn, hãy cùng tìm hiểu xem tỷ lệ tăng trưởng doanh thu hàng tháng của chúng ta:
#using pct_change() function to see monthly percentage change
tx_revenue['MonthlyGrowth'] = tx_revenue['Revenue'].pct_change()
#showing first 5 rows
tx_revenue.head()
#visualization - line graph
plot_data = [
go.Scatter(
x=tx_revenue.query("InvoiceYearMonth < 201112")['InvoiceYearMonth'],
y=tx_revenue.query("InvoiceYearMonth < 201112")['MonthlyGrowth'],
)
]
plot_layout = go.Layout(
xaxis={"type": "category"},
title='Montly Growth Rate'
)
fig = go.Figure(data=plot_data, layout=plot_layout)
pyoff.iplot(fig)
Mọi thứ có vẻ thuận lợi vì chúng đã tăng trưởng 36,5% vào tháng trước (tháng 12 bị loại trừ trong mã do nó chưa được hoàn thành). Nhưng chúng ta cần xác định chính xác điều gì đã xảy ra vào tháng Tư. Do khách hàng ít đặt hàng hơn? Hay do họ muốn mua những sản phẩm rẻ hơn? Chúng ta sẽ chẳng thể biết được tâm lý khách hàng nếu chúng ta không thực hiện một phân tích sâu hơn.
Khách hàng hoạt động hàng tháng
Để xem chi tiết khách hàng hoạt động hàng tháng, chúng ta sẽ thực hiện tương tự các bước như bên doanh thu bán hàng. Bắt đầu từ phần này, chúng ta sẽ chỉ tập trung vào dữ liệu của Vương quốc Anh (nơi có nhiều hồ sơ nhất). Chúng ta có thể thấy được khách hàng hoạt động hàng tháng bằng cách đếm các CustomerIDs.
#creating a new dataframe with UK customers only
tx_uk = tx_data.query("Country=='United Kingdom'").reset_index(drop=True)
#creating monthly active customers dataframe by counting unique Customer IDs
tx_monthly_active = tx_uk.groupby('InvoiceYearMonth')['CustomerID'].nunique().reset_index()
#print the dataframe
tx_monthly_active
#plotting the output
plot_data = [
go.Bar(
x=tx_monthly_active['InvoiceYearMonth'],
y=tx_monthly_active['CustomerID'],
)
]
plot_layout = go.Layout(
xaxis={"type": "category"},
title='Monthly Active Customers'
)
fig = go.Figure(data=plot_data, layout=plot_layout)
pyoff.iplot(fig)
Chúng ta sẽ có đoạn mã và kết quả như sau: Số lượng khách hàng hoạt động mỗi tháng và biểu đồ cột của nó:
Vào tháng 4, số lượng khách hàng hoạt động hàng tháng giảm xuống từ 923 còn 817 ( giảm 11,5%).
Chúng ta cũng sẽ thấy xu hướng tương tự đối với số lượng đơn đặt hàng.
Số lượng đơn hàng hàng tháng
Chúng ta sẽ áp dụng cùng một code bằng cách sử dụng trường Quantity:
#create a new dataframe for no. of order by using quantity field
tx_monthly_sales = tx_uk.groupby('InvoiceYearMonth')['Quantity'].sum().reset_index()
#print the dataframe
tx_monthly_sales
#plot
plot_data = [
go.Bar(
x=tx_monthly_sales['InvoiceYearMonth'],
y=tx_monthly_sales['Quantity'],
)
]
plot_layout = go.Layout(
xaxis={"type": "category"},
title='Monthly Total # of Order'
)
fig = go.Figure(data=plot_data, layout=plot_layout)
pyoff.iplot(fig)
Số lượng đơn đặt hàng hàng tháng và biểu đồ cột của nó:
Đúng như chúng ta dự đoán, số lượng đơn đặt hàng cũng giảm trong tháng 4 từ 279 nghìn xuống còn 257 nghìn (giảm 8%)
Số lượng khách hàng đang hoạt động sẽ ảnh hưởng trực tiếp đến số lượng đơn đặt hàng. Để chắc chắn hơn, chúng ta nên kiểm tra cả doanh thu trung bình trên mỗi đơn đặt hàng của khách.
Doanh thu trung bình trên mỗi đơn đặt hàng
Để có được số liệu này, chúng ta cần tính toán doanh thu trung bình cho mỗi tháng:
# create a new dataframe for average revenue by taking the mean of it
tx_monthly_order_avg = tx_uk.groupby('InvoiceYearMonth')['Revenue'].mean().reset_index()
#print the dataframe
tx_monthly_order_avg
#plot the bar chart
plot_data = [
go.Bar(
x=tx_monthly_order_avg['InvoiceYearMonth'],
y=tx_monthly_order_avg['Revenue'],
)
]
plot_layout = go.Layout(
xaxis={"type": "category"},
title='Monthly Order Average'
)
fig = go.Figure(data=plot_data, layout=plot_layout)
pyoff.iplot(fig)
Doanh thu trung bình hàng tháng trên mỗi đơn đặt hàng và biểu đồ cột của nó:
Mức trung bình đặt hàng hàng tháng cũng giảm trong tháng 4 (16,7 xuống còn 15,8). Chúng ta đã quan sát thấy sự chậm lại trong mọi chỉ số ảnh hưởng đến North Star .
Chúng ta đã xem xét hết các chỉ số và tất nhiên là còn có nhiều các chỉ số hơn nữa và nó khác nhau giữa các ngành. Hãy tiếp tục điều tra một số chỉ số quan trọng khác như:
- Tỷ lệ khách hàng mới: chỉ số này giúp chúng ta nắm được việc chúng ta có đang đánh mất khách hàng hiện tại hoặc có đang làm tốt việc thu hút được khách hàng mới hay không.
- Tỷ lệ giữ chân khách hàng: Được biết đến là chỉ số quan trọng. Cho biết số lượng khách hàng chúng ta giữ chân trong một khoảng thời gian cụ thể.
Tỷ lệ khách hàng mới
Đầu tiên chúng ta nên xác định đâu là khách hàng mới. Trong tập dữ liệu mà chúng ta có, chúng ta có thể giả định một khách hàng mới là người đã mua hàng đầu tiên trong khoảng thời gian mà chúng ta đã xác định.
Chúng ta sẽ sử dụng hàm .min () để tìm ngày mua hàng đầu tiên cho từng khách hàng và xác định khách hàng mới dựa trên đó. Đoạn code dưới đây sẽ áp dụng hàm này và hiển thị cho chúng ta bảng phân tích doanh thu cho từng nhóm hàng tháng.
#create a dataframe contaning CustomerID and first purchase date
tx_min_purchase = tx_uk.groupby('CustomerID').InvoiceDate.min().reset_index()
tx_min_purchase.columns = ['CustomerID','MinPurchaseDate']
tx_min_purchase['MinPurchaseYearMonth'] = tx_min_purchase['MinPurchaseDate'].map(lambda date: 100*date.year + date.month)
#merge first purchase date column to our main dataframe (tx_uk)
tx_uk = pd.merge(tx_uk, tx_min_purchase, on='CustomerID')
tx_uk.head()
#create a column called User Type and assign Existing
#if User's First Purchase Year Month before the selected Invoice Year Month
tx_uk['UserType'] = 'New'
tx_uk.loc[tx_uk['InvoiceYearMonth']>tx_uk['MinPurchaseYearMonth'],'UserType'] = 'Existing'
#calculate the Revenue per month for each user type
tx_user_type_revenue = tx_uk.groupby(['InvoiceYearMonth','UserType'])['Revenue'].sum().reset_index()
#filtering the dates and plot the result
tx_user_type_revenue = tx_user_type_revenue.query("InvoiceYearMonth != 201012 and InvoiceYearMonth != 201112")
plot_data = [
go.Scatter(
x=tx_user_type_revenue.query("UserType == 'Existing'")['InvoiceYearMonth'],
y=tx_user_type_revenue.query("UserType == 'Existing'")['Revenue'],
name = 'Existing'
),
go.Scatter(
x=tx_user_type_revenue.query("UserType == 'New'")['InvoiceYearMonth'],
y=tx_user_type_revenue.query("UserType == 'New'")['Revenue'],
name = 'New'
)
]
plot_layout = go.Layout(
xaxis={"type": "category"},
title='New vs Existing'
)
fig = go.Figure(data=plot_data, layout=plot_layout)
pyoff.iplot(fig)
Đầu ra sẽ hợp nhất với ngày mua đầu tiên:
Doanh thu mỗi tháng cho khách hàng mới và hiện tại:
Biểu đồ đường ở trên:
Khách hàng hiện tại đang có xu hướng tăng lên nhưng khách hàng mới lại có xu hướng giảm nhẹ.
Hãy có cái nhìn rõ hơn bằng cách xem xét tỷ lệ khách hàng mới:
#create a dataframe that shows new user ratio - we also need to drop NA values (first month new user ratio is 0)
tx_user_ratio = tx_uk.query("UserType == 'New'").groupby(['InvoiceYearMonth'])['CustomerID'].nunique()/tx_uk.query("UserType == 'Existing'").groupby(['InvoiceYearMonth'])['CustomerID'].nunique()
tx_user_ratio = tx_user_ratio.reset_index()
tx_user_ratio = tx_user_ratio.dropna()
#print the dafaframe
tx_user_ratio
#plot the result
plot_data = [
go.Bar(
x=tx_user_ratio.query("InvoiceYearMonth>201101 and InvoiceYearMonth<201112")['InvoiceYearMonth'],
y=tx_user_ratio.query("InvoiceYearMonth>201101 and InvoiceYearMonth<201112")['CustomerID'],
)
]
plot_layout = go.Layout(
xaxis={"type": "category"},
title='New Customer Ratio'
)
fig = go.Figure(data=plot_data, layout=plot_layout)
pyoff.iplot(fig)
Tỷ lệ khách hàng mới đã giảm đúng như dự kiến (chúng ta giả định vào tháng 2, tất cả khách hàng đều là người mới) và đang ở mức khoảng 20%.
Tỷ lệ giữ chân khách hàng hàng tháng
Tỷ lệ duy trì này nên được theo dõi chặt chẽ vì nó cho biết mức độ hấp dẫn của dịch vụ và sản phẩm của bạn có phù hợp với thị trường người mua hàng không. Để hiển thị tỷ lệ giữ chân hàng tháng, chúng ta cần tính toán xem có bao nhiêu khách hàng mà chúng ta đã giữ chân được từ tháng trước.
Tỷ lệ giữ chân hàng tháng = Khách hàng được giữ lại từ trước. Tổng số khách hàng đang hoạt động / tháng
Chúng ta sẽ sử dụng hàm crosstab () của pandas, giúp việc tính tỷ lệ giữ chân khách hàng trở nên cực kỳ dễ dàng.
#identify which users are active by looking at their revenue per month
tx_user_purchase = tx_uk.groupby(['CustomerID','InvoiceYearMonth'])['Revenue'].sum().reset_index()
#create retention matrix with crosstab
tx_retention = pd.crosstab(tx_user_purchase['CustomerID'], tx_user_purchase['InvoiceYearMonth']).reset_index()
tx_retention.head()
#create an array of dictionary which keeps Retained & Total User count for each month
months = tx_retention.columns[2:]
retention_array = []
for i in range(len(months)-1):
retention_data = {}
selected_month = months[i+1]
prev_month = months[i]
retention_data['InvoiceYearMonth'] = int(selected_month)
retention_data['TotalUserCount'] = tx_retention[selected_month].sum()
retention_data['RetainedUserCount'] = tx_retention[(tx_retention[selected_month]>0) & (tx_retention[prev_month]>0)][selected_month].sum()
retention_array.append(retention_data)
#convert the array to dataframe and calculate Retention Rate
tx_retention = pd.DataFrame(retention_array)
tx_retention['RetentionRate'] = tx_retention['RetainedUserCount']/tx_retention['TotalUserCount']
#plot the retention rate graph
plot_data = [
go.Scatter(
x=tx_retention.query("InvoiceYearMonth<201112")['InvoiceYearMonth'],
y=tx_retention.query("InvoiceYearMonth<201112")['RetentionRate'],
name="organic"
)
]
plot_layout = go.Layout(
xaxis={"type": "category"},
title='Monthly Retention Rate'
)
fig = go.Figure(data=plot_data, layout=plot_layout)
pyoff.iplot(fig)
Đầu tiên, chúng ta sẽ tạo khung dữ liệu hiển thị tổng doanh thu hàng tháng cho mỗi khách hàng:
Hàm crosstab () chuyển nó thành bảng lưu giữ:
Bảng tỷ lệ giữ chân cho chúng ta biết những khách hàng nào đang hoạt động hàng tháng.
Với sự trợ giúp của vòng lặp for đơn giản, cho mỗi tháng, chúng ta sẽ tính được số lượng khách hàng duy trì từ tháng trước và tổng số khách hàng.
Cuối cùng, chúng ta có dataframe về tỷ lệ giữ chân khách hàng và một biểu đồ đường bên dưới đây:
Tỷ lệ giữ chân khách hàng đã tăng đáng kể trong khoảng thời gian từ tháng 6 đến tháng 8.
Tỷ lệ duy trì khách hàng dựa trên Cohort
Có một cách khác để tính tỷ lệ giữ chân khách hàng ngoài cách trên đó là cách đo tỷ lệ duy trì của khách hàng dựa trên Cohort. Cohort sẽ được xác định là tháng mua hàng đầu tiên trong năm của khách. Chúng ta sẽ đo lường phần trăm khách hàng được giữ lại sau lần mua hàng đầu tiên của họ trong mỗi tháng. Chế độ xem này sẽ giúp chúng ta biết được cohort gần đây và nhóm cũ khác nhau như thế nào về tỷ lệ giữ chân khách. Và liệu những thay đổi gần đây trong trải nghiệm của khách hàng có ảnh hưởng đến tỷ lệ giữ chân của khách hàng mới hay không.
Điều này sẽ phức tạp hơn một chút so với những người khác về mặt mã hóa.
#create our retention table again with crosstab() and add firs purchase year month view
tx_retention = pd.crosstab(tx_user_purchase['CustomerID'], tx_user_purchase['InvoiceYearMonth']).reset_index()
tx_retention = pd.merge(tx_retention,tx_min_purchase[['CustomerID','MinPurchaseYearMonth']],on='CustomerID')
new_column_names = [ 'm_' + str(column) for column in tx_retention.columns[:-1]]
new_column_names.append('MinPurchaseYearMonth')
tx_retention.columns = new_column_names
#create the array of Retained users for each cohort monthly
retention_array = []
for i in range(len(months)):
retention_data = {}
selected_month = months[i]
prev_months = months[:i]
next_months = months[i+1:]
for prev_month in prev_months:
retention_data[prev_month] = np.nan
total_user_count = tx_retention[tx_retention.MinPurchaseYearMonth == selected_month].MinPurchaseYearMonth.count()
retention_data['TotalUserCount'] = total_user_count
retention_data[selected_month] = 1
query = "MinPurchaseYearMonth == {}".format(selected_month)
for next_month in next_months:
new_query = query + " and {} > 0".format(str('m_' + str(next_month)))
retention_data[next_month] = np.round(tx_retention.query(new_query)['m_' + str(next_month)].sum()/total_user_count,2)
retention_array.append(retention_data)
tx_retention = pd.DataFrame(retention_array)
tx_retention.index = months
#showing new cohort based retention table
tx_retention
view rawg1_cohort_retention.py hosted with ❤ by GitHub
Tx_retention có quan điểm rõ ràng trong cách tính tỷ lệ giữ chân khách dựa trên Cohort:
Chúng ta có thể thấy rằng tỷ lệ giữ chân khách trong tháng đầu tiên đã trở nên tốt hơn trong thời gian gần đây (không tính đến ngày 11 tháng 12) và trong gần 1 năm trở lại đây, trong đó có 15% khách hàng mà chúng ta đã giữ chân được.
Cuối cùng chúng ta đã biết cách tính các số liệu của mình cũng như cách theo dõi và phân tích chúng bằng Python.
Trong bài viết tiếp theo (phần 2), chúng ta sẽ cùng tìm hiểu để xem ai là khách hàng tốt nhất, hẹn gặp lại các bạn trong bài viết tiếp theo.
Bài viết được dịch từ đây.
Pum
Life is short. Smile while you still have teeth :)
Bài viết liên quan
Database (Cơ sở dữ liệu) là gì? Những loại Database phổ biến nhất hiện nay
Sep 01, 2024 • 11 min read
Python là gì? Những đặc điểm nổi bật và Ứng dụng của Python
Aug 28, 2024 • 14 min read
Ứng dụng Hypothesis Testing - Kiểm định giả thuyết trong Y học
Jul 18, 2024 • 8 min read
Google Colab là gì? Hướng dẫn sử dụng Google Colab cho người mới
Jul 02, 2024 • 10 min read
Hướng dẫn cách lấy dữ liệu Facebook Ads Tự động Mỗi ngày Miễn phí - Phần 2
Jun 24, 2024 • 6 min read
Hướng dẫn cách lấy dữ liệu Facebook Ads Tự động Mỗi ngày Miễn phí- Phần 1
Jun 24, 2024 • 11 min read