PYTHON + LANGCHAIN 實戰專案
營收趨勢、客戶分析與 AI 商業洞察
# 匯入資料處理套件
import pandas as pd
# 匯入繪圖套件
import matplotlib.pyplot as plt
# 匯入統計視覺化套件
import seaborn as sns
# 載入電商銷售 CSV 數據
df = pd.read_csv('data/ecommerce_sales.csv')
# 將訂單日期轉換為 datetime 格式
df['Order_Date'] = pd.to_datetime(df['Order_Date'])
# 提取月份週期(格式:2024-01)
df['Month'] = df['Order_Date'].dt.to_period('M')
# 計算每筆訂單總金額 = 數量 × 單價
df['Total_Amount'] = df['Quantity'] * df['Unit_Price']
# 顯示資料概要(使用千分位格式)
print(f"訂單數量: {len(df):,}")
print(f"時間範圍: {df['Order_Date'].min()} ~ {df['Order_Date'].max()}")
print(f"產品類別: {df['Category'].unique()}")
# 依月份分組計算營收總額
monthly_revenue = df.groupby('Month')['Total_Amount'].sum().reset_index()
# 將月份轉為字串格式(方便繪圖顯示)
monthly_revenue['Month'] = monthly_revenue['Month'].astype(str)
# 建立畫布
fig, ax = plt.subplots(figsize=(14, 6))
# 繪製長條圖(營收柱狀圖)
ax.bar(monthly_revenue['Month'], monthly_revenue['Total_Amount'],
color='#6c5ce7', alpha=0.8)
# 加上趨勢線(紅色圓點連線)
ax.plot(monthly_revenue['Month'], monthly_revenue['Total_Amount'],
'ro-', linewidth=2, markersize=8)
# 設定標題和軸標籤
ax.set_title('月營收趨勢', fontsize=16)
ax.set_xlabel('月份')
ax.set_ylabel('營收 (元)')
# X 軸標籤旋轉 45 度(避免重疊)
ax.tick_params(axis='x', rotation=45)
# 儲存圖表
plt.tight_layout()
plt.savefig('output/月營收趨勢.png', dpi=300)
# 依產品類別分組,計算銷售總額並由高到低排序
category_sales = df.groupby('Category')['Total_Amount'].sum().sort_values(ascending=False)
# 建立 1x2 子圖佈局
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# 左圖:圓餅圖(顯示各類別銷售佔比)
axes[0].pie(category_sales.values, labels=category_sales.index,
autopct='%1.1f%%', # 顯示百分比(小數點後1位)
colors=plt.cm.Purples(np.linspace(0.3, 0.9, len(category_sales)))) # 紫色漸層
axes[0].set_title('各類別銷售佔比')
# 右圖:水平長條圖(銷售額排名)
axes[1].barh(category_sales.index, category_sales.values, color='#6c5ce7')
axes[1].set_xlabel('銷售額 (元)')
axes[1].set_title('各類別銷售額排名')
# 儲存圖表
plt.tight_layout()
plt.savefig('output/產品類別分析.png', dpi=300)
# 匯入 LangChain OpenAI 模組
from langchain_openai import ChatOpenAI
# 匯入提示模板類別
from langchain_core.prompts import ChatPromptTemplate
# 初始化語言模型
llm = ChatOpenAI(model="gpt-5.6-luna")
# 依產品類別分組計算統計數據
sales_stats = df.groupby('Category').agg({
'Total_Amount': ['sum', 'mean'], # 銷售總額、平均金額
'Order_ID': 'count', # 訂單數量
'Quantity': 'sum' # 銷售數量
}).round(0) # 四捨五入為整數
# 建立銷售分析提示模板
analysis_prompt = ChatPromptTemplate.from_messages([
("system", "你是電商數據分析專家,請用繁體中文提供商業洞察"),
("human", """根據以下銷售數據:
{stats}
請分析:
1. 主力產品類別及其特點
2. 銷售趨勢觀察
3. 提升營收的具體建議""")
])
# 使用 LCEL 串接並執行
chain = analysis_prompt | llm
response = chain.invoke({"stats": sales_stats.to_string()})
# 輸出 AI 分析結果
print(response.content)
# 匯入日期時間模組
from datetime import datetime
# 設定基準日期(最後一筆訂單日期)
today = df['Order_Date'].max()
# 依客戶 ID 分組,計算 RFM 三項指標
rfm = df.groupby('Customer_ID').agg({
# Recency(近期購買):距離上次購買的天數
'Order_Date': lambda x: (today - x.max()).days,
# Frequency(購買頻率):訂單次數
'Order_ID': 'count',
# Monetary(消費金額):消費總額
'Total_Amount': 'sum'
}).rename(columns={
'Order_Date': 'Recency',
'Order_ID': 'Frequency',
'Total_Amount': 'Monetary'
})
# 將 RFM 值轉換為 1-4 分評分(使用四分位數切分)
# R 分數:天數越少分數越高(4=最近購買)
rfm['R_Score'] = pd.qcut(rfm['Recency'], 4, labels=[4,3,2,1])
# F 分數:次數越多分數越高
rfm['F_Score'] = pd.qcut(rfm['Frequency'].rank(method='first'), 4, labels=[1,2,3,4])
# M 分數:金額越高分數越高
rfm['M_Score'] = pd.qcut(rfm['Monetary'], 4, labels=[1,2,3,4])
# 組合 RFM 分數字串(如:444 表示高價值客戶)
rfm['RFM_Score'] = rfm['R_Score'].astype(str) + rfm['F_Score'].astype(str) + rfm['M_Score'].astype(str)
# 顯示前 10 筆客戶 RFM 分析結果
print(rfm.head(10))
# 匯入 JSON 輸出解析器
from langchain_core.output_parsers import JsonOutputParser
# 建立客戶洞察提示模板(指定 JSON 輸出格式)
customer_prompt = ChatPromptTemplate.from_messages([
("system", """你是CRM專家。根據客戶RFM分數提供行銷建議。
輸出JSON:{{"segment": "客群名稱", "strategy": "行銷策略", "channel": "推薦管道"}}"""),
("human", "客戶RFM分數:R={r}, F={f}, M={m}")
])
# 初始化 JSON 解析器
parser = JsonOutputParser()
# 串接完整鏈:提示模板 → 語言模型 → JSON 解析
customer_chain = customer_prompt | llm | parser
# 篩選高價值客戶(R >= 3 且 M >= 3)
vip_customers = rfm[
(rfm['R_Score'].astype(int) >= 3) &
(rfm['M_Score'].astype(int) >= 3)
].head(5) # 取前 5 名
# 迴圈分析每位 VIP 客戶
for idx, row in vip_customers.iterrows():
# 執行 AI 分析鏈
result = customer_chain.invoke({
"r": row['R_Score'],
"f": row['F_Score'],
"m": row['M_Score']
})
# 輸出客戶分群和建議策略
print(f"客戶 {idx}: {result['segment']} - {result['strategy']}")
月營收、成長率追蹤
圓餅圖與長條圖視覺化
客戶價值評估模型
自動產生行銷策略建議