ヤフオクのデータをwebスクレイピングで取得して分析してみた。

概要

Nintendo Switchが実店舗で買えるようになったというツイートをいくつか見たのでヤフオクの落札価格と日時のデータを分析してみました。

本文

ヤフオクには過去120日間に落札された商品の価格とそのオークションの終了日時が公開されています。以下の検索条件で得られた約7900件のデータをwebスクレイピングで取得していきます。

スクリーンショット (107)

import time
import requests,bs4
from bs4 import BeautifulSoup
import pandas as pd
columns = ["price","when"]
df = pd.DataFrame(columns=columns)
for page in range(1,8000,100):
   r = requests.get('https://auctions.yahoo.co.jp/closedsearch/closedsearch?p=nintendo+switch+%E6%9C%AC%E4%BD%93+-Lite&auccat=2084315794&va=nintendo+switch+%E6%9C%AC%E4%BD%93&ve=Lite&aucminprice=33000&istatus=1&b='+str(page)+'&n=100')
   soup = bs4.BeautifulSoup(r.text, "html.parser")
   products =soup.find_all("li",{"class":"Product"})
   time.sleep(5)
   for product in products:
       price = product.find("span",{"class":"Product__priceValue"}).text
       when = product.find("span",{"class":"Product__time"}).text
       price=price.replace("円","")
       price=price.replace(",","")
       se=pd.Series([price, when],columns)
       df = df.append(se, columns)

以下のデータセットが得られました。

スクリーンショット (104)

以下のコードでデータセットを成形していきます。

import pandas as pd
df['2020']='2020'
df['timestamp']=df['2020']+df['when']
a=df['timestamp']
b=[pd.to_datetime(date,format='%Y%m/%d %H:%M') for date in a]
df['timestamp']=b
df_sample1=df.drop(['when','2020'],axis=1)
# 'price'の値が55000以下の行を抽出
df_sample = df_sample1[(df_sample1['price']<=55000)]
df

スクリーンショット (108)

機械学習ライブラリのtslearnを使って、時系列データをクラスタリングしていきます。

from tslearn.clustering import TimeSeriesKMeans
from tslearn.utils import to_time_series_dataset
h = df_sample['price'].values.reshape(-1,1)
s = to_time_series_dataset(h)
n_clusters         = 2
clustering_metric  = 'dtw'
rand_seed          = 12345
km = TimeSeriesKMeans(n_clusters=n_clusters, metric=clustering_metric,random_state=rand_seed,n_job=-1)
km.fit(s)
df_sample['cluster'] = km.labels_

クラスタリング結果を色として付与した散布図を描画します。

画像3

転売により比較的大きい利益を上げることができていたcluster1が11月あたりからほぼなくなっていることが分かります。

次に移動平均線を描画します。

# 'cluster'が0,1であるデータセットをそれぞれ抽出
c=df_sample.query('cluster == "0"')
d=df_sample.query('cluster == "1"')

# timestampをindexにする
c.set_index('timestamp', inplace=True)
d.set_index('timestamp', inplace=True)

# 'cluster'の行を削除
cc=c.drop(['cluster'],axis=1)
dd=d.drop(['cluster'],axis=1)

# 日ごとの平均をの算出
sma_c = cc.rolling('D').mean()
sma_d = dd.rolling('D').mean()

# 移動平均線を描画
fig, ax = plt.subplots(figsize=(15,10)) 
ax.set_ylabel('price (yen)',fontsize=20)
ax.set_xlabel('time',fontsize=20)
ax.set_title('Simple Moving Average ',fontsize=20)
ax.plot(cc.index[:], sma_c, label="cluster0")
ax.plot(dd.index[:], sma_d, label="cluster1")
ax.legend(loc='best',fontsize=20)

plt.show()

画像4

価格のゆるやかな減少傾向が見られます。また散布図からもわかるようにここ数日で価格が急激に下落しています。

おまけ

ps5のデータセットについて同様の手法を用いてみました。

画像5

画像6


この記事が気に入ったらサポートをしてみませんか?