はじめに
コンパラマップとは、母集団において、組織・個人(出願人・権利者・発明者等)から任意に2 つ抽出し、縦軸に任意に定めた項目、横軸に任意の計数値をとり、棒グラフで示したもの、といわれております。
横軸は中心を0として、組織・個人から任意に抽出した1 方を左側に、もう1 方を右側に示すことで、これらを比較するため用いるそうです。
今回は、このコンパラマップをpythonで書きたいと思います。
プログラム
データフレームの作成
まず、仮データを使ってコンパラマップを作成したいと思います。データとしては、出願人は甲と乙、課題はA~Dの4つとし、これらの適当な組合せのデータフレームを作成します。
# 必要なライブラリをインポート
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
import seaborn as sns
# データを定義
data = {
'課題': ['A', 'A', 'B', 'A', 'A', 'A', 'B', 'B', 'C', 'D', 'C', 'D', 'D', 'C', 'C', 'C'],
'出願人': ['甲', '乙', '甲', '甲', '乙', '乙', '乙', '甲', '甲', '甲', '甲', '乙', '甲', '甲', '甲', '甲']
}
# データフレームを作成
df = pd.DataFrame(data)
課題件数のカウント
出願人ごとの課題の件数をカウントします。データフレームに2社以上の出願人が含まれる場合にはエラーを出力することにしました。
# 出願人の一覧を取得
unique_applicants = df['出願人'].unique()
# 出願人が2社でない場合、エラーを表示
if len(unique_applicants) != 2:
raise ValueError("データには2つの異なる出願人が含まれている必要があります。")
# 2つの出願人を変数に格納
company1, company2 = unique_applicants
# 各出願人の課題件数を取得
p_count_1 = df[df['出願人'] == company1]['課題'].value_counts().sort_index()
p_count_2 = df[df['出願人'] == company2]['課題'].value_counts().sort_index()
グラフの設定
wspaceを0として、左右のグラフを密着させます。また、グラフの最大値を計算して、左右のグラフの最大値を合わせます。
# グラフを描画するための設定
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5), sharey=True, gridspec_kw={'wspace': 0})
# クールな色を使うための設定
cool_colors = sns.color_palette("cool", 2)
# グラフの最大値を計算
max_count = max(max(p_count_1.values), max(p_count_2.values))
x_limit = max_count * 1.2 # 余裕のある値
左のグラフの描画
左のグラフについては横棒グラフの向きを反転させます。
# 左側のグラフを描画
ax1.barh(p_count_1.index, p_count_1.values, color=cool_colors[0])
ax1.set_title(f'{company1}')
ax1.set_xlabel('件数')
ax1.set_ylabel('課題')
ax1.invert_xaxis()
ax1.set_xticks(range(0, int(x_limit) + 1))
ax1.set_xlim(x_limit, 0)
右のグラフの描画
右のグラフについては通常の横棒グラフとします。
# 右側のグラフを描画
ax2.barh(p_count_2.index, p_count_2.values, color=cool_colors[1])
ax2.set_title(f'{company2}')
ax2.set_xlabel('件数')
ax2.yaxis.tick_right()
ax2.set_xticks(range(0, int(x_limit) + 1))
ax2.set_xlim(0, x_limit)
# グラフを表示
plt.show()
コンパラマップ
出力されたコンパラマップは以下となります。甲と乙の課題ごとの出願件数の比較がしやすい図となっております。

感想
プログラムとしては、比較的シンプルで、わかりやすいものとなりました。次回は実際の特許データを使用して、コンパラマップを作成したいと思います。