基于K-means聚类算法对相关数据进行分析

k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似
度,而簇间的相似度较低。本文主要基于此算法对下图2006年各地区城镇居民家庭平均每人全年消费性支出进行分析,以了解各地消费层级的划分

基于K-means聚类算法对相关数据进行分析_第1张图片

实现代码如下:

import numpy as np
from sklearn.cluster import KMeans
import openpyxl
 
def loadData(filePath):
    wb = openpyxl.load_workbook(filePath)
    sh = wb.get_sheet_by_name('Sheet1')
    retData = []
    retCityName = []
    for i in range(5, sh.max_row + 1):
        retCityName.append(sh.cell(row=i, column=1).value)
        retData.append([float(sh.cell(row=i, column=j).value) for j in range(2,sh.max_column + 1)])
    return retData,retCityName 
     
if __name__ == '__main__':
    data,cityName = loadData('city.xlsx')
    km = KMeans(n_clusters=4)
    label = km.fit_predict(data)
    expenses = np.sum(km.cluster_centers_,axis=1)
    #print(expenses)
    CityCluster = [[],[],[],[]]
    for i in range(len(cityName)):
        CityCluster[label[i]].append(cityName[i])
    for i in range(len(CityCluster)):
        print("Expenses:%.2f" % expenses[i])
        print(CityCluster[i])

首先通过openpyxl类库来读取Excel中的文件,将城市名称和其它数据分别存入一个一维数据和二维数组中,然后调用KMeans方法,设置n_clusters参数,即分类个数,对数据时行训练,获得标签,最后对标签进行输出。输出结果即将城市按照消费水平n_clusters类,消费水平相近的城市聚集在一类中。其中expense为聚类中心点的数值加和,也就是平均消费水平。
当n_clusters=2时:

Expenses:7595.47
[' 天  津', ' 河  北', ' 山  西', ' 内蒙古', ' 辽  宁', ' 吉  林', ' 黑龙江', ' 江  苏', ' 安  徽', ' 福  建', ' 江  西', ' 山  东', ' 河  南', ' 湖  北', ' 湖  南', ' 广  西', ' 海  南', ' 重  庆', ' 四  川', ' 贵  州', ' 云  南', ' 西  藏', ' 陕  西', ' 甘  肃', ' 青  海', ' 宁  夏', ' 新  疆']
Expenses:13841.98
[' 北  京', ' 上  海', ' 浙  江', ' 广  东']

当n_clusters=3时:

Expenses:7204.11
[' 河  北', ' 山  西', ' 内蒙古', ' 辽  宁', ' 吉  林', ' 黑龙江', ' 安  徽', ' 江  西', ' 山  东', ' 河  南', ' 湖  北', ' 湖  南', ' 广  西', ' 海  南', ' 四  川', ' 贵  州', ' 云  南', ' 西  藏', ' 陕  西', ' 甘  肃', ' 青  海', ' 宁  夏', ' 新  疆']
Expenses:13841.98
[' 北  京', ' 上  海', ' 浙  江', ' 广  东']
Expenses:9845.76
[' 天  津', ' 江  苏', ' 福  建', ' 重  庆']

当n_clusters=4时:

Expenses:7214.42
[' 辽  宁', ' 安  徽', ' 江  西', ' 湖  北', ' 湖  南', ' 广  西', ' 海  南', ' 四  川', ' 贵  州', ' 云  南', ' 西  藏']
Expenses:13841.98
[' 北  京', ' 上  海', ' 浙  江', ' 广  东']
Expenses:9845.76
[' 天  津', ' 江  苏', ' 福  建', ' 重  庆']
Expenses:7194.66
[' 河  北', ' 山  西', ' 内蒙古', ' 吉  林', ' 黑龙江', ' 山  东', ' 河  南', ' 陕  西', ' 甘  肃', ' 青  海', ' 宁  夏', ' 新  疆']

当n_clusters=5时:

Expenses:9845.76
[' 天  津', ' 江  苏', ' 福  建', ' 重  庆']
Expenses:7130.70
[' 河  北', ' 山  西', ' 内蒙古', ' 吉  林', ' 黑龙江', ' 江  西', ' 山  东', ' 河  南', ' 贵  州', ' 陕  西', ' 甘  肃', ' 青  海', ' 宁  夏', ' 新  疆']
Expenses:12890.38
[' 浙  江', ' 广  东']
Expenses:7318.30
[' 辽  宁', ' 安  徽', ' 湖  北', ' 湖  南', ' 广  西', ' 海  南', ' 四  川', ' 云  南', ' 西  藏']
Expenses:14793.59
[' 北  京', ' 上  海']

从结果可以看出消费水平相近的省市聚集在了一类,例如聚4类时,消费最高的' 北 京', ' 上 海', ' 浙 江', ' 广 东'聚集在了消费最高的类别,结果可以比较明显的看出消费层级。

你可能感兴趣的:(基于K-means聚类算法对相关数据进行分析)