목록으로
📊 AIとビジネス - Excel

ChatGPTでExcel条件付き書式設定 - AI業務効率化のヒント

重要データを一目で!AIが条件に応じてセルに色を付けて可読性の高い表を作る方法を教えます。

大量データからパターンを見つける

Excelにデータが数千、数万個積まれているけど... どこから見ればいいか途方に暮れますよね? 売上が上がる傾向なのか、季節別にパターンがあるのか、異常な値はないのか... こういうのを一つ一つ確認しようとすると終わりがありません。

データの中に隠れたパターンを見つけることがデータ分析の核心です。トレンドを把握して、季節性を発見して、異常値を検出して、変数間の関係を見つけなければ意味あるインサイトが得られます。

AIを活用すればこんな複雑な統計分析を簡単にできます。専門的な統計知識がなくても、「トレンドを見せて」、「おかしな値を探して」と言えばAIが分析コードを作ってくれます。

この記事では、AIで大量データのパターンを見つける方法を学びます。時系列分析、季節性発見、異常値検出、相関関係分析など実務に必要な技法を扱います。

1. 時系列パターン分析

トレンドライン分析

AIプロンプト:

"月別売上データから増加/減少トレンドを分析して、
来月の売上を予測してください。"

AI生成数式:

// 線形トレンド予測
=FORECAST.LINEAR(A2, 過去売上!$B:$B, 過去売上!$A:$A)

// またはTREND関数
=TREND(過去売上!$B$2:$B$37, 過去売上!$A$2:$A$37, A2)

// 季節性指数適用
=C2*INDEX(季節指数!$B:$B, MATCH(MONTH(A2), 季節指数!$A:$A, 0))

// 信頼区間 (上限/下限)
// 標準誤差計算
=STEYX(過去売上!$B$2:$B$37, 過去売上!$A$2:$A$37)

// 95%信頼区間上限
=D2+1.96*$標準誤差

// 95%信頼区間下限
=D2-1.96*$標準誤差

2. 季節性パターン発見

AIプロンプト:

"3年間の月別売上データから季節別パターンを見つけてください。
どの月が売上が高く低いか分析してください。"

AI生成VBA:

Sub 季節性分析()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim monthlyAvg(1 To 12) As Double
    Dim monthCount(1 To 12) As Integer
    Dim i As Long
    Dim month As Integer

    Set ws = ThisWorkbook.Sheets("売上データ")
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    ' 月別平均計算
    For i = 2 To lastRow
        month = Month(ws.Cells(i, 1).Value)
        monthlyAvg(month) = monthlyAvg(month) + ws.Cells(i, 2).Value
        monthCount(month) = monthCount(month) + 1
    Next i

    ' 平均計算
    For i = 1 To 12
        If monthCount(i) > 0 Then
            monthlyAvg(i) = monthlyAvg(i) / monthCount(i)
        End If
    Next i

    ' 全体平均
    Dim totalAvg As Double
    totalAvg = Application.WorksheetFunction.Average( _
        ws.Range("B2:B" & lastRow))

    ' 結果シート
    Dim resultWs As Worksheet
    On Error Resume Next
    Set resultWs = Sheets("季節性分析")
    If resultWs Is Nothing Then
        Set resultWs = Sheets.Add(After:=ws)
        resultWs.Name = "季節性分析"
    Else
        resultWs.Cells.Clear
    End If
    On Error GoTo 0

    With resultWs
        .Cells(1, 1).Value = "月"
        .Cells(1, 2).Value = "平均売上"
        .Cells(1, 3).Value = "指数"
        .Cells(1, 4).Value = "特性"

        For i = 1 To 12
            .Cells(i + 1, 1).Value = i & "月"
            .Cells(i + 1, 2).Value = Format(monthlyAvg(i), "#,##0")

            ' 季節指数 (平均対比比率)
            Dim seasonIndex As Double
            seasonIndex = monthlyAvg(i) / totalAvg

            .Cells(i + 1, 3).Value = Format(seasonIndex, "0.00")

            ' 特性分類
            If seasonIndex >= 1.2 Then
                .Cells(i + 1, 4).Value = "繁忙期"
                .Rows(i + 1).Interior.Color = RGB(146, 208, 80)
            ElseIf seasonIndex >= 1.1 Then
                .Cells(i + 1, 4).Value = "準繁忙期"
                .Rows(i + 1).Interior.Color = RGB(255, 242, 204)
            ElseIf seasonIndex <= 0.8 Then
                .Cells(i + 1, 4).Value = "閑散期"
                .Rows(i + 1).Interior.Color = RGB(255, 199, 206)
            Else
                .Cells(i + 1, 4).Value = "平年"
            End If
        Next i

        .Columns("A:D").AutoFit
    End With

    MsgBox "季節性分析が完了しました。", vbInformation
