エクセル×Difyで営業業務を効率化!データ分析の自動化【実装ガイド】

田中 慎

田中 慎

CEO / PM / Vibe Coder

15分で読了
シェア:
エクセル×Difyで営業業務を効率化!データ分析の自動化【実装ガイド】

こんにちは。AI Native の田中です。

営業データの分析に時間を取られていませんか?本記事では、Googleスプレッドシートの営業データをDifyで自動分析し、結果をスプレッドシートに書き戻すワークフローの実装方法を解説します。OAuth認証からAI分析、結果の自動書き込みまで、完全なコード付きで実装手順をお届けします。

📚 データ品質が分析精度を左右する

営業データ分析の精度は、データの品質とフォーマット統一に大きく依存します。詳しくはAI業務効率化の前提条件:データ整理とフォーマット統一が成功の鍵をご参照ください。

営業データ分析の課題

営業マネージャーや経営層が直面する、営業データ分析における3つの大きな課題があります。

1. 分析に時間がかかりすぎる

多くの企業では、週次や月次の営業会議の前に、担当者が数時間かけて以下のような作業を手作業で行っています:

  • Excelやスプレッドシートから営業データを集計
  • グラフやピボットテーブルを作成
  • 前月比・前年比の計算
  • 売上目標との乖離分析
  • レポート資料の作成

この作業だけで週5〜10時間、月間20〜40時間が失われています。本来、その時間は顧客対応や戦略立案に使うべきです。

2. 属人化による分析品質のばらつき

営業データの分析が特定の社員に依存している場合、以下の問題が発生します:

  • 担当者不在時に分析が止まる: 休暇や退職時に業務が滞る
  • 分析の視点が偏る: 担当者の経験や知識に依存した分析
  • ノウハウが蓄積されない: 分析手法が組織の資産にならない
  • 新人育成に時間がかかる: 複雑な分析ロジックの習得に数ヶ月

3. リアルタイム性の欠如

週次・月次の定期レポートでは、以下のような機会損失が発生します:

  • 問題の早期発見ができない: 売上低下に気づくのが1週間〜1ヶ月遅れる
  • 迅速な意思決定ができない: データ待ちで対策が後手に回る
  • 営業担当者へのフィードバックが遅い: 行動改善の機会を逃す

これらの課題を解決するため、DifyとGoogleスプレッドシートを連携させた自動分析システムを構築しました。

💡 本システムの導入効果
• 分析時間を週10時間 → 10分に短縮(98%削減)
• 誰でも同じ品質の分析レポートを取得可能
• データ更新と同時にリアルタイム分析を実行
• 分析ノウハウをプロンプトとして組織に蓄積

システム概要

本システムは以下の流れで動作します:

  1. Googleスプレッドシートから営業データを取得
  2. DifyでAI分析を実行
  3. 分析結果をスプレッドシートに書き戻し
Googleスプレッドシートのデータソース例

図1: Googleスプレッドシートの営業データ例

💡 実装のポイント
OAuth認証、データ取得、AI分析、結果書き込みの4つのステップで完全自動化を実現します。

実装パターンの選択

本記事では、2つの実装パターンを紹介します:

パターンA: Google Apps Script(GAS)で実装

メリット:

  • Googleスプレッドシート上で直接実行可能
  • 追加のサーバー不要で手軽に始められる
  • トリガー設定で定期実行が簡単
  • OAuth認証が不要(スクリプトの権限で実行)

デメリット:

  • 6分の実行時間制限がある
  • 複雑な処理には向かない
  • バージョン管理やデバッグが難しい

パターンB: Next.jsで実装

メリット:

  • 本格的なWebアプリケーションとして構築可能
  • 実行時間の制限なし
  • Git管理やCI/CDとの統合が容易
  • 複雑なビジネスロジックにも対応

デメリット:

  • サーバー環境の準備が必要
  • OAuth認証の設定が必要
  • 初期セットアップに時間がかかる

💡 どちらを選ぶべき?
簡単に始めたい・データ量が少ない → パターンA(GAS)
本格的な運用・大量データ・複雑なロジック → パターンB(Next.js)

パターンA: Google Apps Script(GAS)での実装

ステップ1: スクリプトの作成

