LoginSignup
2
3

More than 1 year has passed since last update.

スシローのセットの要素の価格を推定

Last updated at Posted at 2021-05-20

のような情報から、どれがお得か判定したい。
手動で正規化するのは辛かったので、注文ページから文字列をnetaにコピペしてpythonでスプリットする方針で。

import pandas as pd
df=pd.read_clipboard()
neta=df.neta.apply(
    lambda x:
             x.replace("◇","").split("・")
            )        

sklern.ppのMultiLabelBinarizerというので、楽に正規化できた。

問題は、ネタの数(ncol=31)に比べて単品のを付け加えても、データが31件と少ない。
単純に連立方程式が解けない事がわかるし、線形モデルのX^tXが正則にならない。

飲食店のメニューが
M1={x1,x3,x4...}
M2={x2,x4}
みたいな感じで、メニュー数が十分な数が無い事が多いので、この問題はありがちだと思われる。

リッジ回帰がその解決策の一つで、試してみた

from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()

tdf=df.join(
    pd.DataFrame(mlb.fit_transform(neta),
        columns=mlb.classes_,
         index=df.index)
)
tdf=pd.concat([tdf,pd.Series([1]*tdf.shape[0])],axis=1)

from sklearn.linear_model import Ridge
import numpy as np
#clf = Ridge(alpha=1.0,fit_intercept=True)
clf = Ridge(alpha=1.0,fit_intercept=False)

clf.fit(tdf.iloc[:,3:], tdf.price)
res=pd.DataFrame({"name":tdf.iloc[:,3:].columns,"coef":clf.coef_,"ecoef":np.exp(clf.coef_)})

res.sort_values("coef").iloc[::-1]

22  特ネタ大とろ  191.038970  9.271941e+82
21  特ネタ中とろ  177.280521  9.816398e+76
13  まぐろ   137.828883  7.216449e+59
4   うなぎの蒲焼き   117.117830  7.305117e+50
0   1貫いくら   112.259368  5.670535e+48
17  大えび   102.708073  4.032267e+44
24  生サーモン 102.708073  4.032267e+44
25  赤えび   102.708073  4.032267e+44
1   1貫かに本身持ち帰り専用    101.991049  1.968565e+44
12  ほたて貝柱 91.096206   3.652411e+39
10  はまち/寒ぶり 90.756435   2.600273e+39
7   たい  88.708073   3.352946e+38
16  上穴子   81.144683   1.740556e+35
18  漬けまぐろ 68.538970   5.835750e+29
26  軍艦ねぎまぐろ   66.109740   5.141562e+28
11  びん長まぐろ(持ち帰り専用    63.721606   4.720001e+27
15  ジャンボとろサーモン  39.331794   1.206650e+17
14  サーモン    37.181204   1.404726e+16
2   いか  32.197520   9.620672e+13
5   えび  32.197520   9.620672e+13
9   たまご   32.197520   9.620672e+13
8   たこ  29.809387   8.831864e+12
20  煮あなご    29.809387   8.831864e+12
23  甘えび   28.838339   3.344502e+12
27  0   21.701684   2.660244e+09
6   えんがわ    19.037291   1.852638e+08
3   いくら   16.649158   1.700738e+07
19  焼とろサーモン   14.219927   1.498428e+06

モデルは、対数をとらず、切片をつけるのが一番マシな感じ。
安いのは1皿100円程度で1カン50円程度。
32円のいか以下()はちょっと安すぎじゃないかと思う。高いのが高めに出過ぎてる感じ。
まぐろは130円と高く出過ぎ(単品110円)。

これをやるならベイズ一択だろうけど、なんとなくpython,pandasあたりを最近触っていなかったので

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3