📊 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でデータパターン発見:
- ✅ 時系列トレンドと季節性分析
- ✅ 統計的異常値検出
- ✅ 変数間の相関関係発見
- ✅ 顧客セグメンテーションと関連ルール分析
次の記事では、こういった分析を活用した財務予測モデルを作ります。