, October 02, 2022

0 kết quả được tìm thấy

Data Driven Growth (P.1): Bước đầu tiên hãy hiểu rõ những chỉ số chính.

  • Đăng bởi  Pum
  •  Mar 04, 2022

  •   14 min reads
Data Driven Growth (P.1): Bước đầu tiên hãy hiểu rõ những chỉ số chính.

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.

Bài viết cùng seri

Bài viết liên quan

Master data là gì? Sự khác nhau giữa Master data và Transaction data

Master data là tập hợp các định danh thống nhất và các thuộc tính mở rộng. Nó mô tả các thực thể cốt lõi của doanh nghiệp bao gồm khách hàng,.......

Master data là gì? Sự khác nhau giữa Master data và Transaction data
Danh mục các loại biểu đồ trong Data Visualization

Bạn có thể tìm thấy danh sách các loại biểu đồ, nó sẽ hoạt động như một hướng dẫn đầy hữu ích giúp bạn lựa chọn được biểu đồ phù hợp với nhu cầu của bản thân....

Danh mục các loại biểu đồ trong Data Visualization
Data Analysis with Excel: Analysis ToolPak

Bộ công cụ Analysis ToolPak trên Excel sẽ giúp bạn tiết kiệm thời gian và đơn giản hóa các bước phân tích dữ liệu tài chính, thống kê ....

Data Analysis with Excel: Analysis ToolPak
Data Analysis with Excel: Solver

Excel có một công cụ được gọi là solver cung cấp các lệnh và các tính năng tùy chỉnh để giải quyết các vấn đề quyết định....

Data Analysis with Excel: Solver
Data Analysis with Excel: What-If Analysis

What-If Analysis trong Excel cho phép bạn thử các giá trị (scenarios) khác nhau cho các công thức....

Data Analysis with Excel: What-If Analysis
You've successfully subscribed to 200Lab Blog
Great! Next, complete checkout for full access to 200Lab Blog
Xin chào mừng bạn đã quay trở lại
OK! Tài khoản của bạn đã kích hoạt thành công.
Success! Your billing info is updated.
Billing info update failed.
Your link has expired.