5대 특허청 간의 출원 경향을 파악한다.

각국 특허청의 제1국 출원으로부터, 어떻게 각국에 출원이 흘러가고 있는지, 그 스피드나 양은 어떤 것인가, 5년 이상 전부터 분석해 보고 싶다-라고 생각하고 있어 최근 실현에 가까워진 것 .
이미지에서는 D3.js등 사용해 멋진 느낌 로 하고 싶다.
비행기=출원. 공항 = 각국 특허청

1. 배경



(1)특허 제도는 전세계에 있습니다만, 「각국 특허 독립의 원칙(파리 조약 4조의 2)」이라고 하는 것이 있어,
특허출원은 원칙적으로 각국에 1개씩 나가야 합니다.
(2)그러나, 그것이라면 나라마다 내는 귀찮고 외국어 번역에 시간이 걸리고···라고 하기 때문에 몇가지 특례가 있습니다.
그 중에서 중요한 것이 「우선권」이라고 하는 녀석으로, 난폭하게 요약하면(외국에 수개월 늦게 출원해도) 일본에 내놓은 날을 기준으로 신규성 진보성을 판단해준다 라는 것입니다.
이 「우선권」을 사용하는 것으로, 예를 들어 일본의 기업이 미국에서 제대로 특허를 받거나(미국의 기업에 비해 제도적으로 불리하게 되지 않는다), 그 반대도 가능해집니다.

(3) 이 「각국 특허 독립의 원칙」과 「우선권」을 조합한 결과, 1개의 아이디어를 일본의 특허청에 출원해, (우선권을 사용해 같은 날의 출원의 이익을 얻으면서) 미국의 특허청에 출원해,・・・라고 하는 느낌으로 출원해 갑니다. 같은 우선권을 사용하고 있는 (우선권이 쓰는) 출원은 「패밀리 출원」이라고 합니다.
이 큰 흐름(자국 이외에 어느 나라에서 권리를 확보하려고 하고 있는지)를 5대 특허청에서 파악하고 싶다는 것이 이번 이야기입니다.
최근(이라고 할까 10년 이상 전부터) 중국의 출원 건수가 성장하고 있으므로, 중국의 출원의 동향도 신경이 쓰였습니다.

2. 분석 흐름



・전회와 같이 BigQuery로 아래와 같은 SQL을 두드려, 제1국 출원(=「우선권」의 기초가 되는 출원)의 국명과, 제2국 이후의 출원을 포함한 열을 추출. 기간은 우선일이 2000년 이후. 5대 특허청이 제1국 출원인 특허출원만 추출.

제1국 출원과 패밀리 출원을 추출. 자신의 ~~ 폴더에 다른 BigQuery로 저장.
SQL문 1:
SELECT family_id,SUBSTR(pric.application_number,0,2) as pri_country,STRING_AGG(DISTINCT tb.country_code,"|") as family_country,STRING_AGG(DISTINCT assi.name,"|") as applicant,STRING_AGG(DISTINCT cast(priority_date as string),"|") as priority_day,STRING_AGG(DISTINCT cast(tb.filing_date as string),"|") as filing_days,STRING_AGG(tb.application_number,"|") as appnums 
FROM `patents-public-data.patents.publications_201809` as tb ,UNNEST(priority_claim) as pric,UNNEST(assignee_harmonized) as assi
WHERE pric.filing_date >20000000 and REGEXP_CONTAINS(SUBSTR(pric.application_number,0,2), r"JP|US|EP|CN|KR|WO")
GROUP  BY family_id,pric.application_number

이 시점에서 5대 특허청이 제1국 출원으로 출원된 출원은 약 2900만건(29,130,535건)! EP 제1국 출원이 이외로 적습니다만, 이것은 DE가 제1국 패턴등의 탓일까요? (EP는 국가가 아닌 EU 지역). 뭔가 불안하지만 다른 사람은 그렇게 이상하지 않기 때문에 이대로 진행된다.
SQL문 2:
SELECT pri_country,COUNT(*) as count
FROM  `**~~**201504.uspto.alldata2`
GROUP BY pri_country



제1국 출원과 5청에서 교차 집계
SQL문 3:
SELECT SUBSTR(priority_day,0,4), case pri_country
when 'EP' then 'EP'
when 'JP' then 'JP'
when 'US' then 'US'
when 'CN' then 'CN'
when 'KR' then 'KR'
end pri_country,
sum(case when family_country LIKE '%EP%' then 1 else 0 end ) as EP,
sum(case when family_country LIKE '%JP%' then 1 else 0 end ) as JP,
sum(case when family_country LIKE '%US%' then 1 else 0 end ) as US,
sum(case when family_country LIKE '%CN%' then 1 else 0 end ) as CN,
sum(case when family_country LIKE '%KR%' then 1 else 0 end ) as KR,
count(*) as total
from `**~~**.uspto.alldata2`
group by pri_country,SUBSTR(priority_day,0,4)

이런 느낌. 내리지 않고 일부


3. 시각화



이것을 GoogleMapsAPI 의 애니메이션 기능등을 사용해 가시화 예정. 지쳤기 때문에 이것은 다음에.

4. 여기까지 고생한 사촌.



・UNNEST
⇒priority_date와 filing_date가 BigQuery 특유라고 생각되는 ARRAY(STRUCT)라는 구조로 들어 있었기 때문에 이 근처 참고로 하면서 UNNEST를 사용하는 부분.
· STRING_AGG
⇒패밀리 출원은, priority_date와는 별도로 각각의 나라에서 출원 번호, filing_date등이 부여되므로, family_id로 groupby했을 경우에, STRING_AGG를 사용하지 않으면 에러가 되어 버리는 점.
· SQL로 교차 집계
⇒처음, SQL문 1의 뒤에 pandas로 읽어들여 groupby나 crosstab하면 좋겠다고 생각하고 있었는데, 3000만건 정도 추출되었으므로 단념. 크로스 집계도 BiGQuery에서 받았다.
굉장히 편리하고, pandas 이외에 무기가 생겼습니다.

좋은 웹페이지 즐겨찾기