🐍

【Python/セグメント分析の前処理】リスト同士の積集合を演算する

2025/02/02に公開

やりたいこと

ビジネスの分析をするときに、顧客・ユーザーの持つ複数の属性情報に対して、共通する要素やその要素数を演算することで、インサイトを出したいことがあります。
例えば、以下のような関心事があった場合に、そのユーザーが持つカラムに対して、積集合を演算したいようなケースです。

  • そのユーザーが閲覧した商品と実際に購入した商品で共通するタグは何か?
  • そのユーザーが転職するときに希望する業界とこれまで経験してきた業界が共通する場合と共通しない場合で特定のKPIに変化があるか?
  • そのユーザーが先週閲覧した商品の中で、今週も閲覧している商品は何か?

このようなケースを分析する際によく使っている前処理工程のメモを記載していきます。

実際にやってみる

サンプルのケースとして、そのユーザーが転職するときに希望する業界とこれまで経験してきた業界の共通要素を抽出し、その要素数が0の場合は「未経験業界への転職を希望」、要素数が1以上の場合は「経験業界への転職を希望」という分類を作りたいとします。
また、各業界は事前にIDとして表現されているとします。

まずは基本ライブラリをimportします。

import numpy as np
import pandas as pd

説明用に、以下のようなDataframeを作成します。

df = pd.DataFrame({'user_id': [100, 101, 102, 103, 104, 105],
                   'industry_of_background': ['100', '100,110,120', '190', '160,140', '160,170', '190,170'],
                   'target_industry' : ['100', '110,140', '180', '170,100', '160,170', '120']},
                  index=[1, 2, 3, 4, 5, 6])

dfを呼び出すと、こんなdataframeが確認できます。

この時、例えばindustry_of_backgroundカラムの要素の型はまだ文字列であることが確認できます。

print(type(df['industry_of_background'].iloc[0]))

# 抽出結果 : <class 'str'>

これに対して、やりたい演算を行うための準備として、strlistに変換します。

df['industry_of_background_list'] = df['industry_of_background'].str.split(',')
df['target_industry_list'] = df['target_industry'].str.split(',')
print(type(df['industry_of_background_list'].iloc[0]))

# 抽出結果 : <class 'list'>

dfを呼び出すと、こんなdataframeが確認できます。

ここから、リスト同士の積集合の要素と、その要素数を演算します。

# リスト同士の積集合の要素の抽出
df["intersection_set_of_industry"] = df.apply(lambda x: set(x["industry_of_background_list"]) & set(x["target_industry_list"]), axis=1)

# リスト同士の積集合の要素数の抽出
df["count_intersection_set_of_industry"] = df.apply(lambda x: len(set(x["industry_of_background_list"]) & set(x["target_industry_list"])), axis=1)

ここまでできれば、それぞれのユーザーが「未経験業界への転職を希望」しているのか、「経験業界への転職を希望」しているのがかわかりましたね。

あとは、以下のようなフラグを付与して、industry_mached_flgなるカラムを作成してから、groupbyなどで集計したいKPIについて演算することで、それぞれの違いを確認することができます。

df['industry_matched_flg'] = df['count_intersection_set_of_industry'].apply(lambda x: 1 if x > 0 else 0)

Discussion