python实现——综合类型数据挖掘任务(无监督的分类任务)

综合类型数据挖掘任务

航空公司客户价值分析。航空公司客户价值分析。航空公司客户价值分析。航空公司已积累了大量的会员档案信息和其乘坐航班记录(air_data.csv),以2014年3月31日为结束时间抽取两年内有乘机记录的所有客户的详细数据。利用聚类算法对客户数据进行群体划分,并根据客户群体LRFMC指标分析并给出各客户群体的类型。

数据共有62988条,每条数据具有44个特征。包含会员卡号、入会时间、性别、年龄、会员卡级别、工作地城市、工作地所在省份、工作地所在国家、观测窗口结束时间、观测窗口乘机积分、飞行公里数、飞行次数、飞行时间、乘机时间间隔、平均折扣率等特征。

3.1数据预处理

航空公司客户原始数据存在少量的缺失值和异常值,需要清洗后才能用于分析。票价为空值、票价最小值为0、折扣率最小值为0总飞行千米数大于0的记录。票价为空值的数据可能是由于不存在乘机记录造成的。其他的数据可能是由于客户乘坐0折机票或者积分兑换造成的。

字段

异常情况

SUM_YR_1

NaN

SUM_YR_2

NaN

avg_discount、SEG_KM_SUM

avg_discount=0&SEG_KM_SUM>0

SUM_YR_1、SUM_YR_2

同时为0

处理后的数据有62044条。

# 读取原始数据
data = pd.read_csv('air_data.csv')
# 清洗数据
# 将票价为空值的数据删除
data = data[~data['SUM_YR_1'].isnull() & ~data['SUM_YR_2'].isnull()]
# 将票价为0或折扣率为0但总飞行千米数大于0的记录删除
data = data[~((data['avg_discount'] == 0) & (data['SEG_KM_SUM'] > 0))]
# 将SUM_YR_1和SUM_YR_2同时为0的记录删除
data = data[~((data['SUM_YR_1'] == 0) & (data['SUM_YR_2'] == 0))]

 

 

3.2特征提取

由于原始数据的特征过多,不便直接用于客户价值分析,因此需要对特征进行筛选,根据LRFMC模型挑选出衡量客户价值的关键特征,分别是:

  • Length of Relationship: 客户关系时长,反映客户的活跃时长。
  • Recency: 最近消费时间间隔,反映当前的活跃状态。
  • Frequency: 客户消费频率,反映客户的忠诚度。
  • Mileage: 客户总飞行里程,反映客户对乘机的依赖性。
  • Coefficient of Discount: 客户所享受的平均折扣率,侧面反映客户价值高低。

特征

对应字段

L

LOAD_TIME与FFP_DATE之差

R

LAST_TO_END

F

FLIGHT_COUNT

M

SEG_KM_SUM

C

avg_discount

特征提取后的数据为下图所示:

# 假设你的数据框称为 df,包含了原始数据和对应的特征字段
df = data
# 计算 LRFMC 模型对应的特征
df['L'] = (pd.to_datetime(df['LOAD_TIME']) - pd.to_datetime(df['FFP_DATE'])).dt.days
df['R'] = df['LAST_TO_END']
df['F'] = df['FLIGHT_COUNT']
df['M'] = df['SEG_KM_SUM']
df['C'] = df['avg_discount']from sklearn.preprocessing import StandardScaler# 创建一个标准化器
scaler = StandardScaler()# 假设你的数据框称为 df,包含了需要标准化的特征字段
features_to_scale = ['L', 'R', 'F', 'M', 'C']# 对选择的特征进行均值方差标准化
df[features_to_scale] = scaler.fit_transform(df[features_to_scale])print(df)

 

3.3数据标准化

对提取的数据进行均值方差标准化。

# 标准化数据
scaler = StandardScaler()
scaled_features = scaler.fit_transform(df2)
df_scaled = pd.DataFrame(scaled_features, columns=df2.columns)

 

3.4模型构建

本项目为聚类类型的任务,选择Kmeans对数据进行聚类,从而得到航空公司客户的类型分析结果。但要聚成多少类,很难断定。所以需要采用循环的方法,以聚类的个数作为循环变量(2到10),依次训练不同聚类个数的Kmeans模型,使用calinski_harabasz_score方法对各个Kmeans模型的结果进行评分。

