NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

注目のタグ

    【AWS実践】AWS サービスを使って自分の購買情報を丸裸にしてみた!

    どうも、AWS使用歴約半年のクラウド事業推進部1年目の山田翔也です。


    最近、クレジットカードの明細を見ていて 「あれ、今月こんなに使ったっけ…?」 と驚くこと、ありませんか?

    家計簿アプリでもいいんですが、自分の好きな切り口で分析したり、複数カードの情報をまとめて見たりしようとすると、かゆいところに手が届かなかったりします。

    じゃあ勉強がてら AWS で作ってみるか、ということで、今回は CSV を S3 に置いて、Athena で SQL を叩いて整形して、QuickSight でグラフにする という流れをやってみました。このブログではその過程を紹介します。

    私の 3 月から 11 月までの支出がどのように“丸裸”になったのか、ぜひ最後までご覧ください!

    1. 使用するサービス

    まずは今回使う AWS サービスをさくっと紹介します。

    Amazon S3 (S3)とは

    優れたスケーラビリティ、可用性、セキュリティ、パフォーマンスを提供するオブジェクトストレージです。
    静的サイトホスティングやデータレイクなど用途が広く、耐久性イレブンナイン(99.999999999%)も魅力。
    今回は CSV の置き場として使います。

    参考https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/Welcome.html

    Amazon Athena (Athena) とは

    S3 上のデータに対して直接 SQL を投げられるサーバーレスのクエリサービスです。
    サーバーの構築は不要で、スキャンしたデータ量に応じた課金なので、今回のようなちょっとした分析にはぴったりです。

    参考https://docs.aws.amazon.com/ja_jp/athena/latest/ug/what-is.html

    Amazon QuickSight (QuickSight )とは

    Athena や S3 をデータソースにして、グラフやダッシュボードを作れるサーバーレスの BI ツールです。 数値だけでは見えづらい傾向を、図で直感的に把握できます。

    参考https://aws.amazon.com/jp/quicksight/

    2. 今回分析するデータ

    今回の分析では、2つのクレジットカードの請求情報(CSV)を使います。ここではそれぞれ Aカード/Bカード と呼びます。

    抽出する3つのキー項目

    カードA・B の CSV にはそれぞれ10列前後の項目がありますが、分析に必要なのは以下の3つだけです。これらを Athena で抽出・統合していきます。

    項目 課題 対応
    日付(Date) カードAは秒単位、カードBは日単位と形式がバラバラ YYYY-MM-DD に統一
    店名(Store) そのまま抽出
    金額(Amount) カードAは 1,234 のようにカンマ付き文字列 カンマを除去して数値に変換

    3. 全体の作業フロー

    ざっくり4ステップです。

    1. データ配置(S3)
      • CSVファイルをS3バケットへアップロード
    2. テーブル定義(Athena)
      • DDL(テーブル作成クエリ)でS3上の構造を定義
    3. データ接続(QuickSight)
      • QuickSightからAthenaに接続し、データセットを作成
    4. 可視化(Dashboard)
      • グラフやチャートを作成してダッシュボードを公開

    構成図

    データの可視化の説明を行う上で、まずは全体の設計図を紹介します。

    本来、形式の異なる複数の CSV を統合しようとすると、Excel を開いてコピペして日付形式を手作業で直して…という地道な作業が必要になります。

    今回はそこを AWS のマネージドサービスに任せて、「データの不整合は SQL で吸収する」 という方針で進めました。構成はこんな感じです。

    ポイントをまとめると:

    • S3:CSV は加工せずそのままアップロード(形式差の解決は後段に任せる)
    • Athena:カンマ付き金額や日付フォーマットの違いを SQL で正規化して、2枚のカードを1つのテーブルに統合
    • QuickSight:統合されたデータを棒グラフ・円グラフで可視化

    4. 実際に使ってみた

    Step 1:S3バケットにデータ格納

    まず AWS マネジメントコンソールで S3 を開いて、バケットを作成します。名前を入力してあとはデフォルトで OKです。


    バケットができたら「アップロード」から CSV を選択してアップロードします。コンソールからは最大160GBまでアップロードできるので、今回のCSV なら余裕です。

    Step 2:Athena でデータ定義

    コンソールで Athena を検索して「クエリエディタを開く」をクリック。テーブル名を入力し、必要に応じてデータベースも新規作成します。

    「Browse S3」から対象の S3 バケットを指定して、列名とデータ型を設定すればテーブル作成は完了。


    Step 3:Athena で SQL クエリを実行

    カードA・B それぞれの CSV から日付・店名・金額を取り出して、形式を揃えるクエリを書きました。

    具体的にやったことは2つ:

    • 日付のフォーマットを YYYY-MM-DD に統一
    • カンマ付き文字列の金額を数値に変換

    このクエリを実行すると、カードA・B をまとめた1つのテーブルが生成されて S3 に保存されます。

    Step 4:QuickSight で可視化(グラフ作成)

    メニューから「分析の作成」→ データソース一覧で 作成したテーブルを選択 →「データソースを作成」→「視覚化する」を選択することでデータセットが作成されたグラフを作成する準備ができます。

    棒グラフ

    ビジュアル種類から「棒グラフ」を選択し、横軸に店舗名、値に金額(amount)を設定。

    円グラフ

    新しいビジュアルで「円グラフ」を選択。分類に店舗名、値に金額を入れてラベルや並び順を調整。

    保存/共有
    右上の「公開」をクリックすればダッシュボードとして共有もできます。

    5. 図から分析してみた

    棒グラフ

    店舗ごとの利用金額を見ると、Amazon が圧倒的に高い。それ以外の店舗はそこそこばらつきはあるものの、Amazon と比べると明らかに小さい。「主な支出先がどこか」を把握するには棒グラフが分かりやすいと感じました。

    円グラフ

    円グラフで見ても Amazon の占有率がやはり一番大きくて、支出がかなり偏っていることが一目で分かります。構成比で見ることで「この店舗の割合を減らせないか?」みたいな振り返りがしやすくなりました。

    …正直、Amazon 使いすぎですね。自覚はあります。

    6. まとめ

    今回やったことを振り返ると:

    • S3 に CSV を置いて、Athena の SQL で形式の違いを吸収・統合し、QuickSight でグラフ化した
    • 異なるフォーマットの CSV でも、Athena の SQL だけで前処理できるので Excel での手作業が不要になった
    • QuickSight のダッシュボードにしておけば、チームへの共有も簡単になる

    分析結果としては、支出が特定の店舗(主に Amazon)に集中していることが分かりました。知っていたものでも可視化されると改めてインパクトがあります。

    次は月別の推移やカード別の比較など、もう少し分析軸を増やしてみたいなと思っています。Athena のスケジュール実行と組み合わせれば、毎月自動で更新されるダッシュボードも作れそうです。

    執筆者:山田翔也 システムエンジニア プロテインに呪われてる