Jupyter Notebookで特許分析(7)

さて、前回までで、母集合の主要な数値指標等を見てきました。

市場としては椅子タイプが牽引してきて、最近は、椅子タイプの安価版としてシートタイプが出てきていること。上位の出願人はおおむねこの椅子タイプを中心に出願を行っており、市場でのシェア上位も上位出願人と合っているといった内容でした。

これからマッサージ機市場に参入する方策を検討しているというシチュエーションでしたので、この椅子タイプに参入していくプランは描きにくいところです。したがって、椅子タイプを外して出願動向を見て、参入の方策を検討していくことにしましょう。

マッサージ機のFターム4C100を見るとCA03からCA09が家庭用の椅子タイプに対応するようです(CA11とCA12も椅子タイプの下位分類ですが、普通の家庭用の椅子タイプからは外れると考えました)。これらCA03からCA09を除外した集合を作ってその数値指標を見ていきましょう。

下記のようにCA03からCA09をFタームに含む案件の公報番号のリストCA03list及び含まない案件のリストNOTCA03listを作成します。

CA03list = df1.loc[df1['Fターム'].str.contains('(4C100 CA03|4C100 CA04|4C100 CA05|4C100 CA06|4C100 CA07|4C100 CA08|4C100 CA09)'), '公報番号']
NOTCA03list = df1.loc[~df1['Fターム'].str.contains('(4C100 CA03|4C100 CA04|4C100 CA05|4C100 CA06|4C100 CA07|4C100 CA08|4C100 CA09)'), '公報番号']
 作成したリストにより、CA03からCA09をFタームに含む案件のデータフレームdf10及び含まない案件のデータフレームdf11を作成します。
df10 = df2[df2['公報番号'].isin(CA03list)]
df11 = df2[df2['公報番号'].isin(NOTCA03list)]
まずは、CA03からCA09をFタームに含む案件の出願年別出願件数推移を見てみます。
p3 = Line(df10['公報番号'].groupby(df10['出願日'].dt.year).count(), plot_width=600, plot_height=200, legend = False)
p3.xaxis.axis_label = '出願年'
p3.yaxis.axis_label = '出願件数'
show(p3)
2006年以降出願件数は下がり続けています。安価な製品としてシートタイプを投入していても、シートタイプの投入にあたり、新たな技術要素の開発は活発ではなかったようです。
次に、CA03からCA09をFタームに含まない案件の出願年別出願件数推移を見てみます。
p4 = Line(df11['公報番号'].groupby(df11['出願日'].dt.year).count(), plot_width=600, plot_height=200, legend = False)
p4.xaxis.axis_label = '出願年'
p4.yaxis.axis_label = '出願件数'
show(p4)
 
こちらは100件前後で比較的安定しており、大きな動きは内容です。
次に、CA03からCA09をFタームに含まない案件の上位出願人別の出願年別出願件数推移を見てみます。
df12 = df11[df11['出願人'].isin(df11['公報番号'].groupby(df11['出願人']).count().nlargest(10).index)]
df12 = df12.pivot_table(index=df12['出願日'].dt.year, columns='出願人', values='公報番号', aggfunc='count')
df12
出願人 コーニンクレッカフィリップスエレクトロニクスエヌヴィ ツインバード工業株式会社 パナソニック株式会社 パナソニック電工株式会社 ファミリーイナダ株式会社 大東電機工業株式会社 日立マクセル株式会社 株式会社MTG 花王株式会社 TOTO株式会社
出願日
2006 1.0 2.0 5.0 5.0 2.0 NaN NaN NaN 2.0 9.0
2007 1.0 3.0 5.0 3.0 3.0 NaN 1.0 NaN NaN 10.0
2008 2.0 3.0 5.0 2.0 NaN 3.0 1.0 NaN 1.0 7.0
2009 NaN 7.0 15.0 1.0 NaN 3.0 1.0 NaN 1.0 1.0
2010 2.0 NaN 15.0 10.0 3.0 1.0 NaN 5.0 3.0 NaN
2011 NaN NaN 13.0 NaN NaN 1.0 NaN 7.0 3.0 1.0
2012 NaN 2.0 15.0 NaN 1.0 3.0 4.0 3.0 3.0 1.0
2013 2.0 NaN 7.0 NaN 1.0 3.0 10.0 6.0 1.0 NaN
2014 2.0 3.0 7.0 NaN 1.0 3.0 6.0 4.0 NaN NaN
2015 4.0 NaN 3.0 NaN 6.0 3.0 8.0 NaN 2.0 NaN
2016 NaN NaN 1.0 NaN 2.0 1.0 NaN 3.0 NaN NaN
パナソニックの出願件数が上位出願人の中では突出しており、他の出願人は上位といってもそれほど多くの出願を行っているわけではありません。
グラフも描いてみます。
p5 = Line(df12, plot_width=800, plot_height=400)
p5.xaxis.axis_label = '出願年'
p5.yaxis.axis_label = '出願件数'
p5.legend.location = "top_right"
p5.legend.label_text_font_size = '5pt'
show(p5)
 
次は、CA03からCA09をFタームに含まない案件の出願人別Fターム別の件数表を作成していきます。
df13 = df6[df6['公報番号'].isin(NOTCA03list)]
df14 = df13[(df13['出願人'].isin(df11['公報番号'].groupby(df11['出願人']).count().nlargest(10).index)) & (df13['Fターム'].isin(df13['公報番号'].groupby(df13['Fターム']).count().nlargest(10).index))]
df15 = df14.pivot_table(index='出願人', columns='Fターム', values='公報番号', aggfunc='count', margins=True)
df15 = df15.sort_values(by=["All"], ascending=False)
df15 = df15.sort_values(by=["All"], axis=1, ascending=False)
df15 = df15.drop("All", axis=1)
df15 = df15.drop("All", axis=0)
df15
Fターム 4C100 CA01 4C100 BB03 4C100 DA01 4C100 DA10 4C100 DA02 4C100 BB01 4C100 BB05 4C100 DA08 4C100 DA05 4C100 AF06
出願人
パナソニック株式会社 39.0 35.0 32.0 16.0 16.0 3.0 14.0 5.0 4.0 5.0
株式会社MTG 26.0 2.0 1.0 7.0 19.0 23.0 1.0 12.0 2.0 3.0
日立マクセル株式会社 19.0 4.0 NaN 13.0 14.0 12.0 10.0 10.0 4.0 7.0
大東電機工業株式会社 6.0 18.0 4.0 10.0 1.0 2.0 3.0 3.0 7.0 3.0
ツインバード工業株式会社 18.0 19.0 17.0 NaN 1.0 NaN NaN NaN NaN 1.0
パナソニック電工株式会社 12.0 12.0 7.0 3.0 4.0 1.0 7.0 1.0 2.0 1.0
花王株式会社 15.0 NaN 10.0 2.0 2.0 15.0 NaN 2.0 2.0 NaN
ファミリーイナダ株式会社 5.0 12.0 3.0 7.0 2.0 NaN 5.0 6.0 4.0 2.0
TOTO株式会社 1.0 3.0 1.0 7.0 NaN NaN 15.0 3.0 13.0 NaN
コーニンクレッカフィリップスエレクトロニクスエヌヴィ 7.0 7.0 NaN 2.0 5.0 NaN NaN 1.0 1.0 1.0
グラフも描いてみます。
count3 = []
for x in df15.apply(tuple):
    count3.extend(x)

data = {
  '出願人': list(df15.index) * len(df15.columns),
  'Fターム':  [item for item in list(df15.columns) for i in range(len(df15.index))],
  '件数':   count3,
}

p6 = HeatMap(data, x='Fターム', y='出願人',values='件数', title='出願人別Fターム別件数', stat=None)
show(p6)
上位のFタームとしては、CA01:手持ち、BB03:モータが並びますが、あとは部位に関わるDAの分類がいくつか並び、その中で最上位の部位はDA01:頭部でありDA10:脚、DA02:顔と続く、あとは動力源としてBB01:人力、BB05:ポンプ等が並びます。椅子タイプ以外での参入方針検討のため、ここまで調べた傾向を整理してみます。上位出願人はパナソニック以外はそれほど出願件数は多くない、最上位の製品タイプはCA01:手持ちであり、製品として手持ちタイプに人気があり、出願も行われているようだ、部位としてはDA01:頭部、DA02:顔等の頭を対象とするものやDA10:脚を対象とするものに人気があり、出願も行われているようだ。
これらの状況を踏まえて、ある程度市場で人気がある「手持ち」タイプで、部位を絞って市場参入の戦略を検討を進めるのがよいだろう。
ここから先は、企画、営業、開発等の様々な部署とも情報交換して進めていったほうが良いだろう。そのために、部位毎での出願傾向のグラフや部位別な具体的な出願を参照するためのリストも用意しておいたほうが良いだろう。
そのために、DA00からDA20までの部位に関わるFタームに絞って、出願傾向を見てみる。
df16 = df13.loc[df13['Fターム'].str.contains('(4C100 DA00|4C100 DA01|4C100 DA02|4C100 DA03|4C100 DA04|4C100 DA05|4C100 DA06|4C100 DA07|4C100 DA08|4C100 DA09|4C100 DA10|4C100 DA11|4C100 DA12|4C100 DA20)')]
df16 = df16[(df16['出願人'].isin(df11['公報番号'].groupby(df11['出願人']).count().nlargest(10).index))]
df17 = df16.pivot_table(index='出願人', columns='Fターム', values='公報番号', aggfunc='count')
count3 = []
for x in df17.apply(tuple):
    count3.extend(x)

data = {
  '出願人': list(df17.index) * len(df17.columns),
  'Fターム':  [item for item in list(df17.columns) for i in range(len(df17.index))],
  '件数':   count3,
}

p7 = HeatMap(data, x='Fターム', y='出願人',values='件数', title='出願人別Fターム別件数', stat=None)
show(p7)

DA07:乳房とDA12:体腔が少なく、DA01-02の頭が多く次いで、DA10の脚が次いで多いといった傾向が見られます。体腔はどのようにマッサージするのか分かりませんが、何件かある公報には書いてあるのでしょう。この情報を元に「手持ち」で「手のひら」とか具体的なアイデアを様々な部署と情報交換して検討していこう。そんな感じでとりあえずの分析を終了します。

いかがでしょうか、多少具体的なイメージでマッサージ機を事例にJupyterを用いた分析について解説してきました。何回か順に分けた説明になったため、Jupyter上での操作内容としては少々煩雑になっています。実際に作業を行う場面では繰り返し行うデータフレームの操作は関数として定義して呼び出して使った方がすっきりして良いと思います。

Gephiで特許分析

Jupyterシリーズの途中ですが、横道にそれて今回はGephiの話題。

Gephiはネットワークグラフを描くためのツールです。Twitterで言えばだれがだれをフォローしている等の何かと何かの関係性を可視化するためのツールになります。特許データでいえば、出願人と出願人との共同出願の関係、発明者と発明者との共同発明の関係、分類と分類との共起性の関係、キーワードとキーワードとの共起性の関係等々があたります。

ネットワークグラフなんてどうやって作るんだと思うかもしれませんが、今回は特許データの世界では比較的よく見かけるExcelデータ、例えば、共同出願人名や共同発明者がセミコロン等で区切られて1セルに入っているようなデータからネットワークグラフを簡単に描く手順について紹介していきます。

まずはGephiを入手します。2017年9月現在、公式サイトhttps://gephi.org/で安定版としてVer0.92が公開されているため、ダウンロードしてインストールします。

インストールが終わったら起動します。Javaがインストールされていない場合にはJavaのインストールが必要になるかもしれません。

起動したら「Gephiへようこそ」のウィンドウが開いていると思いますがこれを閉じます。

