门店数据分析专家 Skill
版本: v1.0.0
定位: 营运分析专家,为门店及营运团队提供专业的日度数据分析报告
输出: 腾讯在线文档(Markdown格式)
核心功能
| 序号 | 分析维度 | 说明 | |:----:|----------|------| | 1 | TC/AC分析 | 当日客单价(TC)与平均消费额(AC)统计 | | 2 | 类别销售数据 | 按产品类别汇总销售数据 | | 3 | 核心产品分析 | 海盐可颂、玛格丽特香肠、椒劲香肠日销量 | | 4 | TOP10产品 | 销量排名前10产品及数量 | | 5 | 时段高峰分析 | 早/中/晚高峰数据,含同比环比 | | 6 | 客单价分析 | 客单价分布及趋势分析 | | 7 | 类别占比环比 | 各类别销售占比环比分析,找原因 | | 8 | 天气影响分析 | 天气因素对销售的影响 | | 9 | 会员销售占比 | 会员与非会员销售占比 | | 10 | 营运建议 | 基于数据分析的改善建议 | | 11 | 在线文档 | 生成腾讯文档并分享链接 |
触发方式
用户可以通过以下方式触发分析:
帮我分析今天的门店数据
生成昨日营运报告
门店数据分析报告
今日销售分析
营运日报
数据源说明
期望数据格式
分析需要以下数据文件,请确保数据文件包含以下字段:
1. 销售明细表(sales_detail.xlsx) | 字段 | 类型 | 说明 | |------|------|------| | 日期 | date | 销售日期 | | 门店 | string | 门店名称/编号 | | 类别 | string | 产品类别 | | 产品名称 | string | 产品名称 | | 数量 | int | 销售数量 | | 销售净额 | float | 实际销售收入(净额) | | 会员价 | float | 会员消费金额 | | 时段 | string | 早市/中市/晚市 | | 天气 | string | 当日天气 |
2. 门店基础表(store_info.xlsx) | 字段 | 类型 | 说明 | |------|------|------| | 门店编号 | string | 门店唯一标识 | | 门店名称 | string | 门店名称 | | 门店类型 | string | 旗舰店/标准店/社区店等 |
3. 天气数据表(weather.xlsx) | 字段 | 类型 | 说明 | |------|------|------| | 日期 | date | 日期 | | 天气 | string | 晴/雨/阴等 | | 温度 | int | 当日温度(℃) | | 恶劣天气 | bool | 是否恶劣天气 |
分析流程
1. 数据加载与验证
import pandas as pd
from datetime import datetime, timedelta
def load_and_validate_data(data_dir):
"""加载并验证数据文件"""
# 加载销售数据
sales = pd.read_excel(f'{data_dir}/sales_detail.xlsx')
sales['日期'] = pd.to_datetime(sales['日期'])
# 验证必填字段
required_fields = ['日期', '门店', '类别', '产品名称', '数量', '销售净额']
missing = [f for f in required_fields if f not in sales.columns]
if missing:
raise ValueError(f"数据缺失必填字段: {missing}")
return sales
2. TC/AC 分析
def analyze_tc_ac(sales, date):
"""计算TC客单价和AC平均消费额"""
df = sales[sales['日期'] == date]
total_sales = df['销售净额'].sum() # 销售净额
total_count = df['数量'].sum() # 总数量
order_count = len(df) # 订单数
tc = total_sales / total_count if total_count > 0 else 0 # 客单价
ac = total_sales / order_count if order_count > 0 else 0 # 平均消费额
return {
'TC': round(tc, 2),
'AC': round(ac, 2),
'总销售净额': round(total_sales, 2),
'总数量': int(total_count),
'订单数': order_count
}
3. 核心产品分析
def analyze_core_products(sales, date):
"""分析核心产品:海盐可颂、玛格丽特香肠、椒劲香肠"""
core_items = ['海盐可颂', '玛格丽特香肠', '椒劲香肠']
df = sales[(sales['日期'] == date) & (sales['产品名称'].isin(core_items))]
# 计算今日销量
today_sales = df.groupby('产品名称')['数量'].sum()
# 计算上周同期销量
last_week_date = pd.to_datetime(date) - timedelta(days=7)
df_last_week = sales[(sales['日期'] == last_week_date) &
(sales['产品名称'].isin(core_items))]
last_week_sales = df_last_week.groupby('产品名称')['数量'].sum()
# 构建结果
result = []
for item in core_items:
today = today_sales.get(item, 0)
last_week = last_week_sales.get(item, 0)
change = (today - last_week) / last_week * 100 if last_week > 0 else 0
result.append({
'产品': item,
'今日销量': int(today),
'上周同期': int(last_week),
'环比变化': f"{change:+.1f}%"
})
return result
4. TOP10 产品分析
def analyze_top10_products(sales, date):
"""分析销量TOP10产品"""
df = sales[sales['日期'] == date]
top10 = df.groupby('产品名称').agg({
'数量': 'sum',
'销售净额': 'sum'
}).sort_values('数量', ascending=False).head(10)
result = []
for i, (product, row) in enumerate(top10.iterrows(), 1):
result.append({
'排名': i,
'产品': product,
'销量': int(row['数量']),
'销售净额': round(row['销售净额'], 2)
})
return result
5. 时段高峰分析
def analyze_time_periods(sales, date):
"""分析早中晚高峰数据"""
df = sales[sales['日期'] == date]
# 定义时段
periods = {
'早市': ['05:00-11:00', (5, 11)],
'午市': ['11:00-14:00', (11, 14)],
'晚市': ['14:00-22:00', (14, 22)]
}
# 假设有时间字段,按时间分组
result = df.groupby('时段').agg({
'销售净额': 'sum',
'数量': 'sum'
}).reset_index()
total = result['销售净额'].sum()
result['占比'] = (result['销售净额'] / total * 100).round(1)
# 计算环比(上周同期)
last_week_date = pd.to_datetime(date) - timedelta(days=7)
df_last = sales[sales['日期'] == last_week_date]
last_week_result = df_last.groupby('时段')['销售净额'].sum()
result['上周同期'] = result['时段'].map(last_week_result).fillna(0)
result['环比'] = ((result['销售净额'] - result['上周同期']) /
result['上周同期'] * 100).round(1).fillna(0)
return result
6. 客单价分析
def analyze_customer_price(sales, date):
"""客单价分析"""
df = sales[sales['日期'] == date]
# 按订单/小票计算客单价(这里简化为按产品记录)
return {
'平均客单价': round(df['销售净额'].mean(), 2),
'中位数客单价': round(df['销售净额'].median(), 2),
'最高客单价': round(df['销售净额'].max(), 2),
'最低客单价': round(df['销售净额'].min(), 2),
'客单价标准差': round(df['销售净额'].std(), 2)
}
7. 类别占比环比分析
def analyze_category_ratio(sales, date):
"""类别占比环比分析"""
current = sales[sales['日期'] == date]
last_week = pd.to_datetime(date) - timedelta(days=7)
compare = sales[sales['日期'] == last_week]
# 计算本期占比
current_ratio = current.groupby('类别')['销售净额'].sum()
current_ratio = (current_ratio / current_ratio.sum() * 100).round(1)
# 计算上期占比
compare_ratio = compare.groupby('类别')['销售净额'].sum()
compare_ratio = (compare_ratio / compare_ratio.sum() * 100).round(1)
# 计算变化
ratio_change = (current_ratio - compare_ratio).sort_values(ascending=False)
result = []
for category in current_ratio.index:
current_pct = current_ratio.get(category, 0)
compare_pct = compare_ratio.get(category, 0)
change = current_pct - compare_pct
# 分析原因
if change > 0:
reason = f"占比上升 {change:+.1f}%,需关注增长来源"
elif change < 0:
reason = f"占比下降 {change:+.1f}%,需分析下滑原因"
else:
reason = "占比持平"
result.append({
'类别': category,
'本期占比': f"{current_pct}%",
'上期占比': f"{compare_pct}%",
'变化': f"{change:+.1f}%",
'原因分析': reason
})
return result
8. 天气影响分析
def analyze_weather_impact(sales, weather, date):
"""天气对销售影响分析"""
# 获取当日天气
weather_data = weather[weather['日期'] == date]
if len(weather_data) == 0:
return {'天气': '未知', '建议': '暂无天气数据'}
today_weather = weather_data.iloc[0]
# 获取历史同期天气数据
df = sales[sales['日期'] == date]
total_sales = df['销售净额'].sum()
# 简化分析:恶劣天气 vs 正常天气
is_bad = today_weather.get('恶劣天气', False)
weather_type = today_weather.get('天气', '未知')
suggestions = []
if is_bad or '雨' in str(weather_type):
suggestions.append('建议加强外卖渠道推广')
suggestions.append('可推出雨天专属优惠')
if '高温' in str(weather_type) or '炎热' in str(weather_type):
suggestions.append('冷饮/冰品需求增加,补货优先')
if '节假日' in str(weather_type):
suggestions.append('节假日客流增加,备货量建议+20%')
return {
'天气': weather_type,
'温度': f"{today_weather.get('温度', 'N/A')}℃",
'恶劣天气': '是' if is_bad else '否',
'当日销售净额': f"¥{total_sales:,.2f}",
'建议': suggestions
}
9. 会员销售占比
def analyze_member_ratio(sales, date):
"""会员销售占比分析"""
df = sales[sales['日期'] == date]
member_sales = df['会员价'].sum() if '会员价' in df.columns else 0
total_sales = df['销售净额'].sum()
non_member = total_sales - member_sales
member_ratio = member_sales / total_sales * 100 if total_sales > 0 else 0
suggestions = []
if member_ratio < 30:
suggestions.append('会员占比较低,建议加强会员推广')
elif member_ratio > 60:
suggestions.append('会员活跃度高,可推出会员专属活动')
return {
'会员销售': f"¥{member_sales:,.2f}",
'会员占比': f"{member_ratio:.1f}%",
'非会员销售': f"¥{non_member:,.2f}",
'非会员占比': f"{100-member_ratio:.1f}%",
'建议': suggestions
}
10. 生成营运建议
def generate_suggestions(analysis_result):
"""基于分析结果生成营运建议"""
suggestions = []
# TC/AC建议
if 'tc_ac' in analysis_result:
tc = analysis_result['tc_ac'].get('TC', 0)
if tc < 20:
suggestions.append('客单价偏低,建议推出套餐组合提升连带率')
elif tc > 50:
suggestions.append('客单价表现优秀,保持当前产品结构')
# 核心产品建议
if 'core_products' in analysis_result:
for p in analysis_result['core_products']:
if '下降' in str(p):
suggestions.append(f"【{p['产品']}】销量下滑,需关注原因")
# 时段建议
if 'periods' in analysis_result:
periods_df = analysis_result['periods']
if '早市' in periods_df['时段'].values:
morning = periods_df[periods_df['时段']=='早市']['占比'].values
if len(morning) > 0 and morning[0] < 20:
suggestions.append('早市销售占比偏低,建议推出早餐套餐')
# 会员建议
if 'member' in analysis_result:
if '会员占比较低' in str(analysis_result['member'].get('建议', [])):
suggestions.append('加强会员注册推广,提升会员粘性')
return suggestions if suggestions else ['各项指标表现正常,继续保持']
报告生成模板
Markdown 报告结构
# 🏪 门店日度营运分析报告
**报告日期:** {report_date}
**生成时间:** {generate_time}
**分析门店:** {store_name}
---
## 📊 一、核心指标概览
| 指标 | 本期 | 上周同期 | 环比变化 |
|------|------|----------|----------|
| TC(客单价) | ¥{tc} | ¥{tc_last_week} | {tc_change}% |
| AC(平均消费额) | ¥{ac} | ¥{ac_last_week} | {ac_change}% |
| 总销售额(净额) | ¥{total_sales} | ¥{sales_last_week} | {sales_change}% |
| 总销售数量 | {qty} | {qty_last_week} | {qty_change}% |
---
## 📈 二、类别销售数据
| 类别 | 销售净额(元) | 销售数量 | 占比 |
|------|-------------|----------|------|
{category_rows}
---
## 🔑 三、核心产品分析
| 产品名称 | 今日销量 | 上周同期 | 环比变化 |
|----------|----------|----------|----------|
{core_product_rows}
---
## 🏆 四、TOP10 热销产品
| 排名 | 产品名称 | 销售数量 | 销售净额(元) |
|------|----------|----------|-------------|
{top10_rows}
---
## ⏰ 五、时间段分析
| 时段 | 销售净额(元) | 占比 | 上周同期 | 环比变化 |
|------|-------------|------|----------|----------|
{period_rows}
---
## 💰 六、客单价分析
| 指标 | 数值 |
|------|------|
| 平均客单价 | ¥{avg_tc} |
| 中位数客单价 | ¥{median_tc} |
| 最高客单价 | ¥{max_tc} |
| 最低客单价 | ¥{min_tc} |
---
## 📊 七、销售类别占比环比分析
| 类别 | 本期占比 | 上期占比 | 变化 | 原因分析 |
|------|----------|----------|------|----------|
{category_ratio_rows}
---
## 🌤️ 八、天气对销售影响分析
| 日期 | 天气 | 温度 | 恶劣天气 |
|------|------|------|----------|
| {date} | {weather} | {temp} | {bad_weather} |
**建议:** {weather_suggestions}
---
## 👥 九、会员销售占比
| 指标 | 数值 | 占比 |
|------|------|------|
| 会员销售 | {member_sales} | {member_ratio}% |
| 非会员销售 | {non_member_sales} | {non_member_ratio}% |
---
## 💡 十、营运建议与方案
{key_suggestions}
---
**报告生成:** 门店数据分析专家 v1.0
**统计口径:** 销售净额(已扣除退款、退货)
执行流程
flowchart TD
A[用户触发分析] --> B[确认分析日期和门店]
B --> C[加载数据文件]
C --> D{数据完整性检查}
D -->|通过| E[执行11项分析]
D -->|缺失| F[提示补充数据]
F --> C
E --> G[生成Markdown报告]
G --> H[调用腾讯文档API创建文档]
H --> I[分享文档链接]
I --> J[完成]
腾讯文档输出
分析完成后,自动创建腾讯在线文档:
from qclaw_tdoc_mcp_call import create_smartcanvas_by_mdx
# 生成报告后上传到腾讯文档
doc_result = create_smartcanvas_by_mdx(
title=f"门店日度分析报告_{date}",
mdx=report_content,
content_format="mdx"
)
# 返回文档链接
return doc_result['docUrl']
注意事项
- 数据完整性:确保销售数据包含完整字段,特别是销售净额字段
- 金额口径:所有金额按销售净额统计(扣除退款、退货)
- 占比分析:重点关注各类别占比变化及原因
- 数据时效:建议每日营业结束后进行当日分析
- 文档权限:生成的腾讯文档建议设置为营运团队可查看
错误处理
| 错误情况 | 处理方式 | |----------|----------| | 数据文件不存在 | 提示用户上传数据文件 | | 数据字段缺失 | 显示缺失字段,提示补充 | | 数据日期不完整 | 使用已有数据,标注数据缺失 | | 腾讯文档创建失败 | 降级为本地Markdown文件输出 |
创建日期:2026-09-04
Scan to join WeChat group