利用Apr算法做关联性分析:以对公众号推送的文章类型组合做出优化

本文主要是介绍利用Apr算法做关联性分析:以对公众号推送的文章类型组合做出优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

1.订阅号推送一条图文消息时可一次性组合推送最多8篇文章,如下图,其中1篇头条和最多7篇次条。

2.在推送文章时,需要考虑到文章类型的多样性,因此,每天的推送排版,都要考虑不同的文章类型之间的契合性。要是陈列不当,次条的阅读量就很惨淡。当然,要是选择恰当,头条和次条就能相互促进,而且,头条一般都是确定的,主要是次条文章的挑选。

目的

那针对不同类型的头条文章,应该怎么罗列订阅号的“次条”比较好呢?或者,换句话说,读者可能会同时喜欢看什么类型的内容呢?

通过对用户阅读行为的关联分析,了解顾客的阅读习惯,找出强关联规则,从而为订阅号每日推文的组合提供参考。

获取数据

数据来源:公众号用户访问数据.csv

用户编号文章类别阅读数看一看点赞赞赏被转载访问日期
1数据分析2005112032406806012020/9/21
2数据分析116905841519462332020/9/17
3数据分析5720400572452282020/9/2
4数据分析2250211253150459002020/9/24
5数据分析112015601344894482020/9/8

......

98pandas7454521819292232020/9/20
98pandas7587379910221512020/9/20
99数据分析121798521217484872020/9/23
99pandas117155851288463512020/9/23
99matplotlib115426921269112302020/9/23


数据处理

1.读入数据,创建DataFrame对象

import pandas as pdfileinfo_df = pd.read_csv('./公众号用户访问数据.csv',encoding='gbk')

2.查看数据

fileinfo_df.describe()#查看数据集基本概况
fileinfo_df[fileinfo_df.duplicated()]#查看重复数据

describe结果:

duplicated结果:

由结果可见,无重复数据。

3.数据提取

#提取后续分析可能用到的数据列
extract_data_df = fileinfo_df[['用户编号','访问时间','文章类别']]

4.数据清洗

异常值/空值处理。

因刚已查看源文件数据中并不存在异常值和空值,所以此处跳过。

5.数据整理

但我们要分析的是用户所阅读过的文章类型,故在接下来的分析中,我们需要将同一用户在同一天阅读的相同文章类型进行合并为一条,故本次对提取后的数据,即extract_data_df进行数据去重即可。

首先,查看是否存在重复行数据

extract_data_df[extract_data_df.duplicate()]#查看重复数据

查看结果:

 

 存在重复行,需去重

extract_data_df = extract_data_df.drop_duplicates()#去除重复行

另外,为了后续方便分析,还需要将同一用户在同一天阅读的所有文章类型进行合并到一个列表当中。

#定义函数,将原“文章类型”数据转换为列表类型,便于数据合并 
def tran_list(data):if str(data)[0] == '[' :return datareturn [data]#将文章类别数据由字符串转换为列表
extract_data_df['文章类别'] = extract_data_df['文章类别'].agg(tran_list)#将同一用户在同一天内所阅读过的文章类别进行合并
extract_data_df = extract_data_df.groupby(['用户编号','访问日期']).sum()#查看合并后的数据,尾部10行
extract_data_df.tail(10)

合并后数据:

补充:若不事先对“文章类别”数据做列表类型转换的话,直接合并后的结果会是以下这样的,合并后数据无间隔,不利于后续分析使用。

分析

1.最小支持度设定

最小支持度的设定一般是根据业务经验来预设或调整,本次案例,考虑一个用户每月至少3次阅读,9月有30天,且总数据只有99条,那么,我们可以暂且将支持度设定为:3/30/99≈0.1

2.最小置信度设定

最小置信度同样也是需要根据经验来设定,本次我们先预设最小置信度为0,先观察产出的关联规则数量之后再做调整。

3.建模

#提取文章类型数据
extract_type_df = extract_data_df['文章类型']
#导入APR算法模块
from apyori import apriori as apr
#配置参数,最小支持度min_support=0.1 ,最小置信度min_confidence=0
results = apr.extract_type_df(extract_type_df,min_support = 0.1, min_confidence = 0)
#查看算法产出结果
for result in results:# 获取支持度,并保留3位小数support = round(result.support, 3)# 遍历ordered_statistics对象for rule in result.ordered_statistics:# 获取前件和后件并转成列表head_set = list(rule.items_base)tail_set = list(rule.items_add)# 跳过前件为空的数据if head_set == []:continue# 将前件、后件拼接成关联规则的形式related_catogory = str(head_set)+'→'+str(tail_set)# 提取置信度,并保留3位小数confidence = round(rule.confidence, 3)# 提取提升度,并保留3位小数lift = round(rule.lift, 3)# 查看强关联规则,支持度,置信度,提升度print(related_catogory, support, confidence, lift)

结果展示:

在使用默认最小置信度为0的情况下,我们一共筛选出了10 条关联规则。下一步,就要根据我们自己的实际情况,确定一个合适的最小置信度,选出强关联规则。

为此,我单独提取了这 10 条关联规则的置信度,并查看了它们的描述性统计信息,数值情况如下:

# 提取关联规则的置信度
confidences = [0.233, 1.0, 0.744, 0.395, 0.326, 0.452, 1.0, 0.222, 0.235, 0.613]
# 查看置信度的描述性统计信息
s = pd.Series(confidences).describe()

最小值为0.2,最大值为1.0,极值相差较大;另外,业务需求来讲,10条规则未免过多,实际只需要6条即可,故我们重新将最小置信度参数confidence调整为0.3 后再次进行关联规则的产出,并且将产出结果转换为DataFrame以支持度进行排序,便于后续分析:

# 执行Apriori 算法
results = apr(extract_type_df['文章类别'], min_support=0.1, min_confidence=0.3)
# 创建列表
extract_result = []for result in results:# 获取支持度,并保留3位小数support = round(result.support, 3)# 遍历ordered_statistics对象for rule in result.ordered_statistics:# 获取前件和后件并转成列表head_set = list(rule.items_base)tail_set = list(rule.items_add)# 跳过前件为空的数据if head_set == []:continue# 将前件、后件拼接成关联规则的形式related_catogory = str(head_set)+'→'+str(tail_set)# 提取置信度,并保留3位小数confidence = round(rule.confidence, 3)# 提取提升度,并保留3位小数lift = round(rule.lift, 3)# 将提取的数据保存到提取列表中extract_result.append([related_catogory, support, confidence, lift])
# 将数据转成 DataFrame 的形式
rules_data = pd.DataFrame(extract_result, columns=['关联规则', '支持度', '置信度', '提升度'])# 将数据按照“支持度”排序
sorted_by_support = rules_data.sort_values(by='支持度')
# 查看排序后的数据
sorted_by_support

产出结果为:

关系是促进还是抑制,关键是要看它们的提升度

本次筛选出来的强关联规则提升度大于 1(促进)和小于 1(抑制)的都有,但它们的指导作用是截然相反的,将数据分开来分析是一个明智的选择。

故将提升度>1的规则我们进行单独提取:

# 提取出提升度大于1的数据,并重置数据的索引
promoted_rules = sorted_by_support[sorted_by_support['提升度'] > 1].reset_index(drop=True)
promoted_rules

提取结果为:

由此可知,有促进作用的关联规则一共有 4 个,其中“爬虫”和“Python”互为促进关系,阅读“sql”文章的用户更有可能阅读“Python”文章,喜欢阅读“pandas”文章的读者大概率也会喜欢阅读“数据分析”。

数据可视化展现

1.关联规则的支持度与置信度,促进关系时(即提升度>1)的柱状图绘制

# 功能:绘制提升度大于 1 的强关联规则柱状图
#导入模块
import matplotlib.pyplot as plt
import warnings
# 设置画布尺寸
plt.figure(figsize=(20, 8))
# 设置横纵坐标以及柱子的宽度
width = 0.2
# 画出柱状图
plt.bar(promoted_rules.index-width/2, promoted_rules['支持度'], width=width)
plt.bar(promoted_rules.index+width/2, promoted_rules['置信度'], width=width)
# 设置图例
plt.legend(['支持度', '置信度'], fontsize=20)
# 设置标题
plt.title('促进关系的关联规则的支持度、置信度', fontsize=25)
# 设置刻度名称
plt.xticks(promoted_rules.index, promoted_rules['关联规则'], fontsize=15)
# 设置坐标轴标签
plt.xlabel('关联规则', fontsize=20)
plt.ylabel('数值', fontsize=20)

2.1.关联规则的支持度与置信度,抑制关系时(即提升度<1)的柱状图绘制

# 提取出提升度小于1的数据,并重置数据的索引
restricted_rules = sorted_by_support[sorted_by_support['提升度'] < 1].reset_index(drop=True)
restricted_rules
# 功能:绘制提升度小于 1 的强关联规则柱状图
# 设置画布尺寸
plt.figure(figsize=(20, 8))
# 画出柱状图
plt.bar(restricted_rules.index-width/2, restricted_rules['支持度'], width=width)
plt.bar(restricted_rules.index+width/2, restricted_rules['置信度'], width=width)
# 设置图例
plt.legend(['支持度', '置信度'], fontsize=20)
# 设置标题
plt.title('抑制关系的关联规则的支持度、置信度', fontsize=25)
# 设置刻度名称
plt.xticks(restricted_rules.index, restricted_rules['关联规则'], fontsize=15)
# 设置坐标轴标签
plt.xlabel('关联规则', fontsize=20)
plt.ylabel('数值', fontsize=20)

分析结论

基于这两份结果和公众号的排版需求,现在我们可以提出以下3条建议:

1)当“头条”文章是介绍有关“Sql”的内容时,不妨考虑搭配“python”的“次条”(置信度1,提升度1.04)。
2)当“爬虫”类文章成为“头条”时,可以提高“Python”(置信度0.452,提升度1.04)、降低“数据分析”的“次条”排布(置信度0.613,提升度0.749)。
3)阅读“pandas”的用户大概率也喜欢“数据分析”,可在文章末尾,添加“数据分析”相关的拓展链接,提升阅读量(置信度1,提升度1.222)。

这篇关于利用Apr算法做关联性分析:以对公众号推送的文章类型组合做出优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/405029

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

hdu4869(逆元+求组合数)

//输入n,m,n表示翻牌的次数,m表示牌的数目,求经过n次操作后共有几种状态#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#includ

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig