在本案例中,我们使用人工智能技术的聚类算法去分析超市购物中心客户的一些基本数据,把客户分成不同的群体,供营销团队参考并相应地制定营销策略。
我们使用的数据集是超市用户会员卡的基本数据以及根据购物行为得出的消费指数,总共有5个字段,解释如下:
importosfrommodelarts.sessionimportSessionifnotos.path.exists('kmeans_customer_segmentation'):session=Session()session.download_data(bucket_path='modelarts-labs-bj4-v2/course/ai_in_action/2021/machine_learning/kmeans_customer_segmentation/kmeans_customer_segmentation.zip',path='./kmeans_customer_segmentation.zip')#使用tar命令解压资源包os.system('unzip./kmeans_customer_segmentation.zip')Successfullydownloadfilemodelarts-labs-bj4/course/ai_in_action/2021/machine_learning/kmeans_customer_segmentation/kmeans_customer_segmentation.zipfromOBStolocal./kmeans_customer_segmentation.zip2.导入工具库matplotlib和seaborn是Python绘图工具,pandas和numpy是矩阵运算工具。
此段代码只是引入Python包,无回显(代码执行输出)。
!pipinstallnumpy==1.16.0importnumpyasnp#linearalgebraimportpandasaspd#dataprocessing,CSVfileI/O(e.g.pd.read_csv)importmatplotlib.pyplotaspltimportseabornassnsfromsklearn.clusterimportKMeansimportwarningsimportoswarnings.filterwarnings("ignore")Requirementalreadysatisfied:numpy==1.16.0in/home/ma-user/anaconda3/envs/XGBoost-Sklearn/lib/python3.6/site-packages[33mYouareusingpipversion9.0.1,howeverversion21.1.3isavailable.Youshouldconsiderupgradingviathe'pipinstall--upgradepip'command.[0m3.数据读取使用pandas.read_excel(filepath)方法读取notebook中的数据文件。
df=pd.read_csv('./kmeans_customer_segmentation/data/Mall_Customers.csv')4.展示样本数据执行这段代码可以看到数据集的5个样本数据
df.head()
.dataframetbodytrth{vertical-align:top;}.dataframetheadth{text-align:right;}
执行这段代码可以看到数据集的维度
df.shape(200,5)5.展示各个字段的统计值信息调用pandas.DataFrame.describe方法,可以看到各个特征的统计信息,包括样本数、均值、标准差、最小值、1/4分位数、1/2分位数、3/4分位数和最大值。
df.describe()
pandas.DataFrame.dtypes()方法可以展示各个字段的类型信息。
可以看到每个字段的类型信息。
df.dtypesCustomerIDint64GenderobjectAgeint64AnnualIncome(k$)int64SpendingScore(1-100)int64dtype:object查看是否有数据缺失,如果有,则需要填补。
实验中使用的这份数据很完善,没有任何一个属性的值为null,因此统计下来,null值的数量都是0
df.isnull().sum()CustomerID0Gender0Age0AnnualIncome(k$)0SpendingScore(1-100)0dtype:int647.展示主要属性的数量分布这段代码使用matplotlib绘制了数据中三个主要属性的统计直方图,包含年龄、收入、消费指数。
可以看到三张统计直方图,形状都与正态分布类似,说明数据量足够,数据抽样的分布也比较理想。
可以看到一张条状图。
此段代码执行后,会有9张统计图,展示了任意两个属性之间的统计关系。
此段代码执行后,会有六幅boxplot图像。
我们使用1-10个聚类中心进行聚类。(此段代码无输出)
'''AgeandspendingScore'''X1=df[['Age','SpendingScore(1-100)']].iloc[:,:].valuesinertia=[]forninrange(1,11):algorithm=(KMeans(n_clusters=n,init='k-means++',n_init=10,max_iter=300,tol=0.0001,random_state=111,algorithm='elkan'))algorithm.fit(X1)inertia.append(algorithm.inertia_)观察10次聚类的inertias,并以如下折线图进行统计。
inertias是K-Means模型对象的属性,它作为没有真实分类结果标签下的非监督式评估指标。表示样本到最近的聚类中心的距离总和。值越小越好,越小表示样本在类间的分布越集中。
可以看到,当聚类中心大于等于4之后,inertias的变化幅度显著缩小了。
algorithm=(KMeans(n_clusters=4,init='k-means++',n_init=10,max_iter=300,tol=0.0001,random_state=111,algorithm='elkan'))algorithm.fit(X1)labels1=algorithm.labels_centroids1=algorithm.cluster_centers_我们把4个聚类中心的聚类结果,以下图进行展示。横坐标是年龄,纵坐标是消费指数,4个红点为4个聚类中心,4块不同颜色区域就是4个不同的用户群体。
'''AnnualIncomeandspendingScore'''X2=df[['AnnualIncome(k$)','SpendingScore(1-100)']].iloc[:,:].valuesinertia=[]forninrange(1,11):algorithm=(KMeans(n_clusters=n,init='k-means++',n_init=10,max_iter=300,tol=0.0001,random_state=111,algorithm='elkan'))algorithm.fit(X2)inertia.append(algorithm.inertia_)观察10次聚类的inertias,并以如下折线图进行统计。
可以看到,当聚类中心大于等于5之后,inertias的变化幅度显著缩小了。
algorithm=(KMeans(n_clusters=5,init='k-means++',n_init=10,max_iter=300,tol=0.0001,random_state=111,algorithm='elkan'))algorithm.fit(X2)labels2=algorithm.labels_centroids2=algorithm.cluster_centers_我们把5个聚类中心的聚类结果,以下图进行展示。横坐标是年收入,纵坐标是消费指数,5个红点为5个聚类中心,5块不同颜色区域就是5个不同的用户群体。