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.rhkb.cn/news/337526.html

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

相关文章

苍穹外卖数据可视化

文章目录 1、用户统计2、订单统计3、销量排名Top10 1、用户统计 所谓用户统计,实际上统计的是用户的数量。通过折线图来展示,上面这根蓝色线代表的是用户总量,下边这根绿色线代表的是新增用户数量,是具体到每一天。所以说用户统计…

关系数据库:关系运算

文章目录 关系运算并(Union)差(Difference)交(Intersection)笛卡尔积(Extended Cartesian Product)投影(projection)选择(Selection)除…

鹤城杯 2021 流量分析

看分组也知道考http流量 是布尔盲注 过滤器筛选http流量 将流量包过滤分离 http tshark -r timu.pcapng -Y "http" -T json > 1.json这个时候取 http.request.uri 进一步分离 http.request.uri字段是我们需要的数据 tshark -r timu.pcapng -Y "http&quo…

C++ 混合运算的类型转换

一 混合运算和隐式转换 257 整型2 浮点5 行吗?成吗?中不中? C 中允许相关的数据类型进行混合运算。 相关类型。 尽管在程序中的数据类型不同,但逻辑上进行这种运算是合理的相关类型在混合运算时会自动进行类型转换,再…

【会议征稿】2024年无人驾驶与智能传感技术国际学术会议(ADIST 2024)

2024年无人驾驶与智能传感技术国际学术会议(ADIST 2024)将于2024年6月28-30日在珠海召开。ADIST 2024旨在搭建学术资源共享平台,加强中外学术合作,促进自动驾驶和智能传感技术的发展,促进全球研究人员、开发人员、工程…

免费实现网站HTTPS访问

HTTPS(Hypertext Transfer Protocol Secure)是一种基于SSL协议的HTTP安全协议,旨在为客户端(浏览器)与服务器之间的通信提供加密通道,确保数据在传输过程中的保密性、完整性和身份验证。与传统的HTTP相比&a…

《云原生监控》-prometheus监测技术方案

部署环境 A主机: 系统: CentOS 7 应用: Docker( Prometheus Grafana Alertmanager CAdvisor ) 主机( Node Exporter Consul Confd ) B主机: 系统: CentOS 7 应用: Docker( CAdvisor ) 主机( Node Exporter ) 总体图 下载: Confd链接(0.16.0)…

【C++】数据结构:哈希桶

哈希桶(Hash Bucket)是哈希表(Hash Table)实现中的一种数据结构,用于解决哈希冲突问题。哈希表是一种非常高效的数据结构,它通过一个特定的函数(哈希函数)将输入数据(通常…

jenkins插件之plot

plot是一个生成图表的插件,这里我用于可视化phploc统计的数据 插件安装 进入 Dashboard --> 系统管理 --> 插件管理 --> Available plugins 搜索plot安装生成phploc分析数据 Dashboard --> 您的项目 --> Configuration点击 Build Steps点击 增加构…

一文读懂存内计算与近存计算的分类与应用

存内计算与近存计算-基础理论及分类 技术基础知识和分类 "近存计算"与"存内计算"易混淆,本章明晰其分类,并比较各内存驱动方法的独特优势。可计算存储器设备可作分立加速器或替代现有存储模块。我们深入剖析每种方法的利弊&#xf…

ctfshow web 月饼杯II

web签到 <?php //Author:H3h3QAQ include "flag.php"; highlight_file(__FILE__); error_reporting(0); if (isset($_GET["YBB"])) {if (hash("md5", $_GET["YBB"]) $_GET["YBB"]) {echo "小伙子不错嘛&#xff…

App自动化测试_Python+Appium使用手册

一、Appium的介绍 Appium是一款开源的自动化测试工具&#xff0c;支持模拟器和真机上的原生应用、混合应用、Web应用&#xff1b;基于Selenium二次开发&#xff0c;Appium支持Selenium WebDriver支持的所有语言&#xff08;java、 Object-C 、 JavaScript 、p hp、 Python等&am…

thinkphp6 自定义的查询构造器类

前景需求&#xff1a;在查询的 时候我们经常会有一些通用的&#xff0c;查询条件&#xff0c;但是又不想每次都填写一遍条件&#xff0c;这个时候就需要重写查询类&#xff08;Query&#xff09; 我目前使用的thinkphp版本是6.1 首先自定义CustomQuery类继承于Query <?p…

让表单引擎插上AI的翅膀-记驰骋表单引擎加入AI升级

让表单引擎插上AI的翅膀 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经逐渐渗透到我们工作和生活的每一个角落。在数字化办公领域&#xff0c;表单引擎作为数据处理和流程自动化的重要工具&#xff0c;也迎来了与AI技术深度融合的新机遇。让表单引擎…

Python零基础-下【详细】

接上篇继续&#xff1a; Python零基础-中【详细】-CSDN博客 目录 十七、网络编程 1、初识socket &#xff08;1&#xff09;socket理解 &#xff08;2&#xff09;图解socket &#xff08;3&#xff09;戏说socket &#xff08;4&#xff09;网络服务 &#xff08;5&a…

api网关kong对高频的慢接口进行熔断

一、背景 在生产环境&#xff0c;后端服务的接口响应非常慢&#xff0c;是因为数据库未创建索引导致。 如果QPS低的时候&#xff0c;因为后端服务有6个高配置的节点&#xff0c;虽然接口慢&#xff0c;还未影响到服务的正常运行。 但是&#xff0c;当QPS很高的时候&#xff0c…

整合Spring Boot 框架集成Knife4j

本次示例使用Spring Boot作为脚手架来快速集成Knife4j,Spring Boot版本2.3.5.RELEASE ,Knife4j版本2.0.7 POM.XML完整文件代码如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0…

基于开源项目ESP32 SVPWM驱动无刷电机开环速度测试

基于开源项目ESP32 SVPWM驱动无刷电机开环速度测试 ✨本篇硬件电路和代码来源于此开源项目&#xff1a;https://github.com/MengYang-x/STM3F401-FOC/tree/main&#x1f4cd;硬件电路和项目介绍&#xff0c;立创开源广场&#xff1a;https://oshwhub.com/shadow27/tai-yang-nen…

百度中心之星

目录 新材料 星际航行 新材料 直接模拟&#xff1a;因为要考虑上次出现的位置&#xff0c;所以使用map映射最好&#xff0c;如果没有出现过就建立新映射&#xff0c;如果出现过但是已经反应过就跳过&#xff0c;如果出现过但是不足以反应&#xff0c;就建立新映射&#xff0c;…

python实现——分类类型数据挖掘任务(图形识别分类任务)

分类类型数据挖掘任务 基于卷积神经网络&#xff08;CNN&#xff09;的岩石图像分类。有一岩石图片数据集&#xff0c;共300张岩石图片&#xff0c;图片尺寸224x224。岩石种类有砾岩&#xff08;Conglomerate&#xff09;、安山岩&#xff08;Andesite&#xff09;、花岗岩&am…