python数据分类聚类案例_Python数据分析案例--运用K-Means聚类分析广告效果

在本案例中,我们通过各类广告渠道90天内额日均UV,平均注册率、平均搜索率、访问深度、平均停留时长、订单转化率、投放时间、素材类型、广告类型、合作方式、广告尺寸和广告卖点等特征,将渠道分类,找出每类渠道的重点特征,为加下来的业务讨论和数据分析提供支持。

导入分析过程所需类库

import pandas as pd

import matplotlib.pyplot as plt

import matplotlib,os

import numpy as np

import seaborn as sns

from sklearn.preprocessing import OneHotEncoder #文本向量化

from sklearn.preprocessing import MinMaxScaler #数据标准化

from sklearn.cluster import KMeans #聚类算法模型

from sklearn.metrics import silhouette_score #轮廓系数

import warnings

warnings.filterwarnings("ignore")

matplotlib.rcParams['font.sans-serif'] = ['SimHei']

matplotlib.rcParams['axes.unicode_minus']=False

sns.set(font='SimHei')

导入原始数据

data = pd.read_csv('ad_performance.csv').iloc[:,1:]

data.head()

查看数据基本信息

print("\n"+"{:*^40}".format(' Data Info ')+"\n")

print(data.info())

print("\n"+"{:*^40}".format(' Null ')+"\n")

print(data.isnull().sum())

print("\n"+"{:*^40}".format(' Duplicated ')+"\n")

print(data.duplicated().value_counts())

print("\n"+"{:*^40}".format(' Shape ')+"\n")

print(data.shape)

out:

************** Data Info ***************

RangeIndex: 889 entries, 0 to 888

Data columns (total 13 columns):

渠道代号 889 non-null object

日均UV 889 non-null float64

平均注册率 889 non-null float64

平均搜索量 889 non-null float64

访问深度 889 non-null float64

平均停留时间 887 non-null float64

订单转化率 889 non-null float64

投放总时间 889 non-null int64

素材类型 889 non-null object

广告类型 889 non-null object

合作方式 889 non-null object

广告尺寸 889 non-null object

广告卖点 889 non-null object

dtypes: float64(6), int64(1), object(6)

memory usage: 90.4+ KB

None

***************** Null *****************

渠道代号 0

日均UV 0

平均注册率 0

平均搜索量 0

访问深度 0

平均停留时间 2

订单转化率 0

投放总时间 0

素材类型 0

广告类型 0

合作方式 0

广告尺寸 0

广告卖点 0

dtype: int64

************** Duplicated **************

False 889

dtype: int64

**************** Shape *****************

(889, 13)

查看数据描述统计

data.describe().T.round(2)

查看数据相关系数

data.corr().round(2)

相关系数热力图

sns.heatmap(data.corr().round(2), cmap="Reds", annot=True)

接下来是数据处理部分:

删除包含缺失项内容

raw_data = data.drop(['平均停留时间'], axis=1)

查看类别变量取值范围

cols=["素材类型","广告类型","合作方式","广告尺寸","广告卖点"]

for i in cols:

df = raw_data[i].unique()

print("变量【{0}】的取值有:\n{1}".format(i, df)+"\n")

print("-."*20+"\n")

out:

变量【素材类型】的取值有:

['jpg' 'swf' 'gif' 'sp']

-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.

变量【广告类型】的取值有:

['banner' 'tips' '不确定' '横幅' '暂停']

-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.

变量【合作方式】的取值有:

['roi' 'cpc' 'cpm' 'cpd']

-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.

变量【广告尺寸】的取值有:

['140*40' '308*388' '450*300' '600*90' '480*360' '960*126' '900*120'

'390*270']

-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.

变量【广告卖点】的取值有:

['打折' '满减' '满赠' '秒杀' '直降' '满返']

-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.

字符串分类热编码处理

model_one = OneHotEncoder(sparse=False)

one_matrix = model_one.fit_transform(raw_data[cols])

print(one_matrix[:2])

out:

[[0. 1. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 1. 1. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0.

0. 0. 0.]

[0. 1. 0. 0. 1. 0. 0. 0. 0. 1. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0.

0. 0. 0.]]

标准化处理

scaler = MinMaxScaler()

raw_data_scaler = scaler.fit_transform(raw_data.iloc[:,1:7])

print(raw_data_scaler[:2])

out:

[[1.43508267e-04 1.81585678e-01 2.06364513e-02 1.33404913e-02

1.19168591e-01 6.55172414e-01]

[7.06234624e-03 1.02301790e-01 3.12439730e-02 1.07052569e-02

1.38568129e-02 6.20689655e-01]]

合并训练数据

X = np.hstack((raw_data_scaler, one_matrix))

建立与训练模型

通过平均轮廓系数检验得到最佳KMeans聚类模型

score_list = []

silhouette_int = -1

for n_clusters in range(2,8):

model_kmeans = KMeans(n_clusters=n_clusters)

labels_tmp = model_kmeans.fit_predict(X)

silhouette_tmp = silhouette_score(X, labels_tmp)

if silhouette_tmp > silhouette_int:

best_k = n_clusters

silhouette_int = silhouette_tmp

best_kmeans = model_kmeans

cluster_labels_k = labels_tmp

