电信客户流失数据分析系统-简介
基于Hadoop的电信客户流失数据分析系统,是一个旨在深度挖掘和洞察电信行业客户流失行为的全栈式数据分析平台。本系统以解决电信运营商面临的核心业务挑战——如何有效识别并降低客户流失率为目标,构建了一套从数据存储、分布式计算到前端可视化展示的完整解决方案。在技术架构层面,系统底层采用Hadoop分布式文件系统(HDFS)作为海量客户数据的可靠存储基石,确保数据的可扩展性与容错性。核心数据处理与分析引擎则采用了Apache Spark框架,利用其基于内存的高速计算能力,对存储于HDFS上的数据进行高效的ETL(抽取、转换、加载)、聚合统计与机器学习建模。后端服务逻辑采用主流的Java SpringBoot框架(或Python Django框架)进行开发,负责调度Spark计算任务、管理业务逻辑以及提供RESTful API接口,并通过MySQL数据库存储系统元数据与分析结果。前端界面则基于Vue.js渐进式框架,结合ElementUI组件库和Echarts图表库,打造了一个交互友好、数据呈现直观的数据驾驶舱。在功能实现上,系统不仅局限于基础的统计分析,如从客户总体流失态势、人口属性、账户合约及业务办理等四大维度进行多角度的交叉分析与可视化呈现,更引入了基于LTM(在网时长、合同类型、月度消费)模型的客户分群功能。该功能通过调用Spark MLlib库中的K-Means聚类算法,对客户进行无监督学习分群,自动识别出“高价值忠诚客户”、“潜力新客”、“高流失风险客户”等不同画像的群体,从而为电信运营商制定差异化、精细化的客户挽留策略提供了强有力的数据支撑与决策依据。
电信客户流失数据分析系统-技术
大数据框架:Hadoop+Spark(本次没用Hive,支持定制) 开发语言:Python+Java(两个版本都支持) 后端框架:Django+Spring Boot(Spring+SpringMVC+Mybatis)(两个版本都支持) 前端:Vue+ElementUI+Echarts+HTML+CSS+JavaScript+jQuery 数据库:MySQL
电信客户流失数据分析系统-背景
选题背景 如今的电信市场,竞争可以说是相当激烈了。各大运营商为了吸引新用户、留住老用户,想尽了各种办法。一个很现实的问题摆在面前:开发一个新客户的成本,要比维护一个老客户高得多。所以,怎么让现有客户满意地留下来,减少他们的流失,就成了运营商日常运营中的一个核心课题。运营商手里其实握着海量的数据,比如用户的在网时长、消费习惯、办理了哪些业务、签的是什么类型的合同等等。这些数据就像一座金矿,但如果只是简单地存着,那就只是一堆看不懂的数字。怎么从这些海量、复杂的数据里,找出那些有流失倾向的客户,并且搞明白他们为什么想走,这是一个挺大的挑战。传统的数据处理方式,面对这么大的数据量,往往会显得力不从心,处理速度慢,分析维度也比较单一。因此,借助大数据技术,搭建一个专门的分析系统来系统性地解决这个问题,就显得特别有必要了。这个课题就是想在这方面做一次小小的尝试。
选题意义 做这个毕业设计,它的意义其实还挺实在的。首先,从技术学习的角度看,这是一个非常好的实践机会。在学校里我们学了Hadoop、Spark这些大数据技术,但很多时候只是停留在理论层面。通过这个项目,就能亲自动手把这些技术串联起来,从数据存到HDFS,再用Spark去计算分析,最后通过网页展示出来,完整地走一遍大数据处理的流程。这对于加深技术理解、锻炼动手能力,帮助是很大的。其次,这个项目也能培养一种数据分析的思维。它不单单是写代码实现功能,更多的是要去思考数据背后的业务逻辑。比如,为什么签了长期合同的用户不容易流失?为什么开通了某些增值业务的用户黏性更高?通过自己动手分析,能学会怎么从数据中发现问题、提出假设并验证它,这种从数据到洞察的能力是很有价值的。最后,虽然只是一个毕业设计,但它模拟了一个真实的企业级应用场景。这个系统做出来的分析结果,比如不同客户群体的流失率对比,对于企业来说是有一定参考价值的,能帮助他们更精准地定位问题客户,从而制定挽留策略。总的来说,这个课题不仅是对大学所学知识的一次综合运用和检验,也是一次非常有意义的、贴近实际业务的数据分析实践。
电信客户流失数据分析系统-视频展示
电信客户流失数据分析系统-图片展示
电信客户流失数据分析系统-代码展示
from pyspark.sql.functions import col, when, count, lit
from pyspark.ml.feature import StringIndexer, VectorAssembler, StandardScaler
from pyspark.ml.clustering import KMeans
from pyspark.sql.types import IntegerType
# ==================== 初始化SparkSession ====================
# 这里的配置是示例,实际环境中可能需要更多配置
spark = SparkSession.builder \
.appName("TelecomChurnAnalysis") \
.master("local[*]") \
.config("spark.sql.warehouse.dir", "file:///C:/spark-warehouse") \
.getOrCreate()
# 模拟从HDFS加载数据
# 在实际项目中,路径应为 "hdfs://namenode:port/path/to/your/data.csv"
df = spark.read.csv("path/to/telecom_churn_data.csv", header=True, inferSchema=True)
# ==================== 核心功能1:不同合同类型客户的流失率分析 ====================
def analyze_churn_by_contract(dataframe):
print("--- 开始分析不同合同类型客户的流失情况 ---")
# 统计每个合同类型下的总用户数
total_counts = dataframe.groupBy("Contract").count().withColumnRenamed("count", "TotalCount")
# 统计每个合同类型下流失的用户数
churn_counts = dataframe.filter(col("Churn") == "Yes").groupBy("Contract").count().withColumnRenamed("count", "ChurnCount")
# 将两个结果连接起来
analysis_df = total_counts.join(churn_counts, on="Contract", how="left").fillna(0)
# 计算流失率
result_df = analysis_df.withColumn("ChurnRate", (col("ChurnCount") / col("TotalCount")) * 100)
# 为了方便后续处理,可以整理一下格式
final_result = result_df.select(
col("Contract").alias("contractType"),
col("TotalCount").alias("totalCount"),
col("ChurnCount").alias("churnCount"),
col("ChurnRate").alias("churnRate")
)
print("合同类型流失率分析完成。")
final_result.show()
return final_result
# ==================== 核心功能2:捆绑业务数量与客户流失关系分析 ====================
def analyze_churn_by_service_count(dataframe):
print("--- 开始分析捆绑业务数量与客户流失的关系 ---")
# 定义需要计数的增值服务字段
service_columns = [
"OnlineSecurity", "OnlineBackup", "DeviceProtection",
"TechSupport", "StreamingTV", "StreamingMovies"
]
# 创建新列 ServiceCount,计算每个客户开通的业务总数
# 这里通过将'Yes'记为1,其他记为0,然后求和
df_with_service_count = dataframe
for service_col in service_columns:
df_with_service_count = df_with_service_count.withColumn(service_col + "_num", when(col(service_col) == "Yes", 1).otherwise(0))
# 将所有数值化的服务列相加
sum_cols = [c + "_num" for c in service_columns]
df_with_service_count = df_with_service_count.withColumn("ServiceCount", sum(col(c) for c in sum_cols))
# 按照业务数量分组,计算流失率
total_by_service = df_with_service_count.groupBy("ServiceCount").count().withColumnRenamed("count", "TotalCount")
churn_by_service = df_with_service_count.filter(col("Churn") == "Yes").groupBy("ServiceCount").count().withColumnRenamed("count", "ChurnCount")
# 合并结果并计算流失率
analysis_df = total_by_service.join(churn_by_service, on="ServiceCount", how="left").fillna(0).orderBy("ServiceCount")
result_df = analysis_df.withColumn("ChurnRate", (col("ChurnCount") / col("TotalCount")) * 100)
print("捆绑业务数量流失分析完成。")
result_df.show()
return result_df
# ==================== 核心功能3:基于LTM模型的客户分群 (K-Means) ====================
def customer_segmentation_with_kmeans(dataframe):
print("--- 开始执行基于LTM模型的K-Means客户分群 ---")
# LTM模型字段: Longevity (tenure), Type (Contract), Monetary (MonthlyCharges)
# 1. 特征工程:将分类变量数值化
# 我们需要处理 TotalCharges 中的空值,这里用月费填充
df_processed = dataframe.withColumn("TotalCharges", when(col("TotalCharges") == " ", col("MonthlyCharges")).otherwise(col("TotalCharges")).cast("double"))
# Contract是分类特征,需要进行索引化
contract_indexer = StringIndexer(inputCol="Contract", outputCol="ContractIndex")
df_indexed = contract_indexer.fit(df_processed).transform(df_processed)
# 2. 特征组合:将所有特征合并成一个向量
# 定义数值型特征和需要组合的特征
numeric_cols = ["tenure", "MonthlyCharges", "TotalCharges"]
feature_cols = ["ContractIndex"] + numeric_cols
assembler = VectorAssembler(inputCols=feature_cols, outputCol="features_unscaled")
df_assembled = assembler.transform(df_indexed)
# 3. 特征缩放:K-Means对数据尺度敏感,需要进行标准化
scaler = StandardScaler(inputCol="features_unscaled", outputCol="features")
scaler_model = scaler.fit(df_assembled)
df_scaled = scaler_model.transform(df_assembled)
# 4. 模型训练与预测
# 设置K-Means模型参数,比如分为4个簇
kmeans = KMeans(featuresCol="features", k=4, seed=1)
model = kmeans.fit(df_scaled)
# 为数据集添加分群结果(预测的簇ID)
predictions = model.transform(df_scaled)
# 选择需要的列进行返回,方便后续分析
result_df = predictions.select("customerID", "tenure", "Contract", "MonthlyCharges", "prediction")
result_df = result_df.withColumnRenamed("prediction", "cluster_id")
print("K-Means客户分群完成。")
result_df.show()
# 打印每个簇的中心点
centers = model.clusterCenters()
print("Cluster Centers: ")
for center in centers:
print(center)
return result_df
# ==================== 执行函数调用示例 ====================
# analyze_churn_by_contract(df)
# analyze_churn_by_service_count(df)
# customer_segmentation_with_kmeans(df)
# 关闭SparkSession
spark.stop()
电信客户流失数据分析系统-结语
GitHub高星标项目复现:基于Spark与Vue的电信客户流失数据分析系统,毕设优选
计算机毕设选题推荐:基于Hadoop和Python的电信客户流失数据分析与可视化系统
毕设选题难开题更难?这套基于Hadoop的电信客户流失数据分析系统让你一步到位
大家都可点赞、收藏、关注、如果遇到有技术问题或者获取源代码,欢迎在评论区一起交流探讨!谢谢大家!