Googleスプレッドシートから「拡張機能」→「Apps Script」を開き、以下のコードを貼り付けます。

// スクリプトプロパティに設定
// DIFY_API_KEY: DifyのAPIキー
// DIFY_WORKFLOW_URL: DifyワークフローのURL

function analyzeSalesData() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('営業データ');
  const resultSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('分析結果');
  
  // スプレッドシートからデータを取得
  const dataRange = sheet.getDataRange();
  const data = dataRange.getValues();
  
  // ヘッダー行を除く
  const headers = data[0];
  const rows = data.slice(1);
  
  // データを整形
  const formattedData = rows.map(row => {
    const obj = {};
    headers.forEach((header, index) => {
      obj[header] = row[index];
    });
    return obj;
  });
  
  // Dify APIを呼び出し
  const scriptProperties = PropertiesService.getScriptProperties();
  const apiKey = scriptProperties.getProperty('DIFY_API_KEY');
  const workflowUrl = scriptProperties.getProperty('DIFY_WORKFLOW_URL');
  
  const payload = {
    inputs: {
      sales_data: JSON.stringify(formattedData)
    },
    response_mode: 'blocking',
    user: 'gas-user'
  };
  
  const options = {
    method: 'post',
    contentType: 'application/json',
    headers: {
      'Authorization': 'Bearer ' + apiKey
    },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  };
  
  try {
    const response = UrlFetchApp.fetch(workflowUrl, options);
    const result = JSON.parse(response.getContentText());
    
    // 分析結果を取得
    const analysisResult = JSON.parse(result.data.outputs.result);
    
    // 分析結果をスプレッドシートに書き込み
    writeAnalysisResult(resultSheet, analysisResult);
    
    Logger.log('分析完了');
    SpreadsheetApp.getUi().alert('分析が完了しました!');
    
  } catch (error) {
    Logger.log('エラー: ' + error);
    SpreadsheetApp.getUi().alert('エラーが発生しました: ' + error);
  }
}

function writeAnalysisResult(sheet, result) {
  // シートをクリア
  sheet.clear();
  
  // ヘッダーを書き込み
  sheet.getRange(1, 1, 1, 3).setValues([['分析項目', '結果', '推奨アクション']]);
  sheet.getRange(1, 1, 1, 3).setFontWeight('bold');
  
  // 分析結果を書き込み
  const data = [
    ['売上トレンド', result.trend_analysis, ''],
    ['顧客パフォーマンス', result.customer_performance, ''],
    ['商品分析', result.product_analysis, ''],
    ['改善提案', '', result.recommendations.join('\n')]
  ];
  
  sheet.getRange(2, 1, data.length, 3).setValues(data);
  
  // 書式設定
  sheet.autoResizeColumns(1, 3);
  sheet.setFrozenRows(1);
}

// メニューに追加
function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu('AI分析')
    .addItem('営業データを分析', 'analyzeSalesData')
    .addToUi();
}

ステップ2: スクリプトプロパティの設定

Apps Scriptエディタで「プロジェクトの設定」→「スクリプトプロパティ」を開き、以下を設定します:

  • DIFY_API_KEY: DifyのAPIキー
  • DIFY_WORKFLOW_URL: DifyワークフローのエンドポイントURL

ステップ3: 定期実行の設定(オプション)

Apps Scriptエディタで「トリガー」を開き、以下を設定します:

  • 実行する関数: analyzeSalesData
  • イベントのソース: 時間主導型
  • 時間ベースのトリガー: 毎日、毎週、毎月など任意のタイミング

パターンB: Next.jsでの実装

ステップ1: Google OAuth認証の設定

まず、Google Sheets APIを使用するためのOAuth認証を設定します。

Google Cloud Consoleでの設定

  1. Google Cloud Consoleでプロジェクトを作成
  2. Google Sheets APIを有効化
  3. OAuth 2.0認証情報を作成
  4. リダイレクトURIを設定

環境変数の設定

# .env.local
GOOGLE_CLIENT_ID=your_client_id
GOOGLE_CLIENT_SECRET=your_client_secret
GOOGLE_REDIRECT_URI=http://localhost:3000/api/auth/callback/google
SPREADSHEET_ID=your_spreadsheet_id
SHEET_NAME=営業データ

ステップ2: Next.js APIルートの実装