次のような画面が出ていると思いますので左上のメニューから「ツール」→「プラグイン」→「使用可能なプラグイン」と選択していきます。次の画面になると思います。

「Convert Excel and csv files to networks」にチェックを入れて、インストールボタンを押してインストール作業を進めます。インストールが完了すると再起動を求められますので一旦再起動してください。

ネットワーク分析用のExcelデータを準備します。とりあえず、マッサージ機の特許データを使います。Fタームの共起を見ていきましょう。

ファイルメニューから「Import」を選びます「Import spreadsheet」ではありません。

次の画面で「次へ」ボタンを押して、分析対象のエクセルファイルを選びます。マッサージ機の特許データは公報番号とセミコロンで区切られたFタームデータが入ったデータです。

次のSelect agentsで、上下の枠で同じ「Fターム」を選びます。もしも共同出願人のネットワークデータを作成するなら上下ともに出願人、共同発明者なら上下ともに発明者を選びます。

次のSubfield in agentsで要素を区切っている記号を選択します。今回のデータではセミコロンなのでsemicolonを選びます。

次の画面では動的ネットワークを作成するための日時等のフィールドを選ぶか聞いてきます。今回は飛ばして「次へ」ボタンを押しますが、動的ネットワークを作成したい場合はここで出願日等を選びます。

次のメニューでは1番目と3番目のチェックボックスにチェックを入れます。

次の画面で「終了」ボタンを入れるとネットワークデータが作成されます。

今回のデータは一部のFタームデータに抜けがあるためエラーが出ますが、それ以外はネットワークデータが無事作成されます。

 

適当に見た目を整えるとこのような感じになります。DA05:胴、DA06:腰、DA10:脚などを中心としたマッサージ箇所と、CA06:背部への配置、BB03:モータ、BB05:ポンプ等の主要Fタームが個別に独立した付与ではなく、相互に密接な共起の関係にあることが見て取れます。

今回のGephiを用いたExcelデータからのネットワークグラフの作成は、ネットワーク理論でいうところの「無向」グラフの作成を簡単に行う方法になります。「無向」とは今回のFタームとFタームの共起性の関係や、出願人と出願人との共同出願の関係、発明者と発明者との共同発明の関係、分類と分類との共起性の関係、キーワードとキーワードとの共起性の関係等のように、「4C100DA10」と「4C100BB05」が共起したという表現の順を反対に入れ替えて「4C100BB05」と「4C100DA10」が共起したという表現にしても意味合いに違いが無いような関係を言います。

「無向」の反対は「有向」になりますが、「有向」の場合は順を反対に入れ替えるとおかしくなるような関係になります。特許のデータで言えば引用と被引用の関係や優先権の親と子の関係やクレームの独立と従属の関係のようなものです。「出願B」が「出願A」の審査で引用されたという表現の順を反対に入れ替えると「出願A」が「出願B」の審査で引用されたという表現にしてしまうと意味合いが全く違うものになってしまいます。今回の手法では有向データをExcelシートから上手く処理することはできないため、「有向」データをGephiに取り込む際にはPythonでの処理等の工夫が必要になります。

また、データを取り込んだ後のGephi上のレイアウトの整え方等の操作法については今回は省きましたので、それはまた別の機会に。

Jupyter Notebookで特許分析(6)

さて、前回の続きですが、Jupyter Notebookの使い方ではなく、今回の元データ「マッサージ機」に関して考えていきましょう。

少し適当な設定ですが、「マッサージ機の新商品開発を目指しているとある中小企業の知財あるいは技術戦略企画部門の一担当者として、特許を含めたマッサージ機の動向調査とその情報に基づいてマッサージ機市場への参入シナリオ案を提示する必要がある」位のおおざっぱなシチュエーションを設定してみます。

さて、そのような状況にあるとして、既に前回特許データの荒い分析を進めてしまっているわけですが、ここでは改めて特許以外の情報としてマッサージ機の市場の概観を確認してみましょう。

市場の情報は、政府統計資料とか業界団体の統計資料を見ていくのがよいのですが、矢野経済研究所さんの「ボディケア・リフレクソロジー市場に関する調査を実施(2017年)」から市場規模推移のグラフを見てみましょう。

所謂、針灸、指圧、マッサージ、柔道整復等の国家資格を有して行う施術は除くとされていますが、これらの施術以外の「人間の体に触れ、働きかけ、癒しを与えたり、ストレスを軽減するサービス」の市場規模とされており、人々のこのようなケアサービスへのニーズの動向としては適当な資料と考えます。市場規模は急増というほどではありませんが安定して増加しているようです。とりあえず良い情報です。

一方、マッサージ機の市場というのは、このようなサービスニーズの中で、自分が家庭等で日常的に施術を行うために機器を購入する市場ということになり、ほぼ上記のボディケア・リフレクソロジー市場の傾向と相関性があることが想定されます。こちらの方は厚生労働省の薬事工業生産動態統計を参照して家庭用マッサージ器の生産等に基づく市場規模をまとめると下表のようになります。

2012年 2013年 2014年 2015年 2016年
市場規模(億円) 256 279 309 302 275

2014年まで伸びてきた市場規模は2015年以降減少に転じていることが分かります。人々のマッサージに対するニーズは安定して存在する一方で、マッサージ機は必要な人への市場普及が進み飽和状態になってきているということでしょうか。こちらの記事「マッサージ機器売り場、変革の時!」によれば、高額のマッサージチェアタイプの製品に代わり、比較的安価なシートタイプの製品が大ヒットしたとのことであり、数は出ているが売上規模としては減少しているというところですね。(より正確さを期すには上記の薬事工業生産動態統計に生産数のデータもあるのでそれも見たほうが良い。)上手く参入シナリオを立てれば、ある程度の数を売ることは出来そうですが、製品価格に関してはシビアな状況のようです。

これらの点を踏まえて、前回の特許データを見ていきましょう。

調査対象としたFターム4C100は、マッサージチェアやシートタイプや簡易タイプなど、人の体に対してマッサージを行うための様々な機器に関わる特許出願が含まれる分類です。

【出願年別出願件数推移】

出願年別出願件数のグラフでは、出願件数は2006年以降漸減を続けている。新たな技術開発はそれほど活発でないといえる。これまで確認できていないが、この分野に関わる出願人数もおそらく増えてはいないでしょう。

【出願人別出願件数ランキング】

出願人 出願件数
パナソニック株式会社 335
ファミリーイナダ株式会社 212
株式会社フジ医療器 119
日立マクセル株式会社 114
三洋電機株式会社 110
大東電機工業株式会社 104
パナソニック電工株式会社 100
TOTO株式会社 35
株式会社MTG 29
ツインバード工業株式会社 20

それぞれの出願人別出願年別出願件数推移は次のグラフのようになります。

【出願人別出願年別出願件数推移】

パナソニックは2011年まで出願件数が増加し、以降は出願件数を減らし続けています。富士医療機器は2006年と2007年の出願件数が多いが、それ以降の出願件数は2015年の11件以外は一桁代の出願件数となっています。ファミリーイナダは2006年-2008年は30件前後の出願件数でしたが、以後は一旦10件前後に出願件数を減少し、2013年以降に再び出願件数を増加しています。

さて、ここで参考情報として、価格.comからマッサージチェアの最近の市場シェア推定なんかも併せて見てみましょう。

【価格.com トレンドサーチ マッサージチェア市場シェア 2017年9月】

順位 メーカー名 PVシェア率
1 フジ医療器 46.30%
2 パナソニック 29.94%
3 ファミリーイナダ 10.90%
4 スライヴ 8.49%
5 富士メディック 1.25%

マッサージチェアではフジ医療機器が圧倒的な人気を誇り、次いでパナソニック、ファミリーイナダとなっています。これらが特許の出願人の上位にもなっています。スライヴ、富士メディックは出願件数の上位には入っていません。

このことから、パナソニック、ファミリーイナダ、フジ医療機器の特許出願にはマッサージチェアの関連技術の出願が多いことが想定されますが、パナソニックは家電量販店でそれ以外の足用マッサージ機等の商品を見かけることからマッサージチェア以外の出願も多いかもしれません。とはいえ、パナソニック、ファミリーイナダ、フジ医療機器の出願件数と市場シェアを見ると必ずしも出願件数が多いところが市場でも優位に立っているというわけでもないようです。これら3社以外の日立マクセル等の出願人はマッサージチェア以外の比較的小さなマッサージ機の出願が中心でしょうか。

この辺りは、ある程度、出願された技術の中身に踏み込まないとわかりません。とりあえずは、前回作成した出願人別Fターム別の件数表を見てみましょう。

Fタームの中身が表示されていないので、分かりにくいですね、このあたりは改良要です。Fタームと分類定義を紐づけた表をExcel等で作成して、Jupyter Notebookに読み込み、mergeで紐づければ良いと思いますが、その作業の説明やグラフの差し替え等はとりあえず省きます。ここでは、一つ一つの定義を記述します。DA05:対象-胴、DA10:対象ー脚、CA06:設置個所-いすの背部、BB03:駆動源-モータ、BB05:駆動源-ポンプ、DA06:対象-腰、CA03:設置個所-いす、AD02:もみ-流体駆動マット構造、CA01:設置個所-手持ち、BB01:人力になります。

CA01とBB01以外は、いすタイプのマッサージ機との関連性が深いと考えられる分類になります。人力のみに注力している出願人はおらず、手持ちが中心なのはツインバードとMTGになります。ツインバードはモーター駆動の手持ちタイプマッサージ機が中心で、MTGは顔の美容のためのコロコロマッサージが中心になります。大東電機工業と三洋電機は足モミが中心、フジ医療機器、日立マクセルは設置個所いすの分類が少ないため、部分もみが中心、そしてファミリーイナダ、パナソニックは椅子タイプが中心と言えるでしょうか。

椅子タイプはトップ出願人の特許網が厚く、これから参入するのはリスクが高いと考えられます。手持ちや人力タイプを中心に参入方針を考えたほうがよさそうです。(あえて椅子タイプでの隙間を探す方策もないわけではありませんが)

今回はこの辺で次回に続きます。(あるいは記事に後で書き足すかもしれません)

Why should we conduct patent analysis with Jupyter Notebook?

さて、何回か基礎的な特許分析をJupyter Notebookを用いて行う作業例を紹介してきました。

なんでまた、Juputer Notebook?

商用DBの機能で良いのでは?

市販の解析ツールで良いのでは?

Excelでできるのでは?

はい、どれでも良いです。特許分析を何を使ってやるのかなどもはや好みの問題です。

わざわざPythonやJuputer Notebookの使い方なんて覚える必要もないです。

そう思うならそうしてください。積極的におすすめする理由などありませn。

所属の組織がお金を出してくれて良い分析環境を提供してくれているのならこんなもの覚える必要も無いでしょう。

また、Juputer Notebookを使うためには、Anacondaの環境のインストールやproxyの設定等が必要であり、所属組織によっては色々と乗り越えるべき障害も出てくるでしょう。

だから、暇つぶしで趣味の特許マイナーの方で、これまでの記事を見て、Jupyter Notebookを使うのも面白そうだなと思えばやってみればいいんです。

これまでの記事は、操作の簡単な流れを中心に説明しました。PythonやJupyterの操作の基礎は詳しく説明していません。

世の中には良いPython、Jupyter本がたくさんあります。Qiitaの記事も沢山あります。

ここの記事をベースに自分のデータを用いた処理を行うとき、少しカスタマイズして試してみたいとき、間違いなくPython、Jupyterの基礎知識が必要になります。それを乗り越えてJupyter Notebookを使うのに意味を見出せるかたはやってみましょう。

