고객 생애가치(Customer Lifetime Value, CLV)는 고객이 회사와의 관계 동안 생성하는 총 가치를 나타내는 지표입니다. 구글 스프레드시트를 사용하여 고객의 생애가치를 계산하는 방법은 다음과 같습니다:
스프레드시트 열 만들기: 스프레드시트의 첫 번째 열에는 고객의 고유 식별자, 이름 또는 ID와 같은 정보를 입력합니다. 두 번째 열부터는 해당 고객의 구매 기록, 결제 금액, 구매 날짜 등의 데이터를 입력합니다.
평균 구매 금액 계산: 평균 구매 금액은 해당 고객이 회사에서 평균적으로 얼마를 소비하는지를 나타냅니다. 구매 금액 열의 데이터를 사용하여 각 고객의 평균 구매 금액을 계산합니다.
구매 빈도 계산: 고객의 구매 빈도는 회사에서 고객이 평균적으로 얼마나 자주 구매하는지를 나타냅니다. 구매 날짜 열의 데이터를 사용하여 각 고객의 구매 빈도를 계산합니다.
고객 생애 기간 계산: 고객 생애 기간은 해당 고객이 회사와 유지되는 평균 기간을 나타냅니다. 첫 번째 구매 날짜와 마지막 구매 날짜를 사용하여 각 고객의 생애 기간을 계산합니다.
생애가치 계산: 평균 구매 금액과 구매 빈도를 사용하여 각 고객의 연간 구매 금액을 계산합니다. 그런 다음, 연간 구매 금액을 고객 생애 기간으로 곱하여 고객의 생애가치를 계산합니다.
총 생애가치 합산: 모든 고객의 생애가치를 합산하여 회사의 전체 고객 생애가치를 계산합니다.
스프레드시트 고객생애가치 템플릿
https://docs.google.com/spreadsheets/d/1jzYlupssRB9vSNbcSgvnu-cbfsRWyATjNnCSCPUViVM/edit?usp=sharing
실제 고객 데이터를 기반으로 고객의 생애가치를 계산해본 결과 입니다.
고객생애가치를 계산하면 좋은 점
LTV(Lifetime Value) 계산은 기업과 브랜드에 다양한 이점을 제공합니다. 이를 통해 기업은 고객의 가치를 정량화하고 고객을 효과적으로 관리할 수 있으며, 브랜드에 도움이 되는 이유는 다음과 같습니다.
고객 관리 및 유지: LTV 계산은 기업이 고객을 효과적으로 관리하고 유지하는 데 도움을 줍니다. 고객이 회사와의 관계 동안 생성하는 가치를 파악하면, 기업은 이를 바탕으로 개별 고객에게 맞춤형 서비스와 마케팅 전략을 구축할 수 있습니다. 더불어 LTV는 고객 이탈 가능성을 예측하는 데도 도움이 되어, 이탈 가능성이 높은 고객에게 개별적인 대응을 할 수 있습니다.
마케팅 예산 최적화: LTV 계산은 마케팅 예산을 효율적으로 분배할 수 있는 기준을 제공합니다. 고객마다 다른 LTV를 가지고 있으므로, 기업은 고객 그룹별로 마케팅 예산을 할당하여 최대한의 효과를 얻을 수 있습니다. 예를 들어, 높은 LTV를 가진 고객 그룹에 집중적으로 마케팅을 진행하면 ROI(투자수익률)를 높일 수 있습니다.
고객 가치 기반의 의사 결정: LTV는 기업이 전략적인 의사 결정을 내리는 데 도움을 줍니다. 기업은 LTV를 분석하여 어떤 고객이 가장 가치 있는지, 어떤 제품이 가장 수익성이 높은지 등을 파악할 수 있습니다. 이를 통해 제품 라인업 개발, 가격 정책, 고객 서비스 개선 등 다양한 영역에서 더 나은 결정을 내릴 수 있습니다.
브랜드 강화와 고객 충성도: LTV 계산은 고객 충성도를 분석하는 데도 활용됩니다. 고객이 오랫동안 회사와의 관계를 유지하고 추가 구매를 해주는 경우, 브랜드에 대한 충성도가 높은 것으로 해석할 수 있습니다. 이를 통해 기업은 충성도가 높은 고객을 보다 효과적으로 유지하고, 브랜드 이미지를 강화할 수 있습니다.
경쟁 우위 확보: LTV 계산은 경쟁 우위를 확보하는 데에도 도움을 줍니다. 경쟁사보다 더 높은 LTV를 가진 고객을 유지하고 확보함으로써, 기업은 경쟁력을 강화하고 시장 점유율을 높일 수 있습니다. 이는 브랜드의 장기적인 성장과 영향력 확대에 도움을 줍니다.
이러한 이유로 LTV 계산은 브랜드에 많은 가치를 제공합니다. 기업은 고객 관리와 마케팅 전략을 LTV에 기반하여 최적화할 수 있으며, 고객의 가치를 식별하여 그에 맞는 서비스와 경험을 제공함으로써 브랜드의 성장과 발전을 이끌어낼 수 있습니다.
LTV 계산식 만들기 (스프레드시트 LTV 무료 코드)
// Row indices.
/**
* Groups customers by their ID calculates
* customer lifetime value for each.
*
* @param {Any[][]} rows - array of customer ID, date, amount.
*
* @returns {Any[][]} - table, each row containing:
* - average order size
* - avgOrderFrequency,
* - avgCustomerValue,
* - avgCustomerLifespan,
* - customerLifetimeValue,
* - map of id:orders
*/
function LIFETIME_VALUES(rows) {
// Group all the orders per customer ID.
// After this we get all the customers with a list of all
// their associated orders.
let ordersPerCustomer = groupByKey(rows
// Keep only rows that don't have a blank customer ID.
.filter(row => !!row[CUSTOMER_ID])
// Create [key, value] pairs using the customer ID as key.
.map(row => [row[CUSTOMER_ID], {
date: row[DATE],
amount: row[AMOUNT],
}]));
return ordersPerCustomer
// Create objects from the [key, value] pairs.
.map(keyValue => ({
id: keyValue[0],
orders: keyValue[1],
}))
// Calculate the values we need and return an array of
// the columns to populate per element.
.map(customer => {
let totalRevenue = customer.orders
// Get the `amount` field from each order.
.map(order => order.amount)
// Sum all the amounts.
.reduce((result, amount) => result + amount);
let datesRange = customer.orders
// 각 주문에서 'date' 필드를 가져옵니다.
.map(order => order.date)
// 각 날짜를 비교하고 최소값과 최대값을 할당합니다.
// 날짜 대신 {first: ..., last: ...} 형식의 객체를 반환해야 하므로,
// 초기 값을 명시적으로 설정해야 합니다.
.reduce((result, date) => ({
first: result.first ? (date < result.first ? date : result.first) : date,
last: result.last ? (date > result.last ? date : result.last) : date,
}), {first: null, last: null});
let totalMonths = (new Date(datesRange.last) - new Date(datesRange.first)) / MILLISECONDS_IN_MONTH;
// Calculate the values we are interested in.
let avgOrderSize = totalRevenue / customer.orders.length;
let avgOrderFrequency = customer.orders.length / ordersPerCustomer.length;
let avgCustomerValue = avgOrderSize * avgOrderFrequency;
let avgCustomerLifespan = totalMonths;
let customerLifetimeValue = avgCustomerValue * avgCustomerLifespan;
// Returning an array makes the custom function to fill multiple cells
// instead of a single cell.
// In this case, we are returning one array for every order in
// `ordersPerCustomer`, so the custom function fills a 2D matrix of cells.
// User must create these headers manually in the spreadsheet in this order.
return [
customer.id,
avgOrderSize,
avgOrderFrequency,
avgCustomerValue,
avgCustomerLifespan,
customerLifetimeValue,
]
});
}
'스프레드시트 함수 응용' 카테고리의 다른 글
엑셀 잘하는법, 엑셀 활용 스타트업을 위한 스프레드시트 (0) | 2023.06.13 |
---|---|
구글 스프레드시트 재고관리 Tip. (0) | 2023.05.29 |
직장인을 위한 스프레드시트 함수모음 (0) | 2023.03.22 |
스프레드시트에서 + / - 변동추이 추적 하기 (1) | 2022.09.17 |