# 2026年版 データアナリストのためのdbt入門:モデリング、テスト、面接対策 > dbtのプロジェクト構造、マテリアライゼーション戦略、データ品質テスト、Jinjaマクロ、そして2026年の技術面接でよく問われる質問を網羅的に解説します。 - Published: 2026-06-17 - Updated: 2026-06-17 - Author: SharpSkill - Tags: dbt, data-analytics, sql, data-modeling, interview - Reading time: 10 min --- 2026年現在、dbt(data build tool)はデータアナリストにとって必須のスキルとなっています。データウェアハウス内でのSQL変換を管理し、データ品質を保証し、分析ワークフローを標準化するツールとして、dbtは現代のデータチームにおいて中心的な役割を果たしています。dbt Core v2.0のアルファ版が登場し、v1.12が安定版として広く採用される中、データアナリストは従来のアドホックなSQLクエリから、テスト可能でバージョン管理されたデータモデリングへと移行しています。本記事では、dbtプロジェクトの構造、マテリアライゼーション戦略、データ品質テスト、そして2026年の技術面接でよく問われる質問について詳しく解説します。 > **dbtとは何か** > > dbtは、ELTパイプラインにおける「T(Transform)」の部分を担当します。データはすでにウェアハウス(Snowflake、BigQuery、Redshiftなど)に抽出・ロードされており、dbtはSQLを使用してこれらの生データを分析可能なテーブルやビューに変換します。dbtの最大の強みは、ソフトウェアエンジニアリングのベストプラクティス(バージョン管理、テスト、ドキュメント化、モジュール性)をデータ変換に適用できる点にあります。 ## dbtプロジェクトの構造:ステージング層からマート層まで dbtプロジェクトは通常、3つの主要な層で構成されます。**ステージング層(staging)**では生データをクリーニングし、**中間層(intermediate)**ではビジネスロジックを適用し、**マート層(marts)**では最終的な分析用テーブルを作成します。この階層構造により、データ変換の各ステップが明確になり、保守性が大幅に向上します。 ステージング層では、ソースシステムからの生データを1対1でクリーニングします。以下はStripeの決済データをステージングする例です。 ```sql -- models/staging/stripe/stg_stripe__payments.sql with source as ( select * from {{ source('stripe', 'payments') }} ), renamed as ( select id as payment_id, amount / 100.0 as amount_usd, -- Stripe stores cents status as payment_status, created::timestamp as created_at, customer_id from source where status != 'failed' -- Filter invalid records early ) select * from renamed ``` このステージングモデルでは、カラム名を標準化し、データ型を統一し、無効なレコードを早期に除外しています。`{{ source() }}`関数を使用することで、生データへの参照を明示的に管理できます。 マート層では、複数のステージングモデルを組み合わせて、ビジネス上の質問に答えるためのテーブルを作成します。 ```sql -- models/marts/finance/fct_monthly_revenue.sql with payments as ( select * from {{ ref('stg_stripe__payments') }} ), monthly as ( select date_trunc('month', created_at) as revenue_month, count(*) as total_transactions, sum(amount_usd) as gross_revenue, sum(case when payment_status = 'refunded' then amount_usd else 0 end) as refunds from payments group by 1 ) select revenue_month, total_transactions, gross_revenue, refunds, gross_revenue - refunds as net_revenue -- Key business metric from monthly ``` `{{ ref() }}`関数を使用することで、モデル間の依存関係をdbtが自動的に追跡し、正しい順序でモデルを構築します。これにより、データパイプラインの実行順序を手動で管理する必要がなくなります。 ## マテリアライゼーション戦略:適切な方法の選択 dbtでは、モデルを4つの異なる方法でマテリアライズ(実体化)できます。それぞれに適切なユースケースがあります。 | マテリアライゼーション | 構築方法 | 適切なケース | パフォーマンス | |---|---|---|---| | **view** | `CREATE VIEW` | 小規模なデータセット、常に最新が必要 | クエリ時に計算 | | **table** | `CREATE TABLE` | 中規模データ、高速クエリが必要 | 高速だが全再構築 | | **incremental** | `INSERT/MERGE` | 大規模データ、履歴保持 | 新規データのみ処理 | | **ephemeral** | CTE | 中間計算、物理テーブル不要 | 依存モデルに埋め込み | 大規模なイベントデータを扱う場合、**incremental**マテリアライゼーションが最も効率的です。 ```sql -- models/marts/product/fct_page_views.sql {{ config( materialized='incremental', unique_key='page_view_id', incremental_strategy='merge' ) }} with events as ( select event_id as page_view_id, user_id, page_url, session_id, event_timestamp from {{ ref('stg_snowplow__events') }} where event_type = 'page_view' {% if is_incremental() %} -- Only process new events since last run and event_timestamp > (select max(event_timestamp) from {{ this }}) {% endif %} ) select * from events ``` `{% if is_incremental() %}`ブロックにより、初回実行時は全データを処理し、その後の実行では新しいイベントのみを処理します。これにより、数百万行のテーブルでも効率的に更新できます。 ## データ品質のテスト:信頼性の保証 dbtの最も強力な機能の1つが、組み込みのテスト機能です。データアナリストは、データパイプラインが期待通りに動作していることを継続的に検証できます。 dbtには4つの組み込みテスト(unique、not_null、accepted_values、relationships)があり、YAMLファイルで簡単に定義できます。 ```yaml # models/staging/stripe/_stripe__models.yml version: 2 models: - name: stg_stripe__payments description: "Cleaned payment records from Stripe" columns: - name: payment_id description: "Unique payment identifier" tests: - unique - not_null - name: payment_status tests: - accepted_values: values: ['succeeded', 'pending', 'refunded'] - name: amount_usd tests: - not_null - dbt_utils.expression_is_true: expression: ">= 0" # No negative payments ``` これらのテストは`dbt test`コマンドで実行され、データの整合性を自動的に検証します。テストが失敗した場合、データパイプラインを停止させることで、下流の分析に誤ったデータが流れるのを防ぎます。 より複雑なビジネスルールには、カスタムテストを作成できます。 ```sql -- tests/assert_revenue_not_negative.sql -- This test fails if any month has negative net revenue select revenue_month, net_revenue from {{ ref('fct_monthly_revenue') }} where net_revenue < 0 -- Should never happen ``` このテストは、純収益が負になる月が存在する場合に失敗します。ビジネスロジックのエラーや上流データの問題を早期に検出できます。 ## Jinjaとマクロ:コードの再利用性 dbtはJinjaテンプレート言語を使用しており、SQLコードを動的に生成できます。繰り返しロジックをマクロとして抽出することで、コードの保守性が向上します。 例えば、Stripeはセント単位で金額を保存しているため、多くのモデルで同じ変換ロジックが必要になります。 ```sql -- macros/cents_to_dollars.sql {% macro cents_to_dollars(column_name) %} ({{ column_name }} / 100.0)::numeric(12, 2) {% endmacro %} ``` このマクロは任意のモデルで再利用できます。 ```sql -- Usage in any model select payment_id, {{ cents_to_dollars('amount_cents') }} as amount_usd, {{ cents_to_dollars('tax_cents') }} as tax_usd from {{ source('stripe', 'payments') }} ``` Jinjaの条件分岐を使用することで、環境(開発/本番)に応じて異なるロジックを適用することもできます。これにより、本番環境では完全なデータセットを処理し、開発環境ではサンプルデータのみを処理するといった最適化が可能になります。 ## dbt面接質問:データアナリストが知っておくべきこと 2026年のデータアナリスト面接では、dbtの実践的な知識が頻繁に評価されます。以下は、よく出題される質問とその回答です。 **Q1: `{{ ref() }}`と`{{ source() }}`の違いは何ですか。それぞれをいつ使用しますか。** `{{ source() }}`は、dbtプロジェクト外の生データテーブルを参照する際に使用します。これらはウェアハウスに直接ロードされたテーブルで、通常はステージング層でのみ使用します。一方、`{{ ref() }}`は、dbtで構築された他のモデルを参照します。`ref()`を使用することで、dbtはモデル間の依存関係グラフを構築し、正しい順序で実行できます。また、環境間(dev/prod)で自動的にスキーマを切り替える機能も提供します。ベストプラクティスとして、ステージング層では`source()`を使用し、それ以降の層では`ref()`のみを使用します。 **Q2: incremental モデルをいつ使用すべきですか。通常のtableマテリアライゼーションと比較した利点は何ですか。** incrementalモデルは、大規模なデータセット(通常は数百万行以上)で、履歴データを保持する必要がある場合に使用します。典型的な例は、イベントログ、クリックストリームデータ、IoTセンサーデータなどです。通常のtableマテリアライゼーションは毎回全データを再構築しますが、incrementalモデルは前回実行以降の新しいレコードのみを処理します。これにより、実行時間とウェアハウスコストを大幅に削減できます。ただし、incrementalモデルはロジックが複雑になるため、小規模なテーブル(1日で再構築できる)にはtableマテリアライゼーションを使用する方が保守性が高くなります。 **Q3: SCD Type 2(緩やかに変化するディメンション タイプ2)をdbtでどのように実装しますか。** SCD Type 2は、ディメンションテーブルの履歴変更を追跡する手法です。dbtでは、`dbt_utils`パッケージの`snapshot`機能を使用して実装します。スナップショットは、ソーステーブルの変更を検出し、`valid_from`と`valid_to`のタイムスタンプを自動的に管理します。例えば、顧客の住所変更を追跡する場合、`dbt snapshot`コマンドを実行するたびに、変更された顧客の新しいレコードが作成され、古いレコードには終了日が設定されます。これにより、特定時点での顧客情報を正確に再現できます。スナップショットはincrementalモデルとは異なり、`models/`ではなく`snapshots/`ディレクトリに配置します。 **Q4: staging、intermediate、martsの各層の目的を説明してください。** **staging層**は、生データを1対1でクリーニングし、標準化します。カラム名の変更、データ型の統一、無効レコードの除外を行いますが、ビジネスロジックは含みません。各ステージングモデルは1つのソーステーブルに対応します。**intermediate層**は、複数のステージングモデルを結合し、再利用可能なビジネスロジックを適用します。この層はオプションですが、複雑な変換を分割することでマート層をシンプルに保てます。**marts層**は、特定のビジネス部門(finance、marketing、product)向けの最終的な分析用テーブルを提供します。これらはファクトテーブルやディメンションテーブルとして設計され、BIツールから直接クエリされます。この階層化により、各層が明確な責任を持ち、変更の影響範囲が限定されます。 **Q5: カスタムテストとスキーマテストの違いは何ですか。それぞれをいつ使用しますか。** **スキーマテスト**は、YAMLファイルで定義される簡潔なテストで、単一カラムまたはモデルレベルの検証に使用します。組み込みテスト(unique、not_null、accepted_values、relationships)や`dbt_utils`パッケージのテストが該当します。設定が簡単で、ドキュメントと一緒に管理できる利点があります。一方、**カスタムテスト**は、`tests/`ディレクトリにSQLファイルとして作成され、複雑なビジネスルールの検証に使用します。例えば、「月次収益が負にならない」「顧客の初回購入日が登録日より前にならない」「月間アクティブユーザー数が前月比で90%以上減少しない」といった複数カラムやテーブルにまたがる検証が必要な場合に有効です。一般的に、単純な検証にはスキーマテスト、複雑なビジネスロジックにはカスタムテストを使用します。 ## 本番環境でのdbtベストプラクティス dbtを本番環境で運用する際は、データの鮮度監視、ドキュメント生成、CI/CDパイプラインの統合が重要です。 データの鮮度を監視するには、ソース定義にfreshnessチェックを追加します。 ```yaml # models/staging/stripe/_stripe__sources.yml version: 2 sources: - name: stripe database: raw schema: stripe freshness: warn_after: {count: 12, period: hour} error_after: {count: 24, period: hour} loaded_at_field: _fivetran_synced tables: - name: payments - name: customers ``` `dbt source freshness`コマンドを定期的に実行することで、上流のETLパイプラインの問題を早期に検出できます。データが12時間以上更新されていない場合は警告、24時間以上の場合はエラーとして扱います。 また、dbtプロジェクトを[データエンジニアリング](/technologies/data-engineering)の他のツールと統合することで、包括的なデータプラットフォームを構築できます。[データ分析](/technologies/data-analytics)の実務では、dbtで構築したモデルを基に、BIツールでダッシュボードを作成したり、機械学習モデルの特徴量として利用したりします。 [SQLウィンドウ関数とCTE](/blog/data-analytics/sql-window-functions-ctes-advanced-queries)の知識は、dbtモデルを効率的に設計する上で不可欠です。また、[データアナリスト面接向けの高度なSQL](/blog/data-analytics/advanced-sql-data-analyst-interviews)のスキルは、複雑なビジネスロジックをdbtで実装する際に役立ちます。 本番環境では、dbtプロジェクトをGitでバージョン管理し、プルリクエストごとに`dbt test`を実行するCI/CDパイプラインを構築することが推奨されます。dbt Cloudを使用すると、スケジュール実行、ジョブ監視、系譜グラフの可視化が簡単に実現できます。オンプレミス環境では、Airflow、Prefect、Dagsterなどのオーケストレーションツールとdbtを統合します。 ## まとめ:dbtでデータ分析を次のレベルへ dbtは、データアナリストがソフトウェアエンジニアリングのベストプラクティスを採用し、信頼性の高いデータパイプラインを構築するための強力なツールです。2026年の現在、dbtのスキルはデータアナリストの求人において標準的な要件となっています。 本記事で学んだ主要なポイント: - **階層構造**: staging/intermediate/martsの3層でプロジェクトを整理し、各層に明確な責任を持たせる - **マテリアライゼーション戦略**: データサイズとクエリパターンに応じて、view、table、incremental、ephemeralを適切に選択する - **データ品質テスト**: スキーマテストとカスタムテストを組み合わせ、データの整合性を継続的に検証する - **Jinjaとマクロ**: 繰り返しロジックを再利用可能なマクロとして抽出し、コードの保守性を向上させる - **本番運用**: 鮮度監視、ドキュメント生成、CI/CD統合により、信頼性の高いデータプラットフォームを構築する dbtの実践的なスキルを習得することで、データアナリストはアドホックなSQLクエリから脱却し、スケーラブルで保守可能なデータモデリングを実現できます。面接対策としても、dbtの概念とベストプラクティスを深く理解することが、2026年のデータアナリスト職において重要な差別化要因となります。 --- Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack. HTML version of this page: https://sharpskill.dev/ja/blog/data-analytics/dbt-data-analysts-modeling-testing-interview-2026