そもそも、ここの記事を少しでも読んでみた時点で何かそれぞれ思うものがあるのではないでしょうか。

もちろん、私が感じているメリットもありはしますが、そんなものは人それぞれでしょう。

 

あとは、ここはあくまでも趣味の記事なので、予告なく記事が止まったり、閉鎖する可能性もあるので、あらかじめご了承ください。

Jupyter Notebookで特許分析(5)

前回までの処理手順を踏襲して、今回は新しいデータで分析を行ってみます。家電量販店等で並んでいるマッサージ機のデータを用いてみます。Fターム「4C100」の2006年以降出願分になります。処理内容はおおむね前回まで説明した内容と同じですので、Jupyter Notebookの画面のみで説明は飛ばしていきます。

import pandas as pd
import numpy as np
df1 = pd.read_excel('patentdata2.xlsx')
df1.head()
公報番号 出願日 公開日 出願人 発明者 IPC8 FI Fターム 名称 要約 審査・権利状況
0 特開2017-159091 2013-08-30 2017-09-14 日立マクセル株式会社 品川崇;木村智昭;末次諒子;手塚佳佑 A61H 7/00@AFI(JP) A61H 7/00 322 E 4C100 AD02;4C100 BA02;4C100 BB05;4C100 BC12;4C… マッサージ装置 【課題】装置本体部と押圧部とを一体化して操作を行いやすくすると共に、まとめて取り扱うことがで… 審査請求
1 特開2017-158925 2016-03-11 2017-09-14 パナソニックIPマネジメント株式会社 飯村直之;若林美津恵;柴武志 A61H 7/00@AFI(JP);A45D 97/00@ALI(JP) A61H 7/00 300 G;A45D 97/00 4C100 AA04;4C100 AA15;4C100 CA01;4C100 DA01 頭皮ケア装置、施術突起構造体、当該施術突起構造体で用いられるカバーおよび芯材 【課題】本体部が大型化してしまうのを抑制しつつ、施術突起の配置本数を増やすことのできる頭皮ケ… 出願
2 特開2017-158919 2016-03-11 2017-09-14 パナソニックIPマネジメント株式会社 湯川隆志;森川大輔;泉中健志;渥美紗知子 A61B 5/05@AFI(JP);A61H 7/00@ALI(JP) A61B 5/05 C;A61H 7/00 323 S 4C100 AD11;4C100 BA02;4C100 BA09;4C100 BB03;4C… 生体状態評価装置及びマッサージ機 【課題】汗に伴う生体状態評価の誤差を抑えることができるマッサージ機を提供する。【解決手段】マ… 出願
3 特開2017-158918 2016-03-11 2017-09-14 パナソニックIPマネジメント株式会社 湯川隆志;森川大輔;泉中健志;渥美紗知子 A61H 7/00@AFI(JP) A61H 7/00 323 S;A61H 7/00 323 L 4C100 AD17;4C100 BA03;4C100 BA09;4C100 BA10;4C… 生体状態評価装置及びマッサージ機 【課題】生体状態評価の精度を向上させることができるマッサージ機を提供する。【解決手段】マッサ… 出願
4 特開2017-158834 2016-03-10 2017-09-14 ファミリーイナダ株式会社 佐々木泉 A61H 7/00@AFI(JP) A61H 7/00 323 H;A61H 7/00 323 K 4C100 AD11;4C100 BA07;4C100 BB03;4C100 BC03;4C… マッサージ機 【課題】各部位に対して十分な強さでマッサージできるマッサージ機を提供することを目的とする。【… 出願
df1['公報番号'].groupby(df1['出願日'].dt.year).count()
出願年毎の出願件数データになります。後で、グラフ作成に用います。
出願日
2006    245
2007    236
2008    223
2009    201
2010    204
2011    206
2012    185
2013    183
2014    154
2015    149
2016     33
2017      1
Name: 公報番号, dtype: int64
apns = df1['出願人'].map(lambda x: x.split(";"))
ser1 = pd.Series(np.hstack(apns.values))
unique_apns = ser1.str.strip().unique()
unique_apns.sort()
def filter_df_by_apn(df, apn):
    apn_df = df.loc[df['出願人'].map(lambda x: apn in x)].copy()
    apn_df['出願人'] = apn
    return apn_df
apn_df_list =[filter_df_by_apn(df1, apn) for apn in unique_apns]
df2 = pd.concat(apn_df_list)
df2 = df2.loc[:,['公報番号','出願人','出願日']]
df2.sort_values('公報番号', inplace=True)
df2.head()
公報番号 出願人 出願日
2019 特表2008-532591 グリーンベルグロナルドアラン 2006-03-09
2018 特表2008-532697 エフケイエイディストリビューティングシーオー.ディー/ビー/エイホームディクス,インク. 2006-03-14
2017 特表2008-532714 エフケイエイディストリビューティングシーオー.ディー/ビー/エイホームディクス,インク. 2006-03-16
2016 特表2008-541900 ハンスグローエアーゲー 2006-05-20
2015 特表2008-546460 ウォーカー,ステファン 2006-06-19
df2['公報番号'].groupby([df2['出願人'], df2['出願日'].dt.year]).count()
出願人                                           出願日 
▲ケイ▼泰健康器材有限公司                                 2011     2
▲許▼敬▲鳳▼                                       2007     1
▲高▼島広雄                                        2015     1
あまの葉株式会社                                      2007     1
しげるテック株式会社                                    2009     1
アイコンフォートリミテッド                                 2013     1
アイシン精機株式会社                                    2013     1
                                              2014     2
                                              2015     2
アクアロール                                        2010     1
アドウィン・コリア・コーポレーション                            2006     1
アナスターシヴァヴヴェッスィファビオディアナスターシヴァヴヴェッスィファビオ        2007     1
アナトミックフォーカスリミテッド                              2014     1
アフン,クワングウー                                    2007     1
アルインコ株式会社                                     2011     1
アースライトマッサージテーブルズインコーポレイテッド                    2008     1
アース製薬株式会社                                     2009     1
インデルム                                         2015     1
インプラスフットケア,エルエルシー                             2016     1
イー―リー,ロク                                      2014     1
ウォーカー,ステファン                                   2006     1
エイチエルディーヘルシーライフディバイセズリミテッド                    2006     1
エイベックス,エルエルシー                                 2009     1
エスディーバイオテクノロジーズカンパニーリミテッド                     2016     1
エスパンシオーネマーケティングエッセ.ピ.ア.                       2010     1
エス・エム・ジェイ株式会社                                 2011     1
エヌビーエス株式会社                                    2011     1
エフケイエイディストリビューティングシーオー.ディー/ビー/エイホームディクス,インク.  2006     3
エポコラム機工株式会社                                   2011     1
エムシーヘルステック,エセ.エレ.                             2011     1
                                                      ..
高倉淳                                           2012     1
高木二朗太                                         2010     1
高橋ひとみ                                         2012     1
高橋博文                                          2011     1
高橋眞幸                                          2009     2
高田晴透                                          2011     1
鳥居諭                                           2012     1
麻野井英次                                         2008     1
黄智煥                                           2009     1
黄潤景                                           2015     1
黒岩明                                           2012     1
黒木薫                                           2011     2
                                              2012     1
黒田精工株式会社                                      2006     1
                                              2009     1
BBJハイテック株式会社                                  2009     1
JSR株式会社                                       2008     1
KAATSUJAPAN株式会社                               2006     1
                                              2012     1
NSファーファ・ジャパン株式会社                              2014     1
NTN株式会社                                       2010     2
NTTテクノクロス株式会社                                 2015     1
RIZAPグループ株式会社                                 2013     1
TBCグループ株式会社                                   2011     1
TOTO株式会社                                      2006    12
                                              2007    13
                                              2008     7
                                              2009     1
                                              2011     1
                                              2012     1
Name: 公報番号, Length: 872, dtype: int64
import difflib as diff
for (str1, str2) in [
    (str1, str2)
    for str1 in unique_apns
    for str2 in unique_apns
    if str1 < str2
    ]:
    # 類似度を計算、0.0~1.0 で結果が返る
    s = diff.SequenceMatcher(None, str1, str2).ratio()
    if s > 0.7:
        print (str1, "<->", str2)
        print ("match ratio:", s, "\n")
しげるテック株式会社 <-> エムテック株式会社
match ratio: 0.7368421052631579 

アイシン精機株式会社 <-> アルインコ株式会社
match ratio: 0.7368421052631579 

アルインコ株式会社 <-> ライオン株式会社
match ratio: 0.7058823529411765 

アース製薬株式会社 <-> パーパス株式会社
match ratio: 0.7058823529411765 

アース製薬株式会社 <-> 小林製薬株式会社
match ratio: 0.7058823529411765 

エヌビーエス株式会社 <-> エース消毒株式会社
match ratio: 0.7368421052631579 

エポコラム機工株式会社 <-> エレコム株式会社
match ratio: 0.7368421052631579 

エムテック株式会社 <-> エレコム株式会社
match ratio: 0.7058823529411765 

エムテック株式会社 <-> テイ・エステック株式会社
match ratio: 0.7619047619047619 

エレクトロメド・インコーポレイテッド <-> エレクトロメド,インコーポレイテッド
match ratio: 0.9444444444444444 

エレクトロメド・インコーポレイテッド <-> エレメメディカルインコーポレイテッド
match ratio: 0.7222222222222222 

エレクトロメド・インコーポレイテッド <-> エレメ・メディカル・インコーポレイテッド
match ratio: 0.7368421052631579 

エレクトロメド,インコーポレイテッド <-> エレメメディカルインコーポレイテッド
match ratio: 0.7222222222222222 

エレメメディカルインコーポレイテッド <-> エレメ・メディカル・インコーポレイテッド
match ratio: 0.9473684210526315 

エレメメディカルインコーポレイテッド <-> ダイナサームメディカル,インコーポレイテッド
match ratio: 0.75 

エレメメディカルインコーポレイテッド <-> パーフュジアメディカルインコーポレーテッド
match ratio: 0.717948717948718 

エレメ・メディカル・インコーポレイテッド <-> ダイナサームメディカル,インコーポレイテッド
match ratio: 0.7142857142857143 

エース消毒株式会社 <-> パーパス株式会社
match ratio: 0.7058823529411765 

オリンパス株式会社 <-> パーパス株式会社
match ratio: 0.7058823529411765 

オリンパス株式会社 <-> ライオン株式会社
match ratio: 0.7058823529411765 

オリンパス株式会社 <-> リンナイ株式会社
match ratio: 0.7058823529411765 

コーニンクレッカフィリップスエヌヴェ <-> コーニンクレッカフィリップスエレクトロニクスエヌヴィ
match ratio: 0.7727272727272727 

スライヴ株式会社 <-> ライオン株式会社
match ratio: 0.75 

セバシア,インコーポレイテッド <-> セルイージスデバイシィズインコーポレイテッド
match ratio: 0.7027027027027027 

セーレン株式会社 <-> ヤーマン株式会社
match ratio: 0.75 

セーレン株式会社 <-> 東洋レヂン株式会社
match ratio: 0.7058823529411765 

ソニー株式会社 <-> パナソニック株式会社
match ratio: 0.7058823529411765 

ソニー株式会社 <-> ユーズ株式会社
match ratio: 0.7142857142857143 

タイコヘイルスケアグループエルピー <-> タイコ・ヘルスケアー・グループ・エルピー
match ratio: 0.8648648648648649 

テイアサイエンス・インコーポレーテツド <-> テイライフサイエンスインコーポレイテッド
match ratio: 0.7692307692307693 

トッレグロサパスクアル,ドミンゴ <-> トッレグロサパスクアル,ホセ
match ratio: 0.8 

