たくさん寝太郎の寝床

料理とITと皿回しが好きなオタクのブログ

クレカ支払い情報をpandasで分析してみる話(part 1)

お久しぶりです。たくさん寝太郎です。

気付けば最後のブログ更新から7ヶ月経っていました...時の流れの速さは恐ろしいものです。
修論を提出してから学会誌に速報論文を投稿したり、入社して新人研修を受けたり本配属したりと色々あったのですがそれらについては今後ちまちまと書いていこうと思います。

最近家計簿を付けているのですが、ふと「それぞれの支払い情報を分析してみたいな」と思いました。資産管理にはMoneytreeを使っており、無料版でもかなり十分なくらい機能が備わっているのですが支出の場所や日時の傾向については分析できないっぽいので自分で分析することにしました。
getmoneytree.com

やりたいことを一つの記事にまとめると長くなりそうなので、とりあえず初回の本記事では支払い情報を取得して月毎の支払額を図示するところまでまとめます。


支払い情報を取得する

まず、支払い情報を取得するためにカードの利用明細からcsvファイルを取得してきます。私は普段楽天カード三井住友カードを併用しているので、楽天e-NAVIVpassにログインしてcsvファイルをダウンロードしてきました。

「毎月分照会してcsvダウンロード」というのは少々面倒な気もしますが、私が分析したいのは2021年4月からの支払い情報だけだったのでポチポチとダウンロードを進めました...。長期的なデータを一括で取得したいなら自動化したほうが良いでしょうが、カード利用明細とかってプログラムで処理するの難しそうなイメージがあります。

取得データをpd.DataFrame型に変換する

適当なフォルダを作ってその中に'rakuten'と'mitsui'フォルダを作成し、ダウンロードしてきたcsvファイルをそれぞれのフォルダに移行しておきます。次に、os.listdirでそれぞれのフォルダに含まれるcsvファイルのリストを獲得します。

import os

csvlist_mitsui = os.listdir('mitsui/')
csvlist_mitsui = sorted(['mitsui/' + f for f in csvlist_mitsui])

csvlist_rakuten = os.listdir('rakuten/')
csvlist_rakuten = sorted(['rakuten/' + f for f in csvlist_rakuten])

それぞれのリストの要素をpd.read_csvで読み込めば支払い情報をpd.DataFrame型に変換することができます。ちなみに、三井住友のcsvファイルは文字コードがShift-JISなのでencodingを指定しておきます。

import pandas as pd

df_rakuten = pd.read_csv(csvlist_rakuten[0])
df_mitsui = pd.read_csv(csvlist_mitsui[0], encoding="shift-jis")

(楽天出力例)
f:id:kaworu_mk6:20211004144242p:plain

(三井住友出力例)
f:id:kaworu_mk6:20211004145719p:plain


楽天はヘッダが付いていて優しいですね。三井住友はヘッダが付いてなくて分かりにくいですが、左から「利用日,利用店名,利用金額,支払区分,今回回数,支払金額,利用金額と内手数料」っぽいです。あまり大きな買い物を分割ですることがないので、手数料は最悪無視してもいいか...。(?)

ということで三井住友のデータには楽天と同じになるようにヘッダを付与します。

df_mitsui = pd.read_csv(csvlist_mitsui[0], header=1, encoding="shift-jis")
df_mitsui.columns = ['利用日', '利用店名・商品名', '支払総額', '支払方法', '今回回数', '支払金額', '備考']

三井住友のデータは1行目に契約者情報などが記述されているので、とりあえず2行目をheaderとしてデータを読み込んでから正しいヘッダを指定しました。

楽天のデータは支払金額の部分が「〜月支払金額」となっているためヘッダを修正します。

df_rakuten = df_rakuten.rename({df_rakuten.columns[7]:'支払金額'},axis='columns')
df_rakuten = df_rakuten.rename({df_rakuten.columns[8]:'繰越残高'},axis='columns')

支払金額の推移を図示する

以下のように積立棒表示で支払金額の推移を図示します。確定前の支払明細(この場合だと10月分)はcsvファイルの内容が異なっているため、少し変わった処理をしています。楽天はヘッダに「支払月」が追加されていたためrenameの位置をずらし、三井住友はどうなってるのか分からなかったので確定前の支払金額を0円としました。(確定前の明細は含まない仕様にした方がいいと思いますが)

あと、三井住友は謎に丁寧に最終行に月の支払総額を記述してくれているので最終行を削除します。

import matplotlib.pyplot as plt

rakuten_pay = []
mitsui_pay = []

for rdf in csvlist_rakuten:
    df = pd.read_csv(rdf)
    if len(df.columns) == 11:
        df = df.rename({df.columns[8]:'支払金額'},axis='columns')
        df = df.rename({df.columns[9]:'繰越残高'},axis='columns')
        
    else:
        df = df.rename({df.columns[7]:'支払金額'},axis='columns')
        df = df.rename({df.columns[8]:'繰越残高'},axis='columns')
        
    rakuten_pay.append(sum(df['支払金額']))
    
for mdf in csvlist_mitsui:
    try:
        df = pd.read_csv(mdf, header=1, encoding="shift-jis")
        df.columns = ['利用日', '利用店名・商品名', '支払総額', '支払方法', '今回回数', '支払金額', '備考']
        df = df.drop(df.index[-1])

        mitsui_pay.append(sum(df['支払金額']))
        
    except ValueError:
        mitsui_pay.append(0)
    
    
    
plt.bar(range(4,4+len(rakuten_pay)), rakuten_pay, label='rakuten')
plt.bar(range(4,4+len(mitsui_pay)), mitsui_pay, bottom=rakuten_pay, label='mitsui')
plt.ylim(0,250000)
plt.legend()
plt.show()

出力はこんな感じの棒グラフです。
f:id:kaworu_mk6:20211004180517p:plain


今後、色々分析していこうと思います。


おわり