[第10回「テディカップ」データマイニングチャレンジ]質問C:エピデミックを背景に旅行需要を取り巻くためのグラフ分析問題の3つのスキームとPython実装

ここに画像の説明を挿入

関連リンク

(1)問題1の解決策と実装ブログの紹介

(2)問題2のスキームと実装ブログの紹介

(3)問題3のスキームと実装ブログの紹介

(4)質問4、コードとスキームは4月26日にリリースされました

コードのダウンロード

(1)質問1の完全なコードのダウンロード

(2)質問2の完全なコードとソリューションをダウンロードします

(3)問題の第3世代の完全なプログラムとコードのダウンロード

次のコードは不完全です。完全なコードをダウンロードしてください

(4)質問4、コードとスキームは4月26日にリリースされました

1トピック

完全なタイトルについては、最初の記事を参照してください

[第10回「テディカップ」データマイニングチャレンジ]質問C:エピデミック1スキームとPython実装を背景にした周辺ツアー需要の地図分析問題

質問3:地元の観光地図の作成と分析

提供されたOTAおよびUGCデータに基づいて、質問2で抽出された観光商品の相関分析を実行し、景勝地、ホテル、レストランなどを中心とした強い相関モードを見つけ、結果を次の形式で保存します。ファイル「result3.csv」としてのテーブル。これに基づいて、地元の観光地図が作成され、視覚的な分析のために適切な方法が選択されます。観光商品間の暗黙の関連パターンを発見して説明するようにチームを奨励する

2つのアイデア

サポート、信頼、リフトの加重和を関連性スコアとして使用します

  • その中で、私はトランザクションセット全体を表します。num()は、トランザクションセット内の特定のアイテムセットの出現回数を示します。
  • たとえば、num(I)はトランザクションセットの総数を表します。
  • num(X∪Y)は、{X、Y}を含むトランザクションセットの数を表します(この数は、回数とも呼ばれます)。
  • 1.サポート
    • サポート度は、アイテムセット{X、Y}がアイテムセット全体に表示される確率を表します。式は次のとおりです。
    • サポート(X→Y)= P(X、Y)/ P(I)= P(X∪Y)/ P(I)= num(XUY)/ num(I)サポート(X→Y)= P( X、Y)/ P(I)= P(X∪Y)/ P(I)= num(XUY)/ num(I)S u p p o r t XY =P X Y / P I =P XY / P I =n u m X U Y / n u m I
  • 2.自信
    • 信頼度は、前提条件Xが発生したときに、Yが相関ルール「X→Y」によって推測される確率を表します。つまり、Xを含むアイテムセットでは、Yを含む可能性があり、式は次のようになります。
    • 信頼度(X→Y)= P(Y∣X)= P(X、Y)/ P(X)= P(XUY)/ P(X)信頼度(X→Y)= P(Y | X)= P(X、Y)/ P(X)= P(XUY)/ P(X)C o n f i d e n c e XY =P Y∣X _ _=P X Y / P X =P X U Y / P X
  • 3.リフト(リフト)
    • リフトとは、Xを含む条件でYを含む確率と、Xを含まない条件でYを含む確率の比率を指します。
    • L ift(X→Y)= P(Y∣X)/ P(Y)Lift(X→Y)= P(Y | X)/ P(Y)L i f t XY =P Y∣X / P Y _ _

改善点:

私が提供しているのはベースライン、つまりデータからテーブル、視覚化までのプロセスであり、最終的な答えではなく、単なる参照の答えだと思います。

改善の方向性はたくさんあります。たとえば、質問2では、観光商品をNERに従って抽出できます。質問3では、krl(知識表現学習)、erl(エンティティの認識とリンク)、ere(エンティティの関係の抽出)、 ede(エンティティの検出とリンク)を使用できます。抽出)、ksq(知識の保存とクエリ)、kr(知識の推論)、およびその他の知識システムを改善します。プログラムをより高度にし、勝つ可能性を高める能力を向上させます

3Pythonの実装

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

3.1関連性としてのサポートの計算

3.1サンプルセット内の観光商品のワンホットエンコーディング

キーは観光商品の名前であり、値は列を表します

{'周黑鸭(东汇城店)': 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)

ここに画像の説明を挿入

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.5result3.csvを生成する

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

ここに画像の説明を挿入

# 将名称转为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

ここに画像の説明を挿入

# 读取问题二的产品类型表,需要生成表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

ここに画像の説明を挿入

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

ここに画像の説明を挿入

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)

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_43935696/article/details/124361365