数据分析实战 | 关联规则分析——购物车分析

news2024/11/23 13:15:44

目录

一、数据及分析对象

二、目的及分析任务

三、方法及工具

四、数据读入

五、数据理解

六、数据预处理

七、生成频繁项集

八、计算关联度

九、可视化


一、数据及分析对象

数据集链接:Online Retail.xlsx

该数据集记录了2010年12月01日至2011年12月09日的541909条在线交际记录,包含以下8个属性:

(1)InvoiceNo:订单编号,由6位整数表示,退货单号由字母“C”开头;

(2)StockCode:产品编号,每个不同的产品由不重复的5位整数表示;

(3)Description:产品描述;

(4)Quantity:产品数量,每笔交易的每件产品的数量;

(5)InvoiceDate:订单日期和时间,表示生成每笔交易的日期和时间;

(6)UnitPrice:单价,每件产品的英镑价格;

(7)CustomerID:顾客编号,每位客户由唯一的5位整数表示;

(8)Country:国家名称,每位客户所在国家/地区的名称。

二、目的及分析任务

理解Apriori算法的具体应用

(1)计算最小支持度为0.07的德国客户购买产品的频繁项集。

(2)计算最小置信度为0.8且提升度不小于2的德国客户购买产品的关联关系。

三、方法及工具

能够实现Aprior算法的Python第三方工具包有mlxtend、kiwi-apriori、apyori、apriori_python、efficient-apriori等,比较常用的是mlxtend、apriori_python、efficient-apriori,本项目采用的是mlxtend包。

四、数据读入

import pandas as pd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
df_Retails=pd.read_excel("C:\\Users\\LEGION\\AppData\\Local\\Temp\\360zip$Temp\\360$0\\Online Retail.xlsx")
df_Retails.head()

五、数据理解

 调用shape属性查看数据框df_Retails的形状。

df_Retails.shape

 查看列名称

df_Retails.columns
Index(['InvoiceNo', 'StockCode', 'Description', 'Quantity', 'InvoiceDate',
       'UnitPrice', 'CustomerID', 'Country'],
      dtype='object')

 对数据框df_Retails进行探索性分析。

df_Retails.describe()

其中,count、mean、std、min、25%、50%、75%和max的含义分别为个数、均值、标准差、最小值、上四分位数、中位数、下四分位数和最大值。

除了describe()方法,还可以调用info()方法查看样本数据的相关信息概览:

df_Retails.info()

从输出结果可以看出,数据框df_Retails的Description和CustomerID两列有缺失值。

看国家一列:

df_Retails.Country.unique()
array(['United Kingdom', 'France', 'Australia', 'Netherlands', 'Germany',
       'Norway', 'EIRE', 'Switzerland', 'Spain', 'Poland', 'Portugal',
       'Italy', 'Belgium', 'Lithuania', 'Japan', 'Iceland',
       'Channel Islands', 'Denmark', 'Cyprus', 'Sweden', 'Austria',
       'Israel', 'Finland', 'Bahrain', 'Greece', 'Hong Kong', 'Singapore',
       'Lebanon', 'United Arab Emirates', 'Saudi Arabia',
       'Czech Republic', 'Canada', 'Unspecified', 'Brazil', 'USA',
       'European Community', 'Malta', 'RSA'], dtype=object)
df_Retails["Country"].unique()
array(['United Kingdom', 'France', 'Australia', 'Netherlands', 'Germany',
       'Norway', 'EIRE', 'Switzerland', 'Spain', 'Poland', 'Portugal',
       'Italy', 'Belgium', 'Lithuania', 'Japan', 'Iceland',
       'Channel Islands', 'Denmark', 'Cyprus', 'Sweden', 'Austria',
       'Israel', 'Finland', 'Bahrain', 'Greece', 'Hong Kong', 'Singapore',
       'Lebanon', 'United Arab Emirates', 'Saudi Arabia',
       'Czech Republic', 'Canada', 'Unspecified', 'Brazil', 'USA',
       'European Community', 'Malta', 'RSA'], dtype=object)

 查看各国家的购物数量:

df_Retails["Country"].value_counts()
United Kingdom          495478
Germany                   9495
France                    8557
EIRE                      8196
Spain                     2533
Netherlands               2371
Belgium                   2069
Switzerland               2002
Portugal                  1519
Australia                 1259
Norway                    1086
Italy                      803
Channel Islands            758
Finland                    695
Cyprus                     622
Sweden                     462
Unspecified                446
Austria                    401
Denmark                    389
Japan                      358
Poland                     341
Israel                     297
USA                        291
Hong Kong                  288
Singapore                  229
Iceland                    182
Canada                     151
Greece                     146
Malta                      127
United Arab Emirates        68
European Community          61
RSA                         58
Lebanon                     45
Lithuania                   35
Brazil                      32
Czech Republic              30
Bahrain                     19
Saudi Arabia                10
Name: Country, dtype: int64

