摘要 :近年来,随着人们生活水平的不断提高,出行方便变成了大家的关注点,而大多数人为了便捷都选择了坐飞机出行。而航空公司业务竞争激烈,为了从产品中心转化为客户中心,针对不同类型客户,进行精准营销,实现利润最大化是很重要的。本文的实验目的就是对这些客户进行价值分析,从而促进航空业的发展。本次试验主要实现以下几个目标:1.借助航空公司客户数据,对客户进行分类。2. 对不同的客户进行特征分析,比较不同类客户的客户价值,对不同价值的客户类别提供个性化服务,制定相应的营销策略
关键词 航空公司;客户价值分析;数据挖掘;MATLAB;K-means算法
1.问题的描述
在竞争激烈的航空市场里,很多航空公司都推出了优惠的营销方式来吸引更多的客户。在此种环境下,如何将公司有限的资源充分利用,提升企业竞争力,为企业带来更多的利益。
信息时代的来临使得企业营销焦点从产品中心转变为客户中心,客户关系管理成为企业的核心问题。客户关系管理的关键问题是客户分类,通过客户分类,区分无价值客户、高价值客户,企业针对不同价值的客户制定优化的个性化服务方案,采取不同营销策略,将有限的营销资源集中于高价值客户,实现企业利润最大化的目标。准确的客户分类结果是企业优化营销资源分配的重要依据,客户分类越来越成为客户关系管理中亟待解决的关键问题之一。
1.1客户分类
借助航空公司客户数据,对客户进行分类。
1.2不同类客户的客户价值
对不同的客户进行特征分析,比较不同类客户的客户价值,对不同价值的客户类别提供个性化服务,制定相应的营销策略。
2.问题的分析
这个案例需要通过航空公司提供的会员档案信息和乘坐航班的记录数据进行挖掘,即通过航空公司客户数据识别不同价值的客户。识别客户价值应用最广泛的模型是通过三个指标(最近消费时间间隔(Recency)、消费频率(Frequency)、消费金额(Monetary))来进行客户细分,识别出高价值的客户,简称RFM模型。
在RFM模型中,消费金额表示在一段时间内,客户购买该企业产品金额的总和。由于航空票价收到运输距离、舱位等级等多种因素的影响,同样消费金额的不同旅客对航空公司的价值是不同的,比如一位购买长航线、低等级舱位票的旅客与一位购买短航线、高等级舱位票的旅客相比,后者对航空公司而言价值可能更高。因为这个指标并不适合于航空公司的客户价值分析。因此选择客户在一定时间内累积的飞行里程M和客户在一定时间内乘坐舱位所对应的折扣系数的平均值C两个指标代替消费金额。此外,考虑航空公司会员入会时间的长短在一定程度上能够影响客户价值,所以在模型中增加客户关系长度L,作为区分客户的另一指标。
本案例将客户关系长度(L)、消费时间间隔(R)、消费频率(F)、飞行里程(M)和折扣系数的平均值(C)作为航空公司识别客户价值的五个指标,如下表1所示,记为LRFMC模型。
模型 | L | R | F | M | C |
航空公司的LRFMC模型 | 会员入会时间距观测窗口结束的月数 | 客户最近一次乘坐公司飞机距观测窗口结束的月数 | 客户在观测窗口内乘坐公司飞机的次数 | 客户在观测时间内在公司累计的飞行里程 | 客户在观测窗口内乘坐舱位所对应的折扣系数的平均值 |
表 1 LRFMC模型中各指标的含义
由于传统RFM模型分析是利用属性分箱方法进行分析,根据属性的平均值进行
划分的,其中大于平均值的表示为↑,小于平均值的表示为↓),但是此方法细分的客户群太多,需要一一识别客户特征和行为,提高了针对性营销的成本。因此,本案例采用聚类的方法识别客户价值。通过对航空公司客户价值的LRFMC五个指标进行K-means聚类,识别出最有价值的客户。
指标进行K-means聚类,识别出最有价值的客户。
图 1 RFM模型 |
![]() | |
由于传统RFM模型分析是利用属性分箱方法进行分析,根据属性的平均值进行划分的,其中大于平均值的表示为↑,小于平均值的表示为↓),但是此方法细分的客户群太多,需要一一识别客户特征和行为,提高了针对性营销的成本。因此,本案例采用聚类的方法识别客户价值。通过对航空公司客户价值的LRFMC五个指标进行K-means聚类,识别出最有价值的客户。
本案例航空客户价值分析的总体流程,航空客运信息挖掘主要包括以下步骤:
(1)从航空公司的数据源进行选择性的抽取与新增数据抽取分别形成历史数据和增量数据。因已给出数据文件,不需要提取
(2)对步骤(1)中形成的两个数据集进行数据探索和预处理,包括数据缺失值与异常值的探索分析,数据的属性规约、清洗和变换。
(3)利用步骤(2)中形成的已完成数据预处理的清洗数据,基于旅客价值LRFMC模型进行客户分群,对各个客户进行特征分析,识别出有价值的客户。
(4)针对模型结果对不同价值的客户,采用不同的营销手段,为其提供定制化的服务。
3.数据处理
3.1数据抽取
以2014-03-31为结束时间,选取宽度为两年的时间段作为分析观测窗口,抽取观测窗口内有乘机记录的所有客户的详细数据形成历史数据。对于后续新增的客户详细信息,以后续新增数据中的时间点作为结束时间,采用上述同样的方法进行抽取,形成增量数据。
根据末次飞行日期,从航空公司系统内抽取2012-04-01至2014-03-31内所有乘客的详细数据,总共62988条记录
3.2数据探索分析
对数据进行缺失值分析与异常值分析,分析出数据的规律以及异常值。通过对数据进行观察发现原始数据中存在票价为空值、票价最小值为0、折扣率最小值为0、总飞行公里数大于0的记录。票价为空值的数据可能是客户不存在乘机记录造成的,其他数据可能是客户乘坐0折扣机票或者积分兑换造成的。
查找每列属性观测值中空值个数、最大值、最小值的MATLAB代码、如代码1所示。
代码1 数据探索分析代码
%% 数据空缺值探索,如果是字符串则返回缺失值个数 % 如果是数值型返回缺失值个数以及最大、最小值 clear; % 参数初始化 datafile= 'data/air_data.csv' ; % 航空原始数据,第一行为属性标签 logfile = 'tmp/log.txt'; % 日志文件 resultfile = 'tmp/explore.xls'; % 数据探索结果表 %% 读取数据 [num,txt] = xlsread(datafile); [rows,cols] = size(num); % 初始化 结果变量 results = cell(5,cols+1); result = zeros(4,cols); results(:,1)= {'属性';'空记录表';'缺失率';'最大值';'最小值'}; results(1,2:end)=txt(1,:); % 记录日志 log_add(logfile,['文件' datafile '一共有' num2str(rows) ... '条记录']); %% 遍历所有列,进行空缺判断 for i= 1: cols % 判断txt每列从第二行开始,是否都是空串 empty_sum = sum(cellfun(@isempty,txt(2:end,i))); % 如果是空串,则empty_sum==rows,即为数值型 if empty_sum==rows % 该列为数值型 min_ = min(num(:,i)); % 最小值 max_ = max(num(:,i)); % 最大值 nan_sum = sum(isnan(num(:,i))); nan_rate = nan_sum/rows; % 缺失率 loginfo=['属性列' txt{1,i} '是数值型,其最大值为'... num2str(max_) ',最小值为' num2str(min_) ... ',缺失值个数为' num2str(nan_sum) '个,缺失率为' ... num2str(nan_rate)]; log_add(logfile,loginfo); % if nan_sum~=0 % disp(loginfo); % end result(1,i)=nan_sum; result(2,i)=nan_rate; result(3,i)=max_; result(4,i)=min_;
else % 该列为字符串型,接着判断txt [emptynum,emptyrate]= find_empty(txt(2:end,i)); loginfo=['属性列' txt{1,i} '是字符串型,缺失值个数为' ... num2str(emptynum) '个,缺失率为' ... num2str(emptyrate)]; log_add(logfile,loginfo); % if emptynum~=0 % disp(loginfo); % end result(1,i)=nan_sum; result(2,i)=nan_rate; end end %% 写入数据探索结果 results(2:end,2:end)=num2cell(result); xlswrite(resultfile,results'); disp('代码运行完成!'); |
根据上面代码得到探索结果,如表2所示。
属性名称 | SUM_YR_1 | SUM_YR_2 | … | SEG_KM_SUM | AVG_DISCOUNT |
空记录数 | 551 | 138 | … | 0 | 0 |
最大值 | 239 560 | 234 188 | … | 580 717 | 1.5 |
最小值 | 0 | 0 | … | 368 | 0 |
表 1 数据探索分析结果表
3.3 数据预处理
3.3.1数据清洗
从航空公司业务和数据挖掘建模需要方面考虑,筛选出需要的数据。具体处理方法如下:
(1)丢弃票价为空的记录。
(2)丢弃票价为0、平均折扣率不为0、总飞行公里数大于0的记录。
使用MATLAB对满足清洗条件的数据进行丢弃,处理方法为满足清晰条件的一行数据全部丢弃,如代码2所示。
代码2 数据清洗代码
%% 数据清洗,过滤掉不符合规则的数据 clear; % 参数初始化 datafile = 'data/air_data.csv'; % 数据文件 cleanedfile = 'tmp/data_cleaned.csv'; % 数据清洗后保存的文件 %% 清洗空值和不符规则的数据 [num,txt]=xlsread(datafile); [row,col]=size(txt); % 数据整合 for i=1:col % 判断txt每列从第二行开始,是否都是空串 empty_sum = sum(cellfun(@isempty,txt(2:end,i))); % 如果是空串,则empty_sum==row-1,即为数值型 if empty_sum == row-1 txt(2:end,i)=num2cell(num(:,i)); % 把数值型转为cell类型,并整合 end % if mod(i,500)==0 % disp(['已整合数据' num2str(i) '条记录...']); % end end disp(['过滤前行数' num2str(size(txt,1))]); % 初始化变量 txt_copy=[]; rule1_sum =0; rule2_sum =0; % 数据过滤 for i=2:row % 从第二行数据行开始判断 % 判断每一行数据是否符合规则,其中filter_data为自定义函数 % 如果数据符合要求则返回1,否则返回0 [filterflag,rule1_sum,rule2_sum] = filter_data(txt(i,:),rule1_sum,rule2_sum); if filterflag ==0 % 不符合要求,删除 txt_copy=[txt_copy,i]; % 清除数据 end % if mod(i,500)==0 % disp(['已过滤数据' num2str(i) '条记录...']); % end end txt(txt_copy,:)=[]; disp(['过滤后行数:' num2str(size(txt,1)-1) ',规则1过滤记录数:' num2str(rule1_sum) ... '规则2过滤的记录数:' num2str(rule2_sum)]); %% 写入过滤后的数据 xlswrite(cleanedfile,txt); % 写入数据文件 |
3.3.2属性规约
原始数据中属性太多,根据航空公司客户价值LRFMC模型,选择与LRFMC指标相关的六个属性:FPP_DATE、LOAD_TIME、FLGHT_COUNT、AVG_DISCOUNT、SEG_KM_SUM、LAST_TO_END,删除不相关、弱相关和冗余的属性。
代码3 属性选择代码
preSelfile = 'tmp/data_cleaned.csv ' ; %数据文件 postSelfile = 'tmp/data_seled.csv ' ; %属性规约后保存的文件 [num,txt]= xlsread(preSelfile) ; [row , col]=size ( txt) ; %数据整合 for i=1:col %判断txt 每列从第二行开始﹐是否都是空串 empty_sum = sum(cellfun (@isempty,txt (2:end,i) ) );%如果是空串,则empty_sum==row-1,即为数值型 if empty_sum== row-1 txt (2:end,i ) =num2cell(num (:,i) ) ; %把数值型转为cell类型,并整合 end end txt_copy =[10 2 23 11 17 29]; r_txt = txt (:, txt_copy) ; disp ( [ '选取属性6个! ']); xlswrite (postSelfile,r_txt) ;% 写入数据文件 |
3.3.3数据变换
数据变换是将数据转换成“适当的”格式,以适应挖掘任务及算法的需要。本案例中主要采用的数据变换方式有属性构造和数据标准化。
⑴属性构造:
因原始数据中并没有直接给出LRFMC五个指标,需要构造这五个指标。
L = LOAD _TIME – FFP_DATE
会员入会时间距观测窗口结束的月数=观测窗口的结束时间-入会时间[单位:月
R= LAST_TO_ END
客户最近一次乘坐公司飞机距观测窗口结束的月数=最后一次乘机时间至观察窗口末端时长[单位:月]
F = FLIGHT_ COUNT
客户在观测窗口内乘坐公司飞机的次数=观测窗口的飞行次数[单位:次]
M= SEG _KM_ SUM
客户在观测时间内在公司累计的飞行里程=观测窗口总飞行公里数[单位:公里]
C= AVG_DISCOUNT
客户在观测时间内乘坐舱位所对应的折扣系数的平均值=平均折扣率[单位:无]
⑵数据标准化:
因五个指标的取值范围数据差异较大(如下表3),为了消除数量级数据.带来的影响,需要对数据进行标准化处理。处理后形成ZL、ZR、ZF、ZM、ZC五个属性的数据
属性名称 | L | R | F | M | C |
最大值 | 12.23 | 0.03 | 2 | 368 | 0.14 |
最小值 | 114.63 | 24.37 | 213 | 580717 | 1.5 |
表 2 LRFMC指标的取值范围
用标准差标准化处理的MATLAB代码,如代码3所示。
代码4 标准差标准化代码
%% 标准差标准化 clear; % 参数初始化 %datafile = 'data/zscoredata.xls'; % 需要进行标准化的数据文件 datafile = 'tmp/data_transed1.csv'; % 需要进行标准化的数据文件 zscoredfile = 'tmp/zscoreddata.xls'; % 标准差标准化后的数据存储路径文件 %% 标准化处理 [data,txt]=xlsread(datafile); zscoredata = zscore(data) ; % 其中zscore函数为MATLAB内置的标准化函数 %% 数据写入 xlswrite(zscoredfile,[txt;num2cell(zscoredata)]); |
4.模型的建立与求解
利用以上步骤中的已处理数据作为建模数据,基于旅客价值的LRFMC模型进行客户分群,对各个客户群再进行特征分析,识别有价值客户。
4.1客户聚类
采用K_Means聚类算法对客户数据进行客户分群,聚成五类。
利用K-Means聚类算法进行客户分群的MATLAB代码,如代码4所示。
代码5 K-Means聚类算法代码
%% K-Means聚类算法 clear; % 参数初始化 inputfile = 'tmp/zscoreddata.xls'; % 待聚类的数据文件 k=6; % 需要进行的聚类类别数 logfile = 'tmp/log.txt'; % 日志文件 %% 读取数据并进行聚类分析 [num,txt]=xlsread(inputfile); % 读取数据 % 调用k-means算法,进行聚类分析 % 其中,type为每个样本对应的类别号,centervec为聚类中心向量 [type,centervec] = kmeans(num,k); %% 聚类中心写入日志文件 rows = size(centervec,1); for i=1:rows loginfo= ['聚类号为' num2str(i) '的聚类中心向量为' ... num2str(centervec(i,:))]; log_add(logfile,loginfo); end |
对数据进行聚类分群的结果,如表4所示。
聚类类别 | 聚类个数 | 聚类中心 | ||||
ZL | ZR | ZF | ZM | ZC | ||
客户群1 | 24656 | -0.70003 | -0.41491 | -0.1612 | -0.16103 | -0.25475 |
客户群2 | 5337 | 0.48293 | -0.7994 | 2.4831 | 2.4243 | 0.3078 |
客户群3 | 12129 | -0.31414 | 1.686 | -0.57397 | -0.53678 | -0.17107 |
客户群4 | 15724 | 1.1609 | -0.3771 | -0.08675 | -0.094838 | -0.15803 |
客户群5 | 4198 | 0.056824 | -0.0056164 | -0.22678 | -0.2302 | 2.1911 |
表 4 客户聚类结果
4.2客户价值分析
针对聚类结果进行特征分析,其中客户群1在各属性中都比较小;客户群2在F、M属性中最大,R属性中最小;客户群3在R属性中最大,在F、M属性中最小;客户群4在L属性中最大,F、M、C属性相对较小;客户5在C属性中最大,L、R属性较小。(如图2所示)。 客户群1——黄;客户群2——紫;客户群3——蓝;客户群4——绿;客户群5——红;
图 2雷达图 |
结合业务分析,通过比较各个指标在群间的大小对某一个群的特征进行评价分析(如下图3所示)。
图 3 客户群体5项指标
根据业务定义五个等级的客户类别:重要保持客户、重要发展客户、重要挽留客户、一般客户、低价值客户其中每种客户类别的特征如下。
重要保持客户:
这类客户的平均折扣率(C)较高、最近乘坐过本公司航班(R)少、乘坐的次数(F)多和里程(M)较长。他们是航空公司的高价值客户,是最为理想的客户类型,对航空公司的贡献最大,所占比例却较小。
重要发展客户:
这类客户的平均折扣率(C)很高、最近乘坐过本公司航班(R)较少,乘坐次数(F)较少和里程(M)较短。这类客户入会时间(L)短,他们是航空公司的潜在价值客户。虽然这类客户的当前价值并不是很高,但却有很大的发展潜力。
重要挽留客户:
这类客户入会时间(L)长、乘坐次数(F)较少和历程(M)较d短,并且较长时间已经没有乘坐本公司的航班(R)较低。该类客户处于流失状态。由于这些客户衰退的原因各不相同,所以掌握客户的最新信息、维持与客户的互动就显得尤为重要了。
一般客户或低价值客户:
这类客户所乘航班的平均折扣率(C)很低,乘坐的次数(F)少和里程(M)短,入会时间(L)短。这类客户机票票价低,可能是在航空公司机票打折促销时,才会乘坐该公司的航班,对公司无忠诚度。
根据建模结果,航空公司的五类不同价值的客户数量分布如下表5所示:
表 5 五类群体的数量分布
根据每种客户类型的特征和数量,对各类客户群进行客户价值排名,其结果如下表6所示。针对不同类型的客户群提供不同的产品和服务,提升重要发展客户的价值、稳定和延长重要保持客户的高水平消费、防范重要挽留客户的流失,并积极进行关系恢复。
客户群 | 排名 | 排名含义 |
客户群2 | 1 | 重要保持客户 |
客户群5 | 2 | 重要发展客户 |
客户群4 | 3 | 重要挽留客户 |
客户群1 | 4 | 一般客户 |
客户群3 | 5 | 低价值客户 |
表 6 客户群价值排名
附录
本文所有程序使用MATLAB编写 使用版本 R2021b
属性选择后生成的数据文件data_sele(Matlab报错:excel未激活)改名为data_sele1后在m7_2_3_trans脚本中成功运行。
属性构造后生成的数据文件data_transed(Matlab报错:excel未激活)改名为data_transed1后在m7_3_zscore_data脚本中成功运行。
补文章中代码
2,find_empty.m
function [emptynum, emptyrate] = find_empty(input)
%%cell列向量中查找字符串为空的个数以及比率
%输入参数:
%input:cell列向量;
%输出参数:
%emptynum:空字符串个数;
%emptyrate:空字符串比率;
rows = size(input,1);
emptynum = sum(cellfun(@isempty,input));
%
% for i = 1:rows
% if isempty(input{i,1});
% emptynum=emptynum+1;
% end
%end
emptyrate = emptynum/rows;
end
3,log_add.m
function log_add(logfile,loginfo)
%%日志追加
%输入参数
%logfileid:日志文件;
%loginfo:需要记录的日志信息;
%%打开日志文件
fileID = fopen(logfile,'a+');%以追加的方式添加日志信息
loginfo = [datestr(now) ' ' loginfo]; %日志信息
%%记录日志
fprintf(fileID,'%s\r\n',loginfo); %写入日志信息
%%关闭日志文件
fclose(fileID);
end
5,filter_data.m
function [filterflag,rule1_sum,rule2_sum] = filter_data(txtdata,rule1_sum,rule2_sum)
%%根据过滤规则返回是否符合过滤条件
%票价为空的数据,SUM_YR_1(下标15) 、sUM_YR_2〈下标16)任一为空
% 票价为o、平均折扣率不为o、总飞行公里数大于o的数据
%SUM_YR_1 (下标15)、sUM_YR_2(下标16)都为零
%AVG_DISCOUNT(下标为29)不等于o
%SEG_KM_SuM(下标为17)大于零﹔
%输入参数:
%txtdata:一行数据,cell向里﹔
%rule1_sum :规则一过滤的记录数
%rule2_sum :规则二过滤的记录数
%输出数据:
%filterflag: 0:数据不符合要求,1:数据符合要求;
% rule1_sum :规则一过滤的记录数
%rule2_sum :规则二过滤的记录数
%%过滤
index_15 = txtdata{1,15};
index_16 = txtdata{1,16};
%第一个过滤条件
if isnan(index_15)||isnan(index_16)||isempty(index_15)||isempty(index_16)
filterflag = 0;
rule1_sum=rule1_sum+1;
return;
end
%第二个过滤条件
index_17 = txtdata{1,17};
index_29 = txtdata{1,17};
if index_15==0 && index_16==0
if index_17>0 && index_29~=0
filterflag=0;
rule2_sum = rule2_sum+1;
return;
end
end
filterflag=1;
7,m7_2_3_trans.m
preTransfile = 'tmp/data_seled1.csv ' ; %数据文件
postTransfile = 'tmp/data_transed.csv ' ; %数据转换后保存的文件
[num,txt]=xlsread(preTransfile);
[rows,cols]=size (txt);
results = cell(rows,5 );
results (1,:)= {'L' 'R' 'F' 'M' 'C'};
load_date = datetime ( txt(2:end, 1) );
ffp_date = datetime ( txt(2:end,2) ) ;
L= load_date - ffp_date;
results(2:end, 1) = num2cell( roundn (hours( L ) ./ (24*30),-2) );
results(2:end, 2) = num2cell ( roundn(num(:, 1 )./30 , -2) );
results(2:end, 3) = num2cell( num ( : , 2) );
results(2:end, 4) = num2cell( num ( : , 3) );
results(2:end, 5) = num2cell( roundn (num (: , 4),-2) );
xlswrite(postTransfile,results) ; %写入数据文件
8.m7_3_zscore_data.m
%% 标准差标准化
clear;
% 参数初始化
%datafile = 'data/zscoredata.xls'; % 需要进行标准化的数据文件
datafile = 'tmp/data_transed1.csv'; % 需要进行标准化的数据文件
zscoredfile = 'tmp/zscoreddata.xls'; % 标准差标准化后的数据存储路径文件
%% 标准化处理
[data,txt]=xlsread(datafile);
zscoredata = zscore(data) ; % 其中zscore函数为MATLAB内置的标准化函数
%% 数据写入
xlswrite(zscoredfile,[txt;num2cell(zscoredata)]);
附录1:雷达图(图2)
function spider(theta,data,color)
n=length(data);
[x_,y_] = pol2cart(theta(1),data(1));
for i=2:n
th=theta(i);
[x,y] = pol2cart(th,data(i));
plot([x_,x],[y_,y],'-','linewidth',0.75,'color',color);
hold on
x_=x;
y_=y;
end
[x,y] = pol2cart(theta(1),data(1));
plot([x_,x],[y_,y],'-','linewidth',0.75,'color',color);
function theta=back_ground(n,signal_name)
if nargin==0
n=5;
signal_name={'one','two','three','four','five'};
end
axis off
axis equal
hold on
theta_last=pi/2;
theta=zeros(n,1);
for i=1:n
theta(i)=2*pi/n*i+pi/2;
plot([0,5*cos(theta(i))],[0,5*sin(theta(i))],'k-','linewidth',2);
[x,y] = pol2cart(theta(i),6);
text(x,y,signal_name{i},'HorizontalAlignment','center')
for j=1:5
plot([j*cos(theta_last),j*cos(theta(i))],[j*sin(theta_last),j*sin(theta(i))],'--','linewidth',0.75,'color',[0.5,0.5,0.5]);
end
theta_last=theta(i);
end
x=[-0.70003,-0.41491,-0.1612,-0.16103,-0.25475;0.48293,-0.7994,2.4831,...
2.4243,0.3078;-0.31414,1.686,-0.57397,-0.53678,-0.17107;1.1609,...
-0.3771,-0.08675, -0.094838,-0.15803;0.056824,-0.0056164,-0.22678,...
-0.2302,2.1911];
signal_name={'ZL','ZR','ZF','ZM','ZC'};
[M,N]=size(x);
theta=back_ground(N,signal_name);
for i=1:M
switch i
case 1
color='y';
case 2
color='m';
case 3
color='b';
case 4
color='g';
otherwise
color='r';
end
spider(theta,x(i,:),color);
end
附录2:多组条形图(图3)
x=[-0.70003,-0.41491,-0.1612,-0.16103,-0.25475;0.48293,-0.7994,2.4831,...
2.4243,0.3078;-0.31414,1.686,-0.57397,-0.53678,-0.17107;1.1609,...
-0.3771,-0.08675, -0.094838,-0.15803;0.056824,-0.0056164,-0.22678,...
-0.2302,2.1911];
figure(1)
axes2=axes('position',[0.1,0.1,0.86,0.8]); %这个是figure里面图的位置和大小,分别为离下边,左边的距离,还有图的高和宽
bar(x);
set(gca,'XTickLabel',{'群1','群2','群3','群4','群5'}); %横坐标
legend('ZL','ZR','ZF','ZM','ZC'); %图例
xlabel('聚类类别'); ylabel('聚类中心');
附录3:条形图(图4)
clc;
clear all;
data=[5337,4198,15724,24656,12129];
b=bar(data,'BarWidth',0.6);%可以直接设置条形图的宽度
grid on;
set(gca,'XTickLabel',{'重要保持客户','重要发展客户','重要挽留客户','一般客户','低价值客户'})%设置横坐标数值
for i = 1:length(data)
%直方图上面数据对不齐,利用水平和垂直对齐
%利用text函数实现数据显示,并设置对齐方式,字体大小
text(i,data(i)+0.1,num2str(data(i)),'VerticalAlignment','middle','HorizontalAlignment','center','FontSize',12);
end
set(gca,'FontSize',12);%设置字体大小
xlabel('客户类别');
ylabel('数量(个)');
%axis([0 5 0 3.2]);%设置坐标轴显示范围