2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MIXI DEVELOPERSAdvent Calendar 2023

Day 25

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

Last updated at Posted at 2023-12-24

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

はじめに

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)

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

以下に、多くの人がスクレイピングしており、データエンジニアリングの余地がありそうなページの一例を挙げます。あくまで自己責任で利用規約などを確認した上で行ってください。

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

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

API

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

  • Spotify
  • YouTube
    • 好きな動画の再生数を取得したり。
    • ライブ配信のコメントを取得したり。
    • 結構無料枠の上限が低いのでつらいですが。
  • Qiita ここ。
  • Fitbit フィットネストラッカー
  • マイクロブログ型SNSのタイムライン
    • X(旧Twitter)のタイムラインはAPIの利用が面倒になったため、MastodonやMisskeyなどのタイムラインを代替として取得します。テキストマイニングにはもってこい。APIを叩いてもいいですし、自分でサーバーを立ち上げることもできます。
    • Mastodon
    • Misskey
    • Firefish
  • RSS
    • APIではないですが、ニュースサイトのRSSを記録すると面白そうです。
    • 朝日新聞RSS

IoT

自宅の気温・湿度・消費電力など

Raspberry PiやSwitchBotを使って、自宅の気温などを取得するのもおすすめです。

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

スマホアプリ

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

我が家の基盤

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

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

infra.png

GrafanaはBigQueryをデータソースにして運用しています、BigQueryから取得するのはMySQLなどより流石に遅いですが、数秒待てて頻繁に見ないなら十分かなと思っています。
image

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

おわりに

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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?