トヨタ紡織株式会社 <-> トヨタ自動車株式会社
match ratio: 0.7368421052631579 

トヨタ自動車株式会社 <-> 日産自動車株式会社
match ratio: 0.7368421052631579 

ハントリーテクノロジーリミテッド <-> ハントレイテクノロジーリミテッド
match ratio: 0.875 

パナソニック株式会社 <-> パナソニック電工株式会社
match ratio: 0.9090909090909091 

パナソニック株式会社 <-> パナソニックIPマネジメント株式会社
match ratio: 0.7142857142857143 

パラマウントベッド株式会社 <-> フランスベッド株式会社
match ratio: 0.75 

パーパス株式会社 <-> 東京パーツ株式会社
match ratio: 0.7058823529411765 

ファイテン株式会社 <-> ライオン株式会社
match ratio: 0.7058823529411765 

ベス工業株式会社 <-> 栗田工業株式会社
match ratio: 0.75 

ベス工業株式会社 <-> 金澤工業株式会社
match ratio: 0.75 

ヤマハ株式会社 <-> ヤーマン株式会社
match ratio: 0.8 

上海榮泰健康科技股▲ふん▼有限公司 <-> 慧坦科技股▲ふん▼有限公司
match ratio: 0.7333333333333333 

中西電機工業株式会社 <-> 大東電機工業株式会社
match ratio: 0.8 

九州日立マクセル株式会社 <-> 日立マクセル株式会社
match ratio: 0.9090909090909091 

光▲いく▼金▲屬▼有限公司 <-> 光▲いく▼金屬有限公司
match ratio: 0.9166666666666666 

公立大学法人高知工科大学 <-> 国立大学法人高知大学
match ratio: 0.8181818181818182 

国立大学法人大分大学 <-> 国立大学法人東京大学
match ratio: 0.8 

国立大学法人大分大学 <-> 国立大学法人東北大学
match ratio: 0.8 

国立大学法人大分大学 <-> 国立大学法人高知大学
match ratio: 0.8 

国立大学法人大分大学 <-> 国立大学法人鳥取大学
match ratio: 0.8 

国立大学法人東京大学 <-> 国立大学法人東北大学
match ratio: 0.9 

国立大学法人東京大学 <-> 国立大学法人高知大学
match ratio: 0.8 

国立大学法人東京大学 <-> 国立大学法人鳥取大学
match ratio: 0.8 

国立大学法人東北大学 <-> 国立大学法人高知大学
match ratio: 0.8 

国立大学法人東北大学 <-> 国立大学法人鳥取大学
match ratio: 0.8 

国立大学法人高知大学 <-> 国立大学法人鳥取大学
match ratio: 0.8 

大阪瓦斯株式会社 <-> 東京瓦斯株式会社
match ratio: 0.75 

大阪瓦斯株式会社 <-> 東邦瓦斯株式会社
match ratio: 0.75 

川本産業株式会社 <-> 紀伊産業株式会社
match ratio: 0.75 

日本発條株式会社 <-> 日本電気株式会社
match ratio: 0.75 

日本電信電話株式会社 <-> 日本電気株式会社
match ratio: 0.7777777777777778 

有限会社トウイング <-> 有限会社トーイチ
match ratio: 0.7058823529411765 

有限会社上川製作所 <-> 有限会社村製作所
match ratio: 0.8235294117647058 

有限会社村製作所 <-> 株式会社村田製作所
match ratio: 0.7058823529411765 

東京パーツ株式会社 <-> 東京瓦斯株式会社
match ratio: 0.7058823529411765 

東京瓦斯株式会社 <-> 東邦瓦斯株式会社
match ratio: 0.875 

栗田工業株式会社 <-> 金澤工業株式会社
match ratio: 0.75 

栗田工業株式会社 <-> 黒田精工株式会社
match ratio: 0.75 

株式会社アイアイ <-> 株式会社アイセン
match ratio: 0.75 

株式会社アイセン <-> 株式会社アドバンス
match ratio: 0.7058823529411765 

株式会社アイセン <-> 株式会社アンス
match ratio: 0.8 

株式会社アイセン <-> 株式会社セコ
match ratio: 0.7142857142857143 

株式会社アイティボックス <-> 株式会社アテックス
match ratio: 0.8571428571428571 

株式会社アコーズ <-> 株式会社コニー
match ratio: 0.8 

株式会社アコーズ <-> 株式会社コーセー
match ratio: 0.75 

株式会社アコーズ <-> 株式会社セコ
match ratio: 0.7142857142857143 

株式会社アスク <-> 株式会社アテックス
match ratio: 0.75 

株式会社アスク <-> 株式会社アドバンス
match ratio: 0.75 

株式会社アスク <-> 株式会社アンス
match ratio: 0.8571428571428571 

株式会社アスク <-> 株式会社ミクロ
match ratio: 0.7142857142857143 

株式会社アテックス <-> 株式会社アンス
match ratio: 0.75 

株式会社アテックス <-> 株式会社テスコム
match ratio: 0.7058823529411765 

株式会社アテックス <-> 株式会社フューテック
match ratio: 0.7368421052631579 

株式会社アドバンス <-> 株式会社アンス
match ratio: 0.875 

株式会社クロシオ <-> 株式会社タオ
match ratio: 0.7142857142857143 

株式会社クロシオ <-> 株式会社ミクロ
match ratio: 0.8 

株式会社コジット <-> 株式会社コレッド
match ratio: 0.75 

株式会社コジット <-> 株式会社セコ
match ratio: 0.7142857142857143 

株式会社コニー <-> 株式会社コーセー
match ratio: 0.8 

株式会社コニー <-> 株式会社セコ
match ratio: 0.7692307692307693 

株式会社コレッド <-> 株式会社セコ
match ratio: 0.7142857142857143 

株式会社コーセー <-> 株式会社セコ
match ratio: 0.7142857142857143 

株式会社セコ <-> 株式会社テスコム
match ratio: 0.7142857142857143 

株式会社タオ <-> 株式会社タダノ
match ratio: 0.7692307692307693 

株式会社タオ <-> 株式会社ヒラタ
match ratio: 0.7692307692307693 

株式会社タオ <-> 株式会社マルタカ
match ratio: 0.7142857142857143 

株式会社タダノ <-> 株式会社ヒラタ
match ratio: 0.7142857142857143 

株式会社デンソー <-> 株式会社プロンテー
match ratio: 0.7058823529411765 

株式会社ヒラタ <-> 株式会社ライズ
match ratio: 0.7142857142857143 

株式会社ライズ <-> 株式会社レアーライブ
match ratio: 0.7058823529411765 

株式会社山利製作所 <-> 株式会社山田精密製作所
match ratio: 0.8 

株式会社山利製作所 <-> 株式会社惣田製作所
match ratio: 0.7777777777777778 

株式会社山利製作所 <-> 株式会社村田製作所
match ratio: 0.7777777777777778 

株式会社山利製作所 <-> 株式会社神田製作所
match ratio: 0.7777777777777778 

株式会社山利製作所 <-> 株式会社鹿浜製作所
match ratio: 0.7777777777777778 

株式会社山田精密製作所 <-> 株式会社惣田製作所
match ratio: 0.8 

株式会社山田精密製作所 <-> 株式会社村田製作所
match ratio: 0.8 

株式会社山田精密製作所 <-> 株式会社神田製作所
match ratio: 0.8 

株式会社惣田製作所 <-> 株式会社村田製作所
match ratio: 0.8888888888888888 

株式会社惣田製作所 <-> 株式会社神田製作所
match ratio: 0.8888888888888888 

株式会社惣田製作所 <-> 株式会社鹿浜製作所
match ratio: 0.7777777777777778 

株式会社村田製作所 <-> 株式会社神田製作所
match ratio: 0.8888888888888888 

株式会社村田製作所 <-> 株式会社鹿浜製作所
match ratio: 0.7777777777777778 

株式会社永和工学 <-> 株式会社真和
match ratio: 0.7142857142857143 

株式会社神田製作所 <-> 株式会社鹿浜製作所
match ratio: 0.7777777777777778 

株式会社H&E <-> 株式会社HNS
match ratio: 0.7142857142857143 

株式会社HNS <-> 株式会社JSV
match ratio: 0.7142857142857143 

株式会社INAX <-> 株式会社LIXIL
match ratio: 0.7058823529411765 

株式会社JSV <-> 株式会社Joy
match ratio: 0.7142857142857143 

深▲せん▼市▲軽▼松科技股▲分▼有限公司 <-> 深▲せん▼市倍軽松科技股▲ふん▼有限公司
match ratio: 0.85 

深▲せん▼市▲軽▼松科技股▲分▼有限公司 <-> 深▲せん▼市倍軽松科技股分有限公司
match ratio: 0.8648648648648649 

深▲せん▼市倍軽松科技股▲ふん▼有限公司 <-> 深▲せん▼市倍軽松科技股分有限公司
match ratio: 0.8648648648648649 
df2.loc[df2['出願人'] == 'エレクトロメド,インコーポレイテッド', '出願人'] = 'エレクトロメド・インコーポレイテッド'
df2.loc[df2['出願人'] == 'エレメメディカルインコーポレイテッド', '出願人'] = 'エレメ・メディカル・インコーポレイテッド'
df2.loc[df2['出願人'] == 'コーニンクレッカフィリップスエヌヴェ', '出願人'] = 'コーニンクレッカフィリップスエレクトロニクスエヌヴィ'
df2.loc[df2['出願人'] == 'タイコヘイルスケアグループエルピー', '出願人'] = 'タイコ・ヘルスケアー・グループ・エルピー'
df2.loc[df2['出願人'] == 'パナソニックIPマネジメント株式会社', '出願人'] = 'パナソニック株式会社'
df2.loc[df2['出願人'] == '光▲いく▼金▲屬▼有限公司', '出願人'] = '光▲いく▼金屬有限公司'
df3 = df2['公報番号'].groupby([df2['出願人'], df2['出願日'].dt.year]).count()
df2['公報番号'].groupby(df2['出願人']).count().nlargest(10)
出願人のTOP10件数です。
出願人
パナソニック株式会社      335
ファミリーイナダ株式会社    212
株式会社フジ医療器       119
日立マクセル株式会社      114
三洋電機株式会社        110
大東電機工業株式会社      104
パナソニック電工株式会社    100
TOTO株式会社         35
株式会社MTG          29
ツインバード工業株式会社     20
Name: 公報番号, dtype: int64
fts = df1['Fターム'].map(lambda x: x.split(';'))
ser2 = pd.Series(np.hstack(fts.values))
unique_fts = ser2.str.strip().unique()
unique_fts.sort()
def filter_df_by_ft(df, ft):
    ft_df = df.loc[df['Fターム'].map(lambda x: ft in x)].copy()
    ft_df['Fターム'] = ft
    return ft_df
