今回は、pythonを使ってバタフライチャートを作成する手順について説明します。バタフライチャートは、母集団における特定の2つのカテゴリのデータを比較(例えば特定の2出願人のデータを比較)をするのに便利です。
以下、プログラムの作成方法を順を追って説明します。バタフライチャートをすぐに作成されたい場合、以下の本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では#以降の文字はコメントとされます。)を切り替えて下さい。
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を使ってバブルチャートにしています。グラフは”Butterfly-chart.png”という名前で保存されます。
ここでは出願数の上位2社(ナイルワークス、パロットドローンズ)を比較しています。また上位7個のFIクラスを比較するようにしています。もし出願人、またはFIクラスの個数を切り替えたい場合は、column_max_numを書き換えて下さい。
################################################# calc (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 column_max_num = 7 # Max number of FI category ###################################################### result_b = result.iloc[1:,1:column_max_num] fig = plt.figure(dpi=100, figsize=(12.0,6.0)) ax1 = fig.add_axes([0.25,0.1,0.70,0.80]) ##################################################### df1 = result_b.transpose() df1["ナイルワークス"] *= -1 df1 = df1.loc[:,['ナイルワークス','パロットドローンズ']] max_num = 30 column_colors = ["#4169e1", "#ff1493"] column_list = df1.columns for column, color in zip(column_list, column_colors): sns.barplot(x = column, y = df1.index, data = df1, color = color, label = column, orient = 'h', order = df1.index, ax = ax1) ax1.set_xlabel("The number of applications") ax1.grid(which = "major", axis = "x", color = "grey", alpha = 0.8, linestyle = "--", linewidth = 1) ax1.set_ylabel("FI", fontsize = 12) ax1.set_xlim(-1*max_num, max_num) ax1.set_xticklabels(['30', '20', '10', '0', '10', '20', '30']) ax1.legend(loc = 'lower left') plt.savefig('butterfly-chart.png') plt.show() plt.close()
出力されるバタフライチャートは以下の通りです。ax1.set_xlabel、ax1.set_ylabelの記載を変えることで、軸のラベルを変更可能です。
本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桁 ################################################# calc (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 column_max_num = 7 # Max number of FI category ############################################################### ヒートマップ result_b = result.iloc[1:,1:column_max_num] fig = plt.figure(dpi=100, figsize=(12.0,6.0)) ax1 = fig.add_axes([0.25,0.1,0.70,0.80]) ##################################################### df1 = result_b.transpose() df1["ナイルワークス"] *= -1 df1 = df1.loc[:,['ナイルワークス','パロットドローンズ']] max_num = 30 column_colors = ["#4169e1", "#ff1493"] column_list = df1.columns for column, color in zip(column_list, column_colors): sns.barplot(x = column, y = df1.index, data = df1, color = color, label = column, orient = 'h', order = df1.index, ax = ax1) ax1.set_xlabel("The number of applications") ax1.grid(which = "major", axis = "x", color = "grey", alpha = 0.8, linestyle = "--", linewidth = 1) ax1.set_ylabel("FI", fontsize = 12) ax1.set_xlim(-1*max_num, max_num) ax1.set_xticklabels(['30', '20', '10', '0', '10', '20', '30']) ax1.legend(loc = 'lower left') plt.savefig('Butterfly-chart.png') plt.show() plt.close()
コメント