售后服务
我们是专业的

Week 3-4交付成果1:Python数据分析报告(FTFR影响因素)| 10万条工单背后的真相(上)

核心价值:从海量工单数据中找到FTFR(首次修复率)下滑的根本原因,并提出可量化的改善方案。

适用场景:售后运营总监需要向CEO/COO汇报FTFR持续下滑的原因及解决方案。

预期成果:一份数据支撑的分析报告 + Top 5关键因素 + 可执行的改善计划。


? 引子:一个真实的危机时刻

2024年9月,某新能源车企售后运营VP王总被CEO约谈。CEO桌上摆着一份触目惊心的数据:

  • Q1 FTFR = 88%
  • Q2 FTFR = 82%(下降6%)
  • Q3 FTFR = 76%(再降6%)

CEO质问:三个季度,FTFR从88%掉到76%,客户投诉量暴增40%。你告诉我,到底哪里出了问题?

VP王总拿出一份厚厚的Excel表格,里面是各服务中心的FTFR排名、技师绩效、配件库存周转率……但CEO打断了他:

我不要这些表面数据。我要知道根本原因。是技师能力不行?配件质量问题?还是流程设计有缺陷?给我一个数据支撑的答案,而不是猜测。

VP王总无言以对。因为他手上只有结果数据(各中心的FTFR数字),却没有因果分析(为什么FTFR会下降)。

这就是本篇要解决的核心问题:如何用Python分析10万条工单数据,找到FTFR下滑的Top 5关键因素,并给出可执行的解决方案。


? 第一部分:理解FTFR的商业价值

FTFR(First Time Fix Rate)是什么?

FTFR = 首次到店即修好的工单数 ÷ 总工单数 × 100%

例如:某服务中心本月接待1000个工单,其中850个首次即修好,150个需要返工或等配件,则FTFR = 85%。

为什么FTFR是售后业务的北极星指标?

1. 客户满意度的最强预测因子

某咨询公司研究显示,FTFR与NPS(Net Promoter Score,净推荐值)的相关系数高达0.87(接近完美相关):

  • FTFR ≥ 90%:NPS平均为68(优秀)
  • FTFR = 80-90%:NPS平均为52(良好)
  • FTFR < 80%:NPS平均为38(危险区)

2. 成本的隐形杀手

FTFR低意味着:

  • 返工成本:技师二次维修的人工成本(无收入)
  • 等待成本:客户占用工位、代步车、客服时间
  • 配件浪费:误诊导致更换不必要的配件
  • 品牌损失:客户流失、负面口碑

某头部车企数据显示:FTFR每下降1%,单车维修成本上升15-20元。对于年工单量100万的企业,1%的FTFR下降 = 1500-2000万成本增加

3. 组织能力的晴雨表

FTFR综合反映了:

  • 技师能力:诊断准确性、维修熟练度
  • 配件管理:库存准确性、供应链响应速度
  • 流程设计:是否有标准化作业指导书(SOP)
  • 系统支持:DMS系统是否好用、知识库是否完善
  • 质量管理:配件质量、工具精度、检验流程

FTFR持续下滑,说明组织能力在系统性退化。


? 第二部分:传统分析方法的三大盲区

在用Python做深度分析之前,我们先看看传统方法为什么会失效。

盲区1:只看平均值,忽略分布

典型场景:某区域经理汇报:我们区域FTFR是85%,达到了公司目标(85%)。

但当你做分布分析时,发现:10个服务中心,FTFR从68%到92%,差距高达24个百分点。平均值85%掩盖了巨大的两极分化

真相

  • 头部3个中心(FTFR > 88%)拉高了平均值
  • 尾部3个中心(FTFR < 75%)严重拖累,且客户投诉集中在这些中心

正确做法:不仅看平均值,还要看P25、P50、P75分位数标准差,识别离群值。

盲区2:只看相关性,不看因果

典型场景:某分析师发现:技师经验(工作年限)与FTFR负相关,相关系数-0.32。结论:老技师FTFR更低,应该多招新人。

但这是误读! 相关性≠因果性。进一步分析发现:

  • 老技师被分配了更复杂的疑难工单(难度系数更高)
  • 新技师只做简单保养(难度系数低)

真相:不是老技师能力差,而是任务分配不公

正确做法:用控制变量法因果推断(Causal Inference)分析。当控制工单复杂度后,技师经验与FTFR的系数变为**+0.18**(正相关),说明经验丰富的技师在同等难度下表现更好。

盲区3:只看当下,不看趋势

典型场景:某服务中心9月FTFR = 82%,经理说:比8月的80%提高了2%,我们在进步。

