○概要
今回Colaboratoryを使って、1か月の支出をグラフ化してみました。
スプレッドシートにいつもまとめているのですが、以下の3点の理由からPythonを使ってグラフ化しました。
① グラフ化した方が現状の支出を理解しやすい
② csvデータを加工するだけで、グラフ化できる
③ 1度作成すれば今後もコマンドをたたくだけで済む
とにかく楽に支出のグラフを作成したいのなら、ぜひトライしてみて良いと思います!
私は、家計簿アプリとして「MoneyTree」を使っているので、4月分のデータをcsvファイルとして落としてきました。
落としてきたCSVファイルをドラッグ&ドロップしたあと、下記のコマンドをたたいていきます。
○実際のソースコード
# No.1(下記の図参照)
使用するライブラリをインポート。今回はpandas
とplotyl
を使います。
# No.2
CSVファイルの全量データのうち、1つ目と2つ目と7つ目のカラムを取得して、変数に格納します。
抽出対象のカラムはusecols
で設定していますが、1つ目のカラムは、0にあたるので間違えないように注意して下さい。
今回は、日付と金額とカテゴリのカラムを取得しました。
# No.3
抽出したデータの行数と列名を表記します。
今回は81行と先ほど選択した3列となります。
# No.4
抽出したデータが想定通りに変数に格納されているかを見てみます。
headでデータの頭から数行を取得して確認します。
最後尾から取得する場合は、tail
で取得できます。

# No.5
# No.2で取得したデータをカテゴリごとにグループ化し、合計金額を算出しています。

# No.6
# No.5は2次元配列のため、plotlyで円グラフを作成できませんでした。
そのため、Seriesを用いて1元化しました。
詳細は以下のAPIドキュメントに記載されています。
https://pandas.pydata.org/docs/reference/api/pandas.Series.html?highlight=series#pandas.Series
データには支出と収入の両方が含まれているため、0より大きいものはincome
に格納し、0より小さいものはoutgo
に格納しています。sort_index
はデータを降順に並べています。assending=False
が降順で、Trueの場合、昇順になります。
分かりにくいですが、outgo
に格納する際に、前方に「-」がついている理由は、符号がマイナスだと円グラフを上手く作成することができないため、支出のマイナスを「+」に変換しています。

# No.7
# No.6で取得した支出(outgo
)を円グラフにします。以下の3つの引数でおおむね簡単な円グラフを作成することが可能です。
labelsでは、カテゴリ(outgo.index
)を設定しています。valuesでは、カテゴリの値(今回は金額)を設定しています。
最後のnamesでは、円グラフの右に記載されているラベルを表記します。
たった、5行で以下のような円グラフを作成することができます。
# No.7
fig = px.pie(labels=outgo.index,
values=outgo.values,
names=outgo.index) # ラベルの設定
fig.show()

# No.8
次は支出の合計金額順に並べた棒グラフの作成です。
まずは、X軸とY軸を作成しています。今回は、X軸には支出のカテゴリ、Y軸には支出の合計金額を設定しています。
円グラフでは記載していませんが、グラフに台頭もつけることが可能です。
下記の図からはわかりませんが、hover_name
を設定すると、棒グラフのホバー時にXとYの値やそれ以外の情報が表記されます。
注意点としては、# No.6でデータを降順にしていますが、棒グラフで表記したときに、降順になっているわけではないため、xais
で設定する必要があります。
# No.8
bar = px.bar(x = outgo.index, # X軸のデータを設定
y = outgo.values, # Y軸のデータを設定
title = 'カテゴリ別支出合計', # グラフのタイトル
hover_name = outgo.index, # グラフホバー時にデータ内容を表記
color = outgo.values, # 色をつけるデータの設定
color_continuous_scale = 'Agsunset' # カラースケールの設定。グラデーションになる
)
bar.update_layout(xaxis_title='カテゴリ', # X軸のラベルを設定
yaxis_title='支出合計', # Y軸のラベルを設定
xaxis={'categoryorder':'total descending'}, #データを並び替え
coloraxis_showscale=False) # カラーバーの非表示
bar.show()

まとめ
今回は1か月の支出額をPythonでグラフ化してみました。
グラフ化する前のデータの状態(型、配列、符号etc)などによって、グラフ化できないこともあるので、意外と躓くことが多いですが、試行錯誤するとグラフ化可能なデータにできるので、是非参考にしてください。