クロス集計とは
クロス集計とは、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
まとめ
感想は、こんなに短いコードでよいのか?となります。次回は、実際の特許データを使用して検証してみようと思います。