魂の生命の領域

AWS とか Python とか本読んだ感想とか哲学とか書きます

nヶ月間保管されるデータの月額保存料金から当月の増加分に想いを馳せる 2

kesumita.hatenablog.com

オタクはすぐ何でも一般化する

前回の記事では、前月と当月のストレージ増分の変化(差や比)が一定の値になるパターンを考えました。

より一般的に考えるとどうなるでしょうか。

システムの運用開始月のストレージ量を s_1、その翌月が s_2、... というようにすると、 データの保持期間を n ヶ月とした場合の運用開始から i ヶ月目のストレージ量 \displaystyle{S^ n_ i}

\begin{align}
S^n_i = \sum_{j=1}^n s_{i-j+1} = s_i + s_{i-1} + \cdots + s_{i-n+1}
\end{align}

となるでしょう。

前回の記事の前提に則ると、知ることができるのはこの n ヶ月分の合計だけになるので、ここから話を取る前の \displaystyle{s_ i} を求めましょうという問題になります。

s_i を構成する要素を考える

このストレージ量 \displaystyle{s_ i} に主に寄与する要因は何かを考えます。

例えば適当なECサイトを考えると、アクティブユーザー数や商品数などが挙げられると思います。

まぁ EC サイトエアプ勢なので解像度の低い理解なのは何卒ご容赦ください…。

ともあれ、\displaystyle{s_ i} が m 個の主要なファクター \displaystyle{a _ {i1}, a _ {i2}, ..., a _ {im}} でほぼ表せたとしましょう。そして、これらのファクターは測定可能だとします。

\begin{align}
s_i = s_i(a_ {i1}, a_ {i2}, ..., a_ {im})
\end{align}

…このままだと何もできないので、ここから一般化して広げた風呂敷を畳みにいきます。

それぞれ一次の寄与が支配的だとしましょう。要するに \displaystyle{a _ {i1}, a _ {i2}, ..., a _ {im}} の線型結合で表せるとしましょう。

\begin{align}
s_i = \sum_{k=1}^m c_{ik}a_{ik}
\end{align}

そうすると、\displaystyle{S^ n_ i} は、

\begin{align}
S^n_i & = \sum_{j=1}^n \sum_{k=1}^m c_{i-j+1, k}a_{i-j+1, k} \\
& = \sum_{k=1}^m c_{ik}a_{ik} + \sum_{k=1}^m c_{i-1, k}a_{i-1, k} + \cdots + \sum_{k=1}^m c_{i-n+1, k}a_{i-n+1, k}
\end{align}

です。

もっと単純化して、一つの支配的なファクターとその係数だけで十分近似できるとしてみます。 要するにこういうことです。添字 \displaystyle{c _ {im}} の m 依存性はなくしました。

\begin{align}
s_i = c_{i}a_{i}
\end{align}

そうすると、\displaystyle{S^ n_ i} は、

\begin{align}
S^n_i & = \sum_{j=1}^n c_{i-j+1}a_{i-j+1} \\
& = c_{i}a_{i} + c_{i-1}a_{i-1} + \cdots + c_{i-n+1}a_{i-n+1}
\end{align}

ですよね。

で、この式は何を意味するのでしょうか?

\displaystyle{a _ {1}, a _ {2}, ..., a _ {n}} は測定できる値だと仮定したので、ストレージ量に一番作用しそうだと決めたファクター(アクティブユーザー数、商品数、とか)の値を n ヶ月分集めることが必要です。

そうやって集めた値を代入して、未知数 \displaystyle{c _ {1}, c _ {2}, ..., c _ {n}} を求めることになります。

なので、保存期間の分だけ未知数がある方程式を解かないといけないことになります。

やっぱりこれ以上は何もできないので、当月と前月の総ストレージ量の差分を取ります。

\begin{align}
S^n_i - S^n_{i-1} = c_{i}a_{i} - c_{i-n}a_{i-n}
\end{align}

これは前回の記事の冒頭で、次のように書いていた箇所のことを言っているだけですね。

  • 当月:10月・9月・8月
  • 前月:9月・8月・7月

となって 当月 - 前月 = 10月 - 7月 のようにオマケの項「7月分」がついてくるからです。

結局、ある月のストレージ量と最も寄与すると考えるファクターの比が、当月分 \displaystyle{c _ i = \frac{s_i}{a_i}} とnヶ月前の分 \displaystyle{c _ {i-n} = \frac{s _ {i-n}}{a _ {i-n}}} について必要になるので、未知数が2つで式が1つの方程式になりそのままでは解けない訳です。

なんか振り出しに戻った気がしますね。

風呂敷をさらに畳む

もっと単純化してみます。

ファクターに対する係数が、毎月一定の値 c であるとします。

当月の総ストレージ量の増分は

\begin{align}
S^n_i - S^n_{i-1} = c(a_{i} - a_{i-n})
\end{align}

そうすると、ある月の総ストレージ量はこうなりますので、

\begin{align}
S^n_i = c \sum_{j=1}^n a_{i-j+1}
\end{align}

未知数は1つになるため、バチっと求めることができます。

当月の総ストレージ量を直近 n ヶ月のファクターの合計で割れば良い訳です。

\begin{align}
c = \frac{S^n_i}{a_{i} + a_{i-1} + \cdots + a_{i-n+1}}
\end{align}

当月のストレージ量の増分は \displaystyle{s _ i = ca _ i} でわかります。

パラメータを一番寄与の大きいファクターに押し付けた代償を c_i で吸収できていたような気もするので、これを定数にするのは少し心配ですが、実績値から計算してみて、安定してそうだったら採用しても良いのではないでしょうか。

まとめ

もっと汎用的かつ意味のある結果を得ようとすれば、やっぱりファクターの数を最初から一つに決めつけたり c を固定値にしたりせず、重回帰分析をやれよって話になるんですかね(鼻ホジ

いや、でも元々の問題設定から言えば回帰分析でどうのこうのはそんなに重要ではない気もする

何もわからない。