ft_df_list =[filter_df_by_ft(df1, ft) for ft in unique_fts]
df4 = pd.concat(ft_df_list)
df4 = df4.loc[:,['公報番号','Fターム','出願日']]
df4.sort_values('公報番号', inplace=True)
df4.head()
公報番号 Fターム 出願日
2019 特表2008-532591 4C074 BB01 2006-03-09
2019 特表2008-532591 4C100 BB05 2006-03-09
2019 特表2008-532591 4C074 FF09 2006-03-09
2019 特表2008-532591 4C074 AA10 2006-03-09
2019 特表2008-532591 4C074 DD01 2006-03-09
df5 = df4.copy()
df5['Fターム'] = df5['Fターム'].str[0:5]
df5.head()
公報番号 Fターム 出願日
2019 特表2008-532591 4C074 2006-03-09
2019 特表2008-532591 4C100 2006-03-09
2019 特表2008-532591 4C074 2006-03-09
2019 特表2008-532591 4C074 2006-03-09
2019 特表2008-532591 4C074 2006-03-09
df5 = df5.drop_duplicates()
df5.head()
公報番号 Fターム 出願日
2019 特表2008-532591 4C074 2006-03-09
2019 特表2008-532591 4C100 2006-03-09
2018 特表2008-532697 4C094 2006-03-14
2018 特表2008-532697 4C074 2006-03-14
2018 特表2008-532697 4C100 2006-03-14
df6 = pd.merge(df2, df4, on='公報番号')
df6.head()
分割した出願人データと分割したFタームデータを合体させました。出願日が重複しているのでxやyのラベルが付加されていますが気にしないでください。
公報番号 出願人 出願日_x Fターム 出願日_y
0 特表2008-532591 グリーンベルグロナルドアラン 2006-03-09 4C074 BB01 2006-03-09
1 特表2008-532591 グリーンベルグロナルドアラン 2006-03-09 4C100 BB05 2006-03-09
2 特表2008-532591 グリーンベルグロナルドアラン 2006-03-09 4C074 FF09 2006-03-09
3 特表2008-532591 グリーンベルグロナルドアラン 2006-03-09 4C074 AA10 2006-03-09
4 特表2008-532591 グリーンベルグロナルドアラン 2006-03-09 4C074 DD01 2006-03-09
df4['公報番号'].groupby(df4['Fターム']).count().nlargest(10)
FタームのTOP10件数です。
Fターム
4C100 DA05    768
4C100 DA10    686
4C100 BB03    608
4C100 BB05    572
4C100 CA06    514
4C100 CA01    489
4C100 DA06    395
4C100 AD02    350
4C100 BB01    350
4C100 CA03    327
Name: 公報番号, dtype: int64
df7 = df6[(df6['出願人'].isin(df2['公報番号'].groupby(df2['出願人']).count().nlargest(10).index)) & (df6['Fターム'].isin(df4['公報番号'].groupby(df4['Fターム']).count().nlargest(10).index))]
df8 = df7.pivot_table(index='出願人', columns='Fターム', values='公報番号', aggfunc='count', margins=True)
df8 = df8.sort_values(by=["All"], ascending=False)
df8 = df8.sort_values(by=["All"], axis=1, ascending=False)
df8 = df8.drop("All", axis=1)
df8 = df8.drop("All", axis=0)
df8
出願人別Fターム別出願件数表です。
Fターム 4C100 DA05 4C100 DA10 4C100 CA06 4C100 BB03 4C100 BB05 4C100 DA06 4C100 CA03 4C100 AD02 4C100 CA01 4C100 BB01
出願人
パナソニック株式会社 137.0 95.0 123.0 121.0 94.0 78.0 77.0 65.0 39.0 6.0
ファミリーイナダ株式会社 119.0 101.0 108.0 90.0 83.0 76.0 73.0 47.0 6.0 1.0
株式会社フジ医療器 75.0 61.0 57.0 37.0 62.0 42.0 37.0 43.0 NaN NaN
日立マクセル株式会社 55.0 53.0 48.0 38.0 55.0 27.0 27.0 36.0 19.0 12.0
三洋電機株式会社 41.0 65.0 42.0 34.0 41.0 31.0 26.0 32.0 NaN NaN
パナソニック電工株式会社 53.0 25.0 43.0 36.0 39.0 16.0 32.0 20.0 12.0 1.0
大東電機工業株式会社 43.0 54.0 37.0 56.0 13.0 17.0 23.0 8.0 6.0 5.0
株式会社MTG 2.0 7.0 NaN 3.0 2.0 4.0 1.0 3.0 26.0 23.0
TOTO株式会社 17.0 10.0 5.0 3.0 20.0 9.0 1.0 4.0 1.0 NaN
ツインバード工業株式会社 NaN NaN NaN 19.0 NaN NaN NaN NaN 18.0 NaN
df9 = df2[df2['出願人'].isin(df2['公報番号'].groupby(df2['出願人']).count().nlargest(10).index)]
df9 = df9.pivot_table(index=df9['出願日'].dt.year, columns='出願人', values='公報番号', aggfunc='count')
df9
出願人別出願件数推移です。
出願人 ツインバード工業株式会社 パナソニック株式会社 パナソニック電工株式会社 ファミリーイナダ株式会社 三洋電機株式会社 大東電機工業株式会社 日立マクセル株式会社 株式会社フジ医療器 株式会社MTG TOTO株式会社
出願日
2006 2.0 15.0 33.0 25.0 25.0 3.0 7.0 31.0 NaN 12.0
2007 3.0 29.0 23.0 33.0 12.0 2.0 10.0 38.0 1.0 13.0
2008 3.0 28.0 22.0 25.0 19.0 10.0 9.0 8.0 NaN 7.0
2009 7.0 47.0 7.0 11.0 24.0 14.0 2.0 5.0 NaN 1.0
2010 NaN 48.0 15.0 8.0 21.0 12.0 14.0 2.0 5.0 NaN
2011 NaN 56.0 NaN 15.0 9.0 10.0 9.0 7.0 7.0 1.0
2012 2.0 38.0 NaN 16.0 NaN 13.0 25.0 7.0 3.0 1.0
2013 NaN 33.0 NaN 18.0 NaN 14.0 13.0 6.0 6.0 NaN
2014 3.0 26.0 NaN 27.0 NaN 9.0 11.0 2.0 4.0 NaN
2015 NaN 7.0 NaN 29.0 NaN 12.0 14.0 11.0 NaN NaN
2016 NaN 8.0 NaN 5.0 NaN 5.0 NaN 2.0 3.0 NaN
ここまでで、基礎的な件数データの準備は終わったので、グラフを書いていきます。今回はbokehを使っていきます。まずは、集合全体での出願年別出願件数推移から。
from bokeh.charts import output_notebook, Bar, Line, HeatMap, show
from bokeh.palettes import RdYlGn6
output_notebook()

p1 = Line(df1['公報番号'].groupby(df1['出願日'].dt.year).count(), plot_width=600, plot_height=200, legend = False)
p1.xaxis.axis_label = '出願年'
p1.yaxis.axis_label = '出願件数'
show(p1)
次に、上位の出願人別出願年別出願件数推移を作成します。
p2 = Line(df9, plot_width=800, plot_height=400)
p2.xaxis.axis_label = '出願年'
p2.yaxis.axis_label = '出願件数'
p2.legend.location = "top_right"
show(p2)
 
count3 = []
for x in df8.apply(tuple):
    count3.extend(x)

data = {
  '出願人': list(df8.index) * len(df8.columns),
  'Fターム':  [item for item in list(df8.columns) for i in range(len(df8.index))],
  '件数':   count3,
}

p3 = HeatMap(data, x='Fターム', y='出願人',values='件数', title='出願人別Fターム別件数', stat=None)
show(p3)
 
こんな感じで、Jupyter Notebook上でグラフ作成まで行うこともできます。前回の記事でも述べましたが、データフレームはExcelに出力することもできるので、Jupyter Notebook上ではなくExcel上でグラフ作成することもできます。

Jupyter Notebookで特許分析(4)

前回の出願人の切り分け処理から今度は特許分類の切り分けを行っていきます。どれでも良いのですが、FIで行っていくことにします。出願人と異なり特許分類データは統制されているはずなので名寄せは気にしません。切り分け部分は出願人の切り分けで用いたものを流用していきます。

fis = df1['FI'].map(lambda x: x.split(';'))
ser2 = pd.Series(np.hstack(fis.values))
unique_fis = ser2.str.strip().unique()
unique_fis.sort()
def filter_df_by_fi(df, fi):
    fi_df = df.loc[df['FI'].map(lambda x: fi in x)].copy()
    fi_df['FI'] = fi
    return fi_df
fi_df_list =[filter_df_by_fi(df1, fi) for fi in unique_fis]
df4 = pd.concat(fi_df_list)
df4 = df4.loc[:,['公報番号','FI','出願日']]
df4.sort_values('公報番号', inplace=True)
df4.head()
以上の処理で、以下のようなFIを切り分けたデータフレームが出来上がります。
公報番号 FI 出願日
120 特表2017-502711 A61B 5/05 N 2014-11-06
120 特表2017-502711 A61B 90/00 2014-11-06
120 特表2017-502711 A61B 5/04 300 P 2014-11-06
120 特表2017-502711 A61B 5/04 300 N 2014-11-06
120 特表2017-502711 A61B 10/00 V 2014-11-06
ただし、元のFIのままであるため、サブクラスレベルのFIを切り出すために以下の処理を行います。
df5 = df4
df5['FI'] = df5['FI'].str[0:4]
df5.head()
分類をサブクラスレベルに丸めた結果、重複データ行が出来ています。
公報番号 FI 出願日
120 特表2017-502711 A61B 2014-11-06
120 特表2017-502711 A61B 2014-11-06
120 特表2017-502711 A61B 2014-11-06
120 特表2017-502711 A61B 2014-11-06
120 特表2017-502711 A61B 2014-11-06
以下の処理で重複を取り除きます。
df5 = df5.drop_duplicates()
df5.head()
無事重複が取り除かれました。
公報番号 FI 出願日
120 特表2017-502711 A61B 2014-11-06
119 特表2017-503167 G01J 2014-12-22
118 特表2017-503223 G06Q 2013-11-15
117 特表2017-504087 G06Q 2014-11-10
117 特表2017-504087 G06N 2014-11-10
これをPandasのmergeで既に作成した出願人のデータフレームdf2と合体させます。
df6 = pd.merge(df2, df5, on='公報番号')
df6.head()
切り分けた出願人とFIとを合体させたデータができました。
公報番号 出願人 出願日_x FI 出願日_y
0 特表2017-502711 セーフオプサージカルインコーポレイテッド 2014-11-06 A61B 2014-11-06
1 特表2017-503167 スリーエムイノベイティブプロパティズカンパニー 2014-12-22 G01J 2014-12-22
2 特表2017-503223 テンテンテクノロジーズリミテッド 2013-11-15 G06Q 2013-11-15
3 特表2017-504087 コーニンクレッカフィリップスエヌヴェ 2014-11-10 G06Q 2014-11-10
4 特表2017-504087 コーニンクレッカフィリップスエヌヴェ 2014-11-10 G06N 2014-11-10
これをExcelに書き出してExcelのピボットテーブルで集計することもできますが、ここはJupyter上でピボットテーブルを作成します。
df7 = df6.pivot_table(index='出願人', columns='FI', values='公報番号', aggfunc='count', margins=True)
df7
こんな感じ、データがないNaNの部分が多いですね。
FI A01K A24F A47F A47L A61B A61D A61G A61H A61M A61N H02B H02J H02S H04L H04M H04N H04Q H04W H05B All
出願人
みこらった株式会社 NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 3.0
アイフォーシーイノベーションズインコーポレイテッド 1.0 NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2.0
アクシスアーベー NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN 2.0
アディダスアーゲー NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 3.0
アーマッド・アルサエド・エム・アルガジ NaN NaN NaN NaN 1.0 NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2.0
アール・エイ・アイ・ストラテジック・ホールディングス・インコーポレイテッド NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0
ア-カムアーベー NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.0
イウン、スツ・ファン NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 NaN 1.0 NaN NaN 3.0
インタートラストテクノロジーズコーポレイション NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN 2.0
インターナショナル・ビジネス・マシーンズ・コーポレーション NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN 3.0
インテルコーポレイション NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2.0 NaN 4.0
ウィルマーディング・コミュニケーションズ・エルエルシー NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN 1.0 NaN 2.0
ウテエス・ア・デシャン・エ・フィス NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0
エスゼットディージェイアイテクノロジーカンパニーリミテッド NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 3.0
オムロン株式会社 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2.0
カシオ計算機株式会社 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN 3.0
キム,ヨンソク NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2.0
キヤノンマーケティングジャパン株式会社 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2.0
キヤノンITソリューションズ株式会社 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2.0
ギガコリアコーリミテッド NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0
クアルコム,インコーポレイテッド NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 3.0 NaN 3.0 NaN NaN 9.0
グリー株式会社 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 3.0
グーグルインコーポレイテッド NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN 8.0
コウアヒェ,ノルディン NaN NaN NaN NaN 1.0 NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.0
コーテックインダストリーズプロプライアタリーリミテッド NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0
コーニンクレッカフィリップスエヌヴェ NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2.0
サウジアラビアンオイルカンパニー NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.0
サターンライセンシングエルエルシー NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 3.0
サムスンエレクトロニクスカンパニーリミテッド NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 NaN NaN NaN 7.0
ザコカ・コーラカンパニー NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2.0
ルミラディーエックスユーケーリミテッド NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0
ローベルトボッシュゲゼルシャフトミットベシュレンクテルハフツング NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.0
ヴァイアヴィ・ソリューションズ・インコーポレイテッド NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.0
ヴェルトアナリティクスオサケウフティオ NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2.0
三星電子株式会社 NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN 3.0
国立大学法人埼玉大学 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.0
国立大学法人東北大学 NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 3.0
国立研究開発法人情報通信研究機構 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN 1.0 1.0 NaN 4.0
太田崇博 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN 2.0
富士ゼロックス株式会社 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0
小米科技有限責任公司 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2.0
日本信号株式会社 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.0
日立マクセル株式会社 NaN NaN NaN NaN 1.0 NaN NaN 1.0 NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.0
旭化成ホームズ株式会社 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 NaN NaN NaN NaN NaN NaN NaN 2.0
東芝ライテック株式会社 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0
株式会社カカオ NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2.0
株式会社ケット科学研究所 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0
株式会社スクウェア・エニックス・ホールディングス NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN 4.0
株式会社ブリヂストン NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2.0
株式会社リコー NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2.0
株式会社ワイティーエム NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2.0
株式会社三洋物産 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0
株式会社北電子 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0
株式会社半導体エネルギー研究所 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2.0 7.0
株式会社東芝 NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 4.0
株式会社Agoop NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 3.0
株式会社REALONETECHNOLOGY NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 3.0
華為技術有限公司 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 NaN 1.0
華為終端有限公司 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2.0
All 1.0 1.0 1.0 1.0 11.0 1.0 1.0 3.0 1.0 3.0 1.0 4.0 2.0 6.0 17.0 4.0 10.0 8.0 7.0 275.0