Google Sheets APIとの連携を行うAPIルートを作成します。

認証用APIルート

// app/api/auth/google/route.ts
import { NextRequest, NextResponse } from 'next/server'

export async function GET(request: NextRequest) {
  const { searchParams } = new URL(request.url)
  const code = searchParams.get('code')
  
  if (!code) {
    const authUrl = new URL('https://accounts.google.com/o/oauth2/v2/auth')
    authUrl.searchParams.set('client_id', process.env.GOOGLE_CLIENT_ID!)
    authUrl.searchParams.set('redirect_uri', process.env.GOOGLE_REDIRECT_URI!)
    authUrl.searchParams.set('response_type', 'code')
    authUrl.searchParams.set('scope', 'https://www.googleapis.com/auth/spreadsheets')
    
    return NextResponse.redirect(authUrl.toString())
  }
  
  // トークン交換処理
  const tokenResponse = await fetch('https://oauth2.googleapis.com/token', {
    method: 'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    body: new URLSearchParams({
      client_id: process.env.GOOGLE_CLIENT_ID!,
      client_secret: process.env.GOOGLE_CLIENT_SECRET!,
      code,
      grant_type: 'authorization_code',
      redirect_uri: process.env.GOOGLE_REDIRECT_URI!,
    }),
  })
  
  const tokens = await tokenResponse.json()
  
  return NextResponse.json({ success: true, tokens })
}

データ取得APIルート

// app/api/sheets/data/route.ts
import { NextRequest, NextResponse } from 'next/server'

export async function GET(request: NextRequest) {
  const accessToken = request.headers.get('authorization')?.replace('Bearer ', '')
  
  if (!accessToken) {
    return NextResponse.json({ error: 'No access token' }, { status: 401 })
  }
  
  const spreadsheetId = process.env.SPREADSHEET_ID
  const sheetName = process.env.SHEET_NAME
  const url = 'https://sheets.googleapis.com/v4/spreadsheets/' + spreadsheetId + '/values/' + sheetName
  
  const response = await fetch(url, {
    headers: {
      'Authorization': 'Bearer ' + accessToken,
    },
  })
  
  const data = await response.json()
  
  return NextResponse.json(data)
}

ステップ3: Difyワークフローの設定

Difyで営業データ分析用のワークフローを作成します。

Difyワークフロー全体像

図2: Difyワークフローの全体像

ワークフロー構成

  1. データ入力ノード: スプレッドシートから取得したデータを受け取る
  2. データ前処理ノード: データを分析用に整形
  3. AI分析ノード: LLMでデータ分析を実行
  4. 結果整形ノード: 分析結果をスプレッドシート用に整形

AI分析プロンプト

以下の営業データを分析し、以下の観点で分析結果を提供してください:

1. 売上トレンド分析
2. 顧客別パフォーマンス分析
3. 商品・サービス別売上分析
4. 改善提案

データ: {{input_data}}

分析結果は以下のJSON形式で出力してください:
{
  "trend_analysis": "売上トレンドの分析結果",
  "customer_performance": "顧客別パフォーマンス分析",
  "product_analysis": "商品・サービス別分析",
  "recommendations": "改善提案のリスト"
}

ステップ3: Difyワークフロー統合APIルートの実装

データ取得、Dify分析、結果書き戻しを統合したAPIルートを作成します。

// app/api/workflows/sales-analysis/route.ts
import { readSpreadsheet, writeSpreadsheet, createSheetIfNotExists, clearSheet } from '@/lib/google-sheets'
import { difyClient } from '@/lib/dify-client'
import { NextRequest, NextResponse } from 'next/server'
import { cookies } from 'next/headers'