End Sub

3. 異常値(Outlier)検出

AIプロンプト:

"売上データから異常に高いまたは低い値を見つけてください。
統計的方法(Z-scoreまたはIQR)を使用してください。"

AI生成数式:

// Z-score方法
// C列: Z-score計算
=ABS((B2-AVERAGE($B$2:$B$1000))/STDEV($B$2:$B$1000))

// D列: 異常値判定 (|Z| > 2)
=IF(C2>2, "異常値", "正常")

// IQR方法
// E列: Q1 (25th percentile)
=QUARTILE($B$2:$B$1000, 1)

// F列: Q3 (75th percentile)
=QUARTILE($B$2:$B$1000, 3)

// G列: IQR
=F2-E2

// H列: 異常値判定
=IF(OR(B2<E2-1.5*G2, B2>F2+1.5*G2), "異常値", "正常")

4. 相関関係分析

AIプロンプト:

"広告費と売上間の相関関係を分析してください。
広告費が増加すれば売上も増加するか確認したいです。"

AI生成数式:

// 相関係数 (CORREL)
=CORREL(B2:B100, C2:C100)

// 決定係数 R² (RSQ)
=RSQ(B2:B100, C2:C100)

// 回帰分析傾き
=SLOPE(C2:C100, B2:B100)

// 回帰分析切片
=INTERCEPT(C2:C100, B2:B100)

// 予測値
=傾き*B2+切片

5. 顧客セグメンテーション (RFM分析)

AIプロンプト:

"顧客データをRFM(Recency, Frequency, Monetary)基準で
セグメント化してVIP、一般、離脱リスク顧客を分類してください。"

AI生成VBA:

Sub RFM分析()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim today As Date
    Dim recency As Long
    Dim frequency As Long
    Dim monetary As Double

    Set ws = ThisWorkbook.Sheets("顧客取引履歴")
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    today = Date

    ' 顧客別集計シート
    Dim resultWs As Worksheet
    On Error Resume Next
    Set resultWs = Sheets("RFM分析")
    If resultWs Is Nothing Then
        Set resultWs = Sheets.Add(After:=ws)
        resultWs.Name = "RFM分析"
    Else
        resultWs.Cells.Clear
    End If
    On Error GoTo 0

    ' ヘッダー
    With resultWs
        .Cells(1, 1).Value = "顧客ID"
        .Cells(1, 2).Value = "顧客名"
        .Cells(1, 3).Value = "最近購入日"
        .Cells(1, 4).Value = "R(日)"
        .Cells(1, 5).Value = "F(回)"
        .Cells(1, 6).Value = "M(円)"
        .Cells(1, 7).Value = "Rスコア"
        .Cells(1, 8).Value = "Fスコア"
        .Cells(1, 9).Value = "Mスコア"
        .Cells(1, 10).Value = "RFMスコア"
        .Cells(1, 11).Value = "顧客ランク"
    End With

    Application.ScreenUpdating = False

    ' 顧客別RFM計算
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    For i = 2 To lastRow
        Dim customerID As String
        Dim transDate As Date
        Dim transAmount As Double

        customerID = ws.Cells(i, 1).Value
        transDate = ws.Cells(i, 3).Value
        transAmount = ws.Cells(i, 4).Value

        If Not dict.Exists(customerID) Then
            ' 新規顧客
            Dim customerData(0 To 3) As Variant
            customerData(0) = ws.Cells(i, 2).Value ' 名前
            customerData(1) = transDate             ' 最近取引日
            customerData(2) = 1                     ' 取引頻度
            customerData(3) = transAmount           ' 総購入額
            dict.Add customerID, customerData
        Else
            ' 既存顧客
            Dim existingData As Variant
            existingData = dict(customerID)

            ' より最近の日付に更新
            If transDate > existingData(1) Then
                existingData(1) = transDate
            End If

            existingData(2) = existingData(2) + 1
            existingData(3) = existingData(3) + transAmount

            dict(customerID) = existingData
        End If
    Next i

    ' 結果シートに書き込み
    Dim rowNum As Long
    rowNum = 2

    Dim key As Variant
    For Each key In dict.Keys
        Dim data As Variant
        data = dict(key)

        resultWs.Cells(rowNum, 1).Value = key
        resultWs.Cells(rowNum, 2).Value = data(0)
        resultWs.Cells(rowNum, 3).Value = data(1)

        ' Recency (最近購入日からの経過日)
        recency = today - data(1)
        resultWs.Cells(rowNum, 4).Value = recency

        ' Frequency
        resultWs.Cells(rowNum, 5).Value = data(2)

        ' Monetary
        resultWs.Cells(rowNum, 6).Value = data(3)

        rowNum = rowNum + 1
    Next key

    lastRow = rowNum - 1

    ' RFMスコア計算 (1-5点、5点が最も良い)
    For i = 2 To lastRow
        ' Rスコア (小さいほど良い)
        recency = resultWs.Cells(i, 4).Value
        If recency <= 30 Then
            resultWs.Cells(i, 7).Value = 5
        ElseIf recency <= 60 Then
            resultWs.Cells(i, 7).Value = 4
        ElseIf recency <= 90 Then
            resultWs.Cells(i, 7).Value = 3
        ElseIf recency <= 180 Then
            resultWs.Cells(i, 7).Value = 2
        Else
            resultWs.Cells(i, 7).Value = 1
        End If

        ' Fスコア (多いほど良い)
        frequency = resultWs.Cells(i, 5).Value
        If frequency >= 10 Then
            resultWs.Cells(i, 8).Value = 5
        ElseIf frequency >= 7 Then
            resultWs.Cells(i, 8).Value = 4
        ElseIf frequency >= 5 Then
            resultWs.Cells(i, 8).Value = 3
        ElseIf frequency >= 3 Then
            resultWs.Cells(i, 8).Value = 2
        Else
            resultWs.Cells(i, 8).Value = 1
        End If

        ' Mスコア (多いほど良い)
        monetary = resultWs.Cells(i, 6).Value
        If monetary >= 5000000 Then
            resultWs.Cells(i, 9).Value = 5
        ElseIf monetary >= 3000000 Then
            resultWs.Cells(i, 9).Value = 4
        ElseIf monetary >= 1000000 Then
            resultWs.Cells(i, 9).Value = 3
        ElseIf monetary >= 500000 Then
            resultWs.Cells(i, 9).Value = 2
        Else
            resultWs.Cells(i, 9).Value = 1
        End If

        ' 総RFMスコア
        Dim rfmScore As Integer
        rfmScore = resultWs.Cells(i, 7).Value + _
                   resultWs.Cells(i, 8).Value + _
                   resultWs.Cells(i, 9).Value

        resultWs.Cells(i, 10).Value = rfmScore

        ' 顧客ランク
        Dim grade As String
        If rfmScore >= 13 Then
            grade = "VIP"
            resultWs.Rows(i).Interior.Color = RGB(255, 242, 204)
        ElseIf rfmScore >= 10 Then
            grade = "優秀"
            resultWs.Rows(i).Interior.Color = RGB(226, 239, 218)
        ElseIf rfmScore >= 7 Then
            grade = "一般"
        ElseIf rfmScore >= 5 Then
            grade = "注目必要"
            resultWs.Rows(i).Interior.Color = RGB(252, 228, 214)
        Else
            grade = "離脱リスク"
            resultWs.Rows(i).Interior.Color = RGB(255, 199, 206)
        End If

        resultWs.Cells(i, 11).Value = grade
    Next i

    ' 書式適用
    With resultWs
        .Range("F2:F" & lastRow).NumberFormat = "#,##0"
        .Columns("A:K").AutoFit
        .Range("A1:K1").Font.Bold = True
    End With

    Application.ScreenUpdating = True

    MsgBox "RFM分析が完了しました。", vbInformation
End Sub

まとめ

AIでデータパターン発見:

  • ✅ 時系列トレンドと季節性分析
  • ✅ 統計的異常値検出
  • ✅ 変数間の相関関係発見
  • ✅ 顧客セグメンテーションと関連ルール分析

次の記事では、こういった分析を活用した財務予測モデルを作ります。