任天堂の特許分析 ~J-Plat Pat CSV出力3000件からFIマップ~

J-Plat PatのCSV出力の件数制限が、500件から3,000件に大幅拡大された(2023.3.26機能改善)のを記念(?)して、任天堂の全特許2,915件を対象に、筆頭FIごとの出願件数の年次推移を示すグラフを作ってみた。

① J-Plat Patで出願人検索

ヒット件数は、2,915件だったので、全件を一度にCSV出力できる!

② EXCEL ブックとして保存

③ 「出願年」の列(column)を追加

C列の[出願日]から[出願年]を求めて、N列に出力する。
N2セルに、C2を参照するYEAR関数を入力して、C2の年だけを出力させる。

④ 「筆頭FI」の列を追加

G列の[FI]から筆頭だけを取りだして、O列に出力する。
[FI]は複数のFIがあるとコンマ“,”で区切られていることに着目。先頭から探して最初に見つかるコンマ“,”よりも左側だけを抜き出して、O列に出力すれば良い。

[FI]欄には、1個のFIしかなくて、コンマ“,”が含まれていない場合もあるので、注意が必要。コンマ“,”が何文字目かを探す関数では、見つからないとエラーになる。エラーになったら筆頭FIしかないのだから、そのままO列に出力すれば良い。

FIを最も細かい階層まで取り出すと、細かすぎてグラフには向かないので、メイングループ(スラッシュ“/”の前)までに留めることにする。先頭から探して最初に見つかるコンマ“/”よりも左側だけを抜き出して、O列に出力すれば良い。

