データエンジニアリングを学びたいけどデータがない？データを手に入れる方法

MIXI DEVELOPERS Advent Calendar 2023 25日目の記事です

https://qiita.com/advent-calendar/2023/mixi

# はじめに

BigQueryが好きでよく熱く語るのですが、「入れるデータがないからなー」とか「まずそれなりの規模のサービスを作るところからかなー」とかそういう反応を頂きます。

職場で「データが整理されてない、困っている！」という人は頑張って整理すればいいのですが、なにもないところからデータの勉強をしてみようというのは、少し踏み出しづらいものがあります。

そういうときは、データを自分で取ってくればいいのです。どのようなデータを取得できるか（できそうか）思いつかない方に向けて、一例を紹介し、アイデアの糧にしてほしい（丸パクリでもOKです）、そしてぜひデータエンジニアリングに挑戦してみてほしいというのが、この記事の趣旨です。


# データエンジニアリングしがいのあるデータとは？

せっかくなのでデータエンジニアリングしがいのあるデータを選択できるとより良いでしょう。
実務で扱う典型的なデータには以下のようなものがあります。

- Webサービスのログデータ
  - `2023-12-25T09:00:00+09:00 POST /api/v1/notes {"text": "今日も眠い"}`
- データベースのある時点の断面
  - 2023-12-25T09:00:00+09:00 時点の `SELECT * FROM users`
  - `1,ペンギン,太郎,男,2003-12-25,東京都,千代田区,学生`
- SNSやアンケートでの自社製品の評判
  - `2023-12-25T09:00:00+09:00 "ペンギン 太郎" "大変親切にしていただきました。ぜひ担当者にはお礼を伝えてください。"`
- 店舗（オンライン・実店舗）の購買履歴
  - `2023-12-25T09:00:00+09:00 "[{\"item\": \"牛乳\", \"count\": 1}, {\"item\": \"卵\", \"count\": 6}]"`

これらは以下のような特性を備えています。

- 高頻度で更新される
  - Webサービスのログデータなどはリアルタイムで追加されます。
- 量が多い
  - 多くのユーザーを抱えるWebサービスのログデータは、当然大きくなります。
- 増え続ける
  - サービスが稼働している限り、大量のデータが継続的に発生します。
- 構造化/非構造化
  - テーブル形式の構造化データやJSON形式のテキスト、画像や音声を活用することもあります。
- リアルタイム/バッチ処理
  - ログデータのようにリアルタイム処理が求められることもあれば、1日1回などバッチ処理で十分なこともあります。

これらの特徴を持つデータをソースにすると、以下のような課題があり、解決すると力がつきます。

- どのようにすると効率よく取得できるでしょうか。
   - 本番のサービスに影響を与えないようにしたい。
   - なるべく安く取得したい。
- 更新によって上書きされる場合、更新前のデータはどのように保持するとよいでしょうか。
   - 古いデータも参照できるようにして冪等性を確保したい。
   - 推移を後から確認したい。
- 増え続けるデータにどのように対応するとよいでしょうか。
   - 適切なパーティショニングにより、取り出しやすくしておくなど。
- 古いデータはどのように保管するのがよいでしょうか。
   - AWSならGlacier, GoogleCloudならArchive Storageの活用など。
- データを集めた後にどのように活用するのか。
  - 可視化するならどのツール（スプレッドシート、Grafana、Redash、Matplotlib…）を使うのか、どのような表現（表形式、棒グラフ、ワードクラウド…）にするのか。
  - 指標を定点観測するならどのようにするのがよいのか（SlackやDiscordに通知、Grafana…）

また、せっかくなのでなるべく興味のあることを題材にすることがモチベーションに繋がります。

- 普段遊んでいるゲーム
  - たまに自分や上位勢のプレイデータを取得できることがあります。
  - 無理な場合は無理ですので諦めるか、サービスを提供している会社への就職を目指してみてください。不正行為は絶対にダメです。
- 普段使っているSNS
  - X(旧Twitter)は大分取得しづらくなりました……
- 趣味に関連すること
  - 好きなことが一番楽しい。
- 役に立つこと  

# 集めるデータのアイデア

## Webスクレイピング