export async function POST(request: NextRequest) {
  try {
    const { spreadsheetId, sheetName } = await request.json()

    if (!spreadsheetId || !sheetName) {
      return NextResponse.json(
        { error: 'spreadsheetId and sheetName are required' },
        { status: 400 }
      )
    }

    const cookieStore = await cookies()
    const accessToken = cookieStore.get('google_access_token')?.value

    if (!accessToken) {
      return NextResponse.json(
        { error: 'Not authenticated. Please login with Google first.' },
        { status: 401 }
      )
    }

    // ステップ1: Google Sheetsからデータ読み取り
    const salesData = await readSpreadsheet(accessToken, spreadsheetId, sheetName)

    if (!salesData || salesData.length === 0) {
      return NextResponse.json(
        { error: 'No data found in spreadsheet' },
        { status: 400 }
      )
    }

    // ステップ2: Dify Workflowで分析
    const analysisResult = await difyClient.analyzeSalesData(salesData)

    // ステップ3: 分析結果をGoogle Sheetsに書き込み
    const currentDate = new Date().toISOString().split('T')[0]
    const resultSheetName = '分析結果'

    // 分析結果用のシートを作成(存在しない場合)
    const isNewSheet = await createSheetIfNotExists(accessToken, spreadsheetId, resultSheetName)

    // 既存シートの場合はクリアして最新の結果のみを保持
    if (!isNewSheet) {
      await clearSheet(accessToken, spreadsheetId, resultSheetName)
    }

    // Markdown形式の分析結果を改行で分割して行として書き込む
    const analysisLines = analysisResult.split('\n').map(line => [line])

    // ヘッダー情報と分析結果を書き込み
    await writeSpreadsheet(
      accessToken,
      spreadsheetId,
      resultSheetName,
      [
        ['分析日時', currentDate],
        ['元データシート', sheetName],
        [''],
        ['=== 分析結果 ==='],
        [''],
        ...analysisLines,
      ]
    )

    return NextResponse.json({
      success: true,
      analysisResult,
      message: '分析が完了し、結果を「' + resultSheetName + '」シートに書き込みました',
    })
  } catch (error: any) {
    return NextResponse.json(
      { error: error.message || 'Failed to analyze sales data' },
      { status: 500 }
    )
  }
}

共通: Difyワークフローの設定

パターンA(GAS)とパターンB(Next.js)の両方で使用するDifyワークフローを設定します。

Difyワークフロー全体像

図2: Difyワークフローの全体像

ワークフロー構成

  1. データ入力ノード: スプレッドシートから取得したデータを受け取る
  2. データ前処理ノード: データを分析用に整形
  3. AI分析ノード: LLMでデータ分析を実行
  4. 結果整形ノード: 分析結果をスプレッドシート用に整形

AI分析プロンプト

以下の営業データを分析し、以下の観点で分析結果を提供してください:

1. 売上トレンド分析
2. 顧客別パフォーマンス分析
3. 商品・サービス別売上分析
4. 改善提案

データ: {{input_data}}

分析結果は以下のJSON形式で出力してください:
{
  "trend_analysis": "売上トレンドの分析結果",
  "customer_performance": "顧客別パフォーマンス分析",
  "product_analysis": "商品・サービス別分析",
  "recommendations": "改善提案のリスト"
}

ステップ4: Google Sheets操作ライブラリの実装

Google Sheets APIを扱うための補助ライブラリを作成します。

// lib/google-sheets.ts
import { google } from 'googleapis'

export async function readSpreadsheet(
  accessToken: string,
  spreadsheetId: string,
  sheetName: string
) {
  const auth = setCredentials({ access_token: accessToken })
  const sheets = google.sheets({ version: 'v4', auth })

  const response = await sheets.spreadsheets.values.get({
    spreadsheetId,
    range: sheetName,
  })

  return response.data.values || []
}

export async function writeSpreadsheet(
  accessToken: string,
  spreadsheetId: string,
  sheetName: string,
  values: any[][]
) {
  const auth = setCredentials({ access_token: accessToken })
  const sheets = google.sheets({ version: 'v4', auth })

  const response = await sheets.spreadsheets.values.append({
    spreadsheetId,
    range: sheetName,
    valueInputOption: 'RAW',
    requestBody: {
      values,
    },
  })

  return response.data
}

export async function createSheetIfNotExists(
  accessToken: string,
  spreadsheetId: string,
  sheetName: string
): Promise<boolean> {
  const auth = setCredentials({ access_token: accessToken })
  const sheets = google.sheets({ version: 'v4', auth })

  // 既存シートを取得
  const spreadsheet = await sheets.spreadsheets.get({
    spreadsheetId,
  })

  const sheetExists = spreadsheet.data.sheets?.some(
    (sheet) => sheet.properties?.title === sheetName
  )

  if (sheetExists) {
    return false
  }

  // 新しいシートを作成
  await sheets.spreadsheets.batchUpdate({
    spreadsheetId,
    requestBody: {
      requests: [
        {
          addSheet: {
            properties: {
              title: sheetName,
            },
          },
        },
      ],
    },
  })

  return true
}