# 创建一个空列表用于存放不同聚类数对应的评分
scores = []# 设置循环,尝试不同的聚类个数
for n_clusters in range(2, 6):# 创建并训练Kmeans模型kmeans = KMeans(n_clusters=n_clusters, random_state=42)kmeans.fit(df_scaled)# 使用calinski_harabasz_score方法对模型进行评分score = calinski_harabasz_score(df_scaled, kmeans.labels_)scores.append(score)# 打印各个聚类数对应的评分
for n_clusters, score in zip(range(2, 6), scores):print(f"Number of clusters: {n_clusters}, Calinski-Harabasz score: {score}")

 

 

# 可视化不同聚类数对应的评分
plt.figure(figsize=(10, 6))
plt.plot(range(2, 6), scores, marker='o')
plt.title('Calinski-Harabasz Score for Different Number of Clusters')
plt.xlabel('Number of clusters')
plt.ylabel('Calinski-Harabasz Score')
plt.show()

 

3.5模型训练

从上图中可以看出,聚类个数为2时模型评分最高,但仅将客户划分为2类会导致客户分类结果过于笼统,因此退而求其次,选择模型分数第二高的4作为聚类个数。

# 创建并训练最终的KMeans模型
final_kmeans = KMeans(n_clusters=4, random_state=42)
final_kmeans.fit(df_scaled)# 将每个样本分配到对应的簇中
cluster_labels = final_kmeans.predict(df_scaled)# 将簇标签添加到原始数据中
df2['cluster'] = cluster_labels# 查看每个簇中样本的数量
cluster_counts = df2['cluster'].value_counts()
print(cluster_counts)

 

3.6结果分析

根据聚类结果绘制客户特征分析雷达图,根据雷达图显示的情况来对每个客户群的特征进行分析。

 

# 计算每个簇的平均特征值
cluster_means = df2.groupby('cluster').mean()# 每个簇的特征名称
features = cluster_means.columns.tolist()# 将第一个特征复制到列表末尾,以闭合雷达图
features.append(features[0])# 绘制雷达图
plt.figure(figsize=(10, 8))
for cluster in range(4):values = cluster_means.iloc[cluster].values.tolist()values.append(values[0])angles = np.linspace(0, 2 * np.pi, len(features), endpoint=False).tolist()ax = plt.subplot(2, 2, cluster + 1, polar=True)ax.fill(angles, values, 'b', alpha=0.1)ax.plot(angles, values, linewidth=1.5, linestyle='solid', label=f'Cluster {cluster}')ax.fill(angles, values, alpha=0.25)ax.set_yticklabels([])ax.set_thetagrids(np.degrees(angles), labels=features)ax.set_title(f'Cluster {cluster}')plt.show()

 

分析结果:

群体

类型

客户群体1

重要挽留客户

客户群体2

一般客户

客户群体3

低价值客户

客户群体4

重要保持客户

客户群体LRFMC指标分析:

群体

会员资历L

最近乘机R

乘机次数F

飞行里程M

平均折扣C

重要保持客户

★★★★

★★★★★

★★★★★

★★★★

重要发展客户

★★★

★★★★

★★

★★

★★★★★

重要挽留客户

★★★★★

★★★

★★★★

★★★★

★★★

一般客户

★★★★

★★

★★

低价值客户

★★

★★★★★

★★

客户群体特点及策略:

群体

特点及策略

重要保持客户

平均折扣率高(C↑),最近有乘机记录(R↓),乘机次数高(F↑)或里程高(M↑)

这类客户机票票价高,不在意机票折扣,经常乘机,是最理想的客户类型。公司应优先将资源投放到他们身上,维持这类客户的忠诚度。

重要发展客户

平均折扣率高(C↑),最近有乘机记录(R↓),乘机次数低(F↓)或里程低(M↓)

这类客户机票票价高,不在意机票折扣,最近有乘机记录,但总里程低,具有很大的发展潜力。公司应加强这类客户的满意度,使他们逐渐成为忠诚客户。

