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


 

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