はじめに
特許マップではバブルチャートがよく用いられます。しかし、Excelでバブルチャートを作成するのは面倒という問題があります。
一方、下記リンク先の記事にもありますように、Pythonでもバブルチャートは書けるようですので、初心者でもバブルチャートを書けるか挑戦してみました。
・【特許分析】Pythonでお金を掛けずにパテントマップを作ってみた
使用するデータ
最初から特許データを処理するのはハードルが高いので、今回は、下の2×5の仮データを使って、バブルチャートを書いてみたいと思います。プログラムがうまく動きそうでしたら、次回特許データを処理したいと思います。
甲列はAとBのみ含み、乙列はXとYのみ含みますので、うまくゆけば2×2のバブルチャートが完成するはずです。
甲 | 乙 |
---|---|
A | Y |
B | Y |
A | X |
B | X |
B | Y |
使用する関数
今回はgroupbyを使用してバブルチャートが書ける形式にデータを集計したいと思います。
groupbyは、Pythonのpandasライブラリに含まれている関数で、同じ値を持つ要素をグループ化することができます。グループ化には、特定の列を基準としてグループ化することができます。その後、グループ化された各グループに対して計算を実行することができます。
今回は、甲列、乙列でグループ化して、各グループのサイズを size で取得します。
プログラム
データフレーム化
まずは、上記の表をデータフレーム化します。
import pandas as pd
import matplotlib.pyplot as plt
# DataFrameを作成するためのデータを作成
data = {'甲': ['A', 'B', 'A', 'B', 'B'],
'乙': ['Y', 'Y', 'X', 'X', 'Y']}
# DataFrameを作成
df = pd.DataFrame(data)
groupbyの使用
グループバイ関数を使い、出力を確認してみます。
# 「甲」と「乙」の列でグループ化し、グループ内の要素数を数える
result = df.groupby(['甲', '乙']).size().reset_index(name='Counts')
# resultを確認
print(result)
出力は以下のようになります。A,B,X,Yのグループとそのサイズがカウント数として抽出されております。あとは、甲と乙を軸とし、カウント数に対応する大きさのバブルを配置すれば、バブルチャートとなるはずです。
甲 乙 Counts
0 A X 1
1 A Y 1
2 B X 1
3 B Y 2
リスト化
x,y,sizeのリストを作成します。sizeについては、countsをバブルチャートをみながら適当な倍数(ここでは300)で補正したものをリスト化します。
# 「甲」と「乙」の列からなる値をリスト形式に変換
x = result['甲'].tolist()
y = result['乙'].tolist()
# 「Counts」列からなる値を元に、散布図のすべての点の大きさを示すリストを作成
sizes = [size * 300 for size in result['Counts'].tolist()]
# xとyとsizesを確認
print(x)
print(y)
print(sizes)
リストはこのような感じとなりますので、これをmatplotlibで散布図を書けばよいこととなります。
['A', 'A', 'B', 'B']
['X', 'Y', 'X', 'Y']
[300, 300, 300, 600]
カラーマップの使用
バブルの色は同じでも構わないのですが、ここでは勉強がてらバブルの色をカテゴリーで変えてみます。色を変えるにはカラーマップを使用します。
import numpy as np
import matplotlib.cm as cm
# 「乙」列からなる値を元に、カテゴリーのリストを作成
categories = list(set(y))
# 色マップを作成
colors = cm.rainbow(np.linspace(0, 1, len(categories)))
colors = {categories[i]: colors[i] for i in range(len(categories))}
colors = [colors[item] for item in y]
散布図作成
最後に、matplotlibで散布図を書けば完成です。
# 散布図を作成
fig, ax = plt.subplots()
ax.scatter(x, y, s=sizes, c=colors)
# X軸とY軸のレンジを設定
plt.xlim(-0.5,1.5)
plt.ylim(-0.5,1.5)
# 図を表示
plt.show()
出力は、以下となります。一応、バブルチャートはかけているようです。
感想
とりあえずバブルチャートは書けましたが、matplotlibの出力については、人間が目で見ての調整となりますので、慣れないうちは面倒に感じました。数値だけでよいなら、前回のクロス集計で十分と思います。
また、バブルチャートを作成するにあたり、クロス集計は不要ということがわかり、意外に感じました。
次回は、実際の特許データを使用してバブルチャートを書いてみたいと思います。