score_list.append([n_clusters, silhouette_tmp])

print("\n"+"{:*^60}".format(" K值对应轮廓系数: ")+"\n")

print(np.array(score_list))

print('最优的K值是:{0} \n对应的轮廓系数是:{1}'.format(best_k, silhouette_

out:

************************ K值对应轮廓系数: *************************

[[2. 0.38655493]

[3. 0.45757883]

[4. 0.50209812]

[5. 0.4800359 ]

[6. 0.47761127]

[7. 0.50016363]]

最优的K值是:4

对应的轮廓系数是:0.5020981194788054

建立聚类标签,合并数据

cluster_labels = pd.DataFrame(cluster_labels_k, columns=['clusters'])

merge_data = pd.concat((raw_data,cluster_labels),axis=1)

查看各聚类标签信息

clustering_count = pd.DataFrame(merge_data['渠道代号'].groupby(merge_data['clusters']).count()).T.rename({'渠道代号': 'counts'}) # 计算每个聚类类别的样本量

clustering_ratio = (clustering_count / len(merge_data)).round(2).rename({'counts': 'percentage'}) # 计算每个聚类类别的样本量占比

print(clustering_count)

print("#"*30)

print(clustering_ratio)

out:

clusters 0 1 2 3

counts 349 313 154 73

##############################

clusters 0 1 2 3

percentage 0.39 0.35 0.17 0.08

各聚类中心主要特征提取:

cluster_features = [] # 空列表,用于存储最终合并后的所有特征信息

for line in range(best_k): # 读取每个类索引

label_data = merge_data[merge_data['clusters'] == line] # 获得特定类的数据

part1_data = label_data.iloc[:, 1:7] # 获得数值型数据特征

part1_desc = part1_data.describe().round(3) # 得到数值型特征的描述性统计信息

merge_data1 = part1_desc.iloc[2, :] # 得到数值型特征的均值

part2_data = label_data.iloc[:, 7:-1] # 获得字符串型数据特征

part2_desc = part2_data.describe(include='all') # 获得字符串型数据特征的描述性统计信息

merge_data2 = part2_desc.iloc[2, :] # 获得字符串型数据特征的最频繁值

merge_line = pd.concat((merge_data1, merge_data2), axis=0) # 将数值型和字符串型典型特征沿行合并

cluster_features.append(merge_line) # 将每个类别下的数据特征追加到列表

cluster_pd = pd.DataFrame(cluster_features).T # 将列表转化为矩阵

all_cluster_set = pd.concat((clustering_count, clustering_ratio, cluster_pd),axis=0) # 将每个聚类类别的所有信息合并

all_cluster_set

图形化输出

数据预处理

num_sets = cluster_pd.iloc[:6, :].T.astype(np.float64) # 获取要展示的数据

num_sets_max_min = scaler.fit_transform(num_sets) # 获得标准化后的数据

print(num_sets)

print('-'*60)

print(num_sets_max_min)

out:

日均UV 平均注册率 平均搜索量 访问深度 订单转化率 投放总时间

0 933.015 0.003 0.064 5.916 0.006 8.770

1 1390.013 0.003 0.152 1.168 0.017 8.199

2 2717.419 0.005 0.051 0.947 0.007 8.529

3 1904.371 0.003 0.106 0.943 0.009 8.217

------------------------------------------------------------

[[0.00000000e+00 0.00000000e+00 1.28712871e-01 1.00000000e+00

0.00000000e+00 1.00000000e+00]

[2.56106801e-01 0.00000000e+00 1.00000000e+00 4.52443193e-02

1.00000000e+00 0.00000000e+00]

[1.00000000e+00 1.00000000e+00 0.00000000e+00 8.04343455e-04

9.09090909e-02 5.77933450e-01]

[5.44358789e-01 0.00000000e+00 5.44554455e-01 0.00000000e+00

2.72727273e-01 3.15236427e-02]]

雷达图展示

fig = plt.figure(figsize=(6,6)) # 建立画布

ax = fig.add_subplot(111, polar=True)

labels = np.array(merge_data1.index)

cor_list = ['#FF0000', '#FF7400', '#009999', '#00CC00']

angles = np.linspace(0, 2 * np.pi, len(labels), endpoint=False)

angles = np.concatenate((angles, [angles[0]]))

for i in range(len(num_sets)): # 循环每个类别

data_tmp = num_sets_max_min[i, :] # 获得对应类数据

data = np.concatenate((data_tmp, [data_tmp[0]])) # 建立相同首尾字段以便于闭合

ax.plot(angles, data, 'o-', c=cor_list[i], label="第%d类渠道"%(i)) # 画线

ax.fill(angles, data,alpha=0.5)

ax.set_thetagrids(angles * 180 / np.pi, labels, fontproperties="SimHei") # 设置极坐标轴

ax.set_title("各聚类类别显著特征对比", fontproperties="SimHei") # 设置标题放置

ax.set_rlim(-0.2, 1.2) # 设置坐标轴尺度范围

plt.legend(loc="upper right" ,bbox_to_anchor=(1.2,1.0)) # 设置图例位置

以上就是本次分析所有代码内容,那么通过以上分析能得出怎样的结论呢?欢迎在评论区踊跃发言。扫描二维码获取更多内容

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值