はじめに
ライフサイクルマップとは、「特定の母集団につき計数値を横軸、計数値の伸び率を縦軸にとり、「萌芽期」「成長期」「発展期」「成熟期」「応用期」の各ライフサイクルポジションに分けて技術の過去から現在までの技術開発を可視化したもの。特定技術分野のライフステージ(技術熟成度)を把握することができる」ものだそうです。
今回はこのライフサイクルマップの作製に挑戦します。縦軸、横軸とも数値計算が必要ですので、難易度が高いようにも見えますが、どうなるでしょうか。
プログラム
今回のライフサイクルマップは、横軸が出願件数、縦軸が出願件数の増加率、プロットが出願年となりますので、出願年、出願件数、出願件数増加率のデータフレームをまず作成します。
その後、データフレームから散布図を作成して、ライフサイクルマップは完成となります。
今回は、「ドローン、無人飛行体」に関する特許データを使用して分析を行います。
出願件数算出
まずは、各年ごとの出願件数を算出します。出願件数の算出には「出願日」の列のデータのみでよいことになりますので、今までのような複雑な処理は不要となります。
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
import numpy as np
# googleドライブの利用
from google.colab import drive
drive.mount('/content/drive')
# データの前処理
# データの読み込み(google ドライブから)
df = pd.read_csv("/content/drive/MyDrive/無人飛行体.csv", encoding="utf-8")
#必要な列のみ抽出
df = df[['出願日']]
#出願日を日付型に置き換え
df['出願日'] = pd.to_datetime(df['出願日'])
#出願日を出願年に置き換え
df['出願年'] = df['出願日'].dt.year
# 出願年ごとの件数をカウント
count_by_year = df['出願年'].value_counts().sort_index()
増加率算出
次に増加率の計算となります。計算式は、(今年の件数-前年の件数)/前年の件数、となります。
# 出願年の最小値と最大値を取得
min_year = df['出願年'].min()
max_year = df['出願年'].max()
# 最小年から最大年までの範囲でreindexし、NaNを0に置き換え
count_by_year = count_by_year.reindex(range(min_year, max_year + 1), fill_value=0)
# 増加率を計算
count_by_year_change_rate = ((count_by_year - count_by_year.shift(1)) / count_by_year.shift(1)) * 100 # 結果はパーセンテージ
データフレーム作成
算出された出願件数、増加率、出願年からなるデータフレームを新たに作成します。
# pandas Seriesをデータフレームに変換
count_by_year_df = pd.DataFrame({
'出願年': count_by_year.index,
'件数': count_by_year.values,
'増加率 (%)': count_by_year_change_rate.values
})
# 初年度の増加率はNaNになるので、それを0に置き換える
count_by_year_df['増加率 (%)'] = count_by_year_df['増加率 (%)'].fillna(0)
print(count_by_year_df)
# データフレームを2013年以降に制限
count_by_year_df = count_by_year_df[count_by_year_df['出願年'] >= 2013]
# 2013年の増加率を0に設定
count_by_year_df.loc[count_by_year_df['出願年'] == 2013, '増加率 (%)'] = 0
作成されたデータフレームは以下のようになります。2013年あたりから、グラフ化できる数値が取れそうですので、グラフ化は2013年以降とします。
出願年 件数 増加率 (%)
0 1976 1 0.000000
1 1977 0 -100.000000
2 1978 0 0.000000
3 1979 1 inf
4 1980 0 -100.000000
5 1981 0 0.000000
6 1982 0 0.000000
7 1983 0 0.000000
8 1984 0 0.000000
9 1985 0 0.000000
10 1986 0 0.000000
11 1987 0 0.000000
12 1988 1 inf
13 1989 0 -100.000000
14 1990 2 inf
15 1991 3 50.000000
16 1992 0 -100.000000
17 1993 4 inf
18 1994 1 -75.000000
19 1995 0 -100.000000
20 1996 0 0.000000
21 1997 0 0.000000
22 1998 1 inf
23 1999 1 0.000000
24 2000 1 0.000000
25 2001 1 0.000000
26 2002 0 -100.000000
27 2003 0 0.000000
28 2004 10 inf
29 2005 0 -100.000000
30 2006 1 inf
31 2007 0 -100.000000
32 2008 0 0.000000
33 2009 0 0.000000
34 2010 2 inf
35 2011 0 -100.000000
36 2012 0 0.000000
37 2013 2 inf
38 2014 3 50.000000
39 2015 36 1100.000000
40 2016 89 147.222222
41 2017 108 21.348315
42 2018 120 11.111111
43 2019 183 52.500000
44 2020 89 -51.366120
45 2021 56 -37.078652
46 2022 6 -89.285714
グラフ化
2013年以降を散布図でグラフ化します。各データ点については、年の順に点線で結んで、ライフサイクルが目で見てわかりやすいようにします。
# 散布図をプロット
plt.scatter(count_by_year_df['件数'], count_by_year_df['増加率 (%)'])
# 各データ点に対応する年をテキストとしてプロット
for i in range(len(count_by_year_df)):
plt.text(count_by_year_df['件数'].iloc[i], count_by_year_df['増加率 (%)'].iloc[i], count_by_year_df['出願年'].iloc[i])
# 年の順にデータ点を線で結ぶ
plt.plot(count_by_year_df['件数'], count_by_year_df['増加率 (%)'], color='red', linestyle='dashed')
# 増加率が0の位置に横方向の補助線を引く
plt.axhline(0, color='black', linestyle='dotted')
# 増加率が最大のプロットを通る縦方向の補助線を引く
max_growth_rate = count_by_year_df['増加率 (%)'].max()
max_growth_year = count_by_year_df[count_by_year_df['増加率 (%)'] == max_growth_rate]['件数'].values[0]
plt.axvline(max_growth_year, color='black', linestyle='dotted')
plt.xlabel('件数')
plt.ylabel('増加率 (%)')
plt.title('出願年による件数と増加率の散布図')
plt.show()
出力されたグラフ
出力されたグラフは以下となります。
なんとなくですが、
「萌芽期」:~2013年
「成長期」:2013年~2015年
「発展期」:2015年~2019年
「成熟期」:2019年~2021年
「応用期」:2021年~2022年
というようなライフステージとなっているのではないかと思います。
感想
ライフサイクルマップの作成には難航することが予想されましたが、ChatGPTに頼れば、比較的すんなりと作成できました。
出願人ごとのライフサイクルマップを作成して比較するのも面白いかもしれません。