Webスクレイピング（または単にスクレイピング）というのは、プログラムで自動的にWebページからデータを抽出して集めることをいいます。
スクレイピングは、利用規約で禁止されていない限りは、サーバーに過剰な負担をかけない範囲ならば基本的に自由です。ただし、商用利用は禁止なことが多いため、個人利用にとどめておくのがよいでしょう。
また、非常識な負荷をサーバーに与えた場合はアクセスが制限されることもありますので、自己責任です。（例: [通信制限がかかった（スクレイビングについて） - netkeiba](https://support.keiba.netkeiba.com/hc/ja/articles/18841959592857-%E9%80%9A%E4%BF%A1%E5%88%B6%E9%99%90%E3%81%8C%E3%81%8B%E3%81%8B%E3%81%A3%E3%81%9F-%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%93%E3%83%B3%E3%82%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6-))

APIがある場合はAPIを原則使いましょう。プログラムで処理しやすい形式で取得できますし、サーバーへの負荷も少ないです。

### 例
以下に、多くの人がスクレイピングしており、データエンジニアリングの余地がありそうなページの一例を挙げます。あくまで自己責任で利用規約などを確認した上で行ってください。
- [気象庁](https://www.jma.go.jp/jma/index.html): 天気情報
  - [東京の１０分おきの気象観測データ](https://www.jma.go.jp/bosai/amedas/#area_type=offices&area_code=130000&amdno=44132&format=table1h&elems=53614)
- [netkeiba](https://www.netkeiba.com/): 競馬
  - [2023年ジャパンカップのレース結果](https://race.netkeiba.com/race/result.html?race_id=202305050812&rf=race_list)
  - [netkeibaスクレイピング - Qiita](https://qiita.com/apiss/items/66ef9398fb830fb57483)
- [netkeirin](https://keirin.netkeiba.com/): 競輪 
- [SUUMO](https://suumo.jp/) 不動産検索サイト
  - [機械学習を使って一番安い家賃の家に住む。〜スクレイピング編〜-Qiita](https://qiita.com/tommy24/items/52048b98bc1169b95c05)

## ファイルが公開されている

分析しがいのあるファイルが公開されていることもあります。

- [天鳳](https://tenhou.net/) 麻雀の牌譜
  - [天鳳牌譜解析をはじめたい人へ](http://blog.livedoor.jp/taj_mahal/archives/52075199.html) 
  - 前処理が面倒そうなので挑戦したい方向け。

## API

APIがあると楽にデータを取得できます。

- Spotify
  - [再生中の曲を取得するAPI](https://developer.spotify.com/documentation/web-api/reference/get-the-users-currently-playing-track)
  - これをたとえば10秒間隔で叩けば、何の曲を聞いていたか集計できそう？
- YouTube
  - 好きな動画の再生数を取得したり。
  - ライブ配信のコメントを取得したり。
  - 結構無料枠の上限が低いのでつらいですが。
- [Qiita](https://qiita.com/)　ここ。
  - [検索API](https://qiita.com/api/v2/docs#get-apiv2items)
- Fitbit フィットネストラッカー
  - 心拍数などを１５分おきに取得できます。 [Get Heart Rate Time Series by Date - fitbit](https://dev.fitbit.com/build/reference/web-api/heartrate-timeseries/get-heartrate-timeseries-by-date/)
  - その他、ランニングなどの運動のログもAPIで取得できます。 [Get Daily Activity Summary - fitbit](https://dev.fitbit.com/build/reference/web-api/activity/get-daily-activity-summary/)
- マイクロブログ型SNSのタイムライン
  - X(旧Twitter)のタイムラインはAPIの利用が面倒になったため、MastodonやMisskeyなどのタイムラインを代替として取得します。テキストマイニングにはもってこい。APIを叩いてもいいですし、自分でサーバーを立ち上げることもできます。
  - [Mastodon](https://joinmastodon.org/ja)
  - [Misskey](https://beta.misskey-hub.net/ja/)
  - [Firefish](https://joinfirefish.org/ja/)
- RSS
  - APIではないですが、ニュースサイトのRSSを記録すると面白そうです。
  - [朝日新聞RSS](https://www.asahi.com/information/service/rss.html)

## IoT

### 自宅の気温・湿度・消費電力など
Raspberry PiやSwitchBotを使って、自宅の気温などを取得するのもおすすめです。

「スマートメーター　Raspberry Pi」 などで検索すると、自宅の消費電力を取得する方法も見つかります。私もやっていますが、１～２万円くらいでできるのでおすすめです。

### スマホアプリ

スマホで何か（たとえば位置情報、周りの明るさ、電波状況など）を記録して、分析基盤に送信するアプリを作っても面白そうです。あくまでも自己責任で。

# 我が家の基盤

一例として実際に動いている基盤を紹介します。あまり立派なものではないですが……

温湿度計や電力のスマートメータなどから取得した値を中間サーバーにまとめて、BigQueryに送り出しています。

![infra.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45240/6f85a1e0-6294-f401-569e-b2fd7f599c7f.png)

GrafanaはBigQueryをデータソースにして運用しています、BigQueryから取得するのはMySQLなどより流石に遅いですが、数秒待てて頻繁に見ないなら十分かなと思っています。
![image](https://gist.github.com/assets/5989758/9573fcfb-16a1-4834-aa23-22b769c5ddee)

現状は眺めて満足しており、発展の余地がありますね。市場変動型の電力会社に乗り換えると、リアルタイムで計算できて面白いかも？

# おわりに

何か面白そうなものが見つかったり、思いついたりしたらとても嬉しいです。他にも良さそうなものがあったらコメントで教えてください。