どうも、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ステップです。
- データ配置(S3)
- CSVファイルをS3バケットへアップロード
- テーブル定義(Athena)
- DDL(テーブル作成クエリ)でS3上の構造を定義
- データ接続(QuickSight)
- QuickSightからAthenaに接続し、データセットを作成
- 可視化(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 のスケジュール実行と組み合わせれば、毎月自動で更新されるダッシュボードも作れそうです。