109 rows × 78 columns

行の小計と列の小計を降順でソートしてみます。
df7 = df7.sort_values(by=["All"], ascending=False)
df7 = df7.sort_values(by=["All"], axis=1, ascending=False)
df7
ソートができました。それでもNaNが目立ちますね。もともとZITのデータなので分類がサブクラスレベルでもかなり色々な分野に分散しているということです。これはこれで面白いですね。
これで、特許情報をJupyter上で処理する基本操作としては一通り説明しました。後は、1セルに複数あるようなデータ項目は出願人やFIのような分割処理を行い、必要に応じてデータを結合して集計処理を行えば、様々な処理を行うことができます。
ZITのデータも飽きたので、次回はデータを変えて、集計したデータの可視化について行っていきたいと思います。
FI All G06Q G06F H04M G08G A61B H04Q H04W H05B G01S B61K G05B G05D B67D G06K B64F B64D B64C B61L A01K
出願人
All 275.0 44.0 31.0 17.0 15.0 11.0 10.0 8.0 7.0 7.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
クアルコム,インコーポレイテッド 9.0 NaN 3.0 3.0 NaN NaN 3.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
グーグルインコーポレイテッド 8.0 NaN 1.0 NaN 3.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
株式会社半導体エネルギー研究所 7.0 NaN NaN NaN NaN NaN NaN NaN 2.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
サムスンエレクトロニクスカンパニーリミテッド 7.0 NaN 1.0 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
ピーティーシーインコーポレイテッド 6.0 NaN 2.0 2.0 NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
ヴァイアヴィ・ソリューションズ・インコーポレイテッド 5.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
ローベルトボッシュゲゼルシャフトミットベシュレンクテルハフツング 5.0 NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN
タレス・カナダ・インク 5.0 NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 NaN NaN NaN NaN NaN NaN NaN 1.0 NaN
ハイドロ-エアー、インコーポレイテッド 5.0 NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 NaN NaN
インテルコーポレイション 4.0 NaN 1.0 NaN NaN NaN NaN 2.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
国立研究開発法人情報通信研究機構 4.0 NaN NaN NaN NaN NaN 1.0 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
ア-カムアーベー 4.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
フィリップスライティングホールディングビーヴィ 4.0 NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
サウジアラビアンオイルカンパニー 4.0 3.0 NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
コウアヒェ,ノルディン 4.0 NaN 1.0 NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
国立大学法人埼玉大学 4.0 1.0 NaN NaN 1.0 NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
ゼネラル・エレクトリック・カンパニイ 4.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
日本信号株式会社 4.0 1.0 NaN NaN 1.0 NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
株式会社スクウェア・エニックス・ホールディングス 4.0 1.0 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
株式会社東芝 4.0 2.0 NaN NaN NaN 1.0 NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
日立マクセル株式会社 4.0 1.0 NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
三星電子株式会社 3.0 NaN 1.0 NaN NaN 1.0 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
センシティシステムズインコーポレイテッド 3.0 NaN 1.0 NaN NaN NaN 1.0 NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
ヤフー株式会社 3.0 1.0 NaN 1.0 NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
マイクロソフトテクノロジーライセンシング,エルエルシー 3.0 1.0 NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
国立大学法人東北大学 3.0 2.0 NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
株式会社Agoop 3.0 1.0 NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
ノキアテクノロジーズオーユー 3.0 NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
ナヤヘルス,インコーポレイテッド 3.0 NaN NaN 1.0 NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
トリアビューティインコーポレイテッド 2.0 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
ウィルマーディング・コミュニケーションズ・エルエルシー 2.0 NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
フェイスブック,インク. 2.0 1.0 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
フジフィルムメディカルシステムズユーエスエイインコーポレイテッド 2.0 1.0 NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
ゼットティーイーコーポレーション 2.0 NaN NaN 1.0 NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
株式会社北電子 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
ソニー株式会社 1.0 NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
ソニーコーポレイションオブアメリカ 1.0 NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
スカイリットコーポレーション 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
ウテエス・ア・デシャン・エ・フィス 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
テンテンテクノロジーズリミテッド 1.0 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
華為技術有限公司 1.0 NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
株式会社ケット科学研究所 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
株式会社三洋物産 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
富士ゼロックス株式会社 1.0 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
東芝ライテック株式会社 1.0 NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
ナイキイノベイトシーブイ 1.0 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
ニューロスキー・インコーポレーテッド 1.0 NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
ハイアービュー・インコーポレイテッド 1.0 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
ギガコリアコーリミテッド 1.0 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
バートン、デイビッド 1.0 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
パナソニック株式会社 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
ルミラディーエックスユーケーリミテッド 1.0 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
ランディス・ギアイノベーションズインコーポレイテッド 1.0 NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
ピクセルロットエルティーディー. 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
アール・エイ・アイ・ストラテジック・ホールディングス・インコーポレイテッド 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
コーテックインダストリーズプロプライアタリーリミテッド 1.0 NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
セーフオプサージカルインコーポレイテッド 1.0 NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
ミュージックスターエルエルシー 1.0 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
スリーエムイノベイティブプロパティズカンパニー 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

109 rows × 78 columns


Jupyter Notebookで特許分析(3)

それでは、前回の続きで出願人の名寄せの処理を行っていきます。前回までの作業で、共同出願人をばらして、1出願人毎に公報番号と出願人と出願日が入ったデータフレームdf2を作成しました。単にばらしただけなので出願人名の名寄せはできていません。前回集計した際にもその点が問題として残りました。同じ出願人なのにその表記がばらついていると別々の出願人として集計してしまいます。それを避けるための名寄せになります。

さて、出願人名の名寄せの処理ですが、何か自動的にできるような話を期待されてた方は申し訳ありません。ある程度の軽減はしますが、名寄せの作業自体は手作業が入ります。それでは、前回の作業からの続きで説明していきます。

まずは、名寄せの処理をある程度軽減するためにdifflibをインポートします。

import difflib as diff
I先に作った出願人のリストunique_apnsから二つの出願人の組み合わせを重複無しで取り出して、difflibで二つのテキストのマッチ度を算出するSequenceMatcherを用いて、テキスト全体の長さの内で同じテキストの羅列がある割合を計算します。それが0.7を超えているものを名寄せの候補としてリストアップします。
for (str1, str2) in [
        (str1, str2)
        for str1 in unique_apns
        for str2 in unique_apns
        if str1 < str2
    ]:
    # 類似度を計算、0.0~1.0 で結果が返る
    s = diff.SequenceMatcher(None, str1, str2).ratio()
    if s > 0.7:
        print (str1, "<->", str2)
        print ("match ratio:", s, "\n")
 こんな感じです。
アイフォーシーイノベーションズインコーポレイテッド <-> ランディス・ギアイノベーションズインコーポレイテッド
match ratio: 0.7450980392156863 

インテルアイピーコーポレイション <-> インテルコーポレイション
match ratio: 0.8571428571428571 

インテルアイピーコーポレイション <-> インテル・コーポレーション
match ratio: 0.7586206896551724 

インテルコーポレイション <-> インテル・コーポレーション
match ratio: 0.88 

クアルコム,インコーポレイテッド <-> グーグルインコーポレイテッド
match ratio: 0.7333333333333333 

クアルコム,インコーポレイテッド <-> ナヤヘルス,インコーポレイテッド
match ratio: 0.75 

グリー株式会社 <-> ソニー株式会社
match ratio: 0.7142857142857143 

グリー株式会社 <-> ヤフー株式会社
match ratio: 0.7142857142857143 

グーグルインコーポレイテッド <-> セーフオプサージカルインコーポレイテッド
match ratio: 0.7058823529411765 

グーグルインコーポレイテッド <-> ナヤヘルス,インコーポレイテッド
match ratio: 0.7333333333333333 

グーグルインコーポレイテッド <-> ピーティーシーインコーポレイテッド
match ratio: 0.7096774193548387 

センシティシステムズインコーポレイテッド <-> ピーティーシーインコーポレイテッド
match ratio: 0.7027027027027027 

ソニー株式会社 <-> パナソニック株式会社
match ratio: 0.7058823529411765 

ソニー株式会社 <-> ヤフー株式会社
match ratio: 0.7142857142857143 

トリアビューティインコーポレイテッド <-> ハイアービュー・インコーポレイテッド
match ratio: 0.7777777777777778 

トリアビューティインコーポレイテッド <-> ピーティーシーインコーポレイテッド
match ratio: 0.7428571428571429 

ハイアービュー・インコーポレイテッド <-> ハイドロ-エアー、インコーポレイテッド
match ratio: 0.7567567567567568 

パナソニック株式会社 <-> パナソニックIPマネジメント株式会社
match ratio: 0.7142857142857143 

ローベルトボッシュゲゼルシャフトミットベシュレンクテルハフツング <-> ローベルトボツシユゲゼルシヤフトミツトベシユレンクテルハフツング
match ratio: 0.84375 

国立大学法人埼玉大学 <-> 国立大学法人東北大学
match ratio: 0.8 

