Aggressive Style

不定期更新となりますがよろしくお願いいたします。

メルカリ出品で1円でも高く商品を売るために、Webスクレイピング(Python+Selenium)で過去の売値を調査

ショートトーク

f:id:RyuichiXP:20190915125732j:plain

本題に入る前にショートトークをしたい。本日はのショートトークはヤフーがZOZOの株式の過半数を取得し、ヤフーの連結子会社となったニュースについてだ。この件に対し、俺の主観的な感想を述べたい。*1

まず、昨今ZOZO社はいい噂を聞かなかった。「前社長が自社株を担保に借金」や「前社長が会社の株式(自己株式)を買わせようとして、貸借対照表(BS)の自己資本比率が前年の57.7%から31.3%に減少」*2などの噂がネット上をにぎわせていた。

下表はZOZO社の平成30年3月期決算短信と、2020年3月期第1四半期決算短信における、それぞれのBSの純資産項目を見比べた物だ。前社長(?)、自社株を自社に売りつける事で利益食っちゃってるな。こりゃ退任されて当然だ。

(単位:百万円)
年度2018.32019.3
中略
利益剰余金(内部留保)38,20446,525
自己株式△24,412
株主資本合計40,89224,801
純資産合計40,81024,902
負債純資産合計70,71879,414
自己資本比率(%)57.7%31.3%

自社株売却はITネット業界ではよくあることで、最近のZOZO社は自社株以外売るものが無かったと推測される。

昨今FOREVER 21が100店舗を閉鎖*3しており、低価格のアパレル業界もきついように思う。又ZOZO社の2020年3月期第1四半期決算短信において、洋服1着あたりの平均商品単価が前期の4,364円→3,877円まで落ちている。直感的にZOZOに出展している、5,000円以上の服を売っているブランドは厳しい。

パッと見洋服が売れないこのような状況を、親会社であるYahoo社はどう打破するか気になる所だ。

本題

f:id:RyuichiXP:20190915121414p:plain

さて本題。本日は身辺整理の為、メルカリでカメラやゲーム機を売るまでの過程を話したい。メルカリで商品を売るまでの流れを整理すると、

  1. アカウントの整備
  2. 売る商品を梱包
  3. 過去に売られた商品の価格調査・価格決定
  4. 出品
  5. 値下げ攻勢
  6. 配送

上の順序の中で、一番骨が折れそうなのが価格調査。今日はプログラムと統計、最後の最後の人間の直感を用いた価格調査法を紹介したい。

売りたいカメラの価格調査

まず、下のカメラを売るまでの流れを話そう。まずメルカリで売りたいカメラの検索結果を見たら出品が100件近くあり、価格帯がバラバラと来ている。

f:id:RyuichiXP:20190915093803j:plain

ならばデータをWebスクレイピング(以下:ぶっこぬき)して、価格帯の分布を見てやろうと奮闘。ぶっこ抜きとは、Webページ上からメルカリの商品の商品名や価格などを収集、Excelなどで見やすいように整理するテクニックの事を言う。

最初PHPVPSサーバーからぶっこ抜きを行おうとした。するとメルカリのサーバーに「駄目だ!(403 Forbidden)」と怒られてしまった。どうもVPSサーバーのIPだったら、アクセスを弾く設計となっているようだ。

プロクシサーバーを使う手段もある。それも面倒なので、普通にサイトを見ているフリをしてぶっこぬく方法でやることにした。結果Python+Chrome+Seleniumを使い、パッと見自宅からアクセスするフリをしてぶっこ抜いた。
ここでぶっこぬきに成功した、Pythonプログラムのソースコードは以下の通り。

今度はPythonで得たcsvファイルをExcelで集計。集計に使った関数や計算過程を知りたい方はgoogleスプレッドシートを見てもらうとして、以下のような集計結果となった。

f:id:RyuichiXP:20190915094454j:plain

データの集計件数(サンプル)は計76件。横軸の1は1,000円を表し、縦軸は販売価格が1,000円から2,000円の販売価格の商品が何件あったか?2件あった事を示す。このように販売価格の分布図をヒストグラムという。

f:id:RyuichiXP:20190914202130p:plain

ヒストグラムのモード(最頻値)

さらに分布図の1件1件データのうち、最も現れる値を最頻値(モード)と言う。このモードからカメラは幾らの価格でもっと売れているかを見て行く。すると最頻値は5,000円より、5,000円で最も売られているかがわかる。

ヒストグラムの平均と中央値