重要挽留客户

平均折扣率高(C↑),乘机次数高(F↑)或里程高(M↑),最近无乘机记录(R↑)

这类客户总里程高,但较长时间没有乘机,可能处于流失状态。公司应加强与这类客户的互动,召回用户,延长客户的生命周期。

一般客户

平均折扣率低(C↓),最近无乘机记录(R↑),乘机次数高(F↓)或里程高(M↓),入会时间短(L↓)

这类客户机票票价低,经常买折扣机票,最近无乘机记录,可能是趁着折扣而选择购买,对品牌无忠诚度。公司需要在资源支持的情况下强化对这类客户的联系。

低价值客户

平均折扣率低(C↓),最近无乘机记录(R↑),乘机次数高(F↓)或里程高(M↓),入会时间短(L↓)这类客户与一般客户类似,机票票价低,经常买折扣机票,最近无乘机记录,可能是趁着折扣而选择购买,对品牌无忠诚度。

完整代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.metrics import calinski_harabasz_score
from sklearn.preprocessing import StandardScaler
#%%
# 读取原始数据
data = pd.read_csv('air_data.csv')
# 清洗数据
# 将票价为空值的数据删除
data = data[~data['SUM_YR_1'].isnull() & ~data['SUM_YR_2'].isnull()]
# 将票价为0或折扣率为0但总飞行千米数大于0的记录删除
data = data[~((data['avg_discount'] == 0) & (data['SEG_KM_SUM'] > 0))]
# 将SUM_YR_1和SUM_YR_2同时为0的记录删除
data = data[~((data['SUM_YR_1'] == 0) & (data['SUM_YR_2'] == 0))]
#%%
# 假设你的数据框称为 df,包含了原始数据和对应的特征字段
df = data
# 计算 LRFMC 模型对应的特征
df['L'] = (pd.to_datetime(df['LOAD_TIME']) - pd.to_datetime(df['FFP_DATE'])).dt.days
df['R'] = df['LAST_TO_END']
df['F'] = df['FLIGHT_COUNT']
df['M'] = df['SEG_KM_SUM']
df['C'] = df['avg_discount']
#%%
# 创建一个标准化器
scaler = StandardScaler()
# 假设你的数据框称为 df,包含了需要标准化的特征字段
features_to_scale = ['L', 'R', 'F', 'M', 'C']
# 对选择的特征进行均值方差标准化
df[features_to_scale] = scaler.fit_transform(df[features_to_scale])
#%%
# 创建DataFrame
df2 = pd.DataFrame()
df2['L']=df['L']
df2['R']=df['R'] 
df2['F']=df['F'] 
df2['M']=df['M'] 
df2['C']=df['C']
#%%
# 标准化数据
scaler = StandardScaler()
scaled_features = scaler.fit_transform(df2)
df_scaled = pd.DataFrame(scaled_features, columns=df2.columns)
#%%
# 创建一个空列表用于存放不同聚类数对应的评分
scores = []
# 设置循环,尝试不同的聚类个数
for n_clusters in range(2, 15):# 创建并训练Kmeans模型kmeans = KMeans(n_clusters=n_clusters, random_state=42)kmeans.fit(df_scaled)# 使用calinski_harabasz_score方法对模型进行评分score = calinski_harabasz_score(df_scaled, kmeans.labels_)scores.append(score)
# 打印各个聚类数对应的评分
for n_clusters, score in zip(range(2, 15), scores):print(f"Number of clusters: {n_clusters}, Calinski-Harabasz score: {score}")
#%%
# 可视化不同聚类数对应的评分
plt.figure(figsize=(10, 6))
plt.plot(range(2, 15), scores, marker='o')
plt.title('Calinski-Harabasz Score for Different Number of Clusters')
plt.xlabel('Number of clusters')
plt.ylabel('Calinski-Harabasz Score')
plt.show()
#%%
# 创建并训练最终的KMeans模型
final_kmeans = KMeans(n_clusters=4, random_state=42)
final_kmeans.fit(df_scaled)
# 将每个样本分配到对应的簇中
cluster_labels = final_kmeans.predict(df_scaled)
# 将簇标签添加到原始数据中
df2['cluster'] = cluster_labels
# 查看每个簇中样本的数量
cluster_counts = df2['cluster'].value_counts()
print(cluster_counts)#%%
# 计算每个簇的平均特征值
cluster_means = df2.groupby('cluster').mean()
# 每个簇的特征名称
features = cluster_means.columns.tolist()
# 将第一个特征复制到列表末尾,以闭合雷达图
features.append(features[0])
# 绘制雷达图
plt.figure(figsize=(10, 8))
for cluster in range(4):values = cluster_means.iloc[cluster].values.tolist()values.append(values[0])angles = np.linspace(0, 2 * np.pi, len(features), endpoint=False).tolist()ax = plt.subplot(2, 2, cluster+1, polar=True)ax.fill(angles, values, 'b', alpha=0.1)ax.plot(angles, values, linewidth=1.5, linestyle='solid', label=f'Cluster {cluster}')ax.fill(angles, values, alpha=0.25)ax.set_yticklabels([])ax.set_thetagrids(np.degrees(angles), labels=features)ax.set_title(f'Cluster {cluster}')
plt.show()
#%%
plt.figure(figsize=(10, 8))
# 创建一个极坐标子图
ax = plt.subplot(111, polar=True)
for cluster in range(4):values = cluster_means.iloc[cluster].values.tolist()values.append(values[0])angles = np.linspace(0, 2 * np.pi, len(features), endpoint=False).tolist() # 绘制雷达图ax.fill(angles, values, alpha=0.1)ax.plot(angles, values, linewidth=1.5, linestyle='solid', label=f'Cluster {cluster}')ax.fill(angles, values, alpha=0.25)
# 隐藏雷达图的刻度和标签
ax.set_yticklabels([])
ax.set_thetagrids(np.degrees(angles), labels=features)
# 添加图例
plt.legend(loc='upper right')
plt.show()
#%%

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/19409.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