華為技術有限公司 <-> 華為終端有限公司
match ratio: 0.75 

マッチ度が高い上記の候補の中でも、名寄せすべきもの、そうでないものは人手で判断することになります。また、社名変更等で同じ出願人だけど大きく変わっているものは、difflibでは無理なので、それも人手で判断する必要があります。名寄せの候補が決まったら、次の様に名寄せの対象の出願人名のデータフレームを探し出して(左側)、名寄せする出願人名に書き換えます(右側)。手作業は避けられませんが、一度、このような名寄せ用の修正処理の記述を集めておけば、次回以降の処理では手間が軽減されるはずです。
df2.loc[df2['出願人'] == 'インテルアイピーコーポレイション', '出願人'] = 'インテルコーポレイション'
df2.loc[df2['出願人'] == 'インテル・コーポレーション', '出願人'] = 'インテルコーポレイション'
df2.loc[df2['出願人'] == 'ローベルトボツシユゲゼルシヤフトミツトベシユレンクテルハフツング', '出願人'] = 'ローベルトボッシュゲゼルシャフトミットベシュレンクテルハフツング'
名寄せが終わったら、再度、、出願人別の出願年別出願件数集計表を作成して新たなデータフレームdf3に保存します。
df3 = df2['公報番号'].groupby([df2['出願人'], df2['出願日'].dt.year]).count()
作成したdf3はエクセルデータとして出力することもできます。エクセルデータとして出力するためのxlsxwriterをインポートしてdf3.to_excelで任意のファイル名で出力します。
import xlsxwriter
df3.to_excel('apn_list.xlsx')
出力したエクセルのサンプルapn_list.xlsxを置いておきます。ここまでで、エクセルファイルからの読み込みと書き出しの両方を説明したので、今回のdifflibを用いた手法ではなく、一旦書き出した上で以前の記事で紹介したOpen Refineを用いて名寄せを行って、再度読み込むという手法も可能ではありますが、その辺は臨機応変に行っていただけば良いと思います。名寄せの手法は色々あり、今回提示した手法もその一つにすぎません。Excelに書き出して、Excel上で名寄せを行うのもありかと思います。
次回は、名寄せの要らない特許分類の分割処理と集計作業を行う予定です。

Jupyter Notebookで特許分析(2)

さて、前回の続きになりますが、共同出願人の処理からでしたね。

これのやりかたが習得できれば、同じく1セルに複数の情報を含む特許分類や自分で付与した独自分類なんかの集計処理も同様に行うことができます。

前回までのJupyterの画面の続きから操作していきます。まずは、データフレームdf1の出願人データを区切り文字である’;’で切り分けてapnsに保管していきます。

apns = df1['出願人'].map(lambda x: x.split(';'))
 次に作ったapnsをシリーズ形式のデータに変換します。
ser1 = pd.Series(np.hstack(apns.values))
 出来上がったシリーズ形式の出願人名から重複を除去したシリーズデータに変換します。
unique_apns = ser1.str.strip().unique()
unique_apns.sort()
  一つの出願人について1行のデータリストを作成するための関数を定義します。

def filter_df_by_apn(df, apn):
    apn_df = df.loc[df['出願人'].map(lambda x: apn in x)].copy()
    apn_df['出願人'] = apn
    return apn_df
上記関数を用いて、先の処理で重複を取り除いた出願人のリスト中の出願人ごとに対象の出願の行を抜き出してリストに追加します。
apn_df_list =[filter_df_by_apn(df1, apn) for apn in unique_apns]
 あとは、できたリストを新たなデータフレームdf2に格納するだけです。データフレームをシンプル化するために公報番号と
df2 = pd.concat(apn_df_list)
df2 = df2.loc[:,['公報番号','出願人','出願日']]
df2.sort_values('公報番号', inplace=True)
df2.head()
 こんな感じのデータフレームになります。
公報番号 出願人 出願日
120 特表2017-502711 セーフオプサージカルインコーポレイテッド 2014-11-06
119 特表2017-503167 スリーエムイノベイティブプロパティズカンパニー 2014-12-22
118 特表2017-503223 テンテンテクノロジーズリミテッド 2013-11-15
117 特表2017-504087 コーニンクレッカフィリップスエヌヴェ 2014-11-10
116 特表2017-504323 アイフォーシーイノベーションズインコーポレイテッド 2014-12-30
あとは前回と同様に集計してみるだけですね。
df2['公報番号'].groupby([df2['出願人'], df2['出願日'].dt.year]).count()
出願人                                    出願日 
みこらった株式会社                              2014    1
                                       2015    1
アイフォーシーイノベーションズインコーポレイテッド              2014    1
アクシスアーベー                               2016    1
アディダスアーゲー                              2012    1
アーマッド・アルサエド・エム・アルガジ                    2015    1
アール・エイ・アイ・ストラテジック・ホールディングス・インコーポレイテッド  2015    1
ア-カムアーベー                               2015    1
イウン、スツ・ファン                             2015    1
インタートラストテクノロジーズコーポレイション                2015    1
インターナショナル・ビジネス・マシーンズ・コーポレーション          2016    1
インテルアイピーコーポレイション                       2015    2
インテルコーポレイション                           2016    1
インテル・コーポレーション                          2016    1
ウィルマーディング・コミュニケーションズ・エルエルシー            2015    1
ウテエス・ア・デシャン・エ・フィス                      2016    1
エスゼットディージェイアイテクノロジーカンパニーリミテッド          2013    1
オムロン株式会社                               2013    1
カシオ計算機株式会社                             2012    1
キム,ヨンソク                                2015    1
キヤノンマーケティングジャパン株式会社                    2016    1
キヤノンITソリューションズ株式会社                     2016    1
ギガコリアコーリミテッド                           2014    1
クアルコム,インコーポレイテッド                       2014    3
                                       2015    1
グリー株式会社                                2013    2
グーグルインコーポレイテッド                         2013    2
                                       2014    1
                                       2015    1
コウアヒェ,ノルディン                            2014    1
                                              ..
ローベルトボツシユゲゼルシヤフトミツトベシユレンクテルハフツング       2016    1
ヴァイアヴィ・ソリューションズ・インコーポレイテッド             2016    2
ヴェルトアナリティクスオサケウフティオ                    2014    1
三星電子株式会社                               2016    1
国立大学法人埼玉大学                             2012    1
国立大学法人東北大学                             2014    2
国立研究開発法人情報通信研究機構                       2014    1
太田崇博                                   2015    1
富士ゼロックス株式会社                            2016    1
小米科技有限責任公司                             2015    1
日本信号株式会社                               2012    1
日立マクセル株式会社                             2012    1
旭化成ホームズ株式会社                            2016    1
東芝ライテック株式会社                            2012    1
株式会社カカオ                                2015    1
株式会社ケット科学研究所                           2013    1
株式会社スクウェア・エニックス・ホールディングス               2012    1
株式会社ブリヂストン                             2012    1
株式会社リコー                                2012    1
株式会社ワイティーエム                            2011    1
株式会社三洋物産                               2012    1
株式会社北電子                                2011    1
株式会社半導体エネルギー研究所                        2000    1
                                       2001    1
株式会社東芝                                 2012    1
                                       2014    2
株式会社Agoop                              2013    1
株式会社REALONETECHNOLOGY                  2016    1
華為技術有限公司                               2014    1
華為終端有限公司                               2014    1
Name: 公報番号, Length: 118, dtype: int64
こんな感じになります。名寄せは出来ていないのでローベルトボッシュ等の項目に違和感はありますが、これの処理についてはまた次回にでも。特許分類であれば名寄せはいらないと思いますので、今回の出願人で用いた手法を使いまわすことができます。そして作った出願人の切り分けデータフレームと特許分類の切り分けデータフレームを合体させて集計を行うと、おなじみの出願人ー分類別件数集計表や出願人ー分類バブルマップ等につながるわけですが、こちらも次回以降で。
【参考書籍】

Jupyter Notebookで特許分析(1)

先の「特許データで自然言語処理」からは少し離れて、ベーシックな特許分析をJupyter Notebookでどう行っていくかについて解説していきます。自然言語処理と異なり、形態素解析のことは考えないので、Windows環境でもとりあえず、anaconda.comからAnacondaをダウンロードしてデフォルト設定でインストールしてしまえば処理を試してみることができます。インストールが終わったら、Jupyter Notebookのショートカットから起動するだけです。

サンプルとして先の記事でも使ったZITの特許データリストを用いた処理を行っていきます。Excel形式でpatentdata.xlsxという名前で予めJupyter Notebookの作業フォルダに保存してあります。

まずは、pandasとNumpyをインポートします

import pandas as pd
import numpy as np
次にデータフレームdf1に準備したExcelファイルを読み込みます。コマンドはpd.read_excel(ファイル名)です。読み込みのパラメータは色々と設定は可能ですが、今回はデフォルト設定で読み込みます。
df1 = pd.read_excel('patentdata.xlsx')
データフレームdf1が正しく作成されたか確認するためにdf1.head()でデータフレームの先頭の内容を確認します。
df1.head()
OKのようですね。
公報番号 出願日 優先日 公開日 IPC FI Fターム 出願人 発明等の名称 要約
0 特開2017-123147 2016-10-18 2015-11-03 00:00:00 2017-07-13 G06T 1/00@AFI(JP);G01B 11/24@ALI(JP) G06T 1/00 315;G01B 11/24 K 2F065 AA03;2F065 AA04;2F065 AA06;2F065 AA19;2F… ザ・ボーイング・カンパニー ロボットを案内するための特徴位置の特定 【課題】構成要素の特徴を視覚的に識別する特徴検出システムを提供する。【解決手段】特徴検出シス…
1 特開2017-120659 2011-02-15 NaN 2017-07-06 G06F 13/00@AFI(JP);G06Q 30/02@ALI(JP);G06K … G06F 13/00 510 C;G06Q 30/02 446;G06Q 30/… 5B084 AA02;5B084 AA12;5B084 AA27;5B084 AA30;5B… サターンライセンシングエルエルシー 広告システムおよび広告方法 【課題】商品の小売の利便性を高めることができる広告システムを得る。【解決手段】本開示の広告シ…
2 特開2017-120655 2015-08-12 NaN 2017-07-06 G06F 13/00@AFI(JP);G06F 13/12@ALI(JP);H04M … G06F 13/00 351 B;G06F 13/00;G06F 13/00 5… 5B084 AA01;5B084 AA24;5B084 AB16;5B084 AB37;5B… 太田崇博 関連ユーザ情報を用いた情報機器間の連携 【課題】図1で示す、情報機器でインターフェースが異なる複数情報機器間で通信をする際に、そのま…
3 特開2017-118550 2012-12-13 NaN 2017-06-29 H04M 1/00@AFI(JP);H04M 11/00@ALI(JP);G08C … H04M 1/00 U;G08C 19/00 H;G08C 1… 2F073 CD11;2F073 GG10;2F073 CC03;2F073 BC02;2F… カシオ計算機株式会社 行動管理装置、行動管理システム、行動管理方法及びそのプログラム 【課題】面倒な操作や持ち歩きの不便さを解消して、行動の管理に関するサービスを受けることができ…
4 特開2017-117456 2016-12-14 2015-12-14 00:00:00 2017-06-29 G08G 1/09@AFI(JP);G08G 1/00@ALI(JP);B60W … G08G 1/09 H;B60W 30/10;B60W 30/182;B60… 3D241 BA15;3D241 BA21;3D241 DC57Z;3D241 DC54Z;… ローベルトボツシユゲゼルシヤフトミツトベシユレンクテルハフツング データ値を受信し、車両を動作させるための方法及び装置 【課題】第1自動走行車両を安全かつ快適に動作させるための方法及び装置を提供する。【解決手段】…
まあ、よくある集計ってことで、先ずは出願年別の件数集計から。一般的な日付データであれば、データフレームに読み込む際に自動的に日付データとして扱われているので、下記のコマンドで年データに出願日データを変換できます。Excel関数でいうところの=year(A2)みたいなものです。
df1['出願日'].dt.year.head()
このように年データが表示されます。
0    2016
1    2011
2    2015
3    2012
4    2016
Name: 出願日, dtype: int64
この年データでグループ化して、公報番号データの数をカウントすると、出願年別の出願件数集計になります。
df1['公報番号'].groupby(df1['出願日'].dt.year).count()
出ましたね。
出願日
2000     1
2001     1
2008     1
2009     1
2011     5
2012    15
2013    13
2014    25
2015    42
2016    17
Name: 公報番号, dtype: int64
さらに、出願人と出願年でグループ化して集計すると、出願人別の出願年別出願件数集計になります。
df1['公報番号'].groupby([df1['出願人'], df1['出願日'].dt.year]).count()
どうでしょう。出願人のデータに関して名前の統一(名寄せ)が上手くいっていないことと、共願人の処理が上手くいっていないことから、若干違和感のある部分はありますが、あっさりした集計としてはこんなものではないでしょうか。
出願人                                     出願日 
みこらった株式会社                               2014    1
                                        2015    1