ステップ5: Difyクライアントの実装

Dify APIを呼び出すためのクライアントライブラリを作成します。

// lib/dify-client.ts
export class DifyClient {
  private apiKey: string
  private baseUrl: string

  constructor() {
    this.apiKey = process.env.DIFY_API_KEY || ''
    this.baseUrl = process.env.DIFY_API_BASE_URL || 'https://api.dify.ai/v1'
  }

  async analyzeSalesData(salesData: any[][]): Promise<string> {
    const workflowId = process.env.DIFY_SALES_ANALYSIS_WORKFLOW_ID

    if (!workflowId) {
      throw new Error('DIFY_SALES_ANALYSIS_WORKFLOW_ID is not set')
    }

    // 2次元配列をタブ区切りテキストに変換
    const dataText = salesData.map((row) => row.join('\t')).join('\n')

    // Difyワークフローを実行
    const url = this.baseUrl + '/workflows/run'
    
    const response = await fetch(url, {
      method: 'POST',
      headers: {
        'Authorization': 'Bearer ' + this.apiKey,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        inputs: {
          sales_data: dataText,
        },
        response_mode: 'blocking',
        user: 'sales-analysis-user',
      }),
    })

    if (!response.ok) {
      const errorData = await response.json()
      throw new Error('Dify API error: ' + errorData.message)
    }

    const result = await response.json()

    // ワークフローの出力から分析結果を取得
    const analysisResult = result.data.outputs?.analysis_result ||
                          result.data.outputs?.text ||
                          '分析結果を取得できませんでした'

    return analysisResult
  }
}

export const difyClient = new DifyClient()

ステップ6: フロントエンドの実装

Next.jsのフロントエンドでワークフローを実行するコンポーネントを作成します。

🎯 実際のデモアプリケーション
このコードを実装したデモアプリケーションは /demo/sales-analysis で実際に動作を確認できます。

// app/demo/sales-analysis/page.tsx
'use client'

import { useState } from 'react'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'

export default function SalesAnalysisPage() {
  const [spreadsheetId, setSpreadsheetId] = useState('')
  const [sheetName, setSheetName] = useState('Sheet1')
  const [analysisResult, setAnalysisResult] = useState<string | null>(null)
  const [analyzing, setAnalyzing] = useState(false)
  const [error, setError] = useState('')

  const handleAnalyze = async () => {
    setAnalyzing(true)
    setError('')

    try {
      const response = await fetch('/api/workflows/sales-analysis', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ spreadsheetId, sheetName }),
      })

      if (!response.ok) {
        const errorData = await response.json()
        throw new Error(errorData.error || 'Failed to analyze data')
      }

      const result = await response.json()
      setAnalysisResult(result.analysisResult)
    } catch (err: any) {
      setError(err.message)
    } finally {
      setAnalyzing(false)
    }
  }

  return (
    <div className="container mx-auto px-4 py-8 max-w-4xl">
      <h1 className="text-3xl font-bold mb-6">営業データ自動分析</h1>

      <Card className="mb-6">
        <CardHeader>
          <CardTitle>スプレッドシート情報入力</CardTitle>
          <CardDescription>
            読み取りたいGoogle Sheetsの情報を入力してください
          </CardDescription>
        </CardHeader>
        <CardContent className="space-y-4">
          <div>
            <label className="block text-sm font-medium mb-2">
              スプレッドシートID
            </label>
            <Input
              placeholder="1ABC...xyz"
              value={spreadsheetId}
              onChange={(e) => setSpreadsheetId(e.target.value)}
            />
          </div>

          <div>
            <label className="block text-sm font-medium mb-2">
              シート名
            </label>
            <Input
              placeholder="営業データ"
              value={sheetName}
              onChange={(e) => setSheetName(e.target.value)}
            />
          </div>

          <Button
            onClick={handleAnalyze}
            disabled={analyzing || !spreadsheetId}
            className="w-full"
          >
            {analyzing ? '分析中...' : '分析実行'}
          </Button>
        </CardContent>
      </Card>

      {error && (
        <Card className="mb-6 border-red-500">
          <CardContent className="pt-6">
            <p className="text-red-500">エラー: {error}</p>
          </CardContent>
        </Card>
      )}

      {analysisResult && (
        <Card className="mb-6">
          <CardHeader>
            <CardTitle>分析結果</CardTitle>
            <CardDescription>
              AIによる営業データ分析レポート
              (「分析結果」シートにも保存されています)
            </CardDescription>
          </CardHeader>
          <CardContent>
            <div className="prose max-w-none">
              {analysisResult}
            </div>
          </CardContent>
        </Card>
      )}
    </div>
  )
}

