今回は、pythonを使ってバブルチャートを作成する手順について説明します。バブルチャートは、母集団における2つのパラメータに対する集計結果(例えば縦軸が出願人、横軸が技術分野(FI))を示すのに便利です。
以下、プログラムの作成方法を順を追って説明します。バブルチャートをすぐに作成されたい場合、以下の本pythonプログラムコード全体をご参照下さい。
J-PlatPatから入手したcsvデータに基づいて集計処理、グラフ作成をしていきます。
※csvデータの取得方法についてはこちら→知らなきゃ損!無料のパテントマップ作成方法1(データ準備編)
※pythonを動作させるための環境構築はこちら→すぐにできる、パテントマップ作成のためのPC環境のセットアップ
必要ライブラリの読み込みとフォントの設定
まずは必要なモジュールを読み込みます。ここではpandas、matplotlib、seabornを使いますのでこれらをimportします。また出力する出願人名に日本語を含みますので、フォントの指定が必要です。ここではwindowsの標準フォント、MSゴシックを指定しています。以下がサンプルコードです。
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns ###################### FONT Setting # windows: MS Gothic # osX: Hiragino Sans plt.rcParams['font.family'] = 'MS Gothic' #plt.rcParams['font.family'] = 'Hiragino Sans'
もしMac OSをお使いの場合は、フォント設定は、例えばHiragino Sansにすることをおすすめします。以下のように、Font Setting部分のコメントアウト(Pythonでは#以降の文字はコメントとされます。)を切り替えて下さい。
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns ###################### FONT Setting # windows: MS Gothic # osX: Hiragino Sans #plt.rcParams['font.family'] = 'MS Gothic' plt.rcParams['font.family'] = 'Hiragino Sans'
csvファイルの読み込みとデータの加工
csvファイルの読み込みはpandasのread_csvを用います。ここでJ-PlatPatから入手したcsvを入力します。(ちなみに、知らなきゃ損!無料で特許マクロ分析を行う方法(準備編)で説明した2つのcsvデータ生成方法のいずれであっても、本ページ記載のpythonプログラムにより処理可能です。)
出願人の情報のうち、グラフ表示で見やすくなるように、不要な部分(スペース、株式会社、他)を全てstr.replaceを用いて置換しています。さらにここでは、csv中のFIの情報を加工しています。ここではFIをクラス単位で集計したいと思います。もしサブクラス、またはセクションで集計したい場合にはコメントアウトを切り替えて下さい。またより細かい単位(FIメイングループなど)で集計したい場合には、適宜調整して下さい。
####### csvファイルの読み込み patlist = pd.read_csv('Book2.csv') ####### 読み込みデータの加工 patlist['出願人'] = patlist['出願人/権利者'] patlist['出願年'] = patlist['出願日'].str[:4] patlist['出願人'] = patlist['出願人'].str.replace(' ','') patlist['出願人'] = patlist['出願人'].str.replace(' ','') patlist['出願人'] = patlist['出願人'].str.replace('株式会社','') patlist['出願人'] = patlist['出願人'].str.replace('有限会社','') patlist['出願人'] = patlist['出願人'].str.replace('国立大学法人','') patlist['出願人'] = patlist['出願人'].str.replace('国立研究開発法人','') patlist['出願人'] = patlist['出願人'].str.replace('▲','') patlist['出願人'] = patlist['出願人'].str.replace('▼','') patlist['出願人'] = patlist['出願人'].str.replace('テベル・アドバンスト・テクノロジーズ・リミテッド','テベル・アドバンスト') patlist['出願人'] = patlist['出願人'].str.replace('トップフライトテクノロジーズ,インコーポレイテッド','トップフライトテクノロジーズ') patlist['FI'] = patlist['FI'].str[0:3] #FIクラスで集計する場合は3桁 #patlist['FI'] = patlist['FI'].str[0:4] #FIサブクラスにする場合は4桁 #patlist['FI'] = patlist['FI'].str[0:1] #FIセクションにする場合は1桁
バブルチャートの作成
データの加工後、グラフ(バブルチャート)の作成処理をします。ここではpandasのpivot_tableを使ってクロス集計処理をしています。また、集計結果を、matplotlibのscatterを使ってバブルチャートにしています。グラフは”Bubble_chart-FI.png”という名前で保存されます。なおここでは上位20社、上位15個のFIクラスを表示するようにしています。もしこれらの数を切り替えたい場合は、index_max_num, column_max_numをそれぞれ書き換えて下さい。またバブルのサイズはbubble_sizeを調整することで変更できます。
################################################# Buuble chart (Applicant v FI) result = pd.pivot_table(patlist, index='出願人', columns='FI', values='出願番号', aggfunc=len, margins=True) result = result.sort_values('All', ascending=False) result = result.sort_values(by='All', ascending=False, axis=1) result = result.fillna(0) #################################### Parameter setting index_max_num = 20 # Max number of Applicants column_max_num = 15 # Max number of FI category buuble_size = 30 # Bubble size fig = plt.figure(dpi=100, figsize=(10.0,6.0)) ax1 = fig.add_subplot() ax1.set_position([0.25,0.15,0.70,0.80]) ax1.grid(which = "major", axis = "x", color = "blue", alpha = 0.2, linestyle = "--", linewidth = 1) ax1.grid(which = "major", axis = "y", color = "green", alpha = 0.2, linestyle = "--", linewidth = 1) cm = plt.cm.get_cmap('rainbow') ax1.set_xlim(0,column_max_num) ax1.set_ylim(index_max_num+1,0) ax1.set_xlabel("FI") ax1.set_ylabel("Applicants") plt.xticks(rotation=0) tmp_number=[] for iii in range(1,index_max_num+1): tmp_number.append(iii) plt.yticks(tmp_number,result.index[1:index_max_num+1]) tmp_number=[] for iii in range(1,column_max_num): tmp_number.append(iii) plt.xticks(tmp_number,result.columns[1:column_max_num]) for num in range(1,index_max_num+1): yyy = [num] * column_max_num xxx = [0] * column_max_num zzz = [0] * column_max_num for bbb in range(1,column_max_num): xxx[bbb] = bbb zzz[bbb] = result.iloc[num,bbb] * buuble_size scat = ax1.scatter(xxx, yyy, c=yyy, vmin=0, vmax=20, s=zzz, cmap=cm,alpha=0.5) plt.savefig("Bubble_chart-FI.png") plt.show() plt.clf() plt.close()
出力されるバブルチャートは以下の通りです。p.set_xlabel、p.set_ylabelの記載を変えることで、軸のラベルを変更可能です。出願人名が長い場合には、上記の置換処理をするか、あるいは図のサイズを変更するなど、適宜調整してみてください。
FIクラスはB64がトップですね。B64は、航空機;飛行;宇宙工学です。
本pythonプログラムコードの全体
以下が本pythonプログラムコードの全体です。こちらをコピー&ペーストして利用すれば、J-PlatPatから入手したcsvファイルからバブルチャートを作ることができます。ご自由にご利用下さい。もしお役に立った場合はコメント頂けると幸いです。
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns ###################### FONT Setting # windows: MS Gothic # osX: Hiragino Sans plt.rcParams['font.family'] = 'MS Gothic' #plt.rcParams['font.family'] = 'Hiragino Sans' ####### csvファイルの読み込み patlist = pd.read_csv('Book2.csv') ####### 読み込みデータの加工 patlist['出願人'] = patlist['出願人/権利者'] patlist['出願年'] = patlist['出願日'].str[:4] patlist['出願人'] = patlist['出願人'].str.replace(' ','') patlist['出願人'] = patlist['出願人'].str.replace(' ','') patlist['出願人'] = patlist['出願人'].str.replace('株式会社','') patlist['出願人'] = patlist['出願人'].str.replace('有限会社','') patlist['出願人'] = patlist['出願人'].str.replace('国立大学法人','') patlist['出願人'] = patlist['出願人'].str.replace('国立研究開発法人','') patlist['出願人'] = patlist['出願人'].str.replace('▲','') patlist['出願人'] = patlist['出願人'].str.replace('▼','') patlist['出願人'] = patlist['出願人'].str.replace('テベル・アドバンスト・テクノロジーズ・リミテッド','テベル・アドバンスト') patlist['出願人'] = patlist['出願人'].str.replace('トップフライトテクノロジーズ,インコーポレイテッド','トップフライトテクノロジーズ') patlist['FI'] = patlist['FI'].str[0:3] #FIクラスで集計する場合は3桁 #patlist['FI'] = patlist['FI'].str[0:4] #FIサブクラスにする場合は4桁 #patlist['FI'] = patlist['FI'].str[0:1] #FIセクションにする場合は1桁 ################################################# Buuble chart (Applicant v FI) result = pd.pivot_table(patlist, index='出願人', columns='FI', values='出願番号', aggfunc=len, margins=True) result = result.sort_values('All', ascending=False) result = result.sort_values(by='All', ascending=False, axis=1) result = result.fillna(0) #################################### Parameter setting index_max_num = 20 # Max number of Applicants column_max_num = 15 # Max number of FI category buuble_size = 30 # Bubble size fig = plt.figure(dpi=100, figsize=(10.0,6.0)) ax1 = fig.add_subplot() ax1.set_position([0.25,0.15,0.70,0.80]) ax1.grid(which = "major", axis = "x", color = "blue", alpha = 0.2, linestyle = "--", linewidth = 1) ax1.grid(which = "major", axis = "y", color = "green", alpha = 0.2, linestyle = "--", linewidth = 1) cm = plt.cm.get_cmap('rainbow') ax1.set_xlim(0,column_max_num) ax1.set_ylim(index_max_num+1,0) ax1.set_xlabel("FI") ax1.set_ylabel("Applicants") plt.xticks(rotation=0) tmp_number=[] for iii in range(1,index_max_num+1): tmp_number.append(iii) plt.yticks(tmp_number,result.index[1:index_max_num+1]) tmp_number=[] for iii in range(1,column_max_num): tmp_number.append(iii) plt.xticks(tmp_number,result.columns[1:column_max_num]) for num in range(1,index_max_num+1): yyy = [num] * column_max_num xxx = [0] * column_max_num zzz = [0] * column_max_num for bbb in range(1,column_max_num): xxx[bbb] = bbb zzz[bbb] = result.iloc[num,bbb] * buuble_size scat = ax1.scatter(xxx, yyy, c=yyy, vmin=0, vmax=20, s=zzz, cmap=cm,alpha=0.5) plt.savefig("Bubble_chart-FI.png") plt.show() plt.clf() plt.close()
コメント