可以看出,英国的客户购买商品数量最多,为495478条记录,其次是德国的客户,为9495条记录。

查看订单编号(InvoiceNo)一列中是否有重复的值。

df_Retails.duplicated(subset=["InvoiceNo"]).any()
True

 订单编号有重复表示同一个订单中有多个同时购买的产品,符合Apriori算法的数据要求。

六、数据预处理

查看数据中是否有缺失值。

df_Retails.isna().sum()
InvoiceNo           0
StockCode           0
Description      1454
Quantity            0
InvoiceDate         0
UnitPrice           0
CustomerID     135080
Country             0
dtype: int64

可以看出,Description的缺失值有1454条,CustomerID的缺失值有135080条。

将商品名称(Description)一列的字符串头尾的空白字符删除:

df_Retails['Description']=df_Retails['Description'].str.strip()

再次查看数据集形状;

df_Retails.shape
(541909, 8)

 查看商品名称(Description)一列的缺失值个数:

df_Retails['Description'].isna().sum()
1455

在对商品名称(Description)一列进行空白字符处理后,缺失值增加了一个。去除所有的缺失值:

df_Retails.dropna(axis=0,subset=['Description'],inplace=True)

再次查看数据集形状:

df_Retails.shape
(540454, 8)

 检查此时的数据集是否还有缺失值:

df_Retails['Description'].isna().sum()
0

可以看出,数据框df_Retails中商品名称(Description)一列的缺失值已全部删除。

由于退货的订单由字母“C”开头,删除含有C字母的已取消订单:

df_Retails['InvoiceNo']=df_Retails['InvoiceNo'].astype('str')
df_Retails=df_Retails[~df_Retails['InvoiceNo'].str.contains('C')]
df_Retails.shape
(531166, 8)

将数据改为每一行一条记录,并考虑到内存限制以及德国(Germany)的购物数量位居第二,因此在本项目中只计算德国客户购买的商品的频繁项集及关联规则,全部计算则计算量太大。

df_ShoppingCarts=(df_Retails[df_Retails['Country']=="Germany"].groupby(['InvoiceNo','Description'])['Quantity'].sum().unstack()
                 .reset_index().fillna(0).set_index('InvoiceNo'))
df_ShoppingCarts.shape
(457, 1695)
df_ShoppingCarts.head()

德国的购物记录共有457条,共包含1695件不同的商品。

查看订单编号(InvoiceNo)一列是否有重复的值:

df_Retails.duplicated(subset=["InvoiceNo"]).any()
True

订单编号有重复表示同一个订单中有多个同时购买的产品,符合Apriori算法的数据要求。由于apriori方法中df参数允许的值为0/1或True/False,在此将这些项在数据框中转换为0/1形式,即转换为模型可接受格式的数据即可进行频繁项集和关联度的计算。

def encode_units(x):
    if x<=0:
        return 0
    if x>=1:
        return 1

df_ShoppingCarts_sets=df_ShoppingCarts.applymap(encode_units)

七、生成频繁项集

mlxtend.frequnet_patterns的apriori()方法可进行频繁项集的计算,将最小支持度设定为0.07:

df_Frequent_Itemsets=apriori(df_ShoppingCarts_sets,min_support=0.07,use_colnames=True)
df_Frequent_Itemsets

 

 查看数据框df_Frequent_Itemsets的形状:

df_Frequent_Itemsets.shape
(39, 2)

 可以看出,满足最小支持度0.07的频繁项集有39个。

八、计算关联度

将提升度(lift)作为度量计算关联规则,并设置阈值为1,表示计算具有正相关关系的关联规则。该任务由mlxtend.frequent_patterns的association_rules()方法实现:

df_AssociationRules=association_rules(df_Frequent_Itemsets,metric="lift",min_threshold=1)
df_AssociationRules

 

从结果可以看出各项关联规则的详细信息。

