Databricksユーザー会JEDAIのメンバー数を分析する

Databricks入社以来、ユーザー会JEDAIのステアリングコミッティーメンバーなのです。

https://jedai.connpass.com/?gmem=1

かれこれ3年を迎えようとしている中、「メンバー数の変遷を見てみたい」と思った次第です。おかげさまで1400人を超えています。

しかし、connpassでは[メンバー一覧を参照](https://jedai.connpass.com/participation/)することはできますが、データとしては取得ができませんでした。

ということで、スクレイピングさせていただきました。

:::note
**注意**
スクレイピングする際には、[利用規約](https://connpass.com/about/api/)などに準拠するように注意してください。
:::

# メンバー数の取得

connpassのメンバー一覧ページはページネーションされているのですが、何ページまでかがレスポンスコードで判別できなかったので、メンバー数から計算します。

```py
import requests, datetime, re
from bs4 import BeautifulSoup

user_agent = 'Mozilla/5.0'

url = 'https://jedai.connpass.com/participation/'
r = requests.get(url, headers={"User-Agent": user_agent})
soup = BeautifulSoup(r.text, "html.parser")
num_members = soup.find("h3", "title inline").get_text()
print(num_members)

num_members = re.search(r'\d+', num_members).group()
print(num_members)
```

```
他のメンバー（1438人）
1438
```

# ページ数の計算

管理者数含めてないのでザックリと計算。

```py
member_per_page = 100
page_total = int(int(num_members) / member_per_page) + 1
print(page_total)
```

```
15
```

# メンバー加入日の抽出

```py
def drug_data(page):
  url = 'https://jedai.connpass.com/participation/?page=' + str(page)
  print(url)
  
  r = requests.get(url, headers={"User-Agent": user_agent})
  soup = BeautifulSoup(r.text, "html.parser")
        
  ret_text_list = []
  elems = soup.find_all("td", "join_date")
  for element in elems:
    join_date_str = element.get_text()
    join_date_str = re.sub("\(*.\)", "", join_date_str)
    #print(join_date_str)
    dte = datetime.datetime.strptime(join_date_str, '%Y/%m/%d')

    ret_text_list.append(dte)

  return ret_text_list
```

```py
members = []
count = 1

while(count <= page_total):
  ret_text_list = drug_data(count)

  for element in ret_text_list:
    members.append(element)

  count = count + 1
```

```
https://jedai.connpass.com/participation/?page=1
https://jedai.connpass.com/participation/?page=2
https://jedai.connpass.com/participation/?page=3
https://jedai.connpass.com/participation/?page=4
https://jedai.connpass.com/participation/?page=5
https://jedai.connpass.com/participation/?page=6
https://jedai.connpass.com/participation/?page=7
https://jedai.connpass.com/participation/?page=8
https://jedai.connpass.com/participation/?page=9
https://jedai.connpass.com/participation/?page=10
https://jedai.connpass.com/participation/?page=11
https://jedai.connpass.com/participation/?page=12
https://jedai.connpass.com/participation/?page=13
https://jedai.connpass.com/participation/?page=14
https://jedai.connpass.com/participation/?page=15
```

# メンバー数の確認

```py
len(members)
```

合ってました(管理者も含まれています)。

```
1445
```

```py
import pandas as pd
df_members = pd.DataFrame(members)
df_members.columns = ['join_date']
df_members = df_members.sort_values("join_date")
display(df_members)
```

ビルトインの可視化機能で日毎の参加者数は確認できます。
![Screenshot 2023-10-08 at 21.18.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1cbcf1ff-0f18-c7f3-449e-c4a5b6c34b05.png)

# 日毎の加入者の集計

累積値を計算するために日毎の合計加入者を計算します。

```py
df_members_groupby_data = df_members.groupby('join_date').size().to_frame('size').reset_index()
display(df_members_groupby_data)
```
![Screenshot 2023-10-08 at 21.20.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f8f3abdb-08ce-4cb9-be73-719fd1180fda.png)

# 累積メンバー数の計算

累積値を計算します。

```py
df_members_groupby_data['cum_size'] = df_members_groupby_data['size'].cumsum()
display(df_members_groupby_data)
```
![Screenshot 2023-10-08 at 21.21.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c1b84df8-391c-78de-98c6-f01b2aed85c6.png)

可視化を設定して、累積値と日毎の加入者を表示します。
![Screenshot 2023-10-08 at 21.22.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2bc1208c-07cd-cf63-317c-c4dee71b4145.png)
![Screenshot 2023-10-08 at 21.22.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b95447f5-363e-1ee6-f121-e9416e35ddc2.png)

できました！
![Screenshot 2023-10-08 at 21.22.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/bca6134b-2dec-c0e4-c01e-ec1247ba1a0a.png)

イベントをマッピングすることで、さらに情報を得ることができます。
![Screenshot 2023-10-08 at 21.31.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/52bf4201-4232-d20c-f735-0054339f3218.png)


### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)