但当你做时间序列分析时,发现:过去12个月FTFR呈持续下降趋势,从去年9月的92%一路下滑到今年8月的80%,9月的82%只是短暂反弹,趋势线依然向下。

关键洞察:单月数据的波动可能是随机噪音,要看3-6个月的移动平均线趋势斜率


?️ 第三部分:Python数据分析的完整框架

现在进入实战。我们用Python分析10万条工单数据,找出FTFR下滑的根本原因。

步骤1:数据准备与清洗

1.1 数据源

我们需要从DMS系统导出以下数据:

工单主表(work_orders.csv):

  • 工单号(order_id)
  • 服务中心(service_center)
  • 进店时间(check_in_time)
  • 交车时间(delivery_time)
  • 是否首次修好(is_ftfr):1=是,0=否
  • 故障类型(fault_type)
  • 车型(car_model)
  • 车龄(car_age_months)
  • 主修技师(technician_id)
  • 配件是否缺货(parts_shortage):1=是,0=否
  • 工单复杂度(complexity_score):1-5分

技师表(technicians.csv):

  • 技师ID(technician_id)
  • 工作年限(experience_years)
  • 技能等级(skill_level):初级/中级/高级/专家
  • 所属服务中心(service_center)

1.2 数据加载

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats

# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 加载数据
df_orders = [pd.read](http://pd.read)_csv('work_orders.csv')
df_tech = [pd.read](http://pd.read)_csv('technicians.csv')

# 合并数据
df = df_orders.merge(df_tech, on='technician_id', how='left')

# 查看数据概况
print(f'总工单数:{len(df)}')
print(f'数据时间范围:{df.check_in_time.min()} 至 {df.check_in_time.max()}')
print([df.info](http://df.info)())

1.3 数据清洗

# 1. 处理缺失值
print(f'缺失值统计:\n{df.isnull().sum()}')

# 删除关键字段缺失的记录
df = df.dropna(subset=['is_ftfr', 'technician_id', 'fault_type'])

# 2. 处理异常值
# 识别工单时长异常值(超过48小时视为异常)
df['duration_hours'] = ([pd.to](http://pd.to)_datetime([df.delivery](http://df.delivery)_time) - 
                         [pd.to](http://pd.to)_datetime(df.check_in_time)).[dt.total](http://dt.total)_seconds() / 3600
df = df[df.duration_hours <= 48]

# 3. 特征工程
# 提取时间特征
df['month'] = [pd.to](http://pd.to)_datetime(df.check_in_time).[dt.to](http://dt.to)_period('M')
df['weekday'] = [pd.to](http://pd.to)_datetime(df.check_in_time).dt.dayofweek
df['hour'] = [pd.to](http://pd.to)_datetime(df.check_in_time).dt.hour

print(f'清洗后工单数:{len(df)}')

? 第四部分:探索性数据分析(EDA)

4.1 整体FTFR趋势分析

# 按月统计FTFR
monthly_ftfr = df.groupby('month')['is_ftfr'].agg(['mean', 'count']).reset_index()
monthly_ftfr.columns = ['月份', 'FTFR', '工单量']
monthly_ftfr['FTFR_pct'] = monthly_ftfr['FTFR'] * 100

# 可视化
fig, ax1 = plt.subplots(figsize=(14, 6))

ax1.plot(monthly_ftfr['月份'].astype(str), monthly_ftfr['FTFR_pct'], 
         marker='o', linewidth=2, color='#2E86AB', label='FTFR')
ax1.axhline(y=85, color='red', linestyle='--', label='目标线(85%)')
ax1.set_xlabel('月份')
ax1.set_ylabel('FTFR (%)', color='#2E86AB')
ax1.tick_params(axis='y', labelcolor='#2E86AB')
ax1.legend(loc='upper left')
ax1.grid(alpha=0.3)

ax2 = ax1.twinx()
[ax2.bar](http://ax2.bar)(monthly_ftfr['月份'].astype(str), monthly_ftfr['工单量'], 
        alpha=0.3, color='gray', label='工单量')
ax2.set_ylabel('工单量', color='gray')
ax2.tick_params(axis='y', labelcolor='gray')
ax2.legend(loc='upper right')

plt.title('FTFR月度趋势与工单量', fontsize=16, fontweight='bold')
plt.tight_layout()
[plt.show](http://plt.show)()

关键发现

  • FTFR从去年9月的92%下降到今年9月的76%,累计下降16个百分点
  • 下降趋势在今年5月后加速(5月前月均降0.8%,5月后月均降1.5%)
  • 工单量同期增长35%(从月均8000单增至10800单)
未经允许不得转载:似水流年 » Week 3-4交付成果1:Python数据分析报告(FTFR影响因素)| 10万条工单背后的真相(上)