はじめに
前回は仮のデータでクロス集計をしてみましたが、今回は実際の特許データを使ってクロス集計をしてみたいと思います。
データフレームの作成
以前テキストマイニングを行いました特許データを流用してデータフレームを作成しました。
import pandas as pd
# googleドライブの利用
from google.colab import drive
drive.mount('/content/drive')
# データの前処理
# データの読み込み(google ドライブから)
df_drone_data_1 = pd.read_csv("/content/drive/MyDrive/pat_data_drone.20181231.csv", encoding = "shift-jis")
df_drone_data_2 = pd.read_csv("/content/drive/MyDrive/pat_data_drone.20190101.csv", encoding = "shift-jis")
# データフレームの結合(縦方向)
df_drone_data = pd.concat([df_drone_data_1, df_drone_data_2], ignore_index = True)
#必要な列のみ抽出
df_drone_data = df_drone_data[['出願人/権利者', 'FI']]
#不要語の削除(出願人/権利者)
df_drone_data['出願人/権利者'] = df_drone_data['出願人/権利者'].str.replace('▲', '')
df_drone_data['出願人/権利者'] = df_drone_data['出願人/権利者'].str.replace('▼', '')
# 欠落データを削除
df_drone_data = df_drone_data.dropna()
# データフレームの確認
print(df_drone_data)
データフレームは以下のようになりました。行数は960行となりました。
FIのセルには多数のFIが存在することがわかります。下記出力からはわかりませんが、出願人/権利者にも同様に複数の出願人/権利者が存在すると思われます。
出願人/権利者 FI
0 ソニー株式会社 H04N5/247,G03B15/00@U,G03B37/00@C,H04N5/222,10...
1 日本電気株式会社 G06Q50/10,G06Q30/06,350,G06Q30/0645
2 ソフトバンク株式会社 H04Q9/00,301@B,B64C39/02,B64C13/20@Z,B64C13/18...
3 一般財団法人電力中央研究所 B61B7/00@A,B64D27/24,B64C39/02,H02G1/02
4 楽天株式会社 B64C39/02,B64C27/08,B64D45/00@Z
.. ... ...
955 株式会社NTTドコモ B64F1/36,B64D45/00@A,B64D45/00@Z,B64D47/00,B64...
956 株式会社NTTドコモ G06Q10/08,300,B65G61/00,540,B64C39/02,B64F1/36...
957 カン、ムン シク G06Q50/04,G06Q50/16,G06Q50/06,G06F17/50,612@A,...
958 本郷飛行機株式会社 H04B7/15,H04Q9/00,301@B,H04N7/18@D
959 本郷飛行機株式会社 G05D1/10,B64C39/02,B64C13/18@Z,B64D45/04@A,G08...
[960 rows x 2 columns]
エクスプロード処理
このデータフレームに対してエクスプロード処理をします。
# 'FI' を分割
df_drone_data['FI'] = df_drone_data['FI'].str.split(',')
# '出願人/権利者'を分割
df_drone_data['出願人/権利者'] = df_drone_data['出願人/権利者'].str.split(',')
# エクスプロード
df_drone_data = df_drone_data.explode('FI').explode('出願人/権利者')
# インデックスのリセット
df_drone_data = df_drone_data.reset_index(drop=True)
# エクスプロード処理の確認
print(df_drone_data)
エクスプロード処理により、960行のデータが5573行と約6倍のデータとなりました。
FIのセルには1つのFIが存在し、出願人/権利者のセルには1つの出願人/権利者が存在しますので、うまくエクスプロード処理がされたと思います。
出願人/権利者 FI
0 ソニー株式会社 H04N5/247
1 ソニー株式会社 G03B15/00@U
2 ソニー株式会社 G03B37/00@C
3 ソニー株式会社 H04N5/222:100
4 ソニー株式会社 H04N5/232:030
... ... ...
5568 本郷飛行機株式会社 G05D1/10
5569 本郷飛行機株式会社 B64C39/02
5570 本郷飛行機株式会社 B64C13/18@Z
5571 本郷飛行機株式会社 B64D45/04@A
5572 本郷飛行機株式会社 G08G5/04@A
[5573 rows x 2 columns]
クロス集計
それでは試しにクロス集計してみます。
# クロス集計
result1 = pd.crosstab(df_drone_data['出願人/権利者'],df_drone_data['FI'])
print(result1)
553行 x 1609 列の巨大クロス集計表となりました。
これでは使い物になりませんので、次にtop10に限定したクロス集計表にしたいと思います。
FI A01B39/18@Z A01B69/00:303@L A01B69/00@B \
出願人/権利者
つくばテクノロジー株式会社 0 0 0
アイシン高丘株式会社 0 0 0
アイホン株式会社 0 0 0
アウトストア・テクノロジー・エーエス 0 0 0
アオイコンサルタント株式会社 0 0 0
... ... ... ...
NECソリューションイノベータ株式会社 0 0 0
NEXT Logistics Japan株式会社 0 0 0
SSH株式会社 0 0 0
TEAD株式会社 0 0 0
Zero To Infinity株式会社 0 0 0
FI A01B79/00 A01C15/00@B A01C15/00@C A01C15/00@D \
出願人/権利者
つくばテクノロジー株式会社 0 0 0 0
アイシン高丘株式会社 0 0 0 0
アイホン株式会社 0 0 0 0
アウトストア・テクノロジー・エーエス 0 0 0 0
アオイコンサルタント株式会社 0 0 0 0
... ... ... ... ...
NECソリューションイノベータ株式会社 0 0 0 0
NEXT Logistics Japan株式会社 0 0 0 0
SSH株式会社 0 0 0 0
TEAD株式会社 0 0 0 0
Zero To Infinity株式会社 0 0 0 0
FI A01C15/00@F A01C15/14 A01C23/00@C ... \
出願人/権利者 ...
つくばテクノロジー株式会社 0 0 0 ...
アイシン高丘株式会社 0 0 0 ...
アイホン株式会社 0 0 0 ...
アウトストア・テクノロジー・エーエス 0 0 0 ...
アオイコンサルタント株式会社 0 0 0 ...
... ... ... ... ...
NECソリューションイノベータ株式会社 0 0 0 ...
NEXT Logistics Japan株式会社 0 0 0 ...
SSH株式会社 0 0 0 ...
TEAD株式会社 0 0 0 ...
Zero To Infinity株式会社 0 0 0 ...
FI H05B37/02@C H05B45/32 H05B47/155 H05B47/16 \
出願人/権利者
つくばテクノロジー株式会社 0 0 0 0
アイシン高丘株式会社 0 0 0 0
アイホン株式会社 0 0 0 0
アウトストア・テクノロジー・エーエス 0 0 0 0
アオイコンサルタント株式会社 0 0 0 0
... ... ... ... ...
NECソリューションイノベータ株式会社 0 0 0 0
NEXT Logistics Japan株式会社 0 0 0 0
SSH株式会社 0 0 0 0
TEAD株式会社 0 0 0 0
Zero To Infinity株式会社 0 0 0 0
FI H05B47/19 H05K5/02@L H05K5/03@A H05K7/00@F \
出願人/権利者
つくばテクノロジー株式会社 0 0 0 0
アイシン高丘株式会社 0 0 0 0
アイホン株式会社 0 0 0 0
アウトストア・テクノロジー・エーエス 0 0 0 0
アオイコンサルタント株式会社 0 0 0 0
... ... ... ... ...
NECソリューションイノベータ株式会社 0 0 0 0
NEXT Logistics Japan株式会社 0 0 0 0
SSH株式会社 0 0 0 0
TEAD株式会社 0 0 0 0
Zero To Infinity株式会社 0 0 0 0
FI H05K7/20@B H05K7/20@G
出願人/権利者
つくばテクノロジー株式会社 0 0
アイシン高丘株式会社 0 0
アイホン株式会社 0 0
アウトストア・テクノロジー・エーエス 0 0
アオイコンサルタント株式会社 0 0
... ... ...
NECソリューションイノベータ株式会社 0 0
NEXT Logistics Japan株式会社 0 0
SSH株式会社 0 0
TEAD株式会社 0 0
Zero To Infinity株式会社 0 0
[553 rows x 1609 columns]
top10に限定したクロス集計表の作成
出願人/権利者とFIのtop10に限定したクロス集計表を作成します。
# FIのカウント
fi_counts = df_drone_data['FI'].value_counts()
# FIをtop10で並べ替え
top_fi = fi_counts.sort_values(ascending=False).index[:10].tolist()
# 出願人/権利者のカウント
person_counts = df_drone_data['出願人/権利者'].value_counts()
# 出願人/権利者をtop10で並べ替え
top_person = person_counts.sort_values(ascending=False).index[:10].tolist()
# top10の FIと出願人でクロス集計
result2 = pd.crosstab(df_drone_data[df_drone_data['出願人/権利者'].isin(top_person)]['出願人/権利者'], df_drone_data[df_drone_data['FI'].isin(top_fi)]['FI'])
print(result2)
# CSV出力
result2.to_csv('result2.csv', index=True, encoding='utf-8')
完成したクロス集計表は以下となります。なんとなくうまくいった気がします。
厳密な検証をしておりませんので、問題があるようでしたらコメントをください。
出願人/権利者 | B64C13/18@Z | B64C13/20@Z | B64C27/08 | B64C39/02 | B64D27/24 | B64D47/08 | B64F1/12 | B64F1/36 | G05D1/10 | G08G5/00@A |
---|---|---|---|---|---|---|---|---|---|---|
キヤノン株式会社 | 0 | 2 | 2 | 4 | 0 | 2 | 0 | 0 | 0 | 0 |
ソフトバンク株式会社 | 1 | 3 | 1 | 7 | 0 | 3 | 0 | 2 | 0 | 0 |
トヨタ自動車株式会社 | 0 | 0 | 3 | 6 | 1 | 0 | 1 | 2 | 0 | 3 |
パロット ドローンズ | 0 | 3 | 6 | 10 | 0 | 3 | 0 | 0 | 0 | 0 |
株式会社エアロネクスト | 0 | 0 | 14 | 16 | 3 | 3 | 2 | 4 | 0 | 1 |
株式会社ナイルワークス | 22 | 11 | 53 | 61 | 18 | 8 | 3 | 26 | 14 | 10 |
株式会社荏原製作所 | 0 | 0 | 9 | 11 | 7 | 0 | 0 | 0 | 0 | 0 |
株式会社DRONE iPLAB | 0 | 0 | 14 | 15 | 3 | 3 | 0 | 3 | 0 | 1 |
株式会社NTTドコモ | 2 | 6 | 0 | 23 | 1 | 2 | 0 | 11 | 9 | 10 |
西武建設株式会社 | 2 | 0 | 12 | 9 | 3 | 2 | 1 | 2 | 0 | 0 |
感想
普通に作成するとクロス集計表は巨大となってしまいますので、予め分析する企業やFIを決めておき、それらに限定したクロス集計表を作成した方がよいと感じました。
また、そもそもクロス集計表を使って、どういう分析ができるのかという問題もありますが、とりあえず作り方をマスターしておけば、いつか役に立つかもしれません。