Analysieren Sie preisgünstige Informationen zu Amazon-Geschenkgutscheinen mit Web Scraping & R mit Python

So erhalten Sie mit Amaoku günstig einen Amazon-Geschenkgutschein

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.

Umgebung

Web Scraping

Der verwendete Python-Code ist unten. Als Fluss,

  1. Holen Sie sich den Bereich der Seiten zu kratzen
  2. Holen Sie sich Transaktionsinformationen Zeile für Zeile mit Beautiful Soup
  3. Schreiben Sie die Informationen in die CSV-Datei
  4. Fahren Sie mit der nächsten Seite fort
  5. Wiederholen Sie die Schritte 2 bis 5 innerhalb des in 1 angegebenen Bereichs.

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('&nbsp;', '').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")

Mit R analysieren

Vorverarbeitung

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" ...

Steigt der Abzinsungssatz mit steigendem Nennwert?

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 [%]")

facevalue_vs_discountrate.png

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 **

Gibt es einen Zusammenhang zwischen der Gültigkeitsdauer und dem 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 [%]")

validperiod_vs_discountrate.png

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")

validperiod_histogram.png

Wie verändert sich der Abzinsungssatz im Laufe des Jahres?

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 [%]")

date_vs_discountrate.png

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. ** **.

Gibt es einen Zusammenhang zwischen dem Tag und dem Abzinsungssatz?

Ü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 [%]")

dayoftheweek_vs_discountrate.png

** Fazit: Der Diskontsatz ändert sich an keinem Tag **

Gibt es einen Zusammenhang zwischen dem Datum und dem Abzinsungssatz?

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 [%]")

dayofamonth_vs_discountrate.png

** Fazit: Der Diskontsatz ändert sich an keinem Tag **

Ändert sich der Diskontsatz je nach Tageszeit?

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 [%]")

hourofaday_vs_discountrate.png

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 **

Schließlich

Was haben Sie gedacht? Basierend auf diesen Informationen hoffen wir, dass Benutzer Amazon-Geschenkgutscheine zu einem niedrigen Preis kaufen können.

Recommended Posts

Analysieren Sie preisgünstige Informationen zu Amazon-Geschenkgutscheinen mit Web Scraping & R mit Python
WEB-Scraping mit Python (für persönliche Notizen)
[Für Anfänger] Versuchen Sie Web Scraping mit Python
Web Scraping mit Python (Aktienkurs)
Datenanalyse zur Verbesserung von POG 1 ~ Web Scraping mit Python ~
Web Scraping Anfänger mit Python
Web Scraping mit Python Erster Schritt
Ich habe versucht, WebScraping mit Python.
Web Scraping für Anfänger in Python (1)
Web Scraping für Anfänger in Python (4) -1
Holen Sie sich Wetterinformationen mit Python & Scraping
Abrufen von Eigenschaftsinformationen durch Scraping mit Python
Erste Schritte mit Python Web Scraping Practice
Pferderennseite Web Scraping mit Python
Erste Schritte mit Python Web Scraping Practice
Einfaches Web-Scraping mit Python und Ruby
Vorbereitung zum Schaben mit Python [Schokoladengeschmack]
Führen Sie das WEB-Scraping regelmäßig mit AWS-Lambda + Python + Cron aus
[Für Anfänger] Web-Scraping mit Python "Greifen Sie auf die URL auf der Seite zu, um den Inhalt abzurufen."
Web Scraping für Anfänger in Python (1) Verbesserte Version
Schnelles Web-Scraping mit Python (unterstützt das Laden von JavaScript)
Python-Anfänger bleiben beim ersten Web-Scraping stecken
Web-Scraping für Anfänger mit Python (4) --2 Scraping auf Cloud Shell
Scraping in Python (Vorbereitung)
Versuchen Sie es mit Python.
Scraping mit Python + PhantomJS
Schaben mit Selen [Python]
Scraping mit Python + PyQuery
Scraping von RSS mit Python
Versuchen Sie, verschiedene Informationen anzuzeigen, die für das Debuggen mit Python nützlich sind
Analysieren Sie Aktien mit Python und suchen Sie nach günstigen Handelsphasen
Webcrawlen, Web-Scraping, Zeichenerfassung und Speichern von Bildern mit Python