チュートリアル

話は脱線するが、例えばある5回同じ実験をして、その観測結果が[1,2,3,4,6]だったとする。この時平均(相加平均)は、分布全体を同じ値に均した値(平均=合計÷個数)を指す。

この時、平均=(1+2+3+4+6)/5 = 3.2。分布も[3.2,3.2,3.2,3.2,3.2]と均されている事を示す。

中央値(メジアン)は分布全体の全体の真ん中の値を表す。[1,2,3,4,6]の中央は3なので、中央値は3である事が分かる。

この時平均が中央値より右側に来ている。この事からもわかる通り平均は分布全体の真ん中を表している訳ではない事に注意されたい。ニュースの統計などでは、よく平均を中央の値として用いるがこれは間違いであるので気をつけたい。

カメラの販売価格の平均と中央値は?

話をメルカリに戻して。計76件のデータの分布の平均は4,695.5円。中央値は4,500円である事がわかった。

値下げ前の価格(開始価格)を決定する

以上の調査を基に、値下げ前の価格を決定しようと思う。メルカリの場合、買い手からの値下げ交渉が盛んである。そこで値下げ前の価格を決定する。

まず分布全体を見るに、6,000円以上で売られているケースは15件。このことから売値の限度は6,000円と考え、6,000円を値下げ前の価格(開始価格)として設定する。

最終的な売値(終了価格)・メルカリ売上金

値下げに値下げを重ね、最終的な売値(終了価格)は丸々3,000円。未収入金(メルカリ売上金)は2,000円より、手元に入ったお金も2,000円。ヒストグラムの中央値を見るに、欲を言えば4,000円台で即決したかった所。具体的な費用の内訳は以下。

未収入金2,000売上3,000
配送料700
利用手数料300

売りたいゲーム機(WiiU)の価格調査

今度はWiiUスーパーマリオメーカー限定モデルを売る際の、価格調査を行った。

f:id:RyuichiXP:20190915105708j:plain

売値の分布(ヒストグラム)

早速Webスクレイピングして、ExcelWiiUの最終的な売値を集計。

検索ワード【WiiU スーパーマリオメーカーセット】

2019.8.15頃に【WiiU スーパーマリオメーカーセット】で検索した結果(→googleスプレッドシート)を基に集計。計861件のデータの分布の平均は19,019円、中央値は16,500円、最頻値は12,000円である事がわかった。

f:id:RyuichiXP:20190915124640j:plain
検索ワード【WiiU

今度は2019.8.15頃に【WiiU】で検索した結果(→googleスプレッドシート)を基に集計。データ数が多いため、最終的な売値のみ集計を行った。計645件のデータの分布の平均は12,372円、中央値は11,000円、最頻値は15,000円である事がわかった。

f:id:RyuichiXP:20190915124156j:plain

開始価格・終了価格・メルカリ売上金

中央値が16,500円の情報を下に、値下げ前の価格(開始価格)を16,000円と決定。そして値下げ、値下げ、値下げ交渉の末最終的な売値(終了価格)は6,000円。

中古屋でWiiUが5,000円台だったし、WiiUの分布をみると7,000円~8,000円台で売れた事例が45件。まあしょうがないかなと勝手に納得する。気になる未収入金(メルカリ売上金)は4,400円。その内訳は以下。

未収入金4,400売上6,000
配送料1,000
利用手数料600

反省点

メルカリ出品の目的をはっきりさせる!

以下、メルカリ出品の反省点を述べる。最初の反省点は、メルカリ出品の目的をはっきりさせるという事。メルカリは実質値下げ前提のサービスであるため、売れないとどうしても値下げをしてしまう。ここで、断捨離で早く売りたいのか?待って高く売りたいのか?これによって値下げするしないかが違ってくる事が分かった。

過去の商品の売値をチェックする上での技術的課題

技術的な反省点を言うとしたい。直感的に商品A(新品)の販売時期から経過していくほど、商品A(中古)のメルカリでの販売価格が下がっていくはずである。そこで販売時期を詳細ページから集計できれば良いのだが、検索結果の件数分だけWebスクレイピングすることとなる。このためF5連打する結果によりサーバーに弾かれ集計できない場合、集計に時間がかかる問題などをどうしていくかが課題である。

参考

Webサイト

  1. メルカリをスクレイピングして商品リンク、画像、価格を取得する:Pythonでやる奴
  2. Pythonでメルカリから最安値をスクレイピングで取得する(Qiita)

書籍