多項式近似

久しぶりにPythonをいじって遊びます。
テーマは、平均貯蓄額、(scipyを使っての)多項式近似、あと(matplotlibでの)描画です。


さて、データは【2014年独身男女のお金実態調査】 男性は再婚・晩婚に対して女性よりも積極的 女性は7割以上が年収にこだわりアリ。求める年収は平均640万円! | 株式会社マネーフォワードの5番目の世代別の平均貯金額(男性)を使いたいと思います。
20代のデータとかの幅のあるデータをどうしようか迷ったので、とりあえず、25歳と35歳とかにしました。さらに、70代以上って、幅がありすぎるので、そこは端折ることにしました。

まずは、とりあえず、描画します。

import numpy as np
import scipy as sp
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib
#ここまではお決まり
#データをagesとsavingsにする
ages = [25, 35, 45, 55]
savings = [251, 580, 811, 1005]
#描画する
plt.scatter(ages, savings)
plt.xlabel('年齢')
plt.ylabel('平均貯金額(万円)')

f:id:fijixfiji:20150203192309p:plain

続いて、4つしかデータがないですが、scipyを使って、多項式近似をする(手計算でもできるレベルですが)。
やることは、4つのデータから多項式近似のパラメータを求めて(sp.ployfit)、多項式作って(sp.ploy1d)で、重ねて描画する。

#3つめの"1"が1次多項式の意味。ここの数字を帰れば、n次多項式とかに変更できる。numpy.ndarrayのリストが返ってくる。
fp = sp.polyfit(ages,savings,1)
#続いて、多項式を作る
f1 = sp.poly1d(fp)

近似した関数が求められたので、てきとーに描画します。

fx = sp.linspace(20,60,41)
plt.plot(fx, f1(fx))
plt.legend(['直線で近似','データ'], loc='upper left')

ということで、あっという間に完成。
f:id:fijixfiji:20150203195206p:plain

ここで、ちょっとパラメータ(fp)を見てみます。

array([  24.93, -335.45])

24.93が傾きのことなので、1年でだいたい25万円ほど、貯金額が増加していることになります。


最後に再考。
あまりに少ないデータに対して道具があまりに強力すぎる感は否めないですが、そもそもscipyを使った計算なんかをやったことがなかったので、これはこれでよしとする。
あと、結果なのですが、70歳以上ってのは除いたこととちょっと繋がるのですが、増加率って20代と40代(と70代)だとだいぶ変わる気がするんですが、直線でえいやとやってしまったわけです。
なので、20歳で貯金額が163万円あるような直線になってます。それがスタートってのはおかしいだろと。


ちなみに、大学卒業を22歳だとすると、213万円もあることになります♡ 奨学金まみれだった僕とは大違いですね・・・(え