0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

特許データのバブルチャートを考える。

Last updated at Posted at 2023-02-10

はじめに

特許マップではバブルチャートがよく用いられます。しかし、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のグループとそのサイズがカウント数として抽出されております。あとは、甲と乙を軸とし、カウント数に対応する大きさのバブルを配置すれば、バブルチャートとなるはずです。

result
   甲  乙  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()

出力は、以下となります。一応、バブルチャートはかけているようです。
image.png

感想

とりあえずバブルチャートは書けましたが、matplotlibの出力については、人間が目で見ての調整となりますので、慣れないうちは面倒に感じました。数値だけでよいなら、前回のクロス集計で十分と思います。

また、バブルチャートを作成するにあたり、クロス集計は不要ということがわかり、意外に感じました。

次回は、実際の特許データを使用してバブルチャートを書いてみたいと思います。

0
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
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?