【第十届“泰迪杯”数据挖掘挑战赛】C题:疫情背景下的周边游需求图谱分析 问题三方案及Python实现

简介: 第十届“泰迪杯”数据挖掘挑战赛C题的解决方案,专注于问题三“本地旅游图谱构建与分析”,介绍了基于OTA和UGC数据的旅游产品关联分析方法,使用支持度、置信度、提升度来计算关联度得分,并进行了结果可视化,同时指出了方案的改进方向。

1.png

相关链接

(1)问题一方案及实现博客介绍

(2)问题二方案及实现博客介绍

(3)问题三方案及实现博客介绍

代码下载

https://github.com/BetterBench/BetterBench-Shop

1 题目

完整的题目,请看第一篇文章

【第十届“泰迪杯”数据挖掘挑战赛】C题:疫情背景下的周边游需求图谱分析 问题一方案及Python实现

问题三:本地旅游图谱构建与分析

依据提供的 OTA、 UGC 数据,对问题 2 中提取出的旅游产品进行关联分析,找出以景区、酒店、餐饮等为核心的强关联模式,结果以表 的形式保存为文件“result3.csv”。在此基础上构建本地旅游图谱并选择合适方法进行可视化分析。鼓励参赛队挖掘旅游产品间隐含的关联模式并进行解释

2 思路方案

以支持度、置信度、提升度加权求和作为关联度得分

  • 其中,I表示总事务集。num()表示求事务集里特定项集出现的次数;
  • 比如,num(I)表示总事务集的个数;
  • num(X∪Y)表示含有{X,Y}的事务集的个数(个数也叫次数)。
  • 1.支持度(Support)
    • 支持度表示项集{X,Y}在总项集里出现的概率。公式为:
    • S u p p o r t ( X → Y ) = P ( X , Y ) / P ( I ) = P ( X ∪ Y ) / P ( I ) = n u m ( X U Y ) / n u m ( I ) Support(X→Y) = P(X,Y) / P(I) = P(X∪Y) / P(I) = num(XUY) / num(I) Support(X→Y)\=P(X,Y)/P(I)\=P(X∪Y)/P(I)\=num(XUY)/num(I)
  • 2.置信度 (Confidence)
    • 置信度表示在先决条件X发生的情况下,由关联规则”X→Y“推出Y的概率。即在含有X的项集中,含有Y的可能性,公式为:
    • C o n f i d e n c e ( X → Y ) = P ( Y ∣ X ) = P ( X , Y ) / P ( X ) = P ( X U Y ) / P ( X ) Confidence(X→Y) = P(Y|X) = P(X,Y) / P(X) = P(XUY) / P(X) Confidence(X→Y)\=P(Y∣X)\=P(X,Y)/P(X)\=P(XUY)/P(X)
  • 3.提升度(Lift)
    • 提升度表示含有X的条件下,同时含有Y的概率,与不含X的条件下却含Y的概率之比。
    • L i f t ( X → Y ) = P ( Y ∣ X ) / P ( Y ) Lift(X→Y) = P(Y|X) / P(Y) Lift(X→Y)\=P(Y∣X)/P(Y)

改进点:

我认为我仅仅提供的是一个Baseline,从数据到表,再到可视化的一个过程,仅仅是一个参考答案,并不是最终答案

改进的方向有很多,比如问题二中可以根据NER去提取旅游产品,问题三中可以采用krl(知识表示学习)、erl(实体识别与链接)、ere(实体关系抽取)、ede(实体检测与抽取)、ksq(知识存储与查询)、kr(知识推理)等知识体系去改进。让方案更高级,改进的才能增加获奖的可能

3 Python实现

import pandas as pd
import numpy as np
from collections import defaultdict
# 此csv文件来自第二问的代码,请下载第二问的代码和数据
data = pd.read_csv('./data/问题二所有数据汇总.csv')

3.1 计算支持度作为相关度

3.1 给样本集的旅游产品one-hot编码

key为旅游产品名称,value代表列

{'周黑鸭(东汇城店)': 0, '茂名文华酒店': 1, '旅游度假区': 2, '古郡水城': 3, '南三岛': 4, '红树林公园': 5, '信宜酒店': 6, '菠斯蒂蛋糕': 7}

则每个句子只要出现旅游产品,相应列则就编码为1。

    [[0 1 0 0 0 1 0 1]
     [0 1 0 1 1 0 0 0]
     [0 0 0 0 1 0 0 1]
     [0 0 1 0 1 1 1 0]
     [1 1 0 0 0 1 0 1]
     [0 1 1 0 0 1 0 1]]
# 给每个样本中的产品onehot编码
# 总共有438个产品,则初始化有438列的0,如果一个样本中存在“丰年面包店“和”功夫鸡排”两个产品,则438列中,这两列对应是1。
# 返回one-hot数组和产品字典编号字典
def create_one_hot(data):
    """将实体数据转换成:0,1数据类型,类似于词袋模型
    """
    。。。略
    请下载完整代码
    return out_array, feature_dict

3.2 计算支持度、置信度、提升度

# 计算支持度作为关联度,
def calculate(data_vector):
    """计算支持度,置信度,提升度
    """
    print('=' * 50)
    print('Calculating...')

    n_samples, n_features = data_vector.shape
    print('特征数: ', n_features)
    print('样本数: ', n_samples)

    support_dict = defaultdict(float)
    confidence_dict = defaultdict(float)
    lift_dict = defaultdict(float)

    # together_appear: {(0, 1): 3, (0, 3): 2, (0, 4): 1, (1, 0): 3, (1, 3): 2,...}
    # together_appear: 元组里的元素是特征的序号,后面的数字,是这两个特征同时出现的总次数
    together_appear_dict = defaultdict(int)

    # feature_num_dict:{0: 3, 1: 4, 2: 3,...}
    # feature_num_dict: key是特征的序号,后面的数字是这个特征出现的总次数
    feature_num_dict = defaultdict(int)

       。。。略
    请下载完整代码

    return support_dict, confidence_dict, lift_dict

3.3 将编码转为字符串


def convert_to_sample(feature_dict, s, c, l):
    """把0,1,2,3,... 等字母代表的feature,转换成实体
    """
    print('=' * 50)
    print('Start converting to the required sample format...')
    # print(feature_dict)
    feature_mirror_dict = dict()
    for k, v in feature_dict.items():
        feature_mirror_dict[v] = k
    # print(feature_mirror_dict)

    。。。略
    请下载完整代码
data_array, feature_di = create_one_hot(data)
support_di, confidence_di, lift_di = calculate(data_array)

support = sorted(support_di.items(), key=lambda x: x[1], reverse=True)
confidence = sorted(confidence_di.items(),
                    key=lambda x: x[1], reverse=True)
lift = sorted(lift_di.items(), key=lambda x: x[1], reverse=True)

support_li, confidence_li, lift_li = convert_to_sample(feature_di, support, confidence, lift)

2.png

3.4 计算关联度

support_df = pd.DataFrame(support_li,columns=['产品名称1','产品名称2','支持度'])
confidence_df = pd.DataFrame(confidence_li, columns=['产品名称1', '产品名称2', '置信度'])
lift_df = pd.DataFrame(lift_li, columns=['产品名称1', '产品名称2', '提升度'])

。。。略
请下载完整代码
del submit_3['支持度']
submit_3

3.png

3.5 生成result3.csv

map_dict ={}
for i,d in enumerate(feature_di):
    map_dict[d] = 'ID'+str(feature_di[d]+1)
map_dict

4.png

# 将名称转为ID
submit_3['产品1'] = submit_3['产品名称1'].map(map_dict)
submit_3['产品2'] = submit_3['产品名称2'].map(map_dict)
result3 = submit_3[['产品1', '产品2','关联度']]
result3

5.png

# 读取问题二的产品类型表,需要生成表3的关联类型
# # 此csv文件来自第二问的代码,请下载第二问的代码和数据https://mianbaoduo.com/o/bread/YpmYm5xy
result2_2 = pd.read_csv('./data/result2-2.csv')
p_k = result2_2['产品ID']
p_v = result2_2['产品类型']
p_type_dict  = dict(zip(p_k,p_v))
p_type_dict

6.png

result3['关联类型'] = p_type
result3.to_csv('./data/result3.csv',index=False)

7.png

3.6 可视化关联

import matplotlib.pyplot as plt
import networkx as nx
import pandas as pd

from spacy import displacy
G = nx.from_pandas_edgelist(submit_3[submit_3['关联度'] > 0], "产品名称1", "产品名称2",
                            edge_attr=True, create_using=nx.MultiDiGraph())

plt.figure(figsize=(12, 12))
pos = nx.spring_layout(G, k=0.5)  # k regulates the distance between nodes
nx.draw(G, with_labels=True, node_color='skyblue',
        node_size=1500, edge_cmap=plt.cm.Blues, pos=pos)

8.png

目录
相关文章
|
6天前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现智能食品消费模式分析的深度学习模型
使用Python实现智能食品消费模式分析的深度学习模型
97 70
|
27天前
|
数据采集 缓存 定位技术
网络延迟对Python爬虫速度的影响分析
网络延迟对Python爬虫速度的影响分析
|
2月前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
29天前
|
数据采集 存储 JSON
Python爬虫开发中的分析与方案制定
Python爬虫开发中的分析与方案制定
|
1月前
|
数据可视化 开发者 Python
Python GUI开发:Tkinter与PyQt的实战应用与对比分析
【10月更文挑战第26天】本文介绍了Python中两种常用的GUI工具包——Tkinter和PyQt。Tkinter内置于Python标准库,适合初学者快速上手,提供基本的GUI组件和方法。PyQt基于Qt库,功能强大且灵活,适用于创建复杂的GUI应用程序。通过实战示例和对比分析,帮助开发者选择合适的工具包以满足项目需求。
95 7
|
1月前
|
存储 数据处理 Python
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第27天】在科学计算和数据分析领域,Python凭借简洁的语法和强大的库支持广受欢迎。NumPy和SciPy作为Python科学计算的两大基石,提供了高效的数据处理和分析工具。NumPy的核心功能是N维数组对象(ndarray),支持高效的大型数据集操作;SciPy则在此基础上提供了线性代数、信号处理、优化和统计分析等多种科学计算工具。结合使用NumPy和SciPy,可以显著提升数据处理和分析的效率,使Python成为科学计算和数据分析的首选语言。
36 3
|
1月前
|
存储 机器学习/深度学习 算法
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第26天】NumPy和SciPy是Python科学计算领域的两大核心库。NumPy提供高效的多维数组对象和丰富的数学函数,而SciPy则在此基础上提供了更多高级的科学计算功能,如数值积分、优化和统计等。两者结合使Python在科学计算中具有极高的效率和广泛的应用。
52 2
|
2月前
|
数据采集 机器学习/深度学习 搜索推荐
Python自动化:关键词密度分析与搜索引擎优化
Python自动化:关键词密度分析与搜索引擎优化
|
2月前
|
数据可视化 算法 JavaScript
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
本文探讨了如何利用图论分析时间序列数据的平稳性和连通性。通过将时间序列数据转换为图结构,计算片段间的相似性,并构建连通图,可以揭示数据中的隐藏模式。文章介绍了平稳性的概念,提出了基于图的平稳性度量,并展示了图分区在可视化平稳性中的应用。此外,还模拟了不同平稳性和非平稳性程度的信号,分析了图度量的变化,为时间序列数据分析提供了新视角。
62 0
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
|
2月前
|
自然语言处理 算法 数据挖掘
探讨如何利用Python中的NLP工具,从被动收集到主动分析文本数据的过程
【10月更文挑战第11天】本文介绍了自然语言处理(NLP)在文本分析中的应用,从被动收集到主动分析的过程。通过Python代码示例,详细展示了文本预处理、特征提取、情感分析和主题建模等关键技术,帮助读者理解如何有效利用NLP工具进行文本数据分析。
52 2