LoginSignup
1
2

More than 1 year has passed since last update.

特許データのクロス集計問題を考える

Posted at

クロス集計とは

クロス集計とは、2つの変数の関係性を視覚的に表示する手法です。2つの変数を軸にして、各グループの組み合わせの数の分布を示します。

例えば、以下の出願人と分類のグループがある場合には、

出願人 分類
A X
B Y

クロス集計表は、以下となります。

X Y
A 1 0
B 0 1

特許データの問題点

特許データでは、以下のように出願人や分類に複数の要素を含む場合があります。というより、ほとんど含んでいます。

出願人 分類
A X
A,B X,Y

これを単純にクロス集計すると、以下のようになります。これでも問題ないといえば、ないのですが、正確にはA,BはAとBに分けたい気もしますし、X,YはXとYに分けたい気もします。

X X,Y
A 1 0
A,B 0 1

また、筆頭出願人や筆頭分類に限定して、下記のようなクロス集計をする場合もあります。excelで処理する場合に多く用いられる方法です。これも使い方によっては問題はないと思いますが、BやYの個数が0となってしまうところが気になるところです。

X Y
A 2 0
B 0 0

厳密にクロス集計をしますと以下の表となります。これは私が手計算(というほどのものでもないですが)で作ったものです。2行程度であれば手計算も考えられますが、10行、100行となりますと人手での計算は無理です。

X Y
A 2 1
B 1 1

やりたいこと

上記手計算をプログラムで自動化したい。

方法

ChatGPTに聞いたところ、explodeメソッドを使えばよいとのことでした。

Pandas の explodeメソッドは、データフレーム中のシリーズ(1列)内の要素を展開するためのものです。これは、配列やリストを含む1列を、各要素に対応する列に分割することができます。

コード

それでは実際に試してみます。

まず、データフレームを作成し、単純にクロス集計してみます。

import pandas as pd
data = {'出願人': ['A', 'A,B'],
        '分類': ['X', 'X,Y']}
df = pd.DataFrame(data)
# クロス集計して出力
ct1 = pd.crosstab(df['出願人'], df['分類'])
print(ct1)

クロス集計表は以下となります。単純なクロス集計となります。

分類   X  X,Y
出願人        
A    1    0
A,B  0    1

次に、explodeメソッドを実行します。

# ,で分類を分割
df['分類'] = df['分類'].str.split(',')
# ,で出願人を分割
df['出願人'] = df['出願人'].str.split(',')
# 分類と出願人をエクスプロード
df = df.explode('分類').explode('出願人')
# エクスプロードしたデータフレームを出力
print(df.to_string(index=False))

データフレームは以下のように変形されます。2行のデータフレームが、A,BとX,Yを展開することにより5行のデータフレームに変形していることがわかります。

出願人 分類
  A  X
  A  X
  B  X
  A  Y
  B  Y

次に、クロス集計してみます。

# クロス集計して出力
ct2 = pd.crosstab(df['出願人'], df['分類'])
print(ct2)

出力は以下のようになります。先ほどの手計算のクロス集計表と同じとなりましたので、うまく処理できていることがわかります。

分類   X  Y
出願人      
A    2  1
B    1  1

まとめ

感想は、こんなに短いコードでよいのか?となります。次回は、実際の特許データを使用して検証してみようと思います。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2