万界星空科技MES系统功能介绍

制造执行系统或MES 是一个全面的动态软件系统,用于监视、跟踪、记录和控制从原材料到成品的制造过程。MES在企业资源规划(ERP) 和过程控制系统之间提供了一个功能层,为决策者提供了提高车间效率和优化生产所需的数据。 万界星空科技MES 系统基础功能&am…

【全开源】Java短剧系统微信小程序+H5+微信公众号+APP 源码

打造属于你的精彩短视频平台 一、引言:为何选择短剧系统小程序? 在当今数字化时代,短视频已经成为人们日常生活中不可或缺的一部分。而短剧系统小程序源码,作为构建短视频平台的强大工具,为广大开发者提供了快速搭建…

03-树1 树的同构(浙大数据结构PTA习题)

03-树1 树的同构 分数 25 作者 陈越 单位 浙江大学 给定两棵树 T1​ 和 T2​。如果 T1​ 可以通过若干次左右孩子互换就变成 T2​,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G…

CSPM.pdf

PDF转图片 归档:

跨境电商多店铺:怎么管理?风险如何规避?

跨境电商的市场辽阔,有非常多的商业机会。你可能已经在Amazon、eBay、Etsy等在线平台向潜在客户销售产品了。为了赚更多的钱,你可能还在经营多个店铺和品牌。 但是,像Amazon、eBay、Etsy等知名平台会有自己的规则,他们开发了很多…

手拉手springboot整合kafka发送消息

环境介绍技术栈springbootmybatis-plusmysqlrocketmq软件版本mysql8IDEAIntelliJ IDEA 2022.2.1JDK17Spring Boot3.1.7kafka2.13-3.7.0 创建topic时,若不指定topic的分区(Partition主题分区数)数量使,则默认为1个分区(partition) springboot加入依赖kafk…

探索无限可能性——微软 Visio 2021 改变您的思维方式

在当今信息化时代,信息流动和数据处理已经成为各行各业的关键。微软 Visio 2021 作为领先的流程图和图表软件,帮助用户以直观、动态的方式呈现信息和数据,从而提高工作效率,优化业务流程。本文将介绍 Visio 2021 的特色功能及其在…

