在各个行业,尤其是电商行业当中,经常需要做各个人群之间的相似度分析,以便于找到品牌的核心用户,在拉新过程中,我们也需要用现有数据来挖掘潜在客户。下面为大家提供一个做人群相似度的思路。
1、数据准备
需要准备的数据包括每一类数据及其特征:
实际数据如下:
2、计算人群距离
这里我们评价一个类别是否和其它类别相似,可是用各个类别的距离来衡量,这里需要用到一个包:
from scipy.spatial import distance
这个包可以计算各个人群之间的距离。
file = '20191023_114315pivot_people_huaxiang.xlsx'df = pd.read_excel(file, index_col='人群包')df.fillna(0, inplace=True)disMat = distance.pdist(df, 'euclidean')D = distance.squareform(disMat, force='no', checks=True)df_D = pd.DataFrame(D)df_D.index = list(df.index.values)df_D.columns = list(df.index.values)print(df_D)这里面主要用到了distance当中的两个函数,一个是pdist,一个是squareform。
pdist的主要作用是:得到各个点之间的距离; 这样得到的距离并不能明显的看出各个点之间的区别,所以需要squareform函数;
squareform:这个函数可以把之前pdist得到的距离矩阵化,得到冗余矩阵,例如把
array([ 2, 3, 4, 7, 8, 12])变化成
array([[ 0, 2, 3, 4], [ 2, 0, 7, 8], [ 3, 7, 0, 12], [ 4, 8, 12, 0]])这样我们就得到了各个点之间的距离,距离越大相似度就越小;
3、通过主成分分析画散点图
通过距离的数字有时候并不能明显的看出各个点之间的相似关系,所以我们还可以把所有的点画成散点图。散点图只有两个维度,而我们的数据源却有多个维度,所以,第一步就是降维,使用到的包是:
from sklearn import decomposition as skldec
这个包可以帮我们筛选出来两个主要的维度,得到结果之后画散点图:
#根据两个最大的主成分进行绘图pca = skldec.PCA(n_components = 0.95) pca.fit(df) # 主成份分析时每一行是一个输入数据result = pca.transform(df) #计算结果plt.rcParams["font.sans-serif"] =["SimHei"]plt.rcParams["axes.unicode_minus"] = Falseplt.figure() #新建一张图进行绘制plt.scatter(result[:, 0], result[:, 1], c=label, edgecolor='k') #绘制两个主成分组成坐标的散点图for i in range(result[:,0].size): plt.text(result[i,0],result[i,1],df.index[i]) #在每个点边上绘制数据名称x_label = 'PC1(%s%%)' % round((pca.explained_variance_ratio_[0]*100.0),2) #x轴标签字符串y_label = 'PC1(%s%%)' % round((pca.explained_variance_ratio_[1]*100.0),2) #y轴标签字符串plt.xlabel(x_label) #绘制x轴标签plt.ylabel(y_label) #绘制y轴标签plt.show()使用PCA降维之后还可以查看降维的效果:
>>> pca.n_components1>>> pca.explained_variance_ratio_array([ 0.99910873])>>> pca.explained_variance_array([ 2.55427003])>>> pca.get_params以上面的数据为例,我们所训练的pca对象的n_components值为1,即保留1个特征,该特征的方差为2.55427003,占所有特征的方差百分比为0.99910873,意味着几乎保留了所有的信息。get_params返回各个参数的值。
最终产出的效果图表:
从图中距离的远近我们就可以看出各个人群的相似关系,以便于我们在人群精细化运行的过程中提供参考。