案例一:探究用户对物品类别的喜好细分
1.获取数据import pandas as pd
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score #轮廓系数aisles = pd.read_csv('aisles.csv')
ord_prod_prior = pd.read_csv('order_products__prior.csv')
order = pd.read_csv('orders.csv')
products = pd.read_csv('products.csv')
可以看见数据被拆分成了4个表格,先合并表格。
2.数据基本处理
2.1 合并表格df = pd.merge(ord_prod_prior,products,how='left',on=["product_id", "product_id"])
df1 = pd.merge(df,order,on=['order_id','order_id'])
df2 = pd.merge(df1,aisles,on=['aisle_id','aisle_id'])
df2.head()
2.2 交叉表合并
为了对客户的购物行为分析,将每个客户购买过的商品进行统计,用crosstab可以方便的做到。df_cross = pd.crosstab(df2["user_id"], df2["aisle"])
df_cross.head()
crossTable
上表中有134个特征,对如此多的特征进行聚类会发生维度灾难,这时候我们考虑特征降维。
二十万条数据太多,现在取其中1万条用户信息#使用PCA特征降维,保留90%的特征
transfer = PCA(n_components=0.9)
data = transfer.fit_transform(df_cross_tiny)
data.shape
Out:(10000, 26)
这里降维后剩下了26个特征,损失了10%的信息。
接下来用Kmeans聚类#使用k-means进行聚类,并使用轮廓系数评估
from sklearn.metrics import silhouette_score
def plot_by_n(n_clusters,data):
pre_data = KMeans(n_clusters=n_clusters).fit_predict(data)
sb.scatterplot(data[:,0],data[:,1],hue=pre_data)
plt.show()
# 用silhouette_score评估的聚类分数
print(silhouette_score(data, pre_data))
#从n=2到n=10
for n in range(2,10):
plot_by_n(n,data)OUT:
n= 2 0.692336964374765
n= 3 0.551931038460353
n= 4 0.45253050151292484
n= 5 0.4513994310665167
n= 6 0.4181297258813439
n= 7 0.3722567845705036
n= 8 0.37251302801272024
n= 9 0.36138371002101033
轮廓系数处于[-1,1]之间,越接近于1,聚类效果越好,上述结果发现效果不太明显,不太能确定分为多少类。