华为OD机试 - 游戏分组 - 递归(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷C卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试…

精准检测,安全无忧:安全阀检测实践指南

安全阀作为一种重要的安全装置,在各类工业系统和设备中发挥着举足轻重的作用。 它通过自动控制内部压力,有效防止因压力过高而引发的设备损坏和事故风险,因此,对安全阀进行定期检测,确保其性能完好、工作可靠&#xf…

使用pytorch构建ResNet50模型训练猫狗数据集

数据集 1.导包 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision import datasets, transforms, models import numpy as np import matplotlib.pyplot as plt import os from tqdm.auto import t…

流媒体服务器SMS-语音对讲(一)

1.简介 在国标语音对讲对接中,会发现不同的厂商或不同型号的设备,对讲流程都不一样,本文主要介绍流媒体与设备之间的交互情况。 SMS流媒体服务代码库地址:https://gitee.com/inyeme/simple-media-server 2.流媒体与设备交互的可能…

max6675热电偶温度采集

思路来源 参考价格 概述 MAX6675具有冷端补偿和将来自K型热电偶的信号数字化。数据以12位分辨率输出,SPI™兼容, 只读格式。该转换器将温度分解为0.25C,允许读数高达1024C,并显示热电偶8LSB在0C至 700C 引脚连接 温度采样电路 …

中间件复习之-消息队列

消息队列在分布式架构的作用 消息队列:在消息的传输过程中保存消息的容器,生产者和消费者不直接通讯,依靠队列保证消息的可靠性,避免了系统间的相互影响。 主要作用: 业务解耦异步调用流量削峰 业务解耦 将模块间的…

MySQL之创建高性能的索引(八)

创建高性能的索引 覆盖索引 通常大家都会根据查询的WHERE条件来创建合适的索引,不过这只是索引优化的一个方面。设计优秀的索引应该考虑到整个查询,而不单单是WHERE条件部分。索引确实是一种查找数据的高效方式,但是MySQL也可以使用索引来直…

向量数据库引领 AI 创新——Zilliz 亮相 2024 亚马逊云科技中国峰会

2024年5月29日,亚马逊云科技中国峰会在上海召开,此次峰会聚集了来自全球各地的科技领袖、行业专家和创新企业,探讨云计算、大数据、人工智能等前沿技术的发展趋势和应用场景。作为领先的向量数据库技术公司,Zilliz 在本次峰会上展…

【漏洞复现】电信网关配置管理系统 rewrite.php 文件上传漏洞

0x01 产品简介 中国电信集团有限公司(英文名称"China Telecom”、简称“"中国电信”)成立于2000年9月,是中国特大型国有通信企业、上海世博会全球合作伙伴。电信网关配置管理系统是一个用于管理和配置电信网络中网关设备的软件系统。它可以帮助网络管理员…

在线IP检测如何做?代理IP需要检查什么?

当我们的数字足迹无处不在,隐私保护显得愈发重要。而代理IP就像是我们的隐身斗篷,让我们在各项网络业务中更加顺畅。 我们常常看到别人购买了代理IP服务后,通在线检测网站检查IP,相当于一个”售前检验““售后质检”的作用。但是…

2024-5-31 石群电路-19

2024-5-31,星期五,10:53,天气:阴雨,心情:晴。今天就要回学校啦,当大家看到这篇推文的时候我已经要收拾收拾去赶返校的火车啦,和女朋友短暂分别,不过小别胜新婚吗&#xf…

笔记-docker基于ubuntu22.04安装Jitsi Meet

背景 利用JitsiMeet打造一个可以在线会议的环境,根据躺的坑,做个记录 参考 JitsMeet部署安装说明 开始操作 环境 docker run -it --name ubuntu22.04 ubuntu:22.04 /bin/bash问题 1、安装 openjdk-11 apt install openjdk-11-jdk配置环境变量&…

自媒体必用的50 个最佳 ChatGPT 社交媒体帖子提示prompt通用模板教程

在这个信息爆炸的时代,社交媒体已经成为我们生活中不可或缺的一部分。无论是品牌宣传、个人展示,还是日常交流,我们都离不开它。然而,要在众多信息中脱颖而出,吸引大家的关注并不容易。这时候,ChatGPT这样的…