ライフサイクルマップを描いてみる。

# はじめに
ライフサイクルマップとは、「特定の母集団につき計数値を横軸、計数値の伸び率を縦軸にとり、「萌芽期」「成長期」「発展期」「成熟期」「応用期」の各ライフサイクルポジションに分けて技術の過去から現在までの技術開発を可視化したもの。特定技術分野のライフステージ（技術熟成度）を把握することができる」ものだそうです。

今回はこのライフサイクルマップの作製に挑戦します。縦軸、横軸とも数値計算が必要ですので、難易度が高いようにも見えますが、どうなるでしょうか。

# プログラム
今回のライフサイクルマップは、横軸が出願件数、縦軸が出願件数の増加率、プロットが出願年となりますので、出願年、出願件数、出願件数増加率のデータフレームをまず作成します。

その後、データフレームから散布図を作成して、ライフサイクルマップは完成となります。

今回は、「ドローン、無人飛行体」に関する特許データを使用して分析を行います。

## 出願件数算出
まずは、各年ごとの出願件数を算出します。出願件数の算出には「出願日」の列のデータのみでよいことになりますので、今までのような複雑な処理は不要となります。
```python
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()
```
## 増加率算出
次に増加率の計算となります。計算式は、（今年の件数-前年の件数）/前年の件数、となります。
```python
# 出願年の最小値と最大値を取得
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  # 結果はパーセンテージ
```

## データフレーム作成
算出された出願件数、増加率、出願年からなるデータフレームを新たに作成します。
```python
# 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年以降を散布図でグラフ化します。各データ点については、年の順に点線で結んで、ライフサイクルが目で見てわかりやすいようにします。
```python
# 散布図をプロット
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年
というようなライフステージとなっているのではないかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3110569/d6319d26-af37-022b-4471-db160fd7e9f5.png)
# 感想
ライフサイクルマップの作成には難航することが予想されましたが、ChatGPTに頼れば、比較的すんなりと作成できました。

出願人ごとのライフサイクルマップを作成して比較するのも面白いかもしれません。