実装のポイント

1. 営業データの設計

効果的な分析を行うためには、スプレッドシートのデータ構造が重要です。

推奨データ項目

カテゴリ 項目 説明
基本情報 受注日 YYYY-MM-DD形式で統一
案件ID 一意の識別子
案件名 商談内容の概要
金額情報 売上金額 税込金額
原価 粗利計算に必要
粗利額 売上金額 - 原価
粗利率 粗利額 / 売上金額
予算 月次・四半期目標
顧客情報 顧客名 企業名または個人名
業界 製造業、IT、小売など
地域 都道府県または営業所
新規/既存 顧客区分
商品情報 商品名 販売商品・サービス名
商品カテゴリ 大分類・中分類
数量 販売個数
担当者情報 営業担当者 氏名またはID
所属部門 営業部、支店など

2. セキュリティ対策

  • OAuth 2.0認証: 安全な認証フロー
  • トークン管理: アクセストークンの適切な管理
  • スコープ制限: 必要最小限の権限のみ付与
  • 機密情報の保護: 顧客名や金額などの営業機密データの取り扱い

3. エラーハンドリング

  • API エラー処理: 各API呼び出しでのエラーハンドリング
  • リトライ機能: 一時的なエラーに対するリトライ
  • ログ出力: デバッグ用のログ出力
  • 通知機能: 分析完了・エラー発生時のSlack/Email通知

4. パフォーマンス最適化

  • データ量の制限: 1回の分析で処理するデータ量を適切に設定(GASは6分制限)
  • キャッシング: 頻繁にアクセスするデータのキャッシュ
  • バッチ処理: 大量データは分割して処理
  • 非同期処理: 長時間かかる分析はバックグラウンドで実行

運用とカスタマイズ

定期実行の設定

cronジョブやVercel Cronを使用して、定期的に分析を実行できます。

// vercel.json
{
  "crons": [
    {
      "path": "/api/scheduled-analysis",
      "schedule": "0 9 * * 1"
    }
  ]
}

分析項目のカスタマイズ

Difyのプロンプトを変更することで、営業組織のニーズに合わせた様々な分析が可能です。以下、実務で特に効果の高い分析項目を紹介します。

🎯 基本分析項目

1. 売上トレンド分析

  • 日次・週次・月次・四半期・年次の売上推移
  • 前月比・前年同月比の増減率
  • 売上目標に対する達成率
  • 成長率の鈍化・加速の検知

2. 顧客セグメント分析

  • ABC分析(パレートの法則に基づく顧客分類)
  • 新規顧客 vs 既存顧客の売上比率
  • 顧客ライフタイムバリュー(LTV)分析
  • 離反リスクの高い顧客の特定

3. 商品・サービス別分析

  • 商品カテゴリー別の売上構成比
  • 利益率の高い商品の特定
  • クロスセル・アップセルの機会分析
  • 在庫回転率と販売効率

📊 高度な分析項目

4. 地域別・エリア別分析

  • 都道府県・市区町村別の売上分布
  • 営業拠点ごとのパフォーマンス比較
  • 商圏分析と市場浸透率
  • 地域特性に応じた戦略立案

5. 業界・業種別分析

  • ターゲット業界ごとの売上実績
  • 業界別の平均受注単価・商談期間
  • 業界特有のニーズと提案パターン
  • 参入すべき新規業界の特定

6. 予算・売上目標分析

  • 予算達成率と乖離要因の分析
  • 四半期・年間目標に対する進捗
  • 目標未達部門・担当者の早期特定
  • リカバリープランの自動提案