以第一条关联规则为{6 RIBBONS RUSTIC CHARM}—>{POSTAGE}为例,{6 RIBBONS RUSTIC CHARM}的支持度为0.102845,{POSTAGE}的支持度为0.818381,项集{{6 RIBBONS RUSTIC CHARM,POSTAGE}的支持度为0.091904,客户购买6 RIBBONS RUSTIC CHARM的同时也购买POSTAGE的置信度为0.893617,提升度为1.091933,规则杠杆率(即当6 RIBBONS RUSTIC CHARM和POSTAGE一起出现的次数比预期多)为0.007738,规则确信度(与提升度类似,但用差值表示,确信度越大则6 RIBBONS RUSTIC CHARM和POSTAGE关联关系越强)为1.707221。

查看数据框df_AssocaitionRules的形状:

df_AssociationRules.shape
(34, 10)

 可以看出,总共输出了34条关联规则。接着筛选提升度不小于2且置信度不小于0.8的关联规则:

df_A=df_AssociationRules[(df_AssociationRules['lift']>2)&(df_AssociationRules['confidence']>=0.8)]
df_A

由此可知,提升度不小于2且满足最小置信度0.8的强关联规则有两条,分别为:{ROUND SNACK BOXES SET OF 4 FRUITS}—>{ROUND SNACK BOXES SET OF4 WOODLAND}和{POSTAGE, ROUND SNACK BOXES SET OF 4 FRUITS}—>{ROUND SNACK BOXES SET OF4 WOODLAND}。

九、可视化

绘制出提升度不小于1的关联规则的散点图,横坐标设置为支持度,纵坐标为置信度,散点的大小表示提升度。该可视化任务由matplotlib.pyplot的scatter函数实现:

import matplotlib.pyplot as plt

#将点的大小放大20倍
plt.scatter(x=df_AssociationRules['support'],y=df_AssociationRules['confidence'],s=df_AssociationRules['lift']*20) 

plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1174361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深蓝学院】手写VIO第8章--相机与IMU时间戳同步--作业

0. 题目 1. T1 逆深度参数化时的特征匀速模型的重投影误差 参考常鑫助教的答案&#xff1a;思路是将i时刻的观测投到world系&#xff0c;再用j时刻pose和外参投到j时刻camera坐标系下&#xff0c;归一化得到预测的二维坐标&#xff08;这里忽略了camera的内参&#xff0c;逆深…

力扣刷题之优先队列

前言&#xff1a;优先队列底层是由大根堆或小根堆数据结构实现的。 前K个高频元素 347. 前 K 个高频元素 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: …

基于LDA主题+协同过滤+矩阵分解算法的智能电影推荐系统——机器学习算法应用(含python、JavaScript工程源码)+MovieLens数据集(四)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据爬取及处理2. 模型训练及保存3. 接口实现4. 收集数据5. 界面设计 系统测试相关其它博客工程源代码下载其它资料下载 前言 前段时间&#xff0c;博主分享过关于一篇使用协同过滤算法进行智能电影推荐系统的博…

CCF-CSP真题《202305-5 闪耀巡航》思路+python,c++满分题解

想查看其他题的真题及题解的同学可以前往查看&#xff1a;CCF-CSP真题附题解大全 试题编号&#xff1a;202305-5试题名称&#xff1a;闪耀巡航时间限制&#xff1a;5.0s内存限制&#xff1a;512.0MB问题描述&#xff1a; 问题描述 西西艾弗岛旅游公司最近推出了一系列环绕西西艾…

周报4_YMK

FlashAttention 硬件知识 以 A100 (40GB HBM) 为例&#xff0c;下面显示其内存层次结构的粗略图。SRAM内存分布在108个流式多处理器(SMs)上&#xff0c;每个处理器192KB。片上SRAM比HBM快得多&#xff0c;但比HBM小得多&#xff0c;在计算方面&#xff0c;使用Tensor Core的B…

【ARFoundation学习笔记】ARFoundation基础(上)

写在前面的话 本系列笔记旨在记录作者在学习Unity中的AR开发过程中需要记录的问题和知识点。难免出现纰漏&#xff0c;更多详细内容请阅读原文。 本文从原文第二章开始 文章目录 ARFoundation的体系Subsystem的使用跟踪子系统 ARSession & AR Session OriginARSessionARSe…

多目标优化中的“latent action”是什么?

2020 NeurIPS 中的“latent action”&#xff1a; Our model defines latent action as a boundary that splits the region represented by a node into a high-performing and a low performing region. 这里的latent action代表一个边界&#xff08;分类器&#xff09;&…

4 网络基础知识

1、 ifconfig&#xff1a; 1.Windows&#xff1a;ipconfig 2.Linux&#xff1a;ifconfigip addr2、 ifconfig 和 ip addr 的区别&#xff1f; 问题&#xff1a;假设你登录进入一个被裁剪过的非常小的 Linux 系统中&#xff0c;发现既没有 ifconfig 命令&#xff0c;也没有 ip…

CCF-CSP真题《202309-2 坐标变换(其二)》思路+python,c++满分题解

想查看其他题的真题及题解的同学可以前往查看&#xff1a;CCF-CSP真题附题解大全 试题编号&#xff1a;202309-2试题名称&#xff1a;坐标变换&#xff08;其二&#xff09;时间限制&#xff1a;2.0s内存限制&#xff1a;512.0MB问题描述&#xff1a; 问题描述 对于平面直角坐标…

【Mybatis小白从0到90%精讲】13: Mybatis sql片段,重用SQL的利器!

文章目录 前言SQL片段语句常见应用场景1. select 列字段2. where条件前言 代码复用是优秀程序员的标志之一,它能够减少代码冗余,提高代码可读性和可维护性。 在MyBatis开发中,Mapper中经常会有一些类似的SQL,如果每个语句都单独编写,会使代码冗长且难以维护。 MyBatis提…

Magics测量两个圆形中心点距离的方法

摘要&#xff1a;本文介绍如何使用magics测量两个圆孔之间的距离。 问题来源&#xff1a;3D模型打开后&#xff0c;两个圆孔中心点之间的间距测量无法直接通过测距实现&#xff0c;需要进行一些小小的设置才行。 工具选择“量尺”&#xff0c;如果不设置的话&#xff0c;它会默…

有关我自贡大盐商身世的两篇文章(一)

重游高坑岩瀑布随笔 都市噪杂喧嚣的生活&#xff0c;终于将我暂时逼离网络&#xff0c;决意出游数日&#xff0c;去山里寻找我向往的那些足以鼓舞人斗志的壮观瀑布&#xff0c;并试图从中领受它们那出自天然的&#xff0c;万马奔腾、猛烈撞击、拚抢速度、渲泄激情、永不妥协、…

【数据结构】树与二叉树(一):树(森林)的基本概念:父亲、儿子、兄弟、后裔、祖先、度、叶子结点、分支结点、结点的层数、路径、路径长度、结点的深度、树的深度

文章目录 5.1 树的基本概念5.1.1 树的定义树有序树、无序树 5.1.2 森林的定义5.1.3 树的术语1. 父亲&#xff08;parent&#xff09;、儿子&#xff08;child&#xff09;、兄弟&#xff08;sibling&#xff09;、后裔&#xff08;descendant&#xff09;、祖先&#xff08;anc…

【软件测试】工作内容

测试工程师工作&#xff1a; 阶段&#xff1a;编写测试计划测试用例、测试缺陷报告并执行测试用例&#xff1b;搭建Windows测试环境熟练&#xff1b;使用Bugzilla 提交软件缺陷报告 使用测试技术及工具&#xff1a;白盒测试黑盒测试 Loadrunner、Winrunner 能够运用边界值、等…

go-sync-mutex

Sync ​ Go 语言作为一个原生支持用户态进程&#xff08;Goroutine&#xff09;的语言&#xff0c;当提到并发编程、多线程编程时&#xff0c;往往都离不开锁这一概念。锁是一种并发编程中的同步原语&#xff08;Synchronization Primitives&#xff09;&#xff0c;它能保证多…

【CMake】15分钟带你入门CMake

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

[黑马程序员SpringBoot2]——运维实用篇

目录&#xff1a; 工程打包与运行打包插件Boot工程快速启动&#xff08;Linux版本&#xff09;临时属性配置文件4级分类自定义配置文件多环境开发(yaml版)多环境开发多文件版&#xff08;yaml版&#xff09;多环境开发多文件版&#xff08;properties版&#xff09;多环境分组…

基于AOSP源码Android-10.0.0_r41分支编译,framework开发,修改系统默认字体大小

文章目录 基于AOSP源码Android-10.0.0_r41分支编译&#xff0c;framework开发&#xff0c;修改系统默认字体大小 基于AOSP源码Android-10.0.0_r41分支编译&#xff0c;framework开发&#xff0c;修改系统默认字体大小 主要修改一个地方就行 代码源码路径 frameworks/base/co…

直流无刷电机(BLDC)六步换相驱动

直流无刷电机&#xff08;BLDC&#xff09;六步换相驱动 文章目录 直流无刷电机&#xff08;BLDC&#xff09;六步换相驱动1. 前言2. 六步换相原理3. 电角度与机械角度4. 动手实践4.1 霍尔输出表测量4.2 换向控制4.3 代码编写 5. 总结 1. 前言 直流无刷电机相对直流有刷电机具…

AOE性能调优问题案例

AOE&#xff08;Ascend Optimization Engine&#xff09;是一款自动性能调优工具&#xff0c;目的是为了充分利用有限的硬件资源&#xff0c;满足算子和整网的性能要求。 本期就分享几个关于AOE性能调优问题的典型案例&#xff0c;并给出原因分析及解决方法。 调优过程中进程…