アイフォーシーイノベーションズインコーポレイテッド               2014    1
アクシスアーベー                                2016    1
アディダスアーゲー                               2012    1
アーマッド・アルサエド・エム・アルガジ                     2015    1
アール・エイ・アイ・ストラテジック・ホールディングス・インコーポレイテッド   2015    1
ア-カムアーベー                                2015    1
イウン、スツ・ファン;チャン、マーク・キット・ジウン              2015    1
インタートラストテクノロジーズコーポレイション                 2015    1
インターナショナル・ビジネス・マシーンズ・コーポレーション           2016    1
インテルアイピーコーポレイション                        2015    2
インテルコーポレイション                            2016    1
インテル・コーポレーション                           2016    1
ウィルマーディング・コミュニケーションズ・エルエルシー             2015    1
ウテエス・ア・デシャン・エ・フィス                       2016    1
エスゼットディージェイアイテクノロジーカンパニーリミテッド           2013    1
オムロン株式会社                                2013    1
カシオ計算機株式会社                              2012    1
キム,ヨンソク                                 2015    1
キヤノンマーケティングジャパン株式会社;キヤノンITソリューションズ株式会社  2016    1
ギガコリアコーリミテッド                            2014    1
クアルコム,インコーポレイテッド                        2014    3
                                        2015    1
グリー株式会社                                 2013    2
グーグルインコーポレイテッド                          2013    2
                                        2014    1
                                        2015    1
コウアヒェ,ノルディン                             2014    1
コーテックインダストリーズプロプライアタリーリミテッド             2015    1
                                               ..
ルノーエス.ア.エス.                             2015    1
ルミラディーエックスユーケーリミテッド                     2014    1
ローベルトボッシュゲゼルシャフトミットベシュレンクテルハフツング        2015    1
ローベルトボツシユゲゼルシヤフトミツトベシユレンクテルハフツング        2016    1
ヴァイアヴィ・ソリューションズ・インコーポレイテッド              2016    2
ヴェルトアナリティクスオサケウフティオ                     2014    1
三星電子株式会社                                2016    1
国立大学法人東北大学;株式会社東芝                       2014    2
国立研究開発法人情報通信研究機構                        2014    1
太田崇博                                    2015    1
富士ゼロックス株式会社                             2016    1
小米科技有限責任公司                              2015    1
日本信号株式会社;国立大学法人埼玉大学                     2012    1
日立マクセル株式会社                              2012    1
旭化成ホームズ株式会社                             2016    1
東芝ライテック株式会社;株式会社東芝                      2012    1
株式会社カカオ                                 2015    1
株式会社ケット科学研究所                            2013    1
株式会社スクウェア・エニックス・ホールディングス                2012    1
株式会社ブリヂストン                              2012    1
株式会社リコー                                 2012    1
株式会社ワイティーエム                             2011    1
株式会社三洋物産                                2012    1
株式会社北電子                                 2011    1
株式会社半導体エネルギー研究所                         2000    1
                                        2001    1
株式会社Agoop                               2013    1
株式会社REALONETECHNOLOGY                   2016    1
華為技術有限公司                                2014    1
華為終端有限公司                                2014    1
Name: 公報番号, Length: 109, dtype: int64
先の記事でも紹介したe-patentの野崎氏の「特許情報分析とパテントマップ作成入門 改訂版」では、Excelを用いた特許分析を紹介していますが、Excelは出願人データにおける共願人のような1項目に複数のデータが入る場合の集計処理は簡単には行うことができません。上記書籍でも出願人データは筆頭出願人のみを抜き出して処理する事例が示されています。Jupyterは比較的簡単なステップでこれらの処理が可能です。また、自然言語処理の記事でも述べましたが、Jupyterは作業がスクリプトとして記録されるため、中身が違うデータに対しても同じ処理を繰り返し適用する(patentdata.xlsxの中身を入れ替えれば、色んな元データから一発で今回の出願年別件数処理を行う)ことができます。ExcelでもVBAを組めばスクリプトとしての記録が出来ないことはないですが、Jupyterのほうが直感的に作業しながら分析処理をスクリプトとして記録していくことができると感じます。
次回以降はJupyterでの出願人データの集計の扱いや、同じく1項目に複数のデータが入る特許分類の集計の扱いについて説明していく予定です。

特許データで自然言語処理(5)

さて、前回まではPythonを用いた自然言語処理の入門編ということで、1公報の単語頻度や1公報でのword2vecによる分散表現の取得などを試みてきたわけですが、それでなんなのって感じでしたね。今回は前回までの知識を応用して、多数の公報のテキストデータに対してword2vecでキーワードの分散表現を得る処理を行い、t-SNEを用いて2次元のキーワード分布表示を行うところまで行ってみたいと思います。

まず、最初の難関は多数の公報のテキストデータの取得です。商用特許データベースをお使いの方はそこから好きにダウンロードしていただけばいいですが、暇つぶしの特許テキストマイナーでは無料でなんとかしないといけません。やり方はそれだけで説明が大変な代物なので省きます。個々に工夫してみてください。(e-patentの野崎氏の「特許情報分析とパテントマップ作成入門 改訂版」でもその辺りは有効な手段は示されていません)

では、J-PlatPatの分類検索で入手した現在のZIT分類でヒットする公報の要約・請求項データを集めたテキストを用いた分析を行っていきます。まずは、前回と同様に入手したテキストに対してコマンドラインでMecabによる形態素分析済みのテキストファイル(ZITsw2v.txt’)を作成します。これを用いてword2vecの分析を行っていきます。

from gensim.models import word2vec
data = word2vec.Text8Corpus('ZITsw2v.txt')
model = word2vec.Word2Vec(data, size=200)
out=model.most_similar(positive=[u'データ'])
out
[('データベース', 0.7113999128341675),
 ('広告', 0.711033821105957),
 ('リスト', 0.6924494504928589),
 ('細胞', 0.6894968152046204),
 ('画像', 0.6841669082641602),
 ('メッセージ', 0.681996762752533),
 ('処方箋', 0.6778149604797363),
 ('関連', 0.6708742380142212),
 ('収集', 0.6694872975349426),
 ('アップリンク', 0.667609453201294)]
out=model.most_similar(positive=[u'通信'])
out
[('アクセス', 0.8646170496940613),
 ('ネットワーク', 0.8549761176109314),
 ('接続', 0.8120658993721008),
 ('無線通信', 0.8065581321716309),
 ('機', 0.7985461354255676),
 ('データ通信', 0.775153398513794),
 ('端末', 0.7741917371749878),
 ('経由', 0.7681775689125061),
 ('車載', 0.7607901096343994),
 ('パチンコ', 0.7600409984588623)]
ここまでは前回と同様の処理です。多数の公報データに基づく分析になった分、前回とは類似キーワードの出方は異なってきます。そしてここからword2vecで処理したキーワードのベクトル表現の分布を2次元で可視化する処理を行っていきます。word2vecは各キーワードが200次元のベクトルを持っているので、これを2次元のベクトル上に圧縮していきますが、この処理をにt-SNEという手法を用います。詳細はググって見てください。2次元化したあとは、matplotlibで二次元の散布図を書かせる処理を行います。今回は個々の詳細な説明は省きます。
import matplotlib as mpl 
from sklearn.manifold import TSNE
import pandas as pd
vocab = list(model.wv.vocab)
X = model[vocab]
tsne = TSNE(n_components=2)
X_tsne = tsne.fit_transform(X)
df = pd.concat([pd.DataFrame(X_tsne),
                pd.Series(vocab)],
               axis=1)
df.columns = ['x', 'y', 'word']
from matplotlib.font_manager import FontProperties
font_path = '/usr/share/fonts/truetype/takao-gothic/TakaoGothic.ttf'
font_prop = FontProperties(fname=font_path)
mpl.rcParams['font.family'] = font_prop.get_name()
fig = mpl.pyplot.figure(num=None, figsize=(40, 30), dpi=80, facecolor='w', edgecolor='k')
ax = fig.add_subplot(1, 1, 1)
ax.scatter(df['x'], df['y'])
for i, txt in enumerate(df['word']):
    ax.annotate(txt, (df['x'].iloc[i], df['y'].iloc[i]))
とりあえず雰囲気だけ。こんな感じで出力されます(画像をクリックすると多少高解像度の元画像が表示されます)。
元のテキストデータさえ取得できれば、処理自体は10分程度であり、Jupyter Notebookのファイルにしておけば何度でも使い回しが効きます。前回までの単語の頻度分布と組み合わせれば、上のようなごちゃごちゃした図ではなく限られたキーワードの類似度の関係を描くこともできます。どうでしょう、こうなると多少使えそうに見えますか。そこそこ使えそうと思う方、全然使えねぇと思う方、色々かと思います。
そこそこ使えそうと思った方、今回のサンプルは分かり易くするためかなり適当です。データも全文を持ってきたほうが良いかもしれませんし、形態素もMecabではなく、技術ワードに向いたtermmiを使ってみるのもよいかもしれません(Patentfieldの方がDockerファイルを作成されています)し、品詞を絞るのも良いかもしれません。まぁ、商売として特許分析サービスを提供するのでなければ、この辺のこだわりは自分の判断で必要に応じて試行錯誤してみるのが良いと思います。調査や分析でなんらかの効率化に使えないかなというケースが殆どかと思いますので、あまり試行錯誤に時間をかけるのも本末転倒です。
word2vecはitem2vecとしての応用の可能性もあるので、読み込ませるスペース区切りのテキストデータは様々な応用が可能です。例えば、FタームやFI等の特許分類をスペースで区切って読み込ませれば分類間の相関性のマップも描かせることができるでしょう。あるいは自分の独自分類や特許分類と出願人等をスペースで区切って読み込ませれば分類と出願人間の相関性のマップも描かせることができるでしょう。共同出願人をスペースで区切って読み込ませれば共同出願の相関性のマップも描かせることができるでしょう。このように工夫により応用範囲は様々です。商用データベースを使わなくてももっと特許データの入手が楽にできるようになれば良いのですが。
ここまでで件の特許データを使って、自然言語処理を学ぼう!というデータ分析の勉強会の一日目の内容までたどり着けたでしょうか。
CNNとRNNの活用に関わる部分については、気が向けばぼちぼち記事にしていこうかと思います。