> 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/ja/customdashboard/custom/custom_formula.md).

# カスタムフォーミュラ

{% hint style="info" %}
カスタムフォーミュラとは？

カスタムフォーミュラは、ラプラスでデータを分析するときに**独自の計算式を作成できる機能**です。Excel や Google スプレッドシートの数式と同じように、既存の指標（Measure）と分析軸（Dimension）を組み合わせて新しい指標を作成できます。
{% endhint %}

#### カスタムフォーミュラでできること

1. 比率の計算：コンバージョン率、平均注文額、クリック単価などの主要指標の計算
2. 目標管理：目標達成率、目標に対する実績、進捗率の追跡
3. 条件付き分析：ランク分類、セグメントの区分
4. 文字列の処理：データのクレンジング、パース、結合、変換
5. 日付の演算：年・月・日・週・曜日・四半期の抽出
6. 複合計算：ROAS、ROI、純利益率などの高度な指標

## カスタムフォーミュラを作成する <a href="#create" id="create"></a>

1. チャート編集画面の右側にある設定パネルの「データ」タブで、先にデータソースと指標を選んでください。
2. 「データ」タブ ›「カスタムフォーミュラ」で「新しいフォーミュラ」を押してください。
3. 「フォーミュラ名」に、テーブルと指標の一覧に表示する名前を入力してください。（例：ROAS）
4. 「数式」に指標と関数を入力してください。左側の一覧の関数や「例」にマウスを合わせると説明が表示され、押すと数式に入力されます。
5. 「表記形式」で「数値」 · 「通貨」 · 「割合」 · 「文字」のいずれかを選び、「保存」を押してください。

   ![カスタムフォーミュラの編集画面](https://1689889301-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FXSnF6RixhZ8AqU0DBfmd%2Fuploads%2Fgit-blob-7cea289ca2b3d729f8f747fab39925597f0c812e%2Fcustomdashboard__custom__custom_formula__01.png?alt=media)

{% hint style="info" %}
保存したフォーミュラはテーブルに自動で追加され、「チャート」タブの指標一覧にも入るため、チャートとして描画できます。作成したフォーミュラは、「カスタムフォーミュラ」の一覧から「フォーミュラを編集」 · 「複製」できます。
{% endhint %}

## 仕組み <a href="#working_principle" id="working_principle"></a>

Custom Formula は次の順序で動作します。

1. 数式の入力

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

2. 構文の検証\
   括弧、引用符、関数名に加え、参照したカラムが現在選択している指標・分析軸にあるかを確認
3. 計算\
   選択した指標と分析軸でデータを照会し、照会結果の各行に数式を適用して新しいカラムを作成します
4. 結果の表示\
   計算した値をダッシュボードに表示

## Excel との比較 <a href="#excel_comparison" id="excel_comparison"></a>

<table><thead><tr><th width="135">区分</th><th>Excel/スプレッドシート</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" %}
主な違い

* カラム名は \*\*シングルクォート（\`'\`）\*\*で囲みます：'revenue'
* 文字列の値は \*\*ダブルクォート（\`"\`）\*\*で囲みます："完了"
* 関数名は大文字・小文字を区別しません。このドキュメントでは大文字で表記します：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>

条件は 2 つまで入れられます。3 つ以上の場合は `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', "東京", "Tokyo")</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>1 日あたりの必要売上</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://www.analytics.laplacetec.com/contact)

**メールでのお問い合わせ：** [**product@laplacetec.com**](mailto:product@laplacetec.com)
