1、聚类分析
是按照个体的特征将他们分类,让同一个类别内的个体之间具有较高的相似度,不同类别之间具有较大的差异性;
2、基本理论
Kmeans:K表示算法当中类的个数
Means 均值算法:K-means 使用均值算法把数据分成k个类别的算法
Kmeans算法:kmeans算法的目标,是把n个样本点划分到k个类中,使得每个点都属于离他最近的质心对应的类,以此作为聚类的标准
质心:是指一个类,内部所有样本点的均值
3、步骤
# 第一步
取得K个初始质心:从数据中随机抽取k个点作为初始聚类的中心,由这个中心代表各个类
# 第二步
根据欧式距离最小原则,把每个点划分配进距离最近的类中
# 第三步
重新计算质心:根据均值等方法,重新计算每个类的质心
# 第四部
迭代计算质心:重复第二步和第三步,迭代计算质心
# 第五步
聚类完成:聚类中心不再发何时能移动
4、聚类方法
sklearn.cluster.Kmeans(n_cluster=8)
n_clusters 要聚类的个数
fit(date) 训练模型
data 训练数据
predict(data) 预测
data 需要预测的数据
5、案例代码
# 目的:识别站点应用最广泛的模型是通过:流水、费比roi、当周销转、跨期销转 网销 销转
import pandas
data = pandas.read_csv('D:\\DATA\\pycase\\number2\\Data.csv')
explore=data.describe() # 查看数据框基本的信息描述、均值、标准差等
len(data) # 数据的行数
data.shape # 数据规模,行列
data.dtypes # 数据的格式类型
data.columns # 提取数据列
# 1 数据预处理
# 处于花费小于等于0的数据
Data=data[(data.现金>0)&(data.流水>0)]
# 选择360 头条 广点通 百度 微信 UC 用或“|”的关系 与“&” 非 not
Data=Data[(Data.广告商.str.contains('今日头条'))|(Data.广告商.str.contains('腾讯广点通'))|(Data.广告商.str.contains('360网盟'))|(Data.广告商.str.contains('微信朋友圈'))|(Data.广告商.str.contains('UC头条'))]
# T=('今日头条','腾讯广点通') 数组
# 数据探索查看
explore=Data.describe()
# 2 数据规约
# 原始数据属性太多,根据站点价值挖掘模型,选择与ZD指标相关的6个属性;
# 进行属性的筛选,在底表里边选择流水、现金、当周报名人数、跨期报名人数、报名人数、名片量 展现量
# 添加对应的数据属性
Data=Data[['站点ID','现金', '流水', '当期报名人数', '跨期报名人数', '名片量', '展现量','报名人数']]
Data['Cvr']=Data.名片量/Data.展现量
Data['销转']=Data.报名人数/Data.名片量
Data['ROI']=Data.现金/Data.流水
Data['当期销转']=Data.当期报名人数/Data.名片量
Data['跨期销转']=Data.跨期报名人数/Data.名片量
Data['名片成本']=Data.现金/Data.名片量
Data.columns
# 提取聚类属性
TData=Data[['站点ID', '销转', 'ROI', '流水','名片成本','Cvr',
'当期销转', '跨期销转']]
# 异常值处理(在这里,当期销转大于1为异常数据)
SData=TData[TData.当期销转<1]
Explore=SData.describe()
# 3 数据变换
# 将数据转换成“适当的”格式,以适应挖掘任务及算法的需要,构造需要的数据属性
# 0-1 表转化处理
from sklearn.preprocessing import MinMaxScaler
scaler=MinMaxScaler()
SData[[ '销转', 'ROI', '流水','名片成本','Cvr',
'当期销转', '跨期销转']]=scaler.fit_transform(SData[[ '销转', 'ROI', '流水','名片成本','Cvr',
'当期销转', '跨期销转']])
# 找到空值所在位置 isNA=TData.isnull()
# 获取空值所在行 TData[isNA.any(axis=1)]
# 替换掉NA值 TData=TData.fillna('0')
# 4 模型构建
# 站点价值Fenix模型构建主要由两部分构成,第一部分根据航空公司客户5个指标的数据,对客户进行聚类分群。第二部分结合业务对每个站点群进行特征
# 分析,分析站点的价值,并且对每个站点群进行排名
# 选择需要聚类的变量,以list形式展现
fcolumns=['销转', 'ROI', '流水','名片成本','Cvr',
'当期销转', '跨期销转']
from sklearn.cluster import KMeans
# 设置聚类参数
ZDModel=KMeans(n_clusters=5)
ZDModel=ZDModel.fit(SData[fcolumns])
# 对聚类的结果客户进行类别标注
pTarget=ZDModel.predict(SData[fcolumns])
# 查看每个客户的额类别分布情况,也可以进行分组
import pandas
pandas.crosstab(pTarget,pTarget)
import matplotlib
import matplotlib.pyplot as plt
# 聚类后需要查看不同客户类别之间对应现有属性值得差异
# 在这里使用每个属性值得均值,以直方图的形式展现
# 用数据框来表示,在现有的属性后加类别属性列
dMean=pandas.DataFrame(columns=fcolumns+['分类'])
# 通过客户聚类类别对各属性特征进行分类
SData_gb=SData[fcolumns].groupby(pTarget)
# 座标轴字体、绘图格式设置
import matplotlib.font_manager as font_manager
fontprop=font_manager.FontProperties(
fname='C:\\windows\\Fonts\\msyh.ttF' )
font={
'family':fontprop.get_name(),
'size':15
}
matplotlib.rc('font',**font)
# 对dmean数据框进行添加数据执行FOR循环,这是两层循环
dMean=pandas.DataFrame() # 初始化
# 注意for循环为嵌套循环,两个循环一起执行
plt.figure(figsize=(16,16)) # 条形图大小
i=0
for g in SData_gb.groups:
# 获得每种客户的均值
rMean=SData_gb.get_group(g).mean()
rMean['分类']=g;
rMean['总计']=SData_gb.get_group(g).size/7
dMean=dMean.append(rMean,ignore_index=True)
# 通过直方图查看各个类别对应所有属性之间的差异
subData=SData_gb.get_group(g)
for column in fcolumns:
i=i+1
p=plt.subplot(5,7,i)#进行5行7列的规则划分
p.set_title(column)
p.set_ylabel(str(g)+"分类")
plt.hist(subData[column])
plt.tight_layout() #调整子图间距
# %matplotlib qt 弹窗
# 注释:原案例查看数据,无法可视化
ZDModel.cluster_centers_ # 查看聚类中心
SData['分类']=ZDModel.labels_ # 查看各样本对应的类别
## 导出所需要的文件
# 数据表之间的匹配
SData_left=TData.merge(SData[['站点ID','分类']],left_on='站点ID',right_on='站点ID',how='left')
SData_left.to_csv('D:\\DATA\\pycase\\number2\\project\\SData_left.csv',
index=False,
encoding='utf_8_sig' # 重要,避免中文乱码
)
dMean.to_csv('D:\\DATA\\pycase\\number2\\project\\dMean.csv',
index=False,
encoding='utf_8_sig' # 重要,避免中文乱码
)