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