この記事は弥生 Advent Calendar 2022の14日目の記事です。
前置き
我が家では趣味で開発した「ストック管理システム」を運用しており、日々の買い物に役立てています。
「ストック管理システム」について
シャンプーや調味料などのストック品の個数を管理して、個数が少なくなったものをLINEに通知するシステム。
詳しくは昨年の記事をどうぞ。
運用していく中で、1つの致命的な問題点が浮上しました。
使用した記録の入力を忘れることです。
昨年の記事にも書いた通り、システムに入力する作業が増えたことが一番のデメリットだったのですが、
入力を忘れてしまった場合は、実際の数とシステム上の数がずれてしまい、
実際は数が少ないのにLINEに通知ができなくなってしまいます。
その結果、本当は買う必要があったのに、通知が無かったから買わなかった→ストックが無いオワタ/(^o^)\ということが起きてしまいました。
どう対処しよう?
この問題にシステム的に対処するために、どういった機能を用意すればいいか考えました。
一番ユーザに親切なのは、システム側から「君、入力忘れてない?」とユーザに通知することです。
システムに「入力忘れ通知」機能を実装するために、いくつか方法が考えられます。
- 決まった時間間隔(例えば3日間)ごとに「君、入力忘れてない?」と通知する。
- ユーザがストックごとに時間間隔を設定して、その間隔ごとに「君、入力忘れてない?」と通知する。
- 適切な時間間隔をシステムで計算して、その間隔ごとに「君、入力忘れてない?」と通知する。
この中で一番高機能なのは3です。
余計な通知がなく、最も実際に忘れていそうなタイミングで通知できそうです。
なので、3が可能かどうかを考えてみます。
「ストック管理システム」では、各種操作に対して履歴を蓄積しており、
・どのストック品を
・いつ
・いくつ
・使用した/購入した
というデータが蓄積されています。
このデータを活用すれば、各ストック品のだいたいの使用周期がわかり、その周期に基づいて「君、入力忘れてない?」と通知できるのではないか?と考えました。
データ分析してみよう
「入力忘れ通知」機能を実装できるかどうか、まずは今のデータを分析してみることにしました。
本番データを確認したところ、2022/11/29時点で311件のストック使用ログがありました。
ログは下記のような形式です(一部抜粋)。
ストック品名 | 開封日 |
---|---|
パン粉 | 2021/11/27 |
パン粉 | 2022/2/12 |
パン粉 | 2022/5/14 |
ブルーレット | 2021/11/21 |
ブルーレット | 2021/12/19 |
ブルーレット | 2022/1/30 |
ブルーレット | 2022/2/27 |
ブルーレット | 2022/3/27 |
ブルーレット | 2022/4/24 |
ブルーレット | 2022/5/22 |
ブルーレット | 2022/6/19 |
ブルーレット | 2022/7/18 |
ブルーレット | 2022/8/14 |
ブルーレット | 2022/9/17 |
ボディーソープ | 2021/11/24 |
ボディーソープ | 2021/12/18 |
ボディーソープ | 2022/1/30 |
ボディーソープ | 2022/4/9 |
ボディーソープ | 2022/5/3 |
ボディーソープ | 2022/7/10 |
これらに対して、下記の分析をしていきます。
①使用間隔の算出
ストック品ごとに、前回の使用ログから何日間隔が空いているかを算出します。
②使用間隔のばらつき具合を算出
使用間隔が大きくばらついている場合は、今回の仕組みには向いていないストック品(使用タイミングが予測不可能なもの)となります。
データ分析の結果①
使用間隔は以下のようになりました。
長いので見たい方は展開してくださいね。
使用間隔一覧
ストック品名 | 使用間隔 |
---|---|
あらびき胡椒 | 77 |
あらびき胡椒 | 150 |
ウェットシート | 70 |
ウェットシート | 70 |
ウェットシート | 70 |
ウェットシート | 70 |
ウェットティッシュ | 83 |
ウェットティッシュ | 90 |
ウェットティッシュ | 43 |
ウェットティッシュ | 42 |
オイスターソース | 70 |
オイスターソース | 70 |
オイスターソース | 82 |
オイスターソース | 30 |
オイスターソース | 70 |
オートミール | 16 |
オートミール | 15 |
オートミール | 15 |
オートミール | 26 |
オートミール | 14 |
オートミール | 15 |
オートミール | 18 |
オートミール | 10 |
オートミール | 14 |
オートミール | 19 |
オートミール | 14 |
オートミール | 23 |
オートミール | 13 |
オートミール | 41 |
オートミール | 43 |
おふろのルック | 48 |
おふろのルック | 1 |
おふろのルック | 77 |
おふろのルック | 35 |
おふろのルック | 49 |
おふろのルック | 78 |
おふろのルック | 48 |
オリーブオイル | 96 |
オリーブオイル | 108 |
お茶パック | 28 |
お茶パック | 26 |
お茶パック | 102 |
お茶パック | 24 |
お茶パック | 26 |
お茶パック | 19 |
お茶パック | 20 |
お茶パック | 42 |
お茶パック | 21 |
お茶パック | 26 |
お茶パック | 17 |
お茶パック | 5 |
かつお節 | 75 |
かつお節 | 40 |
かつお節 | 16 |
かつお節 | 30 |
かつお節 | 20 |
かつお節 | 16 |
かつお節 | 27 |
かつお節 | 96 |
かつお節 | 19 |
かつお節 | 38 |
キッチンペーパー | 133 |
キッチンペーパー | 110 |
キッチンペーパー | 63 |
キッチンペーパー | 42 |
キッチンペーパー | 49 |
クイックルワイパー | 97 |
クイックルワイパー | 95 |
ごま油 | 144 |
ごま油 | 200 |
ごま油 | 48 |
コンソメ(固形) | 127 |
コンソメ(顆粒) | 90 |
コンソメ(顆粒) | 60 |
コンロ用クリーナーシート | 108 |
サラダ油 | 63 |
サラダ油 | 0 |
サラダ油 | 33 |
サラダ油 | 28 |
サラダ油 | 59 |
サラダ油 | 52 |
サラダ油 | 46 |
サラダ油 | 68 |
サラダ油 | 25 |
シャンプー | 66 |
シャンプー | 65 |
シャンプー | 71 |
スポンジ | 72 |
だしの素 | 46 |
だしの素 | 64 |
だしの素 | 56 |
ティッシュ | 190 |
トイレットペーパー | 28 |
トイレットペーパー | 64 |
トイレットペーパー | 54 |
トイレットペーパー | 7 |
トイレットペーパー | 25 |
トイレットペーパー | 27 |
トイレットペーパー | 27 |
トイレットペーパー | 56 |
トイレットペーパー | 33 |
トイレットペーパー | 30 |
トイレの漂白剤 | 245 |
トイレ掃除シート | 184 |
にんにくチューブ | 31 |
にんにくチューブ | 30 |
にんにくチューブ | 28 |
にんにくチューブ | 23 |
にんにくチューブ | 20 |
にんにくチューブ | 17 |
にんにくチューブ | 20 |
にんにくチューブ | 24 |
にんにくチューブ | 12 |
にんにくチューブ | 15 |
にんにくチューブ | 46 |
にんにくチューブ | 5 |
にんにくチューブ | 27 |
にんにくチューブ | 21 |
にんにくチューブ | 47 |
にんにくチューブ | 23 |
パスタ | 23 |
パスタ | 74 |
パスタ | 18 |
パスタ | 4 |
パスタ | 14 |
パスタ | 13 |
パスタ | 40 |
パスタ | 24 |
パスタ | 41 |
パスタ | 42 |
パスタ | 36 |
ハンドソープ | 211 |
パン粉 | 63 |
パン粉 | 77 |
パン粉 | 91 |
ブルーレット | 15 |
ブルーレット | 28 |
ブルーレット | 42 |
ブルーレット | 28 |
ブルーレット | 28 |
ブルーレット | 28 |
ブルーレット | 28 |
ブルーレット | 28 |
ブルーレット | 29 |
ブルーレット | 27 |
ブルーレット | 34 |
ボディーソープ | 18 |
ボディーソープ | 24 |
ボディーソープ | 43 |
ボディーソープ | 69 |
ボディーソープ | 24 |
ボディーソープ | 68 |
ボディーソープ | 24 |
ボディーソープ | 22 |
ボディーソープ | 23 |
ボディーソープ | 45 |
ポン酢 | 196 |
マヨネーズ | 47 |
マヨネーズ | 78 |
マヨネーズ | 75 |
マヨネーズ | 50 |
ラー油 | 24 |
ラー油 | 17 |
ラー油 | 43 |
ラー油 | 45 |
ラー油 | 48 |
ラー油 | 23 |
ラー油 | 20 |
ラー油 | 9 |
ラー油 | 19 |
ラー油 | 18 |
ラー油 | 18 |
ラー油 | 11 |
ラー油 | 16 |
ラー油 | 57 |
リンス | 84 |
リンス | 70 |
リンス | 71 |
ルックプラス | 12 |
ルックプラス | 14 |
ルックプラス | 19 |
ルックプラス | 16 |
ルックプラス | 13 |
ルックプラス | 34 |
ルックプラス | 15 |
ルックプラス | 16 |
ルックプラス | 16 |
ルックプラス | 17 |
ルックプラス | 9 |
ルックプラス | 9 |
ルックプラス | 15 |
ルックプラス | 16 |
ルックプラス | 15 |
ルックプラス | 13 |
ルックプラス | 13 |
ルックプラス | 16 |
ルックプラス | 13 |
ルックプラス | 13 |
ルックプラス | 28 |
ワイドハイター | 41 |
ワイドハイター | 35 |
ワイドハイター | 42 |
ワイドハイター | 35 |
ワイドハイター | 49 |
ワイドハイター | 40 |
ワイドハイター | 41 |
塩コショウ | 7 |
可燃ごみ袋(10L) | 126 |
可燃ごみ袋(10L) | 105 |
可燃ごみ袋(20L) | 78 |
可燃ごみ袋(20L) | 91 |
可燃ごみ袋(20L) | 189 |
合わせ味噌 | 98 |
歯磨き粉 | 92 |
歯磨き粉 | 112 |
歯磨き粉 | 110 |
酒 | 93 |
酒 | 52 |
酒 | 42 |
酒 | 28 |
酒 | 91 |
酒 | 48 |
酒 | 40 |
柔軟剤 | 17 |
柔軟剤 | 14 |
柔軟剤 | 15 |
柔軟剤 | 12 |
柔軟剤 | 13 |
柔軟剤 | 12 |
柔軟剤 | 14 |
柔軟剤 | 21 |
柔軟剤 | 11 |
柔軟剤 | 45 |
柔軟剤 | 12 |
柔軟剤 | 16 |
柔軟剤 | 14 |
柔軟剤 | 14 |
柔軟剤 | 29 |
柔軟剤 | 15 |
柔軟剤 | 18 |
柔軟剤 | 15 |
柔軟剤 | 20 |
醤油(調理用) | 181 |
醤油(調理用) | 96 |
食器用洗剤(キュキュット) | 237 |
生姜チューブ | 104 |
生姜チューブ | 113 |
生姜チューブ | 64 |
洗顔 | 51 |
洗顔 | 51 |
洗顔 | 56 |
洗濯用漂白剤 | 27 |
洗濯用漂白剤 | 16 |
洗濯用漂白剤 | 57 |
洗濯用漂白剤 | 11 |
洗濯用漂白剤 | 21 |
洗濯用漂白剤 | 42 |
洗濯用漂白剤 | 28 |
洗濯用漂白剤 | 24 |
洗濯用漂白剤 | 25 |
洗濯用漂白剤 | 21 |
洗濯用漂白剤 | 24 |
洗濯用漂白剤 | 27 |
洗濯用粉洗剤 | 17 |
洗濯用粉洗剤 | 18 |
洗濯用粉洗剤 | 17 |
洗濯用粉洗剤 | 15 |
洗濯用粉洗剤 | 16 |
洗濯用粉洗剤 | 15 |
洗濯用粉洗剤 | 17 |
洗濯用粉洗剤 | 17 |
洗濯用粉洗剤 | 22 |
洗濯用粉洗剤 | 27 |
洗濯用粉洗剤 | 18 |
洗濯用粉洗剤 | 17 |
洗濯用粉洗剤 | 16 |
洗濯用粉洗剤 | 16 |
洗濯用粉洗剤 | 16 |
洗濯用粉洗剤 | 17 |
洗濯用粉洗剤 | 16 |
洗濯用粉洗剤 | 31 |
洗濯用粉洗剤 | 24 |
洗濯用粉洗剤 | 16 |
甜麺醤 | 77 |
甜麺醤 | 76 |
甜麺醤 | 61 |
甜麺醤 | 28 |
甜麺醤 | 45 |
甜麺醤 | 45 |
豆板醤 | 87 |
豆板醤 | 53 |
豆板醤 | 76 |
豆板醤 | 50 |
豆板醤 | 39 |
豆板醤 | 28 |
豆板醤 | 36 |
豆板醤 | 35 |
豆板醤 | 19 |
排水溝ネット | 66 |
排水溝ネット | 64 |
排水溝ネット | 70 |
排水溝ネット | 63 |
排水溝ネット | 73 |
片栗粉 | 60 |
片栗粉 | 185 |
片栗粉 | 36 |
片栗粉 | 23 |
油固め粉 | 86 |
輪切り唐辛子 | 73 |
輪切り唐辛子 | 77 |
輪切り唐辛子 | 95 |
考察①
洗濯用粉洗剤(ビーズとかそういうやつです)がかなりブレが少なそうなことに驚きました。
おそらく入力忘れのせいで31日間空いているところがありますが、大体が15~18日間隔になっています。
結構目分量で使っているつもりだったので驚きました。
また、豆板醤やラー油の使用量がおかしいです。
私は辛い物が好きなので、使うときは多めに使っていたり、、
ラー油を使う料理(餃子、麻婆豆腐など)をよく作ったりするので、そのせいだと思います。
(それでもこんなに使っているとは…)
データ分析の結果②
①の結果をもとに、ストック品ごとにデータのばらつき度合いを計算していきます。
データのばらつき具合は標本分散で見ていきます。
ストック品ごとの母集団を「これまで発生した・これから発生する使用履歴すべて」と考え、今あるデータはその標本であるとして、統計のロジックを適用します。
標本分散はExcelのVAR.P関数で算出できます。
ある程度の標本数がないと標本分散の意味がないので、使用履歴が3回以下のストック品は省くことにしました。
標本分散が小さい=ばらつきが少ない順に並べます。
ストック品名 | 標本分散(小数第3位以下切捨て) |
---|---|
ウェットシート | 0.00 |
排水溝ネット | 14.16 |
洗濯用粉洗剤 | 17.34 |
ワイドハイター | 19.38 |
ルックプラス | 24.36 |
ブルーレット | 36.23 |
柔軟剤 | 59.42 |
オートミール | 91.12 |
にんにくチューブ | 112.46 |
洗濯用漂白剤 | 133.07 |
マヨネーズ | 198.25 |
ラー油 | 215.34 |
トイレットペーパー | 273.29 |
甜麺醤 | 314.88 |
オイスターソース | 317.44 |
ボディーソープ | 336.40 |
パスタ | 344.26 |
サラダ油 | 427.80 |
豆板醤 | 440.00 |
ウェットティッシュ | 490.25 |
お茶パック | 542.55 |
酒 | 558.48 |
おふろのルック | 588.57 |
かつお節 | 657.41 |
キッチンペーパー | 1280.24 |
片栗粉 | 4136.5 |
考察②
標本分散が小さいストック品は、洗濯用粉洗剤のような「定期的に決まった量を消費するもの」が多いです。
反対に、標本分散が大きいストック品は調味料などの「不定期に様々な量を消費するもの」が多いです。
ところで、ラー油の標本分散、小さすぎません?
上記の法則でいえば、ラー油は「不定期に様々な量を消費するもの」のはずですが、我が家では比較的「定期的に決まった量を消費するもの」のようです。
このあたりの使用間隔がやばいです。圧倒的な消費スピードです。
■ラー油の使用履歴(一部)
開封日 | 使用間隔 |
---|---|
2022/6/28 | 19 |
2022/7/16 | 18 |
2022/8/3 | 18 |
2022/8/14 | 11 |
2022/8/30 | 16 |
逆にお茶パック(煮だして1Lとか作るやつ)はほぼ毎日1L分消費しているのに標本分散が大きすぎる気がします。
使用履歴を見ると、2022/3/22と2021/12/10の間がいくつか入力忘れがありそうです。
この時期にお茶パックを使っていなかったということはないはずです。
試しに、102日間という使用間隔を無視して標本分散を計算すると、72.99となり、柔軟剤とオートミールの間くらいの数値になりました。
■お茶パックの使用履歴
開封日 | 使用間隔 |
---|---|
2021/11/14 | 28 |
2021/12/10 | 26 |
2022/3/22 | 102 |
2022/4/15 | 24 |
2022/5/11 | 26 |
2022/5/30 | 19 |
2022/6/19 | 20 |
2022/7/31 | 42 |
2022/8/21 | 21 |
2022/9/16 | 26 |
2022/10/3 | 17 |
2022/10/8 | 5 |
お茶パックのように、既に入力漏れがありおかしくなってしまっているものがあるため、明らかにおかしいデータは除外する必要がありますが、除外のロジックは相当難しいので、今回は目で見て判断して除外します。
最終的には下記のように修正しました。
ついでに各ストック品の平均使用周期(日)も計算しました。
ストック品名 | 標本分散 | 平均使用周期(日) |
---|---|---|
ウェットシート | 0.00 | 70.00 |
洗濯用粉洗剤 | 9.46 | 17.74 |
排水溝ネット | 14.16 | 67.2 |
柔軟剤 | 17.44 | 15.67 |
ワイドハイター | 19.39 | 40.43 |
ルックプラス | 24.36 | 15.81 |
ブルーレット | 36.23 | 28.64 |
洗濯用漂白剤 | 55.42 | 24.18 |
お茶パック | 72.99 | 23.09 |
オートミール | 91.13 | 19.73 |
にんにくチューブ | 112.46 | 24.31 |
マヨネーズ | 198.25 | 62.50 |
トイレットペーパー | 206.17 | 38.22 |
ラー油 | 215.35 | 26.29 |
サラダ油 | 238.44 | 46.75 |
おふろのルック | 257.14 | 55.83 |
パスタ | 304.85 | 32.50 |
甜麺醤 | 314.89 | 55.33 |
オイスターソース | 317.44 | 64.40 |
ボディーソープ | 336.40 | 36.00 |
豆板醤 | 440.00 | 47.00 |
ウェットティッシュ | 490.25 | 64.50 |
酒 | 558.49 | 56.29 |
かつお節 | 657.41 | 37.70 |
キッチンペーパー | 1280.24 | 79.40 |
片栗粉 | 4136.50 | 76.00 |
どこまでが「入力忘れ通知」できそうか
標本分散が一番小さい「ウェットシート」(床を拭くやつです)は、使用タイミングのブレが無いので、
確実にピッタリなタイミングで「入力忘れ通知」ができそうだと言えます。
反対に、標本分散がもっとも大きい「片栗粉」は、使用タイミングのブレが大きすぎて、
適切なタイミングでの「入力忘れ通知」ができなさそうだと言えます。
ではその間のストック品たちはどうでしょうか。
使用タイミングがどれくらいブレているか、標本分散ではわかりにくいため、標本標準偏差を使います。
標本標準偏差を見ることで、使用周期が平均使用周期±標本標準偏差の範囲に大体収まっている、ということがわかります。
標本標準偏差は標本分散の平方根です。
ストック品名 | 標本分散 | 標本標準偏差 |
---|---|---|
ウェットシート | 0.00 | 0.00 |
洗濯用粉洗剤 | 9.46 | 3.08 |
排水溝ネット | 14.16 | 3.76 |
柔軟剤 | 17.44 | 4.18 |
ワイドハイター | 19.39 | 4.40 |
ルックプラス | 24.36 | 4.94 |
ブルーレット | 36.23 | 6.02 |
洗濯用漂白剤 | 55.42 | 7.44 |
お茶パック | 72.99 | 8.54 |
オートミール | 91.13 | 9.55 |
にんにくチューブ | 112.46 | 10.60 |
マヨネーズ | 198.25 | 14.08 |
トイレットペーパー | 206.17 | 14.36 |
ラー油 | 215.35 | 14.67 |
サラダ油 | 238.44 | 15.44 |
おふろのルック | 257.14 | 16.04 |
パスタ | 304.85 | 17.46 |
甜麺醤 | 314.89 | 17.75 |
オイスターソース | 317.44 | 17.82 |
ボディーソープ | 336.4 | 18.34 |
豆板醤 | 440 | 20.98 |
ウェットティッシュ | 490.25 | 22.14 |
酒 | 558.49 | 23.63 |
かつお節 | 657.41 | 25.64 |
キッチンペーパー | 1280.24 | 35.78 |
片栗粉 | 4136.5 | 64.32 |
個人的に、1週間以内であれば使ったことは思い出せそうなので、
標本標準偏差が7未満になるものが「入力忘れ通知」に適していそうです。
標本標準偏差が7以上の場合は通知タイミングが早すぎたり遅すぎたりする可能性が出てくるため、平均使用周期±標本標準偏差の期間内で複数回「入力忘れ通知」をするなどの対処が必要かもしれません。
(ラー油、最短だと柔軟剤と同じ周期で消費しているらしいです。最長だとにんにくチューブと同じ。麻婆豆腐に使う組み合わせですね。)
まとめ
我が家のストック品の使用データを分析してみた結果、
・洗濯用粉洗剤や柔軟剤などは思っているよりもコンスタントに消費している
・辛い物が好きすぎる
ということがわかりました。
普通に生活していたらなかなか気づけないことだったと思います。
今後もデータを収集し続け、注視していきたいと思います。