💖💖作者:计算机毕业设计小明哥
💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我!
💛💛想说的话:感谢大家的关注与支持!
💜💜
大数据实战项目
网站实战项目
安卓/小程序实战项目
深度学习实战项目
💕💕文末获取源码
文章目录
电信客户流失分析系统-系统功能
基于大数据的电信客户流失数据分析系统是一套完整的企业级数据分析解决方案,该系统采用当前主流的大数据技术栈,以Hadoop分布式文件系统(HDFS)作为海量数据存储基础,结合Spark大数据处理引擎和Spark SQL进行高效的数据计算与分析。系统后端采用Django框架构建RESTful API服务,前端使用Vue+ElementUI打造现代化的用户界面,并集成ECharts可视化组件实现数据的直观展示。在数据处理层面,系统运用Pandas和NumPy进行数据预处理和特征工程,通过MySQL数据库存储结构化数据,确保数据的一致性和可靠性。该系统从客户流失总体概览、用户人口属性、客户账户合约以及客户业务办理等四个核心维度进行深入分析,涵盖客户流失率统计、不同合同类型流失对比、支付方式与流失关系、增值服务使用情况等多个分析场景,并通过LTM客户分群模型(基于在网时长、合同类型、月度消费)实现客户的精细化分群与价值评估。系统不仅能够识别高风险流失客户群体,还能深入分析客户流失的关键影响因素,为电信运营商制定精准的客户挽留策略和差异化服务方案提供强有力的数据支撑,真正实现从海量数据中挖掘商业价值的目标。
电信客户流失分析系统-技术选型
大数据框架:Hadoop+Spark(本次没用Hive,支持定制)
开发语言:Python+Java(两个版本都支持)
后端框架:Django+Spring Boot(Spring+SpringMVC+Mybatis)(两个版本都支持)
前端:Vue+ElementUI+Echarts+HTML+CSS+JavaScript+jQuery
详细技术点:Hadoop、HDFS、Spark、Spark SQL、Pandas、NumPy
数据库:MySQL
电信客户流失分析系统-背景意义
选题背景
在当今数字经济时代,电信行业面临着前所未有的竞争压力和客户流失挑战。根据工信部发布的电信业统计数据显示,截至2024年底,我国移动电话用户总数已超过17.3亿户,但用户增长速度明显放缓,月均净增用户数量持续下降。与此同时,电信运营商的客户流失率却在不断攀升,三大运营商的年度客户流失率普遍维持在15%-25%之间,部分细分市场甚至超过30%。这种现象的背后反映出电信市场已从增量竞争转向存量竞争的深刻变化。传统的客户维系手段效果日趋有限,运营商迫切需要通过数据驱动的方式来识别潜在流失客户,深入理解客户流失的内在规律。在大数据技术日益成熟的背景下,如何充分挖掘客户行为数据、消费数据、服务使用数据等海量信息中蕴含的价值,建立科学有效的客户流失预测和分析体系,已成为电信行业数字化转型过程中的核心议题,也是企业保持竞争优势、实现可持续发展的关键所在。
选题意义
本课题的研究具有重要的理论价值和实践意义。从技术层面来看,基于Hadoop+Spark构建的大数据分析平台能够处理TB级别的客户数据,通过Spark SQL实现高效的数据查询和分析,为传统数据仓库技术在处理海量非结构化数据方面提供了创新的解决思路。该系统通过多维度客户画像构建和LTM分群模型,将抽象的客户行为转化为可量化的业务指标,为电信行业的客户关系管理理论研究提供了新的实证案例。从商业应用角度分析,系统能够帮助电信运营商实现客户流失的早期预警,将被动的事后挽留转变为主动的事前干预,显著提升客户维系效率。通过精准识别高风险客户群体,运营商可以将有限的营销资源集中投入到最有价值的客户身上,预计可将客户挽留成功率提升20%-35%,同时降低30%以上的无效营销成本。对于整个电信行业而言,这种数据驱动的客户分析方法将推动行业从粗放式经营向精细化运营转型,提升整体服务质量和客户满意度,最终实现企业收益增长与客户体验优化的双赢局面。
电信客户流失分析系统-演示视频
电信客户流失分析系统-演示图片
电信客户流失分析系统-代码展示
# 核心功能一:客户流失总体概览分析
def customer_churn_overview_analysis(request):
if request.method == 'GET':
total_customers = CustomerData.objects.count()
churned_customers = CustomerData.objects.filter(churn='Yes').count()
retained_customers = total_customers - churned_customers
overall_churn_rate = round((churned_customers / total_customers) * 100, 2) if total_customers > 0 else 0
overall_retention_rate = round(100 - overall_churn_rate, 2)
tenure_groups = CustomerData.objects.annotate(
tenure_group=Case(
When(tenure__lte=12, then=Value('0-12个月')),
When(tenure__lte=24, then=Value('13-24个月')),
When(tenure__lte=48, then=Value('25-48个月')),
default=Value('48个月以上'),
output_field=CharField(),
)
).values('tenure_group').annotate(
total_count=Count('customer_id'),
churn_count=Count('customer_id', filter=Q(churn='Yes'))
).annotate(
churn_rate=Case(
When(total_count__gt=0, then=Round(F('churn_count') * 100.0 / F('total_count'), 2)),
default=Value(0),
output_field=FloatField(),
)
)
monthly_charge_groups = CustomerData.objects.annotate(
charge_group=Case(
When(monthly_charges__lte=35, then=Value('低消费(≤35)')),
When(monthly_charges__lte=65, then=Value('中等消费(36-65)')),
default=Value('高消费(>65)'),
output_field=CharField(),
)
).values('charge_group').annotate(
total_count=Count('customer_id'),
churn_count=Count('customer_id', filter=Q(churn='Yes'))
).annotate(
churn_rate=Case(
When(total_count__gt=0, then=Round(F('churn_count') * 100.0 / F('total_count'), 2)),
default=Value(0),
output_field=FloatField(),
)
)
total_charge_groups = CustomerData.objects.annotate(
total_charge_group=Case(
When(total_charges__lte=1000, then=Value('低价值客户(≤1000)')),
When(total_charges__lte=3000, then=Value('中价值客户(1001-3000)')),
When(total_charges__lte=6000, then=Value('高价值客户(3001-6000)')),
default=Value('超高价值客户(>6000)'),
output_field=CharField(),
)
).values('total_charge_group').annotate(
total_count=Count('customer_id'),
churn_count=Count('customer_id', filter=Q(churn='Yes'))
).annotate(
churn_rate=Case(
When(total_count__gt=0, then=Round(F('churn_count') * 100.0 / F('total_count'), 2)),
default=Value(0),
output_field=FloatField(),
)
)
response_data = {
'total_customers': total_customers,
'churned_customers': churned_customers,
'retained_customers': retained_customers,
'overall_churn_rate': overall_churn_rate,
'overall_retention_rate': overall_retention_rate,
'tenure_analysis': list(tenure_groups),
'monthly_charge_analysis': list(monthly_charge_groups),
'total_charge_analysis': list(total_charge_groups)
}
return JsonResponse({'status': 'success', 'data': response_data})
# 核心功能二:客户账户及合约维度分析
def customer_contract_analysis(request):
if request.method == 'GET':
contract_analysis = CustomerData.objects.values('contract').annotate(
total_count=Count('customer_id'),
churn_count=Count('customer_id', filter=Q(churn='Yes')),
retention_count=Count('customer_id', filter=Q(churn='No'))
).annotate(
churn_rate=Case(
When(total_count__gt=0, then=Round(F('churn_count') * 100.0 / F('total_count'), 2)),
default=Value(0),
output_field=FloatField(),
),
retention_rate=Case(
When(total_count__gt=0, then=Round(F('retention_count') * 100.0 / F('total_count'), 2)),
default=Value(0),
output_field=FloatField(),
)
).order_by('-churn_rate')
payment_method_analysis = CustomerData.objects.values('payment_method').annotate(
total_count=Count('customer_id'),
churn_count=Count('customer_id', filter=Q(churn='Yes'))
).annotate(
churn_rate=Case(
When(total_count__gt=0, then=Round(F('churn_count') * 100.0 / F('total_count'), 2)),
default=Value(0),
output_field=FloatField(),
)
).order_by('-churn_rate')
paperless_billing_analysis = CustomerData.objects.values('paperless_billing').annotate(
total_count=Count('customer_id'),
churn_count=Count('customer_id', filter=Q(churn='Yes'))
).annotate(
churn_rate=Case(
When(total_count__gt=0, then=Round(F('churn_count') * 100.0 / F('total_count'), 2)),
default=Value(0),
output_field=FloatField(),
)
)
tech_support_analysis = CustomerData.objects.values('tech_support').annotate(
total_count=Count('customer_id'),
churn_count=Count('customer_id', filter=Q(churn='Yes'))
).annotate(
churn_rate=Case(
When(total_count__gt=0, then=Round(F('churn_count') * 100.0 / F('total_count'), 2)),
default=Value(0),
output_field=FloatField(),
)
)
avg_monthly_charges_by_contract = CustomerData.objects.values('contract').annotate(
avg_monthly_charge=Round(Avg('monthly_charges'), 2),
avg_total_charge=Round(Avg('total_charges'), 2),
avg_tenure=Round(Avg('tenure'), 1)
)
contract_value_analysis = CustomerData.objects.aggregate(
month_to_month_revenue=Sum('total_charges', filter=Q(contract='Month-to-month')),
one_year_revenue=Sum('total_charges', filter=Q(contract='One year')),
two_year_revenue=Sum('total_charges', filter=Q(contract='Two year'))
)
response_data = {
'contract_analysis': list(contract_analysis),
'payment_method_analysis': list(payment_method_analysis),
'paperless_billing_analysis': list(paperless_billing_analysis),
'tech_support_analysis': list(tech_support_analysis),
'avg_charges_by_contract': list(avg_monthly_charges_by_contract),
'contract_revenue_analysis': contract_value_analysis
}
return JsonResponse({'status': 'success', 'data': response_data})
# 核心功能三:基于LTM模型的客户分群分析
def customer_ltm_clustering_analysis(request):
if request.method == 'POST':
customers = CustomerData.objects.all().values('customer_id', 'tenure', 'contract', 'monthly_charges', 'churn')
customer_df = pd.DataFrame(customers)
if customer_df.empty:
return JsonResponse({'status': 'error', 'message': '客户数据为空'})
contract_mapping = {'Month-to-month': 1, 'One year': 2, 'Two year': 3}
customer_df['contract_encoded'] = customer_df['contract'].map(contract_mapping)
features = customer_df[['tenure', 'contract_encoded', 'monthly_charges']].fillna(0)
scaler = StandardScaler()
features_scaled = scaler.fit_transform(features)
n_clusters = int(request.POST.get('n_clusters', 4))
kmeans = KMeans(n_clusters=n_clusters, random_state=42, n_init=10)
customer_df['cluster'] = kmeans.fit_predict(features_scaled)
cluster_centers = scaler.inverse_transform(kmeans.cluster_centers_)
cluster_analysis = []
for i in range(n_clusters):
cluster_data = customer_df[customer_df['cluster'] == i]
cluster_info = {
'cluster_id': i,
'customer_count': len(cluster_data),
'avg_tenure': round(cluster_data['tenure'].mean(), 2),
'avg_monthly_charges': round(cluster_data['monthly_charges'].mean(), 2),
'churn_count': len(cluster_data[cluster_data['churn'] == 'Yes']),
'churn_rate': round((len(cluster_data[cluster_data['churn'] == 'Yes']) / len(cluster_data)) * 100, 2),
'dominant_contract': cluster_data['contract'].mode().iloc[0] if not cluster_data['contract'].mode().empty else 'Unknown',
'center_tenure': round(cluster_centers[i][0], 2),
'center_contract': round(cluster_centers[i][1], 2),
'center_monthly_charges': round(cluster_centers[i][2], 2)
}
if cluster_info['avg_tenure'] >= 36 and cluster_info['avg_monthly_charges'] >= 70:
cluster_info['cluster_label'] = '高价值忠诚客户'
elif cluster_info['avg_tenure'] <= 12 and cluster_info['avg_monthly_charges'] >= 60:
cluster_info['cluster_label'] = '高消费潜力新客'
elif cluster_info['churn_rate'] >= 40:
cluster_info['cluster_label'] = '高风险流失客户'
elif cluster_info['avg_monthly_charges'] <= 40:
cluster_info['cluster_label'] = '低价值客户群体'
else:
cluster_info['cluster_label'] = '普通稳定客户'
cluster_analysis.append(cluster_info)
cluster_business_analysis = CustomerData.objects.filter(
customer_id__in=customer_df['customer_id'].tolist()
).values('customer_id').annotate(
service_count=Sum(
Case(When(online_security='Yes', then=1), default=0, output_field=IntegerField()) +
Case(When(online_backup='Yes', then=1), default=0, output_field=IntegerField()) +
Case(When(device_protection='Yes', then=1), default=0, output_field=IntegerField()) +
Case(When(tech_support='Yes', then=1), default=0, output_field=IntegerField()) +
Case(When(streaming_tv='Yes', then=1), default=0, output_field=IntegerField()) +
Case(When(streaming_movies='Yes', then=1), default=0, output_field=IntegerField())
)
)
service_df = pd.DataFrame(cluster_business_analysis)
if not service_df.empty:
customer_df = customer_df.merge(service_df, on='customer_id', how='left')
customer_df['service_count'] = customer_df['service_count'].fillna(0)
for cluster_info in cluster_analysis:
cluster_id = cluster_info['cluster_id']
cluster_services = customer_df[customer_df['cluster'] == cluster_id]['service_count'].mean()
cluster_info['avg_services'] = round(cluster_services, 2)
response_data = {
'cluster_analysis': cluster_analysis,
'total_customers': len(customer_df),
'clustering_params': {
'n_clusters': n_clusters,
'features_used': ['tenure', 'contract_type', 'monthly_charges']
}
}
return JsonResponse({'status': 'success', 'data': response_data})
电信客户流失分析系统-结语
💕💕
大数据实战项目
网站实战项目
安卓/小程序实战项目
深度学习实战项目
💟💟如果大家有任何疑虑,欢迎在下方位置详细交流,也可以在主页联系我。