如果动手做过的人可能面临的第一个问题就是,这数据读进pandas怎么弄编码结果都是错的。如果你存在这样的问题,那么我建议你使用NotePad++载入文件以后,改成无BOM的UTF-8编码,然后就可以正常读取了。
数据预处理部分
根据书上的条件,预处理需要分以下几条:
1、老客户:飞行次数大于6次
2、已流失客户:第二年飞行次数’L1Y_Flight_Count’ 低于 第一年飞行次数’P1Y_Flight_Count’ 的50%, 类型为0
3、准流失客户:第二年飞行次数’L1Y_Flight_Count’ 在 第一年飞行次数’P1Y_Flight_Count’ 的 50%-90% 之间, 类型为1
4、未流失客户:第二年飞行次数大于 第一年飞行次数的90%以上, 类型为2
5、单位里程票价:这也是没有现成的,我采用的是((第一年总票价+第二年总票价)/总里程)
6、单位里程积分:(总积分/总里程)
然后因为有些客户没有票价,造成了单位里程票价为0,这类客户不是很多,所以我也就全部丢弃掉了。最后,把小数部分都取成2位。得到结果如下图:
然后进行标准化,这次我采用的是max-min标准化。得到的结果是:
到这里数据应该算准备完成了。但我在这里遇见了一个问题,在把这个数据导入KMeans的时候,会报一个ValueError的错误。所以需要通过以下代码,解除错误。
# data_zc就是上面的表
from sklearn.preprocessing import Imputer
data_zcc = pd.DataFrame(Imputer().fit_transform(data_zc))
然后划分80%数据为训练集,20%为测试集。在这里其实我有一个很大的疑惑以至于我对整个过程表示怀疑。通过KMeans对以上的数据进行了分类,那么训练集和测试集有本质性的区别吗?为什么不把测试集做为增量数据和训练集一起进行训练分类呢?当然,如果训练级如果确实数量很大,那么从性能角度而言,确实分开比较好。
好了,无论如何,我也把训练数据分成了三类。
那么下面就是要分析一下,这三类究竟是什么情况了。
我们看一下这群体客户的原始数据。
很明显,这一群的客户数据都好好看。
我们也看一下这个群体的客户原始数据。
很明显,这一群体里面第二年的乘机次数都有明显的下降。对于这一群体中的会员卡等级较高且第一年乘机次数较多的客户,应当进行回访,了解客户为什么会减少乘机次数,找出原因进行改进。争取把这一部分流失的客户重新召回。
根据数据,我们可以认为,这一群体应该是刚刚加入这家航空公司不久的会员,所以会员等级等等数据并不是那么好看,但是他们都有一个共同的特征,就是他们的飞行次数在增加。也就是他们正处于一个上升区间,把这一群体的客户努力转变为0群客户,那么就可以增加忠诚用户的数量。这显然是至关重要的。那么可以通过给这些会员更多的晋升VIP等级,更好的折扣加强用户存在感等等营销方式呵护这一群体。
第0群,这一类就是传说中的空中飞人,经常出差工作,飞来飞去是航空公司的常客。
第1群,曾经他们是空中飞人,但是现在可能转换工作不太需要出差了,所以出行次数变少。
第2群,将要成为空中飞人的人或者每年有固定飞行计划的人,又不需要出差的工作转为常常需要出差飞行的工作,或者这些客户一年就飞个3-4次,比如去某个城市开个季度会议之类,所以飞行量不是很大,但是次数也比较固定。