商品销售关联分析

导入相关库

import pandas as pd 
from mlxtend.frequent_patterns import apriori,association_rules
from mlxtend.preprocessing import TransactionEncoder

读取数据

#显示所有列
pd.set_option('display.max_columns',None)
#导入数据
f=r'D:\purchase.csv'
df=pd.read_csv(f,encoding='gbk')
print('The data size is ',df.shape)

在这里插入图片描述
一共53704行数据,12列信息
查看数据

df.head(5)

在这里插入图片描述
查看数据是否存在缺失

df.info()

在这里插入图片描述
无缺失数据

数据编码

按照交易号、商品大类对商品交易数量分组计数;之后使用unstack函数将数据从“花括号结构”变成“表格”结构并用reset_index还原索引重新变为默认索引;最后将空值用0进行填充,设置交易号为索引。

basket = (df
        .groupby(['交易号','商品大类'])['商品交易数量'].count()
        .unstack().reset_index().fillna(0).set_index('交易号'))
 basket.shape
 basket.head(5)       

结果如下:一共有595次交易,23个商品大类。
在这里插入图片描述
在这里插入图片描述
由于关联算法只接受0和1的值,所以我们要对大于等于1 的值转换为1,即购买了该商品;将小于等于0的值转换为0,即未购买该商品。定义好函数之后使用applymap()作用于DataFrame每一个元素。

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

basket_sets = basket.applymap(encode_units)
basket_sets.head()

在这里插入图片描述

使用算法进行关联运算

将数据导入频繁项集模型,设置最小支持度为“0.6”并使用原列名,对频繁项集进行支持度排序,并查看数据

frequent_itemsets = apriori(basket_sets,
             min_support=0.6,
             use_colnames=True,
             max_len=None)
print('frequent_itemsets num is:', len(frequent_itemsets))
frequent_itemsets.sort_values(by='support',
                             ascending=False,
                             inplace=True) 
frequent_itemsets.head(10)

在这里插入图片描述
总共有61个频繁项集,排名前10位的类目,有1-2个类目相关联,且两类目相关联的数据的子类目均为支持度前四的类目。可以将这些商品类目的位置摆放在一起,提高转化。

将得到的频繁项集数据导入关联规则模型,设置关联规则为“提升度”,最小值为“1”,对关联规则进行规则置信度排序,并查看数据

rules=association_rules(frequent_itemsets,metric='lift',min_threshold=1)
print('rules num is ',len(rules))
rules.sort_values(by='confidence',ascending=False,inplace=True)
rules.head(10)

在这里插入图片描述
关联规则有234项,前10项关联规则的置信度均达到0.99以上,平均提升度在1.4以上。

筛选出置信度>=0.95的关联规则,最后符合条件的规则有113个。

print('selected rule num is:',len(selected_rules))
selected_rules.head(10)

在这里插入图片描述
从数据中可以得到,(18,11)或(11,14)或(18,11,14)-> 15的置信度 > 0.99,而它们的提升度达到了1.468。
也就意味着,同时购买(18)、(11)和(14)中的两种或3种商品的人,很有可能再购买1.468份15,所以可以将他们组合一起出售。

### 使用MATLAB实现Apriori算法进行商品销售数据的关联规则挖掘 #### 准备工作 为了在 MATLAB 中应用 Apriori 算法,需先准备好交易记录的数据集。这些数据通常由多个事务组成,每个事务代表顾客购买的一组项目。 #### 加载并预处理数据 假设有一个名为 `transactions` 的矩阵表示各个购物篮中的物品列表: ```matlab % 假设 transactions 是一个 cell 数组,其中每一行是一个客户的购买清单 load('transaction_data.mat'); % 导入预先准备好的交易数据文件 disp(transactions); ``` #### 定义函数来计算支持度和置信度 创建辅助功能用于评估候选集合的支持度以及生成强关联规则: ```matlab function support = calculateSupport(itemset, transactions) count = sum(cellfun(@(t) issubset(itemset,t), transactions)); support = count / length(transactions); end function confidence = calculateConfidence(ruleAntecedent, ruleConsequent, transactions) antecedentCount = sum(cellfun(@(t) issubset(ruleAntecedent,t), transactions)); consequentGivenAntecedentCount = sum(arrayfun(@(idx) ... all(ismember(ruleAntecedent, transactions{idx}) & ismember(ruleConsequent, transactions{idx})), 1:length(transactions))); if antecedentCount ~= 0 confidence = consequentGivenAntecedentCount ./ antecedentCount; else confidence = 0; %#ok<CTSA> end end ``` #### 构建Apriori核心逻辑 编写主程序部分执行迭代过程直到不再找到新的频繁项集为止,并最终输出满足最小阈值条件的所有关联规则: ```matlab min_support_threshold = 0.5; % 设置最低支持度门限 min_confidence_threshold = 0.7; % 设置最低置信度门限 frequentItemsets = uniqueItemsInTransactions(transactions); % 初始化为单个项目的集合 L = frequentItemsets; while ~isempty(L) Ck_plus_1 = generateCandidateSets(L); % 根据当前层 L_k 生成下一层候选项集 C_(k+1) validCandidates = {}; for i=1:numel(Ck_plus_1) candidateSet = Ck_plus_1{i}; supp = calculateSupport(candidateSet, transactions); if supp >= min_support_threshold validCandidates{end+1} = candidateSet; end end L = validCandidates; frequentItemsets = [frequentItemsets ; L]; %#ok<AGROW> % 对于每一个新加入到频繁模式库里的 k-itemset, % 尝试从中提取出所有可能存在的 (k-1)-itemset 关联规则 extractAssociationRules(frequentItemsets(end,:),... min_confidence_threshold,... @calculateConfidence,... transactions); end ``` 上述代码片段展示了如何利用循环结构逐步扩展频繁项集直至无法再发现更多符合条件的新成员。对于每次更新后的频繁项集都会尝试抽取潜在有用的关联关系[^1]。 #### 提取关联规则 定义方法负责从给定的大规模频繁项集中挑选出那些具有足够高可信性的规则组合: ```matlab function extractAssociationRules(largeFrequentItemset,minConfidenceThreshold,... confCalculationFunc,transactions) n_items = numel(largeFrequentItemset); for r=2:n_items combinations = combnk(1:n_items,r); for c=1:size(combinations,1) antecedentsIdx = combinations(c,:); consequentsIdx = setdiff(1:n_items,antecedentsIdx); antecedents = largeFrequentItemset(antecedentsIdx); consequents = largeFrequentItemset(consequentsIdx); conf = feval(confCalculationFunc,antecedents,consequents,transactions); if conf>=minConfidenceThreshold fprintf('Rule: {%s} -> {%s}, Confidence=%.4f\n',... strjoin(mat2cell(num2str(antecedents'),ones(size(antecedents))),', '),... strjoin(mat2cell(num2str(consequents'),ones(size(consequents))),', '),conf); end end end end ``` 这段脚本会遍历大型频繁项集内的每一对子集作为前提与结论来进行测试,只有当其对应的置信水平超过了设定标准才会被正式采纳成为有效的商业洞察依据[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值