> For the complete documentation index, see [llms.txt](https://www.analytics-docs.laplacetec.com/guide/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://www.analytics-docs.laplacetec.com/guide/customdashboard/custom/custom_formula.md).

# 커스텀 포뮬러

{% hint style="info" %}
커스텀 포뮬러란?

커스텀 포뮬러는 라플라스에서 데이터를 분석할 때 **나만의 계산식을 만들 수 있는 기능**입니다. 엑셀이나 구글 스프레드시트의 수식과 비슷하게, 기존 측정값(Measure)과 분석단위(Dimension)를 조합하여 새로운 지표를 만들 수 있습니다.
{% endhint %}

#### 커스텀 포뮬러에서는 다음이 가능해요

1. 비율 계산: 전환율, 평균 주문금액, 클릭당 비용 등 핵심 지표 계산
2. 목표 관리: 목표 달성률, 목표 대비 실적, 진행률 추적
3. 조건부 분석: 등급 분류, 세그먼트 구분
4. 문자열 처리: 데이터 정제, 파싱, 결합 및 변환
5. 날짜 연산: 연·월·일·주차·요일·분기 추출
6. 복합 계산: ROAS, ROI, 순이익률 등 고급 지표

## 작동 원리 <a href="#working_principle" id="working_principle"></a>

Custom Formula는 다음과 같은 순서로 작동합니다:

1. 수식 입력

{% hint style="success" %}
예: DIVIDE('revenue', 'order\_count')
{% endhint %}

2. 구문 검증\
   괄호, 따옴표, 함수명과 함께 참조한 컬럼이 지금 선택한 측정값·분석단위에 있는지 확인
3. 계산\
   선택한 측정값과 분석단위로 데이터를 조회한 뒤, 조회 결과의 각 행에 수식을 적용해 새 컬럼을 만듭니다
4. 결과 표시\
   계산한 값을 대시보드에 표시

## 엑셀과의 비교 <a href="#excel_comparison" id="excel_comparison"></a>

<table><thead><tr><th width="135">구분</th><th>엑셀/스프레드시트</th><th>라플라스 Custom Formula</th></tr></thead><tbody><tr><td>셀 참조</td><td>A1, B2:B10</td><td>'revenue', 'order_count'</td></tr><tr><td>나누기</td><td>=A1/B1</td><td>DIVIDE('revenue', 'order_count')</td></tr><tr><td>조건문</td><td>=IF(A1>100, "High", "Low")</td><td>IF('revenue' > 100, "High", "Low")</td></tr><tr><td>문자</td><td>="Hello " &#x26; A1</td><td>CONCAT("Hello ", 'product_name')</td></tr></tbody></table>

{% hint style="info" %}
핵심 차이점

* 컬럼명은 **작은따옴표(\`'\`)**&#xB85C; 감쌉니다: 'revenue'
* 문자열 값은 **큰따옴표(\`"\`)**&#xB85C; 감쌉니다: "완료"
* 함수명은 대소문자를 구분하지 않습니다. 이 문서는 대문자로 적습니다: DIVIDE
  {% endhint %}

## 기본 문법 <a href="#basic_syntax" id="basic_syntax"></a>

### 1. 컬럼 참조 <a href="#column_reference" id="column_reference"></a>

'컬럼명'

```
예시
'revenue' - 매출
'order_count' - 주문수
'product_name' - 상품명
```

{% hint style="info" %}
이 문서의 컬럼명(`'revenue'`, `'order_count'` 등)은 문법을 보여주기 위한 예시예요. 실제 수식에서는 입력창 자동완성에 뜨는 측정값·분석단위 이름을 고르면 그 컬럼의 키가 작은따옴표로 감싸져 들어갑니다. 예를 들어 결제금액은 `'sales'` 로 들어가고, 데이터 소스를 여러 개 쓰면 `'A__sales'` 처럼 소스 기호가 앞에 붙어요.
{% endhint %}

### 2. 숫자 리터럴 <a href="#numeric_literals" id="numeric_literals"></a>

```
100        # 정수
3.14       # 소수
0 - 50     # 음수
```

음수는 `-50` 처럼 바로 쓸 수 없어요. `0 - 50` 처럼 뺄셈으로 만듭니다.

### 3. 문자열 리터럴 <a href="#string_literals" id="string_literals"></a>

큰 따옴표를 사용합니다.

```
"텍스트"
"Hello World"
"완료"
```

### 4. 연산자 우선순위 <a href="#operator_precedence" id="operator_precedence"></a>

1. **()괄호**\
   가장 먼저 계산 됩니다.
2. **\* / 곱셈, 나눗셈**

   덧셈/뺄셈보다 먼저 계산
3. **+ - 덧셈, 뺄셈**

   곱셈/나눗셈 다음에 계산
4. **> < >= <= 비교 연산자**

   산술 연산 후 비교

## 연산자 <a href="#operator" id="operator"></a>

### 산술 연산자 <a href="#arithmetic_operators" id="arithmetic_operators"></a>

<table><thead><tr><th width="85">연산자</th><th width="117">설명</th><th>예시</th><th>결과 설명</th></tr></thead><tbody><tr><td>+</td><td>더하기</td><td>'revenue' + 'cost'</td><td>매출 + 비용</td></tr><tr><td>-</td><td>빼기</td><td>'revenue' - 'cost'</td><td>순이익</td></tr><tr><td>*</td><td>곱하기</td><td>'quantity' * 'unit_price'</td><td>총 금액</td></tr><tr><td>/</td><td>나누기</td><td>'revenue' / 'order_count'</td><td>평균 주문금액</td></tr></tbody></table>

### 비교 연산자 <a href="#comparison_operators" id="comparison_operators"></a>

<table><thead><tr><th width="85">연산자</th><th width="117">설명</th><th>예시</th></tr></thead><tbody><tr><td>=</td><td>같다</td><td>'status' = "완료"</td></tr><tr><td>&#x3C;></td><td>같지 않다</td><td>'status' &#x3C;> "취소"</td></tr><tr><td>></td><td>크다</td><td>'revenue' > 1000</td></tr><tr><td>&#x3C;</td><td>작다</td><td>'revenue' &#x3C; 1000</td></tr><tr><td>>=</td><td>크거나 같다</td><td>'order_count' >= 2</td></tr><tr><td>&#x3C;=</td><td>작거나 같다</td><td>'order_count' &#x3C;= 1</td></tr></tbody></table>

### 논리 함수 <a href="#logical_operators" id="logical_operators"></a>

`AND`, `OR` 는 조건 사이에 쓰는 연산자가 아니라 함수로 씁니다. `'revenue' > 1000 AND 'status' = "완료"` 처럼 쓰면 오류가 납니다.

<table><thead><tr><th width="114">함수</th><th width="189">설명</th><th>예시</th></tr></thead><tbody><tr><td>AND</td><td>AND(조건1, 조건2): 둘 다 참</td><td>AND('revenue' > 1000, 'status' = "완료")</td></tr><tr><td>OR</td><td>OR(조건1, 조건2): 하나라도 참</td><td>OR('category' = "의류", 'category' = "잡화")</td></tr><tr><td>NOT</td><td>NOT(조건): 참과 거짓을 뒤집음</td><td>NOT('revenue' > 1000)</td></tr></tbody></table>

조건은 두 개까지 넣을 수 있어요. 세 개 이상이면 `AND(조건1, AND(조건2, 조건3))` 처럼 겹쳐 씁니다.

## 함수 종류 <a href="#function_types" id="function_types"></a>

{% hint style="info" %}
수식은 조회 결과의 각 행에 따로 적용돼요. 여러 행을 모으는 합계·평균·개수·최솟값·최댓값 같은 집계 함수는 없습니다.
{% endhint %}

### 수학 함수 <a href="#acceptance_functions" id="acceptance_functions"></a>

<table><thead><tr><th width="126">함수</th><th>문법</th><th width="117">설명</th><th>예시</th></tr></thead><tbody><tr><td>MULTIPLY</td><td>MULTIPLY(a, b)</td><td>곱셈</td><td>MULTIPLY('quantity', 'unit_price')</td></tr><tr><td>DIVIDE</td><td>DIVIDE(a, b)</td><td>나눗셈</td><td>DIVIDE('revenue', 'order_count')</td></tr><tr><td>SUBTRACT</td><td>SUBTRACT(a, b)</td><td>뺄셈</td><td>SUBTRACT('revenue', 'cost')</td></tr><tr><td>ABS</td><td>ABS(value)</td><td>절댓값</td><td>ABS('profit_loss')</td></tr><tr><td>FLOOR</td><td>FLOOR(value)</td><td>내림</td><td>FLOOR('decimal_value')</td></tr><tr><td>CEIL</td><td>CEIL(value)</td><td>올림</td><td>CEIL('decimal_value')</td></tr></tbody></table>

### 조건 함수 <a href="#conditional_functions" id="conditional_functions"></a>

<table><thead><tr><th width="128">함수</th><th>문법</th><th width="115">설명</th><th>예시</th></tr></thead><tbody><tr><td>IF</td><td>IF(condition, true_value, false_value)</td><td>조건문</td><td>IF('revenue' > 1000, "우수", "보통")</td></tr><tr><td>IFS</td><td>IFS(cond1, val1, cond2, val2, ...)</td><td>다중 조건문. 어느 조건에도 맞지 않는 행은 빈 값</td><td>IFS('revenue' >= 10000, "최우수", 'revenue' >= 5000, "우수")</td></tr><tr><td>COALESCE</td><td>COALESCE(val1, val2, ...)</td><td>NULL 대체</td><td>COALESCE('discount', 0)</td></tr><tr><td>NULLIF</td><td>NULLIF(val1, val2)</td><td>같으면 NULL</td><td>NULLIF('order_count', 0)</td></tr></tbody></table>

### 문자열 함수 <a href="#string_functions" id="string_functions"></a>

<table><thead><tr><th width="109">함수</th><th>문법</th><th width="116">설명</th><th>예시</th></tr></thead><tbody><tr><td>CONCAT</td><td>CONCAT(str1, str2, ...)</td><td>문자열 결합</td><td>CONCAT('first_name', " ", 'last_name')</td></tr><tr><td>UPPER</td><td>UPPER(text)</td><td>대문자 변환</td><td>UPPER('product_code')</td></tr><tr><td>LOWER</td><td>LOWER(text)</td><td>소문자 변환</td><td>LOWER('email')</td></tr><tr><td>TRIM</td><td>TRIM(text)</td><td>공백 제거</td><td>TRIM('address')</td></tr><tr><td>LENGTH</td><td>LENGTH(text)</td><td>문자열 길이</td><td>LENGTH('product_name')</td></tr><tr><td>SUBSTR</td><td>SUBSTR(text, start, length)</td><td>부분 문자열</td><td>SUBSTR('phone', 1, 3)</td></tr><tr><td>REPLACE</td><td>REPLACE(text, old, new)</td><td>문자열 치환</td><td>REPLACE('address', "서울", "Seoul")</td></tr></tbody></table>

### 날짜/시간 함수 <a href="#datetime_functions" id="datetime_functions"></a>

<table><thead><tr><th width="157">함수</th><th>문법</th><th width="111">설명</th><th>예시</th></tr></thead><tbody><tr><td>NOW</td><td>NOW()</td><td>현재 시각</td><td>NOW()</td></tr><tr><td>CURRENT_DATE</td><td>CURRENT_DATE()</td><td>오늘 날짜</td><td>CURRENT_DATE()</td></tr><tr><td>DATE</td><td>DATE(year, month, day)</td><td>날짜 생성</td><td>DATE(2024, 1, 15)</td></tr><tr><td>YEAR</td><td>YEAR(date)</td><td>연도 추출</td><td>YEAR('time_id')</td></tr><tr><td>MONTH</td><td>MONTH(date)</td><td>월 추출</td><td>MONTH('time_id')</td></tr><tr><td>DAY</td><td>DAY(date)</td><td>일 추출</td><td>DAY('time_id')</td></tr><tr><td>WEEK</td><td>WEEK(date)</td><td>주차 추출</td><td>WEEK('time_id')</td></tr><tr><td>DAY_OF_WEEK</td><td>DAY_OF_WEEK(date)</td><td>요일 (1=일, 2=월, ..., 7=토)</td><td>DAY_OF_WEEK('time_id')</td></tr><tr><td>QUARTER</td><td>QUARTER(date)</td><td>분기</td><td>QUARTER('time_id')</td></tr></tbody></table>

### 정규식 함수 <a href="#regex_functions" id="regex_functions"></a>

<table><thead><tr><th>함수</th><th>문법</th><th width="123">설명</th><th>예시</th></tr></thead><tbody><tr><td>REGEXP_EXTRACT</td><td>REGEXP_EXTRACT(text, pattern)</td><td>정규식 추출</td><td>REGEXP_EXTRACT('url', "utm_source=([^&#x26;]+)")</td></tr><tr><td>REGEXP_REPLACE</td><td>REGEXP_REPLACE(text, pattern, replacement)</td><td>정규식 치환</td><td>REGEXP_REPLACE('phone', "[^0-9]", "")</td></tr></tbody></table>

### 타입 변환 함수 <a href="#type_conversion_functions" id="type_conversion_functions"></a>

<table><thead><tr><th width="93">함수</th><th>문법</th><th width="124">설명</th><th>예시</th></tr></thead><tbody><tr><td>CAST</td><td>CAST(value, "TYPE")</td><td>타입 변환</td><td>CAST('amount', "DOUBLE")</td></tr></tbody></table>

{% hint style="warning" %}
`VARCHAR`, `DOUBLE`, `BIGINT`, `BOOLEAN`, `DATE`, `TIMESTAMP`
{% endhint %}

## 예제 <a href="#examples" id="examples"></a>

### 비율 계산 <a href="#ratio_calculation" id="ratio_calculation"></a>

<table><thead><tr><th width="141">항목</th><th width="183">계산</th><th width="296">문법</th><th>결과값</th></tr></thead><tbody><tr><td>전환율(CVR)</td><td>(주문수 ÷ 클릭수) × 100</td><td>DIVIDE('order_count' * 100, 'clicks')</td><td>5.0%</td></tr><tr><td>평균 주문금액 (AOV)</td><td>매출 ÷ 주문수</td><td>DIVIDE('revenue', 'order_count')</td><td>₩ 50,000</td></tr><tr><td>클릭당 비용 (CPC)</td><td>광고비 ÷ 클릭수</td><td>DIVIDE('ad_cost', 'clicks')</td><td>₩ 200</td></tr><tr><td>ROAS</td><td>(매출 ÷ 광고비) × 100</td><td>DIVIDE('revenue' * 100, 'ad_cost')</td><td>500%</td></tr></tbody></table>

### 목표 관리 <a href="#goal_management" id="goal_management"></a>

<table><thead><tr><th width="141">항목</th><th width="183">계산</th><th width="296">문법</th><th>결과값</th></tr></thead><tbody><tr><td>목표 달성률</td><td>(실제 매출 ÷ 목표 매출) × 100</td><td>DIVIDE('revenue' * 100, 'target_revenue')</td><td>85%</td></tr><tr><td>목표 달성 등급</td><td>S (130%↑) / A (110%↑) / B (90%↑) / C (90%↓)</td><td>IF(DIVIDE('revenue', 'target_revenue') >= 1.3, "S등급",<br>IF(DIVIDE('revenue', 'target_revenue') >= 1.1, "A등급",<br>IF(DIVIDE('revenue', 'target_revenue') >= 0.9, "B등급",<br>"C등급")))</td><td>A등급</td></tr><tr><td>목표 대비 차이</td><td>실제 매출 - 목표 매출</td><td>SUBTRACT('revenue', 'target_revenue')</td><td>+ ₩ 2,000,000</td></tr><tr><td>일평균 필요 매출</td><td>(목표 - 현재) ÷ 남은 일수</td><td>DIVIDE( SUBTRACT('target_revenue', 'current_revenue'), 'days_remaining' )</td><td>₩ 1,200,000/일</td></tr></tbody></table>

### 고객 세분화 <a href="#customer_segmentation" id="customer_segmentation"></a>

<table><thead><tr><th width="141">항목</th><th width="183">계산</th><th width="296">문법</th><th>결과값</th></tr></thead><tbody><tr><td>고객 등급 분류</td><td>플래티넘 (50K↑) / 골드 (20K↑) / 실버 (10K↑) / 브론즈</td><td>IF('revenue' >= 50000, "플래티넘",<br>IF('revenue' >= 20000, "골드",<br>IF('revenue' >= 10000, "실버",<br>"브론즈")))</td><td></td></tr><tr><td>주말/평일 구분</td><td>요일 번호로 주말 판별</td><td>IF(OR(DAY_OF_WEEK('time_id') = 1, DAY_OF_WEEK('time_id') = 7), "주말", "평일")</td><td></td></tr><tr><td>신규/재구매 고객</td><td>주문 횟수로 고객 유형 분류</td><td>IF('order_count' > 1, "재구매", "신규")</td><td></td></tr><tr><td>연령대 분류</td><td>35세 → "30대"</td><td>CONCAT(<br>CAST(FLOOR('age' / 10) * 10, "VARCHAR"),<br>"대"<br>)</td><td></td></tr></tbody></table>

## 팁과 주의사항 <a href="#tips_cautions" id="tips_cautions"></a>

### 권장 사항 <a href="#recommendations" id="recommendations"></a>

{% hint style="success" %}

1. 괄호로 우선순위 명확히

복잡한 수식은 괄호로 의도를 명확하게 표현하세요.

```
❌ 'a' + 'b' * 'c' / 'd'
✅ 'a' + (('b' * 'c') / 'd')
```

{% endhint %}

{% hint style="success" %}
2\. 0으로 나누기는 자동으로 처리돼요

`DIVIDE`와 `/`는 분모가 0이면 오류 대신 빈 값을 돌려줍니다. 따로 0 체크를 하지 않아도 됩니다.

단, 나눗셈 결과에 다시 곱하거나 더하면 빈 값이 0으로 바뀝니다. 백분율처럼 배수를 곱해야 할 때는 분자에 먼저 곱하세요.

```
DIVIDE('revenue', 'order_count')         (주문수가 0인 행은 빈 값)
DIVIDE('order_count' * 100, 'clicks')    (클릭수가 0인 행은 빈 값)
DIVIDE('order_count', 'clicks') * 100    (클릭수가 0인 행은 0)
```

{% endhint %}

{% hint style="success" %}
3\. 타입 일치 확인

비교/연산 시 같은 타입끼리 사용하세요.

```
❌ 'revenue' > "1000"   (숫자 vs 문자열)
✅ 'revenue' > 1000     (숫자 vs 숫자)
```

{% endhint %}

### 주의 사항 <a href="#warnings" id="warnings"></a>

| 항목     | ❌ 잘못된 예              | ✅ 올바른 예   |
| ------ | -------------------- | --------- |
| 컬럼 참조  | revenue 또는 "revenue" | 'revenue' |
| 문자열    | '완료'                 | "완료"      |
| 컬럼명 오타 | 'revenu'             | 'revenue' |

{% hint style="danger" %}
**순환 참조 금지**

수식이 자기 자신을 참조하면 오류가 발생합니다. 다른 수식을 참조하는 것은 가능하지만, 순환 참조는 피해야 합니다.
{% endhint %}

## 자주 묻는 질문 (FAQ)

<details>

<summary>Q. 수식이 작동하지 않아요. 어떻게 해야 하나요?</summary>

**체크리스트:**

1. 이 문서의 함수 표에 있는 함수만 썼나요?
2. 컬럼명을 작은따옴표로 감쌌나요? (`'revenue'`)
3. 문자열을 큰따옴표로 감쌌나요? (`"완료"`)
4. 괄호가 제대로 닫혔나요?

</details>

<details>

<summary>Q. 다른 수식을 참조할 수 있나요?</summary>

**네, 가능합니다!**\
\
먼저 "평균 주문금액" 수식을 만들고:\
`DIVIDE('revenue', 'order_count')`\
\
그 다음 다른 수식에서 참조:\
`IF('평균 주문금액' > 50000, "VIP", "일반")`\
\
⚠️ **주의:** 순환 참조는 금지됩니다.

</details>

<details>

<summary>Q. 수식 성능을 개선하려면?</summary>

**권장 사항:**

1. 복잡한 정규식은 최소화해주세요.
2. 필요한 데이터만 필터링하여 사용해주세요.

</details>

## 전담 매니저에게 요청하기 <a href="#contact" id="contact"></a>

커스텀 포뮬러 이용에 어려움이 있으신가요?

하단의 문의하기 혹은 홈페이지의 채팅 상담을 통해 문의하세요. 담당 매니저가 도움을 드리도록 하겠습니다.

> 💬 [채팅으로 문의하기](https://laplacetec.channel.io/lounge)
>
> 💬 [홈페이지에서 문의하기](https://www.analytics.laplacetec.com/contact)

**이메일 문의:** [**product@laplacetec.com**](mailto:product@laplacetec.com)
