のような情報から、どれがお得か判定したい。
手動で正規化するのは辛かったので、注文ページから文字列を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あたりを最近触っていなかったので