7. 営業担当者別分析

  • 個人別の売上実績とランキング
  • 商談成約率・平均商談期間
  • 訪問件数と受注件数の相関分析
  • トップセールスの行動パターン分析
  • 育成が必要な担当者の特定

🔮 予測・将来分析

8. 季節性・トレンド分析

  • 月別・四半期別の季節変動パターン
  • 繁忙期・閑散期の特定と対策
  • 前年同期比での成長トレンド
  • 季節要因を考慮した売上予測

9. 売上予測分析

  • 過去データに基づく翌月・翌四半期の売上予測
  • 商談パイプラインからの受注予測
  • 目標達成に必要な追加商談数の算出
  • リスクシナリオ分析(楽観・標準・悲観)

10. 競合比較分析

  • 競合製品との価格・機能比較
  • 失注理由の分析と改善策
  • 競合に勝っている商材・エリアの特定
  • 競合対策の有効性評価

💼 実装例:カスタム分析プロンプト

あなたは経験豊富な営業分析のエキスパートです。
以下の営業データを多角的に分析し、実行可能なアクションプランを提案してください。

【分析データ】
{{sales_data}}

【分析項目】
1. 売上トレンド分析
   - 前月比・前年同月比の増減率
   - 目標達成率と乖離要因
   - 成長が加速/鈍化している領域

2. セグメント別分析
   - 地域別:都道府県・営業所別の実績
   - 業界別:主要業界ごとの売上構成
   - 商品別:売れ筋商品と不振商品
   - 担当者別:トップ5とボトム5の特定

3. 顧客分析
   - ABC分析:上位20%の顧客で何%の売上を占めるか
   - 新規顧客の獲得状況
   - 既存顧客の継続率・離反リスク

4. 営業効率分析
   - 商談成約率の推移
   - 平均商談期間の長期化/短縮
   - 訪問件数と受注の相関

5. アクションプラン
   - 今月注力すべき3つの施策
   - リスク項目と対策
   - 来月の売上予測と必要アクション

【出力形式】
Markdown形式で、経営層にも分かりやすく、
具体的な数値と改善提案を含めてレポートしてください。

✅ プロンプト設計のコツ
ペルソナを明確にする:「営業分析のエキスパート」など役割を指定
具体的な分析項目を列挙:曖昧な指示ではなく、見たい数値を明記
出力形式を指定:JSON、Markdown、表形式など用途に合わせて指定
実行可能性を求める:分析だけでなく改善アクションまで出力させる

まとめ

DifyとGoogleスプレッドシートを連携させることで、営業データの分析を完全自動化できます。この実装により:

  • 分析時間の大幅短縮: 数時間の作業が数分で完了
  • 属人化の解消: 誰でも同じ品質の分析結果を取得
  • リアルタイム分析: データ更新と同時に分析実行
  • スケーラブルな運用: データ量が増えても対応可能
分析結果の表示例

図3: 分析結果がスプレッドシートに自動的に書き込まれる

🚀 営業データ分析の自動化を始めませんか?

実装支援やカスタマイズのご相談はお気軽にお問い合わせください。

お問い合わせ

この実装により、営業チームはデータ分析に時間を取られることなく、より戦略的な業務に集中できるようになります。

📊

あなたのAI活用レベルを診断

20問・3分で、あなたのAIスキルレベルを可視化します。
個人・法人社員の方、どなたでも無料で診断いただけます。

執筆者

田中 慎

田中 慎

CEO / PM / Vibe Coder

2011年新卒で受託開発/自社メディア企業にWebデザイナーとして入社。1年半ほど受託案件のディレクション/デザイン/開発に従事。2012年株式会社サイバーエージェントに転職し、約4年間エンジニアとしてポイントプラットフォーム事業、2つのコミュニティ事業の立ち上げ・運用に従事。同時に個人事業主としてWebサービス/メディアの開発をスタートし、年間3,000万円以上の利益を創出。2017年株式会社overflowを共同創業者・代表取締役CPOとして設立。2つのHR SaaS事業をゼロから立ち上げ、累計1,000社以上の企業、エンジニア/PMなど3万人以上が利用するサービスへと成長させた。現在はAI Nativeの創業者として、AIと人間の共創による新しい価値創造を推進。