Kennen Sie eine Site namens Amaoku? Auf dieser Website können Sie Amazon-Geschenkgutscheine kaufen und verkaufen. Sie wird mit einem Abzinsungssatz von etwa 5 bis 10% gehandelt.
Wie kann ich auf dieser Website einen Geschenkgutschein zum bestmöglichen Preis kaufen? Gibt es zum Beispiel eine Tendenz, dass der Diskontsatz am Dienstag gut und der Diskontsatz um den 25. schlecht ist?
Glücklicherweise hat Amaoku Past Transaction Data für die Öffentlichkeit freigegeben. Der Inhalt dieses Artikels ist, dass diese Transaktionsdaten mit Python + Beautiful Soup abgekratzt und mit R analysiert wurden.
Wenn Sie die Schlussfolgerung zuerst schreiben, lautet sie wie folgt.
Der verwendete Python-Code ist unten. Als Fluss,
ist.
amaoku_scraping.py
#! coding: UTF-8
from bs4 import BeautifulSoup
import urllib.request
import time
file = open("C:/Users/user/amaoku_transaction_data.csv", 'w')
# get last page index
last_index = 0
html = urllib.request.urlopen("https://amaoku.jp/past_gift/index_amazon/")
soup = BeautifulSoup(html, "lxml")
a_s = soup.find(class_="pager_link").find_all('a')
for a in a_s:
if a.string.replace(u"\xa0", u" ") == u'letzte "':
last_index = int(a.get('href').split('/')[-1])
# get auction data from a page
last_index = 20
page_index = 0
while page_index <= last_index:
url = 'https://amaoku.jp/past_gift/index_amazon/' + str(page_index)
html = urllib.request.urlopen(url)
soup = BeautifulSoup(html, 'lxml')
rows = soup.find('table', class_='contacttable').find('tbody').find_all('tr')
# get sales data from a page
for row in rows:
line_elements = []
# if the row is a header, skip
if row.has_attr('class') and ['class'][0] == 'tr_tit':
continue
items = row.find_all('td')
for item in items:
# if the item is empty, skip
if item.string == None:
continue
# clean the string
element = item.string.replace(',', '').replace(' ', '').replace('\xa0', '').replace(u'Kreis', '').replace('%', '')
line_elements.append(element)
line = ','.join(line_elements)
if line == '':
continue
file.write(line + '\n')
print("Page {0} processed".format(page_index))
time.sleep(1)
# 20 items per a page
page_index += 20
file.close()
print("Task completed")
Lesen Sie die Datei mit read.csv und geben Sie in jede Spalte einen Namen ein. Konvertieren Sie die Datums- und Uhrzeitdaten in die Datumsklasse.
uri <- "D:/workspace/amaoku_analyze/amaoku_transaction_data.csv"
dat <- read.csv(uri, header=T, fileEncoding="UTF-8", stringsAsFactors = F)
names(dat) <- c("biddate", "facevalue", "bidprice", "discount", "validdate")
dat$biddate2 <- as.Date(dat$biddate)
dat$validdate2 <- as.Date(dat$validdate)
Vorerst,
Als ich die Leitung mit NaN usw. überprüfte, waren es 170.
sum(!complete.cases(dat)) # 170
Ich werde es löschen.
dat = dat[complete.cases(dat),]
Die Daten sind 176899 Zeilen und 7 Spalten.
> str(dat)
'data.frame': 176899 obs. of 7 variables:
$ biddate : chr "2015/12/20 18:58" "2015/12/20 18:03" "2015/12/20 18:03" "2015/12/20 18:01" ...
$ facevalue : int 10000 5000 5000 20000 3000 5000 5000 3000 10000 3000 ...
$ bidprice : int 9750 4825 4825 19300 2880 4800 4825 2895 9700 2895 ...
$ discount : num 97.5 96.5 96.5 96.5 96 96 96.5 96.5 97 96.5 ...
$ validdate : chr "2015/12/20" "2016/12/20" "2016/11/20" "2016/12/20" ...
$ biddate2 : Date, format: "2015-12-20" "2015-12-20" "2015-12-20" ...
$ validdate2: Date, format: "2015-12-20" "2016-12-20" "2016-11-20" ...
Je größer der Nennwert ist, desto höher ist wahrscheinlich der Abzinsungssatz. Wie ist es eigentlich
require(ggplot2)
ggplot(dat, aes(facevalue, discount)) + geom_point() + labs(x="Face value [yen]", y="Discount rate [%]")
Auf den ersten Blick scheint es keine solche Tendenz zu geben. Schauen wir uns die Steigung der Regressionslinie an.
>summary(lm(discount ~ facevalue, data=dat))
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 9.401e+01 5.586e-03 16828.37 <2e-16 ***
facevalue -1.812e-05 2.516e-07 -72.03 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Die Neigung ist-1.812e-05。Pr(>|t|)Es ist wichtig, wenn Sie den Wert von betrachten. Mit anderen WortenWenn sich der Nennwert um 1000 Yen erhöht, beträgt der Preis 0.02%GehenEs gibt eine Tendenz. Es liegt fast im Fehlerbereich.
** Fazit: Es besteht kein Zusammenhang zwischen Nennwert und Abzinsungssatz **
Im Allgemeinen ist die Nachfrage umso geringer, je kürzer die Gültigkeitsdauer ist, sodass der Abzinsungssatz wahrscheinlich höher ist. Was ist mit der Wahrheit?
Berechnen Sie die Gültigkeitsdauer aus dem Ablaufdatum und dem Kaufdatum und der Kaufzeit und zeichnen Sie sie zusammen mit dem Abzinsungssatz auf.
dat$timediff <- as.numeric(difftime(dat$validdate2, dat$biddate2, units = "days")) / 365.24
ggplot(dat, aes(timediff, discount)) + geom_point() +
labs(x="Valid period [year]", y="Discount [%]")
Auch hier scheint es keine besondere Tendenz zu geben. Die Steigung der Regressionslinie betrug auf die gleiche Weise wie zuvor -0,099743 (p <2e-16).
Es scheint, dass der Abzinsungssatz mit einer Gültigkeitsdauer von 1 Jahr niedrig ist, aber dies liegt wahrscheinlich daran, dass die Anzahl der Stichproben groß und die Verteilungsbasis breit ist. Unten ist das Histogramm.
** Schlussfolgerung: Es besteht kein Zusammenhang zwischen der Gültigkeitsdauer und dem Abzinsungssatz **
ggplot(dat, aes(timediff)) + geom_histogram(binwidth = 1/12) + xlim(-1, 5) +
labs(x="Valid period [year]", y="Frequency")
Wie ändert sich der Abzinsungssatz im Laufe des Jahres? Gibt es eine günstige Saison?
ggplot(dat, aes(biddate2, discount)) + geom_point(size=1) +
ylim(75, 100) + labs(x="Date", y="Discount [%]")
Die Zahlen auf der horizontalen Achse sind die Monate 2015. Es zeigt eine mäanderförmige Bewegung. Da die diesmal erfassten Daten für das vergangene Jahr sind, kenne ich die Details der saisonalen Schwankungen nicht, aber wenn ich mir die Daten für das ganze Jahr anschaue, scheint diese Saison teuer zu sein. In Bezug auf die Grafik sehen 92,5-95% wie ein Marktpreis aus.
** Fazit: Derzeit teuer. Warten Sie vor dem Kauf, bis 92,5-95% erreicht sind. ** **.
Überprüfen Sie auch den Tag. Da die Anzahl der Nutzer der Website samstags und sonntags groß ist, ist dies für die Verkäuferseite von Vorteil und der Diskontsatz ist schlechter.
weekdays_names=c("Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag","Sonntag")
dat$weekdays <- factor(weekdays(dat$biddate2), levels= weekdays_names)
wddf <- aggregate(discount ~ weekdays, dat, mean)
gggplot(data=dat, aes(weekdays, discount)) + geom_boxplot() +
ylim(75,110) + labs(x="Day of the week", y="Discount rate [%]")
** Fazit: Der Diskontsatz ändert sich an keinem Tag **
Da der 25. ein Zahltag ist, wird die Brieftasche des Benutzers mit Feuchtigkeit versorgt, und selbst wenn die Bedingungen etwas schlecht sind, wird sie verkauft, sodass sich der Diskontsatz möglicherweise verschlechtert.
dat$days <- factor(format(as.POSIXct(dat$biddate), format="%d"))
ggplot(dat, aes(days, discount)) + geom_boxplot() +
ylim(75,100) + labs(x="Day of a month", y="Discount rate [%]")
** Fazit: Der Diskontsatz ändert sich an keinem Tag **
Ist es nicht möglich, dass die Anzahl der Benutzer sinkt und sich der Diskontsatz mitten in der Nacht, am frühen Morgen und tagsüber verbessert? Untersuche dich.
dat$hours <- factor(format(as.POSIXct(dat$biddate), format="%H"))
ggplot(dat, aes(hours, discount)) + geom_boxplot() +
ylim(75,100) + labs(x="Hour of a day", y="Discount rate [%]")
Von 23:00 bis 8:00 Uhr am nächsten Morgen ist der Preis hoch. Es ist kein großer Unterschied, aber wenn Sie einen niedrigen Preis anstreben, ist die Tageszeit eine gute Wahl.
** Fazit: Die Tageszeit ist etwas günstiger als zu anderen Zeiten **
Was haben Sie gedacht? Basierend auf diesen Informationen hoffen wir, dass Benutzer Amazon-Geschenkgutscheine zu einem niedrigen Preis kaufen können.
Recommended Posts