
過去数年間、私はロシアのオンラインストアでの価格設定の問題に非常に興味を持っていました。 オンラインストアが大きな値引きを発表するたびに、疑いが忍び込んでくる...本当にそんな大きな値引きがありますか? 現在、価格は取り消されましたか?
2014年末の急激なドルの変化。 火に燃料を追加しました。 実際に価格がドルの為替レートにどのように依存するかという質問に対する答えを得たいと思いました。
その結果、これらの問題に終止符を打ち、ロシアのオンラインストアでの価格変更の履歴を収集することにしました。 仕事の結果といくつかの興味深いパターン。
いくつかの技術的な詳細
現在、Pythonで書かれた数十のパーサーがシステム上で実行されています。
データを額に保存するのは非常に無駄に思えたので、価格の変更のみを保存することにしました。 価格が変わらない場合、レコードはデータベースに作成されません;このアプローチにより、リソースを非常に節約できます。 現時点では、テーブルには200,000,000行しかありません。これは、8か月間で1,000以上のストアにある100,000アイテム以上のデータにはあまりありません。
MySQL 5.6はストレージとして使用されます。 通常、Hetzner HDDは重い記録負荷に対応していなかったため、最近SSDに移行する必要がありました。
この記事では、収集されたデータの分析で見つかった興味深いパターンについて説明します。
1.同期価格変更
数か月にわたってベースを収集したので、異なるストアからの同じ製品のオファー間の相関係数を分析することにしました。 このために、python + pandasスクリプトがすぐにスケッチされました。 この場合のパンダは、リサンプル機能に本当に役立ちました。
sql = """ SELECT pr.date, pr.shopitemid, price from prices AS pr JOIN shopitems AS si ON pr.shopitemid = si.id WHERE si.itemid = 1 AND si.shopid > 10 AND si.last_price IS NOT NULL ORDER BY pr.date """ df = pd.read_sql_query(sql, engine) for item in df['shopitemid'].unique(): x= df[df['shopitemid'] == item] nans = x.isnull().sum()['price']/float(len(x)) if nans > 0.2 or len(x['price'].unique()) < 10 or \ x['date'].min() > (datetime.now() - relativedelta(months=3)): df = df.drop(df[df['shopitemid'] == item].index) df = df.dropna() df = df.pivot(index='date', columns='shopitemid', values='price') df = df.fillna(method='pad') df = df.dropna() df = df.resample('24h', fill_method='pad', how='last', loffset='24h') mtrx = df.as_matrix().T columns = df.columns.values corr = np.corrcoef(mtrx) z = np.where(corr > 0.90) for x,y in zip(z[0],z[1]): if x<y: print columns[x],columns[y] myplot(mtrx[x]) myplot(mtrx[y]) plt.show()
Indesit SB 185冷蔵庫の例を使用して、価格変更の履歴を分析しましょう。
出力は、次のような非常に興味深いグラフィックでした。

その他のチャート



ここでは、このチャートをより便利な形式で見ることができます。
この例では、3つの店舗で価格が8か月間絶対に同期して変化することがわかります。 私はこの現象のそのような推定原因を見る:
- 3つのうち2つは、競合他社の価格に基づいて自動価格設定システムを使用しています。
- 店舗は何らかの形で組織的に接続されており、共通の価格データベースにアクセスできます
2.新しいスマートフォンの登場。
分析の時点で、Samsung Galaxy S6の価格表を見つけました。

携帯電話が登場した瞬間、私には面白そうだった。
最初の週:高価格の1つまたは2つのオファー。
その後、2か月の間に、残りの店舗が徐々に接続され、価格のスプレッドが大きくなります。
3.商品の各カテゴリで最も安いオンラインストア
かなり大きな価格ベースを収集したので、アイデアは商品の各カテゴリーで最も安い店のトップ10を形成するようになりました。
冷蔵庫カテゴリの例を使用して、このリストを形成する原則を分析しましょう。
各製品カテゴリについて説明します。
この商品を販売している各店舗について、0から1の安いポイントが加算されます。
スコア計算アルゴリズムのスコア=(maxprice-price)/(maxprice-minprice)
各店舗で獲得したポイントの平均を計算します。
このカテゴリの商品をほとんど販売していない店舗は削除します。
たとえば、カテゴリTVの場合、次のリストを取得します。
役職
| ポイント数
| Yandex.Marketでの評価
| Yandex.Marketの評価数
|
レッドボタン
| 0.877
| 5
| 697
|
トップテル
| 0.854
| 5
| 1358
|
Pleer.ru
| 0.853
| 4
| 52711
|
グリーンブック
| 0.853
| 5
| 200
|
CSO
| 0.832
| 5
| 4009
|
Technosteps.ru
| 0.832
| 5
| 294
|
サウンドブリーズ
| 0.812
| 5
| 662
|
エレクトロ
| 0.808
| 5
| 6445
|
デジタル
| 0.805
| 5
| 460
|
電気ゾーン
| 0.804
| 5
| 1664
|
4.なぜこれをすべて書いたのですか?
評判の良いコミュニティからのフィードバックとして、このデータセットの分析に関するアイデアを受け取りたいと思います。
他に何を分析できますか、見つけようとする興味深いパターンは何ですか?
特にブラックフライデー以降、すべての人に価格の履歴を見る機会を与えるために、商品を検索する機能を備えたシンプルなWeb銃口をスケッチしました。 ここでプレイできます。嘘をつかないでください。
UPD 2015年12月1日:価格が特定のしきい値を下回った場合に通知する機能が追加されました。