[FIND関数]を使ってFI(G2)の中での[/]が何文字目かを求め、[LEFT関数]を使って求めた[何文字目」よりも左側を抜き出して、筆頭(O2)に出力する。

⑤ 「出願件数」のP列を追加

すべての行に1を入力

出願年のN2セル、筆頭FIのO2セルと1を入力した出願件数のP2セルを選んで、最も下の行までコピーする。

⑥ ピボットテーブルの作成

出願年のN列、筆頭FIのO列、出願件数のP列を選んで、[挿入]タブの[ピボットテーブル]をクリックして、新規シートのピボットテーブルを作成する

作成したピボットテーブルで、[ピボットテーブルのフィールド]を操作
「出願年」を「列」にドラッグ
「筆頭FI」を「行」にドラッグ
「出願件数」を「Σ値」にドラッグ
すると、ピボットテーブルが生成される。

合計件数の多いFIから順に表示されるように並べ替え

ピボットテーブルの集計結果は、J-Plat Patの[分類コードランキング]と似た処理になっていて、合計だけでなく年次推移がわかる点で優れている。

なお、A63F13, A63F9はゲーム、G06F3は計算機のユーザーインターフェース。

⑦ 年次推移グラフの作成

5位までの筆頭FIについて、出願件数の年次推移を示す折れ線グラフを描いてみる。

ピボットテーブルから5位までの筆頭FIの値をコピーして別の(グラフ用の)シートに貼り付け、空白に0を埋めて、散布図で折れ線グラフを描いた。

注:空白のセルに0を埋めるやり方は、Google先生に聞いてみると教えてくれる。

⑧ 筆頭FIを、メイングループではなく、クラスで分析してみた

④~⑥の「筆頭FI」を「筆頭FI(main group)」に変更し、「筆頭FI(class)」(O列)を挿入。

FIは、X00Y nn/mmmmの形で、Xはセクション、X00はクラス、X00Yはサブクラスと呼ばれ、さらに下位のX00Y nnはメイングループと呼ばれている。

文字列処理は簡単。先頭から3文字を抜き出せばよい。

⑨ ピボットテーブルを更新

⑩ 筆頭FI(CLASS)の年次推移の折れ線グラフ

まとめ

J-Plat patのCSV出力の件数制限が、500件/1回から3,000件/1回に緩和されたので、任天堂のすべての特許でも1度にダウンロードして分析できるようになった。3,000件を超えても、何回かに分けてダウンロードすればよいため、1回の件数制限が緩和されたのはありがたい。

ダウンロードして自身で試行錯誤してみると、自由度が広がる。筆頭FIといっても、クラス単位で動向を見るか(⑩)、メイングループ単位で動向を見るか(⑦)で、何か違いが見えてくるかもしれない。

今回、筆頭FIをクラスとメイングループの2通りで分析したが、顕著な違いは見えなかった。ただし、どちらにも共通する流れとして、
2007年、2008年のリーマンショックでは、A63(ゲーム)系の出願は減ったが、計算機のインターフェース(G06)系は現状維持か増加傾向が継続した。2011年の東日本大震災では、A63(ゲーム)系の出願は急増後急減したが、計算機のインターフェース(G06)系の出願は安定している。

[Python] 正規表現を使ったFターム分析

〘 背景 〙

日本の特許文献には、FIとFタームと呼ばれる特許分類が付与されている。FIは国際特許分類(IPC)と同じ階層構造で、日本の実情に合わせて細分化されている。Fタームは、テーマコードごとに種々の観点について付与された特許分類コードである。出願された特許文献の内容に応じて付与されるので、内容を読む代わりに付与されているFIやFタームを分析対象とすることで、特許文献の内容分析ができる。
以下の例は、事例研究「リチウムイオン電池の電極材料の特許マップ」で紹介した特許マップを作成するための前処理。

〘 課題 〙

1件の特許文献には複数の(多くの)特許分類コードが付与されている。前処理として、どのコードが付与されているかを表すフラグを立てる。分析対象の特許文献それぞれにフラグを立てる処理をしておけば、後段に分析目的に合わせた集計処理を行えば良い。
特許分類は、FIもFタームもIPCも階層構造をもつので、立てるフラグは階層関係を反映するように設計する。

〘 仕様 〙

処理対象:EXCELの特許文献リスト()
各特許文献に、FI, Fターム, IPCなどの項目が含まれていること

入力 「Fターム」カラム
例=“5H050 AA02;5H050 AA08;5H050 BA17;5H050 CA08;5H050 CA09;5H050 CB01;5H050 CB02;5H050 CB08;5H050 CB11;5H050 DA03;5H050 DA04;5H050 DA10;5H050 DA11;5H050 DA18;5H050 EA23;5H050 EA24;5H050 EA28;5H050 FA02;5H050 FA17;5H050 GA10;5H050 HA00;5H050 HA01;5H050 HA20
出力 フラグを立てる複数のカラム
特許文献のレコードに立てたフラグ(1/” “

注:フラグを立てる対象のFタームが上位階層なら、それに含まれる下位階層のFタームでもフラグが立つようにプログラミングする。但し、階層関係はプログラマーが解釈してソースコード内に正規表現で記述する。

〘 階層構造を考慮した正規表現〙

Fタームの階層構造の例は、以下のとおり。上述の「リチウムイオン電池の電極材料の特許マップ」で分析対象としたテーマコード「電池の電極および活物質」(5H050)の「正極活物質」(CA00)である。

フラグを立てたい範囲を緑の枠取りで示す。フラグを立てたい範囲を正規表現で表す(各正規マッチマッチオブジェクトを生成する)。

例1:CA03(Niを主体とするもの)の下位概念にはCA04(Coを固溶するもの)を下位に含むので、CA03 or CA04が付与されていればCA03のフラグ(CA01)を立てる。

CA01 = re.compile(‘5H050 (CA03|CA04)’) 

例2:CA19(有機化合物)の下位概念にはCA20(ポリマーまたは重合体)~CA27(ハロゲン原子を有するもの)を下位に含むので、CA19 ~ CA27が付与されていればCA19のフラグ(CA12)を立てる。

CA12 = re.compile(‘5H050 (CA19|CA2[0-7])’)

フラグを立てたいすべてのFタームについて、マッチオブジェクトを生成する。

〘 各レコード(特許文献)についてフラグを立てる 〙

searchメソッドを使って、マッチオブジェクトにマッチするパターンが、対象レコード(特許文献)のFタームカラムの文字列に含まれているかを判定し(if文)、EXCELの所定カラムに出力する。

〘 ソースコード 〙

# -*- coding: utf-8 -*-
"""
Fターム分析
 電池の電極および活物質(5H050)のLiイオン電池(BA17)にヒットする文献について、
 正極と負極の活物質材料として付与されているFタームのフラグを立てる
 入力: ダウンロード項目にFタームを含む特許文献リスト
 出力: 各文献について、付与されているFタームにフラグを立てる
 newly created                           2022.9.19 H. Kojima
"""
import openpyxl, re
path = "C:\\Users\\kojim\\Dropbox\\事例研究\\Liイオン電池の電極材料分析"
file_name  = "5H050_DB.xlsx"
workbook = openpyxl.load_workbook(path+"\\"+file_name)
# 特許文献シート
sheet_db = workbook.get_sheet_by_name('db')
col_Fterm = 17
# 正極活物質
CA01 = re.compile('5H050 (CA03|CA04)')
CA02 = re.compile('5H050 CA05')
CA03 = re.compile('5H050 CA06')
CA04 = re.compile('5H050 (CA07|CA08|CA09)')
CA05 = re.compile('5H050 CA10')
CA06 = re.compile('5H050 CA11')
CA07 = re.compile('5H050 CA12')
CA08 = re.compile('5H050 CA15')
CA09 = re.compile('5H050 CA16')
CA10 = re.compile('5H050 CA14')
CA11 = re.compile('5H050 CA17')
CA12 = re.compile('5H050 (CA19|CA2[0-7])')
CA13 = re.compile('5H050 (CA29|CA30)')
# 負極活物質
CB01 = re.compile('5H050 (CB02|CB03)')
CB02 = re.compile('5H050 CB04')
CB03 = re.compile('5H050 CB05')
CB04 = re.compile('5H050 CB08')
CB05 = re.compile('5H050 CB09')
CB06 = re.compile('5H050 CB07')
CB07 = re.compile('5H050 CB12')
CB08 = re.compile('5H050 CB13')
CB09 = re.compile('5H050 CB14')
CB10 = re.compile('5H050 CB15')
CB11 = re.compile('5H050 (CB16|CB17|CB18)')
CB12 = re.compile('5H050 (CB19|CB2[0-7])')
CB13 = re.compile('5H050 (CB29|CB30)')
#
#   Start processing
for line in range(2, sheet_db.max_row+1):
    Fterm = sheet_db.cell(row=line,column=col_Fterm).value
    if re.search(CA01, Fterm):
        sheet_db.cell(row=line,column=37).value = 1
    if re.search(CA02, Fterm):
        sheet_db.cell(row=line,column=38).value = 1
    if re.search(CA03, Fterm):
        sheet_db.cell(row=line,column=39).value = 1  
    if re.search(CA04, Fterm):
        sheet_db.cell(row=line,column=40).value = 1  
    if re.search(CA05, Fterm):
        sheet_db.cell(row=line,column=41).value = 1  
    if re.search(CA06, Fterm):
        sheet_db.cell(row=line,column=42).value = 1  
    if re.search(CA07, Fterm):
        sheet_db.cell(row=line,column=43).value = 1  
    if re.search(CA08, Fterm):
        sheet_db.cell(row=line,column=44).value = 1  
    if re.search(CA09, Fterm):
        sheet_db.cell(row=line,column=45).value = 1
    if re.search(CA10, Fterm):
        sheet_db.cell(row=line,column=46).value = 1
    if re.search(CA11, Fterm):
        sheet_db.cell(row=line,column=47).value = 1
    if re.search(CA12, Fterm):
        sheet_db.cell(row=line,column=48).value = 1
    if re.search(CA13, Fterm):
        sheet_db.cell(row=line,column=49).value = 1
    if re.search(CB01, Fterm):
        sheet_db.cell(row=line,column=51).value = 1
    if re.search(CB02, Fterm):
        sheet_db.cell(row=line,column=52).value = 1
    if re.search(CB03, Fterm):
        sheet_db.cell(row=line,column=53).value = 1 
    if re.search(CB04, Fterm):
        sheet_db.cell(row=line,column=54).value = 1 
    if re.search(CB05, Fterm):
        sheet_db.cell(row=line,column=55).value = 1 
    if re.search(CB06, Fterm):
        sheet_db.cell(row=line,column=56).value = 1 
    if re.search(CB07, Fterm):
        sheet_db.cell(row=line,column=57).value = 1 
    if re.search(CB08, Fterm):
        sheet_db.cell(row=line,column=58).value = 1 
    if re.search(CB09, Fterm):
        sheet_db.cell(row=line,column=59).value = 1 
    if re.search(CB10, Fterm):
        sheet_db.cell(row=line,column=60).value = 1
    if re.search(CB11, Fterm):
        sheet_db.cell(row=line,column=61).value = 1 
    if re.search(CB12, Fterm):
        sheet_db.cell(row=line,column=62).value = 1
    if re.search(CB13, Fterm):
        sheet_db.cell(row=line,column=63).value = 1 
workbook.save(path+"\\"+file_name)

〘 出力(フラグを出力したEXCELのカラム)〙

リチウムイオン電池の電極材料の特許マップ

電池の電極にはいろいろな活物質が使われる。その状況を、特許マップを使って分析してみた。

通常は、どんな材料が使われているか、特許を1件1件読んで分析する必要があるが、Fタームにはその分析結果があるので、それを利用することを考える。

〔利用するFタームは、テーマコード5H050「電池の電極及び活物質」〕

出所:J-Plat Pat [ https://www.j-platpat.inpit.go.jp/p1101 ]

分析の進め方は、以下が考えられる。
BA00 「電池の種別」で「リチウムイオン電池」に絞り込んで、
CA00「正極活物質」と、
CB00「負極活物質」を分析する。

BA00「電池の種別」の詳細は以下。

CA00「正極活物質」の詳細は以下。

 関心のある粒度を定めて分析対象とすれば良い。この例では上の図のように、13種類の活物質を分析対象とする。(もし有機化合物に着目したい場合には、CA19の下位階層を細かく分析対象にする。)

CB00「負極活物質」の詳細は以下。

 負極側の活物質についてこの例では、上の図のように、13種類の活物質を分析対象とする。

分析対象とした13種類×13種類の活物質の組合せで、マトリックスを作成する。

上のマトリックスは、全期間を通した全体の特許文献すべてを対象とした。これを5年刻みにすると、正/負極の活物質の組合せの年次推移が見える化される。

1986-1990年には、正極=有機化合物/負極=アルカリ金属の組合せが最大。負極活物質としてはアルカリ金属が多く、炭素系もこれに続いている。正極活物質としては、有機化合物の他、複合系酸化物とMn系酸化物、カルコゲン系が続く構図。

1990-1995年には、正極活物質は有機化合物から複合系酸化物にシフト、負極活物質としては、アルカリ金属から炭素系にシフトした。

1995-2000年以降は、正極活物質は複合系酸化物に定着する一方、負極活物質としてはアルカリ金属から炭素系、特にグラファイトへのシフトが進んだことがわかる。

J-Plat PatとExcelで描くバブルチャート

J-Plat Patで500件/回のCSV出力ができるようになったので、Excelでバブルチャートを描いてみた

任天堂の特許2858件(下図)を6~7回かけてCSVダウンロードして、Excelで集計、バブルチャートを描いてみる。

目指すグラフをイメージしてみると、上の「FI別」を縦軸、「公開年」を横軸、特許件数をバブルサイズにした,バブルチャート(下図)

① CSVダウロードしたデータを結合して、Execlシートを作成

② 公開年と分析対象のFIの有無(フラグ)を示す列を作成

公開年は、公開日のD列を参照するYEAR関数

分析対象のFIのフラグは、関数 =IF(ISERROR(FIND(O$1,$G2)),0,1)
FIND関数=対象のG列(FI)に検索文字列のO列(検索するA63)にみつかればその位置、みつからなければエラーになる
IF(ISERROR(FIND・・・),0,1)は、FIND関数がエラーなら 0、なければ 1
分析対象のFIの有無を示すフラグになる。
注:この例(FI全体を対象)に代えて、筆頭FIを対象にするのも一案

③ 入力した関数を最下行までコピーして、FI分析を完了

④ 公開年ごとにFIの件数を集計(ピボットテーブル)

⑤ 5年ごとに集計

ピボットテーブルをコピーして(10行~)、SUM関数を使って、5年ごとに件数を集計する(1~8行)
(横軸を公開年のままにするか、何年かごとに集計するかは、適宜調整)

⑥ 集計した表に「条件付き書式」を設定すると、バブルチャート風(?)の簡易的な見える化ができる

⑦ Excelでバブルチャートを描く

Excelのバブルチャートは、X, Y, Zの元データが必要。X, Yは数値で座標を示し、Zはバブルの大きさを表す。すべて数値で示す必要がある。

上のまとめ表を、
X=公開年(範囲に代えて代表年)
Y=FIを表示する位置(座標)。A63を最上、H05を最下にしたいのでそれに応じた数値を入力。
Z=集計した件数=バブルの大きさになる
の形に並べ直す。

並べ直したデータを元にして、バブルチャートを描く。

⑧ バブルチャートの書式を整える

「データ系列の書式」でバブルサイズを調整(ex.バブルが重ならないように)
「データラベルの書式」で「バブルサイズ」を表示

縦軸、横軸は、座標(数値)にしたので、元のFIを上書きする。
(たとえば、画像を作って重ねる)

できあがり!!

お化粧はあまり上手ではありませんが、何とか完成。

知財実務オンライン 2022/3/3

知財実務オンラインで紹介します。

   特許検索手法の見直し
~短時間でそれらしい特許をみつける手順~

【 YouTubeライブ 】

日時: 2022.3.3 18:30~20:00

https://m.youtube.com/watch?v=eAjKGUpla40

プレゼン資料: 20220303_ChizaiJitsumuOnline

検索手順を定型化することによって、試行錯誤を減らし、かけた時間・労力に見合った特許文献を抽出することを目指した、特許検索手法を紹介します。

「『折り畳みスマホ』の特許を探す」J-Plat Patを使った検索の実例付きです。

使い慣れた[選択入力]に代えて[論理式入力]を使った実例ですので、J-Plat Patの使い方をバージョンアップしたい方にもヒントになります。

セルフレジ特許訴訟Ⅳ

セルフレジ特許(特許第6469758号、特許第6541143号など)を有するアスタリスクがユニクロを運営するファーストリテーリングにを特許侵害で訴えた特許権侵害訴訟(セルフレジ特許訴訟 参照)に関連する裁判の判決が出たので報告する。(特許侵害訴訟そのものの判決ではない。)

訴訟の対象は、特許第6469758号の無効審判の審決である。この特許には請求項1~4があるが、審決では請求項3を除いて他の請求項が無効と判断された。(セルフレジ特許訴訟Ⅲ 参照) この審決に対して審決取消訴訟が提起され、今回、判決が言い渡された。

判決は、以下のように、無効とされた審決が取り消され、請求項1~4のすべてが有効であると判断されたもので、アスタリスクの全面勝利である。

 
請求項 内容 審決 判決
 物品に付されたRFタグから情報を読み取る据置式の読取装置であって、
 前記RFタグと交信するための電波を放射するアンテナと、
 上向きに開口した筺体内に設けられ、前記アンテナを収容し、前記物品を囲み、該物品よりも広い開口が上向きに形成されたシールド部と、を備え、
 前記筺体および前記シールド部が上向きに開口した状態で、前記RFタグから情報を読み取ることを特徴とする読取装置。
無効 有効
 前記アンテナよりも前記開口側に配されて、前記物品が載置される載置部を備えた請求項1に記載の読取装置。 無効 有効
 前記シールド部は、
  前記電波を吸収する電波吸収層と、
  前記電波吸収層の外側に形成され、前記電波を反射させる電波反射層と、
  を備えることを特徴とする請求項1または請求項2に記載の読取装置。
有効 有効

 請求項1~請求項3のいずれかに記載の読取装置と、
 前記読取装置と通信可能な情報提供装置と、を備え、
 前記情報提供装置は、
  前記物品に関する物品情報を前記RFタグの情報に対応付けて記憶する記憶部と、
  前記読取装置から前記RFタグの情報を取得する取得部と、
  取得した前記RFタグの情報に対応する前記物品情報を前記記憶部から抽出して提供すべき情報を生成する情報生成部と、
  生成された前記提供すべき情報を出力する出力部と、
  を備える情報提供システム。

無効 有効

なお、裁判は三審制なので、不服がある側(原告or被告)は、最高裁判所へ上訴することは可能であり、この判決はまだ確定してはいない。

もう少し詳しく解説する。

そもそもは、アスタリスクが自社の特許第6469758号を侵害しているとしてファーストリテーリング(ユニクロ)を訴えた特許権侵害訴訟(セルフレジ特許訴訟 参照)が始まりである。この訴訟は、まだ決着していない。

特許侵害訴訟は、被告の行為が原告の特許権を侵害しているかどうかを審理する侵害論と、侵害している場合にどの程度の損害が出ているかを審理する損害論の2つの段階に分かれるが、それ以前に特許自体が有効かどうかを争う段階を経ることが多い。そのために被告が原告の特許が無効であると主張して、特許庁へ無効審判を請求する。

本件でも、訴えられた側のファーストリテーリングが、特許第6469758号の無効を主張して、特許庁へ無効審判を請求した。この無効審判では、請求項1,2,4を無効とした一方、請求項3は有効と、審決された。請求項1,2,4についてはファーストリテーリングが勝ち、請求項3についてはアスタリスクの勝ちである。(セルフレジ特許訴訟Ⅲ 参照)

無効審判は、裁判の三審制の第一審に位置づけられているため、不服があれば高等裁判所(特許訴訟なので知財高裁が管轄する)へ審決取消訴訟を提起することができる。今回の判決は、この審決取消訴訟の判決である。

この事案では、ファーストリテーリングとアスタリスクのそれぞれが、自身が負けた側の審決に不服があるので、下の2件の審決取消訴訟が提起された。

事件番号 原告 被告 請求内容
令和2年(行ケ)
第10102号
アスタリスク ファースト
リテーリング
請求項1,2,4を無効とした審決の取消
令和2年(行ケ)
第10106号
ファースト
リテーリング
アスタリスク 請求項3を有効とした審決の取消

この2件の訴訟は併合されて、今回、両方について判決が言い渡されたものである。

アスタリスクが求めた「請求項1,2,4を無効とした審決の取消」は認められ、
ファーストリテーリングが求めた「請求項3を有効とした審決の取消」は棄却された。

ということで、請求項1~4のすべてが有効と認定され、アスタリスクの主張が全面的に認められたという判決である。

この判決に不服がある場合には、最高裁判所へ上訴することができる。一方、上訴を断念するなどしてこの判決が確定すると、請求項1~4のすべてが有効であることを前提として、そもそもの特許侵害訴訟が再開されるのである。

判決理由など、さらに詳しくは、いずれ解説したいが、判決文が191ページに上るため、今回はここまでとしたい。

(判決文は、裁判所の裁判例検索から入手することができる。( 裁判所判例検索 参照))