Python

【Python】家計を見直してみた part2

はじめに

こんにちは。

今回は前回part1の続きです。

前回はデータを加工して、合計支出と決済数の相関関係をみたところで終わりました。

今回は、以下3つの内容について見てみました。

  1. 合計支出額の階級分布の作成
  2. 四分位数ごとに支出額/決済を取る
  3. 月ごとの平均支出額を算出

それでは見ていきましょう。





1.合計支出額の階級分布

ヒストグラムはライブラリを使って、簡単に作成できます。

まずは分かりやすいように、グリッドが表示されるように設定します。

そしてヒストグラムはplt.histで作成できます。

各オプションの意味ですが、

binsは表示する棒の数で、階級数を表します。(デフォルト値: 10)

rangeはビンの最小値と最大値を指定します。(デフォルト値: (x.min(), x.max()))

rwidthは、各棒の幅を数値または、配列で指定します。

import numpy as np
import matplotlib.pyplot as plt
 
# ヒストグラムを出力
plt.grid(True)    
plt.hist(data_total_by_month.values(), bins=20, range=(0, 500000), rwidth=0.8)


そうすると、このようなヒストグラムが作成されます。

合計支出額でいうと、20万弱と30万半ばが多いことがわかります。





2.四分位数ごとに支出額を取得

それでは、四分位数ごとに支出額を出していきます。

まずは、箱ヒゲ図を作成してみました。

plt.boxplot(data_total_by_month.values(), vert=False)

vertは縦向きにするか横向きにするかを選択できます。

さらに中央値と第1、第3四分位数を取得します。

処理としては、q25,q50,q75にそれぞれ四分位数を入れた後、その値に該当する月をfor文にて取得しています

import statistics
q50 = statistics.median(data_total_by_month.values())
q75, q25 = np.percentile(list(data_total_by_month.values()), [75 ,25])

def get_keys_from_value(data, val):
    return [k for k, v in data.items() if v == val]

key_q25 = get_keys_from_value(data_total_by_month, q25)
key_q50 = get_keys_from_value(data_total_by_month, q50)
key_q75 = get_keys_from_value(data_total_by_month, q75)
print(key_q25, key_q50, key_q75)
>['2019/08'] ['2021/09'] ['2022/05']

keyとなる各月を取得できたら、今度は月ごとの1決済あたりの支出額をグラフで見ていきます。

四分位数ごとの支出額をdata_outcome_qXXに入れて、その値でヒストグラムを作成します。

オプションの意味ですが、alphaは透明度を指定できます。

data_outcome_q25 =  -(data_drop_income[data_drop_income['日付'].str.startswith(key_q25[0])]['金額'])
data_outcome_q50 =  -(data_drop_income[data_drop_income['日付'].str.startswith(key_q50[0])]['金額'])
data_outcome_q75 =  -(data_drop_income[data_drop_income['日付'].str.startswith(key_q75[0])]['金額'])

plt.grid(True)    
plt.hist(data_outcome_q25, bins=50, alpha = 0.3, range=(0, 15000), rwidth=0.8, color='blue')
plt.hist(data_outcome_q50, bins=50, alpha = 0.3, range=(0, 15000), rwidth=0.8, color='green')
plt.hist(data_outcome_q75, bins=50, alpha = 0.3, range=(0, 15000), rwidth=0.8, color='red')

ヒストグラムの結果は以下となります。

青が第1四分位数、緑が中央値、赤が第3四分位数となります。

青が少額の決済が多く、赤は1決済あたりの支出額が大きいものがあることが分かります。





3.月ごとの平均支出額を算出

続いて、各月の合計支出額の平均(Ex. 2019,2021,2022の1月の合計支出額の平均)を見て、時期による支出額の大小があるかを見ていきます。

keyとなる月が何月に当たるかを判別し、月毎に支出額のデータを足していきます。

そして、計算結果をprintで出します。

#月ごとの支出平均
#支出が多くなる時期はあるかを確認
count_01 = count_02 = count_03 = count_04 = count_05 = count_06 = 0
count_07 = count_08 = count_09 = count_10 = count_11 = count_12 = 0
data_total_by_01 = data_total_by_02 = data_total_by_03 = data_total_by_04 = data_total_by_05 = data_total_by_06 = 0
data_total_by_07 = data_total_by_08 = data_total_by_09 = data_total_by_10 = data_total_by_11 = data_total_by_12 = 0
for key in data_total_by_month.keys():

  if key.endswith('01'):
    data_total_by_01 += data_total_by_month[key]
    count_01 += 1

  if key.endswith('02'):
    data_total_by_02 += data_total_by_month[key]
    count_02 += 1

  if key.endswith('03'):
    data_total_by_03 += data_total_by_month[key]
    count_03 += 1

  if key.endswith('04'):
    data_total_by_04 += data_total_by_month[key]
    count_04 += 1

  if key.endswith('05'):
    data_total_by_05 += data_total_by_month[key]
    count_05 += 1

  if key.endswith('06'):
    data_total_by_06 += data_total_by_month[key]
    count_06 += 1

  if key.endswith('07'):
    data_total_by_07 += data_total_by_month[key]
    count_07 += 1

  if key.endswith('08'):
    data_total_by_08 += data_total_by_month[key]
    count_08 += 1

  if key.endswith('09'):
    data_total_by_09 += data_total_by_month[key]
    count_09 += 1

  if key.endswith('10'):
    data_total_by_10 += data_total_by_month[key]
    count_10 += 1

  if key.endswith('11'):
    data_total_by_11 += data_total_by_month[key]
    count_11 += 1

  if key.endswith('12'):
    data_total_by_12 += data_total_by_month[key]
    count_12 += 1

print(f' 1月 : '  "{:,.0f}".format(data_total_by_01/count_01)) 
print(f' 2月 : '  "{:,.0f}".format(data_total_by_02/count_02)) 
print(f' 3月 : '  "{:,.0f}".format(data_total_by_03/count_03)) 
print(f' 4月 : '  "{:,.0f}".format(data_total_by_04/count_04)) 
print(f' 5月 : '  "{:,.0f}".format(data_total_by_05/count_05)) 
print(f' 6月 : '  "{:,.0f}".format(data_total_by_06/count_06))
print(f' 7月 : '  "{:,.0f}".format(data_total_by_07/count_07)) 
print(f' 8月 : '  "{:,.0f}".format(data_total_by_08/count_08)) 
print(f' 9月 : '  "{:,.0f}".format(data_total_by_09/count_09)) 
print(f' 10月 : '  "{:,.0f}".format(data_total_by_10/count_10)) 
print(f' 11月 : '  "{:,.0f}".format(data_total_by_11/count_11)) 
print(f' 12月 : '  "{:,.0f}".format(data_total_by_12/count_12)) 

結果は以下の通りです。

10月は少なく、7月に多いことが分かります。おそらく、7月は旅行へ行ったりすることが多いからだと思います。

・1月 : 254,890  
・2月 : 238,021  
・3月 : 255,792  
・4月 : 298,013  
・5月 : 226,351  
・6月 : 226,107  
・7月 : 393,344  
・8月 : 230,105  
・9月 : 169,948  
・10月 : 151,251  
・11月 : 220,380  
・12月 : 222,787

これにて今回の分析は以上です。

見たいデータがあったときに、pythonであれば、どのライブラリを使えば表示させることができるのかを学ぶことができました。

特に型によってはできないこともあったため、リストなどに型変換・加工して、データを図として表示させることが多かったです。

いろんなやり方があるとは思いますが、参考までに。

次回はブートストラップ法などを使ってみます。

Google広告