21、python的K-means聚类分析方法案例代码

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' # 重要,避免中文乱码
             )


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章