[Für Super-Anfänger] Python-Umgebungskonstruktion & Scraping & maschinelles Lernen & praktische Anwendung, die Sie genießen können, indem Sie mit Kopie umziehen [Lassen Sie uns mit SUUMO ein gutes Mietobjekt finden! ]]

Einführung

Jeder, magst du __ Datenanalyse __?

Freut mich, dich kennenzulernen! Mein Name ist @ haraso_1130 und ich bin Mentor bei DMM WEB CAMP.

Schauen Sie sich plötzlich das Bild unten an.

スクリーンショット 2019-12-15 18.13.43.png

5DK 80.000 Yen für eine Immobilie in den 23 Bezirken von Tokio! ??

Wenn Sie in der 23. Abteilung sind, werden Sie mit 80.000 Studios pro Monat in Ordnung sein ...

Diese Eigenschaft ist meine eigene ** Verwenden von "Python" ** Sammeln Sie Daten durch ** "Scraping" ** Ergebnisse der Datenanalyse mit ** "maschinelles Lernen" ** Es ist eine Eigenschaft, die ich entdecken konnte.

Dieser Artikel ist (im Grunde genommen) ** ein Artikel, mit dem Sie Daten mit nur Kopieren und Einfügen analysieren und die Datenanalyse mögen **. Mit anderen Worten, das Ziel ist es, den Eindruck zu erwecken, dass "ich etwas Erstaunliches tun kann!" **.

Wenn Sie also etwas wie "Ich weiß nicht, was Sie sagen" lesen, denken Sie "Ich kann den Autor einfach nicht gut erklären" und fahren Sie fort.

Als beabsichtigter Leser denke ich wie folgt. ** ・ Personen, die an Datenanalyse interessiert sind ・ Personen, die Datenanalysen vermeiden · Andere Leute **

Von oben werde ich den Code nicht ausführlich erläutern, sondern mich auf "Was machst du jetzt und warum?" ** konzentrieren.   Auch wenn dort "Mit Kopieren und Einfügen verschieben" steht, möchte ich etwas entwickeln, damit Sie den Spaß an der Datenanalyse nur durch ** Lesen ** verstehen können!

Es ist nur eine Werbung, aber wenn Sie diesen Artikel lesen und denken "Ich möchte die Daten analysieren!", Schrieb ich auf Mein Blog darüber, wie ich selbst lernen kann. Bitte beziehen Sie sich darauf.

Was ist in diesem Artikel zu tun?

** ・ Vom Aufbau der Python-Umgebung bis zur Implementierung von Scraping und maschinellem Lernen ** ** ・ Erstellen Sie eine Suche nach profitablen Immobilien wie im Bild unten **: Ermitteln Sie profitable Immobilien mithilfe des erstellten Modells. スクリーンショット 2019-12-17 13.30.58.png

Was in diesem Artikel nicht zu tun ist

・ ** Detaillierte Erläuterung des Codes ** ・ ** Erklärung des Algorithmus für maschinelles Lernen **

Dieser Artikel ist nur für Leute gedacht, die Datenanalyse mögen. Ich werde kleine und schwierige Geschichten so weit wie möglich weglassen! (Ich bin der Meinung, dass das Programmierenlernen in "Praxis-> Theorie / Grundlagen" überwiegend effizienter ist als in "Theorie / Grundlagen-> Praxis" ...)

Meine Umgebung

macOS High Sierra ver10.13.6 (~~ Sei nicht müde ~~) python3.7.3 Jupyter lab

Hinweis

Der Titel des Artikels lautet ** "Es funktioniert mit Kopieren und Einfügen" **, aber als ich einige Bekannte bat, es zu versuchen, ** sollte Jupyter Notebook oder Labor ** fast ohne Fehler funktionieren! * Stand 17. Dezember 2019 Wenn es nicht funktioniert, lassen Sie es mich bitte wissen ... Wenn es nicht funktioniert, ist die Bibliothek höchstwahrscheinlich nicht enthalten. Bitte installieren Sie jedes Mal mit "conda install".

Inhaltsverzeichnis

Inhaltsverzeichnis
Gesamtdurchfluss
Umgebung
Schaben
Datenanalyse
Entdecken Sie tolle Angebote
Tatsächlich...
Am Ende

Gesamtdurchfluss

Lassen Sie uns zunächst den Gesamtfluss überprüfen. In diesem Artikel

  1. ** Umgebungskonstruktion ** zum Ausführen von Code
  2. Erfassen Sie automatisch eine große Menge an Informationen mithilfe von ** Scraping **
  3. Erstellen Sie ein ** Modell für maschinelles Lernen ** basierend auf den erfassten Informationen
  4. Prognostizieren Sie die Immobilienpreise anhand des erstellten Modells **
  5. Vergleichen Sie den vorhergesagten Wert mit dem tatsächlichen Preis. ** Finden Sie ein gutes Angebot. ** ** **

Es ist ein Fluss.

Ich denke nicht, dass es eine gute Idee ist zu sagen, dass es ein vorhergesagter Wert eines Modells ist, aber es ist in Ordnung, weil ich es im folgenden Teil des maschinellen Lernens erklären werde!

Umgebung

Wie bereits erwähnt, ist der gesamte Code in diesem Artikel für die Jupyter-Implementierung vorgesehen. Hier stellen wir Ihnen vor, wie Sie ** Jupyter lab ** installieren.

Installieren Sie zuerst Anaconda über den folgenden Link. 【https://www.anaconda.com/distribution/】

スクリーンショット 2019-12-18 3.48.04.png

danach für Windows 【https://www.python.jp/install/anaconda/windows/install.html 】 für mac 【https://www.python.jp/install/anaconda/macos/install.html 】

Bitte beziehen Sie sich auf, um die Installation von Anaconda abzuschließen.

Und kürzlich hat Anaconda von Anfang an ein Jupyter-Labor.

$ jupyter lab

Führen Sie den obigen Code an der Eingabeaufforderung für Windows und am Terminal für Mac aus.

Auch wenn Sie Anaconda an erster Stelle haben

$ conda install -c conda-forge jupyterlab
$ jupyter lab

Es ist in Ordnung.

Dies ist das Ende des Umgebungsbaus. Es ist zu einfach ...!

Erstellen Sie einen Ordner auf Ihrem Desktop und erstellen Sie dort ein Notizbuch. スクリーンショット 2019-12-18 3.52.26.png

Schaben

Was ist eigentlich "kratzen" überhaupt? Laut Wikipedia

Web Scraping ist nichts anderes als das automatische Sammeln von Informationen aus dem WWW.

Mit anderen Worten, ** "sammelt automatisch Informationen aus dem Internet" **. (~~ Das ist zu gut ~~)

In dieser Analyse verwenden wir Daten zu Mietobjekten wie Tausenden und in einigen Fällen Zehntausenden für ein Objekt.

・ Eigenschaftsname ・ Miete ・ Fläche ・ Layout ・ Ort (nächster Bahnhof, Entfernung zum nächsten Bahnhof, detaillierte Adresse) etc...

Ich tippe dies tausende Male, Zehntausende Male manuell in Excel ein ... nur daran zu denken macht mich krank. Daher werden Daten sofort durch Programmierung gesammelt.

Hier gibt es einen wichtigen Hinweis. ** Überprüfen Sie vor dem Scraping unbedingt die Nutzungsbedingungen der Website. ** ** ** Das Verschrotten ist auf einigen Websites aufgrund von Problemen wie Urheberrecht und Unmöglichkeit auf dem Server verboten. Glücklicherweise in SUUMO Nutzungsbedingungen

"Der Benutzer darf ohne unsere vorherige Zustimmung nicht alle auf dieser Website bereitgestellten Inhalte über den im Urheberrechtsgesetz festgelegten persönlichen persönlichen Gebrauch hinaus verwenden."

Es ist nur geschrieben und dieses Mal ist es in Ordnung, weil es für den privaten Gebrauch ist.

Öffnen Sie jupyter,

#URL (bitte geben Sie hier die URL ein)
url = ''

Bitte geben Sie die URL Ihrer Lieblingsstation in den 23 Bezirken von Tokio zwischen den einfachen Anführungszeichen ein und führen Sie den Code aus. Sie können zum Bildschirm springen, um die 23. Station über den unten stehenden Link auszuwählen. 【https://suumo.jp/chintai/tokyo/city/ 】 Beispiel: In der Gemeinde Bunkyo lautet https://suumo.jp/jj/chintai/ichiran/FR301FC001/?ar=030&bs=040&ta=13&sc=13101&cb=0.0&ct=9999999&mb=0&mt=9999999&et=99999990 = 03 & sngz = & po1 = 09 & pc = 50` Das Sammeln von Daten dauert lange. Es wird daher empfohlen, diese vor dem Schlafengehen auszuführen.

__ * Ergänzung (29.12.2019) __ __ Derzeit prüfen wir Fälle, die nicht in der "empfohlenen Reihenfolge" funktionieren. __ __ __ Es ist eine symptomatische Maßnahme, aber es scheint zu funktionieren, wenn es nach "Neuankömmlingsreihenfolge" sortiert ist. __ __ __ Ich werde es erneut aktualisieren, sobald die Grundursache bekannt ist. __ __

Darüber hinaus kann dieser Code Informationen nicht nur in den 23 Bezirken Tokios, sondern auch außerhalb Tokios erfassen. (Als ich es versuchte, konnte ich die Daten der Präfektur Okayama abrufen.) Da der Datenanalyseteil in der zweiten Hälfte dieses Artikels unter der Annahme der Daten der 23 Bezirke Tokios codiert ist, funktioniert er häufig nicht mit Kopieren und Einfügen allein. Es gibt.


from bs4 import BeautifulSoup
import urllib3
import re
import requests
import time
import pandas as pd
from pandas import Series, DataFrame

#URL (bitte geben Sie die URL hier ein)
url = ''

result = requests.get(url)
c = result.content

soup = BeautifulSoup(c)

summary = soup.find("div",{'id':'js-bukkenList'})
body = soup.find("body")
pages = body.find_all("div",{'class':'pagination pagination_set-nav'})
pages_text = str(pages)
pages_split = pages_text.split('</a></li>\n</ol>')
pages_split0 = pages_split[0]
pages_split1 = pages_split0[-3:]
pages_split2 = pages_split1.replace('>','')
pages_split3 = int(pages_split2)

urls = []

urls.append(url)

for i in range(pages_split3-1):
    pg = str(i+2)
    url_page = url + '&page=' + pg
    urls.append(url_page)

names = [] 
addresses = [] 
locations0 = [] 
locations1 = [] 
locations2 = [] 
ages = [] 
heights = [] 
floors = []
rent = [] 
admin = []
others = [] 
floor_plans = [] 
areas = []
detail_urls = [] 

for url in urls:
    result = requests.get(url)
    c = result.content
    soup = BeautifulSoup(c)
    summary = soup.find("div",{'id':'js-bukkenList'})
    apartments = summary.find_all("div",{'class':'cassetteitem'})

    for apartment in apartments:

        room_number = len(apartment.find_all('tbody'))

        name = apartment.find('div', class_='cassetteitem_content-title').text
        address = apartment.find('li', class_='cassetteitem_detail-col1').text

        for i in range(room_number):
            names.append(name)
            addresses.append(address)

        sublocation = apartment.find('li', class_='cassetteitem_detail-col2')
        cols = sublocation.find_all('div')
        for i in range(len(cols)):
            text = cols[i].find(text=True)
            for j in range(room_number):
                if i == 0:
                    locations0.append(text)
                elif i == 1:
                    locations1.append(text)
                elif i == 2:
                    locations2.append(text)

        age_and_height = apartment.find('li', class_='cassetteitem_detail-col3')
        age = age_and_height('div')[0].text
        height = age_and_height('div')[1].text

        for i in range(room_number):
            ages.append(age)
            heights.append(height)

        table = apartment.find('table')
        rows = []
        rows.append(table.find_all('tr'))

        data = []
        for row in rows:
            for tr in row:
                cols = tr.find_all('td')
                if len(cols) != 0:
                    _floor = cols[2].text
                    _floor = re.sub('[\r\n\t]', '', _floor)

                    _rent_cell = cols[3].find('ul').find_all('li')
                    _rent = _rent_cell[0].find('span').text
                    _admin = _rent_cell[1].find('span').text

                    _deposit_cell = cols[4].find('ul').find_all('li')
                    _deposit = _deposit_cell[0].find('span').text
                    _reikin = _deposit_cell[1].find('span').text
                    _others = _deposit + '/' + _reikin

                    _floor_cell = cols[5].find('ul').find_all('li')
                    _floor_plan = _floor_cell[0].find('span').text
                    _area = _floor_cell[1].find('span').text

                    _detail_url = cols[8].find('a')['href']
                    _detail_url = 'https://suumo.jp' + _detail_url

                    text = [_floor, _rent, _admin, _others, _floor_plan, _area, _detail_url]
                    data.append(text)

        for row in data:
            floors.append(row[0])
            rent.append(row[1])
            admin.append(row[2])
            others.append(row[3])
            floor_plans.append(row[4])
            areas.append(row[5])
            detail_urls.append(row[6])


        time.sleep(3)

names = Series(names)
addresses = Series(addresses)
locations0 = Series(locations0)
locations1 = Series(locations1)
locations2 = Series(locations2)
ages = Series(ages)
heights = Series(heights)
floors = Series(floors)
rent = Series(rent)
admin = Series(admin)
others = Series(others)
floor_plans = Series(floor_plans)
areas = Series(areas)
detail_urls = Series(detail_urls)

suumo_df = pd.concat([names, addresses, locations0, locations1, locations2, ages, heights, floors, rent, admin, others, floor_plans, areas, detail_urls], axis=1)

suumo_df.columns=['Name der Wohnung','Adresse','Standort 1','Standort 2','Standort 3','Alter','Gebäude höhe','Hierarchie','Miete','Verwaltungsgebühr', 'Shiki/Vielen Dank/Garantie/Shiki引,Amortisation','Gebäudeplan','Besetztes Gebiet', 'Detaillierte URL']

suumo_df.to_csv('suumo.csv', sep = '\t', encoding='utf-16', header=True, index=False)

Wenn Sie nach ca. 10 Sekunden keinen Fehler auslösen, sind Sie erfolgreich. Warten wir geduldig.

Erklären Sie, was dieser Code tut. Die meisten Webseiten sind in der Sprache HTML geschrieben. Lassen Sie uns die Struktur der SUUMO-Website mit dem Überprüfungstool von Chrome überprüfen. スクリーンショット 2019-12-17 18.47.06.png

Wenn Sie sich das Obige ansehen, können Sie sehen, dass der Name des Mietobjekts mit "cassetteitem_content-title" gekennzeichnet ist. Beim Scraping werden Daten mithilfe der Markierungsinformationen erfasst, die an diesen HTML-Code angehängt sind.

Eigentlich möchte ich alle Daten von Mietinformationen in Tokio erfassen, aber es wird enorm viel Zeit in Anspruch nehmen, so dass ich mich diesmal auf nur eine Station konzentrieren werde.

Datenanalyse

Guten Morgen. Wenn Sie die Daten erhalten können, sollten Sie eine Datei mit dem Namen "suumo.csv" im selben Verzeichnis wie das Notizbuch haben. スクリーンショット 2019-12-17 18.55.05.png Die Daten sehen wie oben aus. Es gibt eine Erinnerung, die von ** "der Kruste Oh Oh !!! großartig !!!" ** beeindruckt war, als er das erste Mal erfolgreich war, große Datenmengen selbst zu erfassen, was ist mit allen?

Wir werden die Daten anhand dieser Daten analysieren, aber vorher werde ich ein kleines Grundkonzept über das Modell des maschinellen Lernens erläutern.

Mit einem Lehrer lernen

Das diesmal durchzuführende Lernen ist eine Lernmethode (Datenanalysemethode), die als ** überwachtes Lernen ** bezeichnet wird. Laut Wikipedia

Der Name kommt von der Tatsache, dass die im Voraus angegebenen Daten als "Beispiel (= Rat des Lehrers)" angesehen werden und das Lernen (= eine Anpassung an die Daten) anhand dieser Richtlinie durchgeführt wird.

... anscheinend ... Es kommt nicht sehr gut heraus, also betrachten wir ein konkretes Beispiel.

Dieses Mal erstellen wir ein Modell, das den Mietpreis anhand der Mietinformationen vorhersagt. Wir haben in der Regel folgende Kenntnisse über Miete:

Je größer die Fläche, desto höher die Miete Je näher am Bahnhof, desto höher die Miete Je kleiner das Gebäudealter, desto höher die Miete

Der Grund, warum ich dieses Wissen haben kann, ist nichts anderes als solche Fälle zu kennen. Aus diesem Wissen können Sie in gewissem Umfang auch die Miete vorhersagen.

Beim maschinellen Lernen geht es darum, Maschinen dies tun zu lassen.

Viele Daten werden von einer Maschine trainiert, die Miete wird als vorhergesagter Wert aus dem Gebiet, der Entfernung zum Bahnhof, dem Alter des Gebäudes usw. ausgegeben, und die Miete wird vorhergesagt, so dass die Differenz zwischen dem vorhergesagten Wert und der tatsächlichen Miete (Lehrerdaten) kleiner wird. Machen.

Auch als Begriff Der Wert, der als vorhergesagter Wert wie Miete ausgegeben werden soll, ist ** Zielvariable ** Informationen, die die Zielvariable charakterisieren, wie Fläche und Alter, ** Merkmalsmenge ** Wird genannt.

Überlernen

Die größte Schwierigkeit beim maschinellen Lernen ist dieses ** Überlernen **. Übertraining ist ** "Überanpassung an einige Daten" **.

Angenommen, Sie haben ein Modell erstellt, das die Miete nach Fläche vorhersagt. Das Bild unten ist das Bild. スクリーンショット 2019-12-19 9.15.36.png

Lassen Sie uns das Modell komplizieren, um diesen Fehler weiter zu reduzieren. スクリーンショット 2019-12-19 9.15.42.png

Beeindruckend! Ich kann die Miete perfekt mit 100% Genauigkeit vorhersagen !!!! ... und ** Ich bin nicht glücklich. ** ** ** Verwenden wir dieses Modell und wenden es auf andere Daten mit ähnlicher Verteilung an. スクリーンショット 2019-12-19 9.18.26.png

Das einfache Modell auf der linken Seite weist eine ähnliche Leistung auf, während das komplexe Modell auf der rechten Seite ** eindeutig nicht vorhersagt **.

Der Zweck des maschinellen Lernens besteht im Allgemeinen darin, das leistungsstärkste Modell für unbekannte Datensätze zu erstellen. Die Leistung des Modells für diesen unbekannten Datensatz wird als ** Generalisierungsleistung ** bezeichnet.

Wie erstellen Sie ein Modell mit hoher Generalisierungsleistung? Am einfachsten ist es, die Daten wie in der Abbildung unten gezeigt zu teilen. スクリーンショット 2019-12-18 4.53.29.png Befolgen Sie die nachstehenden Anweisungen, um die Generalisierungsleistung zu messen.

  1. Teilen Sie die Daten in Trainingsdaten und Testdaten auf.
  2. Erstellen Sie ein Modell mit ** nur Trainingsdaten **.
  3. Wenden Sie das erstellte Modell mit ** Testdaten ** an und berechnen Sie den vorhergesagten Wert.
  4. Messen Sie die Leistung des Modells anhand des "berechneten Vorhersagewerts" und des "tatsächlichen Testdatenwerts (Lehrerdaten)".

In diesem Teil des maschinellen Lernens werden 67% der gesammelten Daten in Trainingsdaten und die restlichen 33% in Testdaten unterteilt.

Vorbehandlung

Tatsächlich ist dies der Teil, der den größten Teil der Datenanalyse ausmacht, und die Datenanalyse erfordert die Verarbeitung der Daten in einer maschinenlesbaren Form.

Schauen wir uns zum Beispiel die Altersspalte (den Namen der Spalte) an. スクリーンショット 2019-12-17 19.15.41.png Wir Menschen können dies sehen und erkennen, dass ** "Das Alter des Gebäudes ist" Neubau <7 Jahre <21 Jahre alt "" **. Sie halten es vielleicht für selbstverständlich, aber Maschinen können dies nicht erkennen. Damit ** Neubau → 0 7 Jahre alt → 7 21 Jahre alt → 21 ** Es muss verarbeitet werden, damit die Maschine [0 <7 <21] erkennen kann.

Zusätzlich wird das Layout von 2LDK usw. mit der Methode ** One-Hot-Codierung (Dummy-Variable) ** verarbeitet, und die nächste Station usw. wird mit der Methode ** Label-Codierung ** verarbeitet. (Bitte überprüfen Sie, ob Sie interessiert sind)

Möglicherweise müssen Sie auch mit fehlenden Werten umgehen. (Das fehlende Wertekomplement ist ein Sumpf, daher werde ich es hier nicht anfassen ...)

Die Verarbeitung der Daten vor dem Lernen wird zusammenfassend als ** Vorverarbeitung ** bezeichnet.

Lassen Sie uns nun den Code tatsächlich ausführen.

import pandas as pd
import numpy as np
from sklearn.preprocessing import OrdinalEncoder
from sklearn import preprocessing
import pandas_profiling as pdp 

df = pd.read_csv('suumo.csv', sep='\t', encoding='utf-16')

splitted1 = df['Standort 1'].str.split('Ayumu', expand=True)
splitted1.columns = ['Standort 11', 'Standort 12']
splitted2 = df['Standort 2'].str.split('Ayumu', expand=True)
splitted2.columns = ['Standort 21', 'Standort 22']
splitted3 = df['Standort 3'].str.split('Ayumu', expand=True)
splitted3.columns = ['Standort 31', 'Standort 32']

splitted4 = df['Shiki/Vielen Dank/Garantie/Shiki引,Amortisation'].str.split('/', expand=True)
splitted4.columns = ['Anzahlung', 'Schlüsselgeld']

df = pd.concat([df, splitted1, splitted2, splitted3, splitted4], axis=1)

df.drop(['Standort 1','Standort 2','Standort 3','Shiki/Vielen Dank/Garantie/Shiki引,Amortisation'], axis=1, inplace=True)

df = df.dropna(subset=['Miete'])

df['Miete'] = df['Miete'].str.replace(u'Zehntausend Yen', u'')
df['Anzahlung'] = df['Anzahlung'].str.replace(u'Zehntausend Yen', u'')
df['Schlüsselgeld'] = df['Schlüsselgeld'].str.replace(u'Zehntausend Yen', u'')
df['Verwaltungsgebühr'] = df['Verwaltungsgebühr'].str.replace(u'Kreis', u'')
df['Alter'] = df['Alter'].str.replace(u'Neubau', u'0') 
df['Alter'] = df['Alter'].str.replace(u'Über 99 Jahre', u'0') #
df['Alter'] = df['Alter'].str.replace(u'Gebaut', u'')
df['Alter'] = df['Alter'].str.replace(u'Jahr', u'')
df['Besetztes Gebiet'] = df['Besetztes Gebiet'].str.replace(u'm', u'')
df['Standort 12'] = df['Standort 12'].str.replace(u'Protokoll', u'')
df['Standort 22'] = df['Standort 22'].str.replace(u'Protokoll', u'')
df['Standort 32'] = df['Standort 32'].str.replace(u'Protokoll', u'')

df['Verwaltungsgebühr'] = df['Verwaltungsgebühr'].replace('-',0)
df['Anzahlung'] = df['Anzahlung'].replace('-',0)
df['Schlüsselgeld'] = df['Schlüsselgeld'].replace('-',0)

splitted5 = df['Standort 11'].str.split('/', expand=True)
splitted5.columns = ['Route 1', 'Station 1']
splitted5['1 zu Fuß'] = df['Standort 12']
splitted6 = df['Standort 21'].str.split('/', expand=True)
splitted6.columns = ['Route 2', 'Station 2']
splitted6['2 zu Fuß'] = df['Standort 22']
splitted7 = df['Standort 31'].str.split('/', expand=True)
splitted7.columns = ['Route 3', 'Station 3']
splitted7['3 zu Fuß'] = df['Standort 32']

df = pd.concat([df, splitted5, splitted6, splitted7], axis=1)

df.drop(['Standort 11','Standort 12','Standort 21','Standort 22','Standort 31','Standort 32'], axis=1, inplace=True)

df['Miete'] = pd.to_numeric(df['Miete'])
df['Verwaltungsgebühr'] = pd.to_numeric(df['Verwaltungsgebühr'])
df['Anzahlung'] = pd.to_numeric(df['Anzahlung'])
df['Schlüsselgeld'] = pd.to_numeric(df['Schlüsselgeld'])
df['Alter'] = pd.to_numeric(df['Alter'])
df['Besetztes Gebiet'] = pd.to_numeric(df['Besetztes Gebiet'])

df['Miete'] = df['Miete'] * 10000
df['Anzahlung'] = df['Anzahlung'] * 10000
df['Schlüsselgeld'] = df['Schlüsselgeld'] * 10000

df['1 zu Fuß'] = pd.to_numeric(df['1 zu Fuß'])
df['2 zu Fuß'] = pd.to_numeric(df['2 zu Fuß'])
df['3 zu Fuß'] = pd.to_numeric(df['3 zu Fuß'])

splitted8 = df['Hierarchie'].str.split('-', expand=True)
splitted8.columns = ['1. Stock', 'Etage 2']
splitted8['1. Stock'].str.encode('cp932')
splitted8['1. Stock'] = splitted8['1. Stock'].str.replace(u'Fußboden', u'')
splitted8['1. Stock'] = splitted8['1. Stock'].str.replace(u'B', u'-')
splitted8['1. Stock'] = splitted8['1. Stock'].str.replace(u'M', u'')
splitted8['1. Stock'] = pd.to_numeric(splitted8['1. Stock'])
df = pd.concat([df, splitted8], axis=1)

df['Gebäude höhe'] = df['Gebäude höhe'].str.replace(u'U-Bahn 1 oberirdisch', u'')
df['Gebäude höhe'] = df['Gebäude höhe'].str.replace(u'U-Bahn 2 oberirdisch', u'')
df['Gebäude höhe'] = df['Gebäude höhe'].str.replace(u'U-Bahn 3 oberirdisch', u'')
df['Gebäude höhe'] = df['Gebäude höhe'].str.replace(u'U-Bahn 4 oberirdisch', u'')
df['Gebäude höhe'] = df['Gebäude höhe'].str.replace(u'U-Bahn 5 oberirdisch', u'')
df['Gebäude höhe'] = df['Gebäude höhe'].str.replace(u'U-Bahn 6 oberirdisch', u'')
df['Gebäude höhe'] = df['Gebäude höhe'].str.replace(u'7 unterirdisch', u'')
df['Gebäude höhe'] = df['Gebäude höhe'].str.replace(u'8 unterirdisch', u'')
df['Gebäude höhe'] = df['Gebäude höhe'].str.replace(u'U-Bahn 9 oberirdisch', u'')
df['Gebäude höhe'] = df['Gebäude höhe'].str.replace(u'Eine Geschichte', u'1')
df['Gebäude höhe'] = df['Gebäude höhe'].str.replace(u'Fußboden', u'')
df['Gebäude höhe'] = pd.to_numeric(df['Gebäude höhe'])

df = df.reset_index(drop=True)
df['Layout DK'] = 0
df['Layout K.'] = 0
df['Layout L.'] = 0
df['Layout S.'] = 0
df['Gebäudeplan'] = df['Gebäudeplan'].str.replace(u'Studio', u'1') 

for x in range(len(df)):
    if 'DK' in df['Gebäudeplan'][x]:
        df.loc[x,'Layout DK'] = 1
df['Gebäudeplan'] = df['Gebäudeplan'].str.replace(u'DK',u'')

for x in range(len(df)):
    if 'K' in df['Gebäudeplan'][x]:
        df.loc[x,'Layout K.'] = 1        
df['Gebäudeplan'] = df['Gebäudeplan'].str.replace(u'K',u'')

for x in range(len(df)):
    if 'L' in df['Gebäudeplan'][x]:
        df.loc[x,'Layout L.'] = 1        
df['Gebäudeplan'] = df['Gebäudeplan'].str.replace(u'L',u'')

for x in range(len(df)):
    if 'S' in df['Gebäudeplan'][x]:
        df.loc[x,'Layout S.'] = 1        
df['Gebäudeplan'] = df['Gebäudeplan'].str.replace(u'S',u'')

df['Gebäudeplan'] = pd.to_numeric(df['Gebäudeplan'])

splitted9 = df['Adresse'].str.split('Station', expand=True)
splitted9.columns = ['Station', 'Kommunal']
splitted9['Station'] = splitted9['Station'] + 'Station'
splitted9['Station'] = splitted9['Station'].str.replace('Tokio','')
df = pd.concat([df, splitted9], axis=1)

df_for_search = df.copy()

df[['Route 1','Route 2','Route 3', 'Station 1', 'Station 2','Station 3','Kommunal']] = df[['Route 1','Route 2','Route 3', 'Station 1', 'Station 2','Station 3','Kommunal']].fillna("NAN")

oe = preprocessing.OrdinalEncoder()
df[['Route 1','Route 2','Route 3', 'Station 1', 'Station 2','Station 3','Kommunal']] = oe.fit_transform(df[['Route 1','Route 2','Route 3', 'Station 1', 'Station 2','Station 3','Kommunal']].values) 

df['Miete+Verwaltungsgebühr'] = df['Miete'] + df['Verwaltungsgebühr']

#Legen Sie den Höchstpreis fest
df = df[df['Miete+Verwaltungsgebühr'] < 300000]

df = df[["Name der Wohnung",'Miete+Verwaltungsgebühr', 'Alter', 'Gebäude höhe', '1. Stock',
       'Besetztes Gebiet','Route 1','Route 2','Route 3', 'Station 1', 'Station 2','Station 3','1 zu Fuß', '2 zu Fuß','3 zu Fuß','Gebäudeplan', 'GebäudeplanDK', 'GebäudeplanK', 'GebäudeplanL', 'GebäudeplanS',
       'Kommunal']]

df.columns = ['name','real_rent','age', 'hight', 'level','area', 'route_1','route_2','route_3','station_1','station_2','station_3','distance_1','distance_2','distance_3','room_number','DK','K','L','S','adress']


pdp.ProfileReport(df)

Ich werde vier Punkte erklären. ・ Da festgestellt wurde, dass dies für die Analyse nicht erforderlich ist, sind Informationen wie "Station" und "detaillierte URL" nicht enthalten. Diesmal mache ich es zum Beispiel in Bunkyo Ward, aber da alle Daten von Bunkyo Ward stammen, sind diese Informationen nicht wertvoll. Beachten Sie jedoch, dass die "Stations" -Informationen beispielsweise bei der Analyse von Daten aus allen 23 Stationen Tokios sehr wichtig sind.

・ Die Informationen von "Shikikin" und "Reikin" sind nicht enthalten. Dies liegt daran, dass es im Gegensatz zum vorherigen Grund zu leicht vorherzusagen ist (es hat keine Bedeutung). Bei den meisten Anmietungen werden Einzahlungen und Dankbarkeit auf das gleiche oder das 2-3-fache der Miete festgelegt. Selbst wenn Sie sagen: "Ich gehe davon aus, dass die Miete für eine Miete von 70.000 Yen 70.000 Yen betragen wird!", Werden Sie nichts bekommen ...

・ Die Zielvariable ist "Miete + Verwaltungsgebühr" anstelle von Miete. Die tatsächliche monatliche Zahlung beträgt "Miete + Verwaltungsgebühr". Darüber hinaus sind die Daten von Immobilien, deren Miete + Verwaltungskosten 300.000 Yen übersteigen, die dritte Zeile von unten.


df = df[df['Miete+Verwaltungsgebühr'] < 300000]

Es ist ausgeschlossen durch. Ich analysierte, auch wenn es keine Obergrenze für die Miete gab, und versuchte, ein gutes Geschäft zu finden, sagte aber: "Die geschätzte Miete für diese Immobilie beträgt 2 Millionen Yen, aber in Wirklichkeit sind es 1,5 Millionen Yen! Satte 500.000 Yen pro Monat!" Ich war traurig, als mir gesagt wurde. (Ich kann nicht einmal in einem Haus mit einer Miete von 300.000 leben ...) Es ist in Ordnung, wenn Sie den Preis selbst ändern.

・ Pandas-Profiling wird für ** Exploratory Data Analysis (EDA) ** verwendet. Dies ist eine Bibliothek, die ich persönlich sehr mag.

Aus der gesamten Information der Daten ... スクリーンショット 2019-12-17 20.06.56.png Grundlegende Statistiken jeder Variablen, スクリーンショット 2019-12-17 20.07.09.png Es wird sogar die Korrelationskoeffizientenmatrix angezeigt ... Zu bequem ...

スクリーンショット 2019-12-17 20.13.33.png

** Nachtrag (2020/1/7) ** ** Derzeit scheint lightgbm nicht in der Lage zu sein, Japanisch für Merkmalsmengennamen zu verwenden **

Feature-Erstellung

Als nächstes folgt der Teil zur Feature-Erstellung. Dies ist auch als Vorverarbeitung enthalten.

Hier erstellen wir eine neue Merkmalsmenge, die aus der vorhandenen Merkmalsmenge effektiv zu sein scheint (sie scheint die erklärenden Variablen gut erklären zu können). Zum Beispiel im folgenden Code ・ Fläche pro Raum geteilt durch die Anzahl der Räume ・ Das Produkt aus dem Typ des nächstgelegenen Bahnhofs und der Entfernung zum nächstgelegenen Bahnhof (letzteres scheint teurer zu sein, wenn es 5 Minuten zu Fuß zu einem Nebenbahnhof und 5 Minuten zu Fuß zu einem Hauptbahnhof sind). Wir haben Funktionen wie erstellt und hinzugefügt.

Wenn Sie Erfahrung mit Python haben, versuchen Sie bitte, Ihre eigene Funktionsmenge zu erstellen.


df["per_area"] = df["area"]/df["room_number"]
df["height_level"] = df["height"]*df["level"]
df["area_height_level"] = df["area"]*df["height_level"]
df["distance_staion_1"] = df["station_1"]*df["distance_1"]

Maschinelles Lernen

Es lernt endlich! !! !! Wir werden ein Preisprognosemodell erstellen, das auf den geformten und erstellten Daten basiert.

Der hier verwendete Algorithmus für maschinelles Lernen ist ** lightgbm **. · Hohe Genauigkeit ・ Die Verarbeitung ist schnell Es kann gesagt werden, dass es die wichtigste Methode in Wettbewerben für die Genauigkeit des maschinellen Lernens ist. (In dem Offline-Wettbewerb mit einem engen Zeitlimit, an dem ich zuvor teilgenommen habe, haben alle Top 10 diesen Algorithmus verwendet ...!)

Zuerst am Terminal oder an der Eingabeaufforderung

conda install -c conda-forge lightgbm

Und lassen Sie uns lightgbm installieren.

Lassen Sie uns nun den Code ausführen.


import matplotlib.pyplot as plt
import japanize_matplotlib
import lightgbm as lgb
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score

y = df["real_rent"]
X = df.drop(['real_rent',"name"], axis=1) 

X_train, X_test, y_train, y_test = train_test_split(X, y,test_size=0.33, random_state=0)

lgb_train = lgb.Dataset(X_train, y_train)
lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train)

lgbm_params = {
        'objective': 'regression',
        'metric': 'rmse',
        'num_leaves':80
}

model = lgb.train(lgbm_params, lgb_train, valid_sets=lgb_eval, verbose_eval=-1)
    
y_pred = model.predict(X_test, num_iteration=model.best_iteration)

print(r2_score(y_test, y_pred)  )
lgb.plot_importance(model, figsize=(12, 6))
plt.show()


Ergebnis
スクリーンショット 2019-12-17 20.44.49.png

Ich werde auch hier einige Erklärungen hinzufügen.

-Die resultierenden Zahlen geben die ** Modellgenauigkeit ** an. Dieser Index nimmt einen Wert von 0 bis 1 an und je näher er an ** 1 liegt, desto besser **. Aus dem Index von "0,945", den ich diesmal in meiner Analyse erhalten habe, können Sie erkennen, dass dieses Modell eine hohe Leistung aufweist. Als Bild kann es mit einer Genauigkeit von etwa 94% vorhergesagt werden.

-Feature_importance gibt ** die Wichtigkeit jeder Merkmalsmenge ** an. Immerhin können Sie sehen, dass die besetzte Fläche und das Alter wichtig sind. ~~ Ich bin froh, dass die Menge an Features, die ich gemacht habe, ganz gut funktioniert. ~~

Suche nach Immobilien mit einem guten Preis-Leistungs-Verhältnis

pred = list(model.predict(X, num_iteration=model.best_iteration))
pred = pd.Series(pred, name="Voraussichtlicher Wert")
diff = pd.Series(df["Miete+Verwaltungsgebühr"]-pred,name="Unterschied zum vorhergesagten Wert")
df_search = pd.concat([df_for_search,diff,pred], axis=1)
df_search = df_search.sort_values("Unterschied zum vorhergesagten Wert")
df_search = df_search[["Name der Wohnung",'Miete+Verwaltungsgebühr', 'Voraussichtlicher Wert',  'Voraussichtlicher Wertとの差', 'Detaillierte URL']]
df_search.to_csv('otoku.csv', sep = '\t',encoding='utf-16')

Durch Ausführen des obigen Codes wird eine CSV-Datei wie die folgende erstellt. Dieser Code verwendet das erstellte Modell, um die Miete für alle Immobilien vorherzusagen und eine Tabelle zu erstellen, in der die Differenz groß ist, dh nach Gewinn sortiert. Mit anderen Worten, je mehr es in der erstellten CSV-Datei aktiviert ist, desto besser ist es.

スクリーンショット 2019-12-17 21.26.35.png Informieren wir uns beispielsweise über die Immobilie "A-Standard Hongo 3-chome", die als die rentabelste Immobilie in diesem Modell gilt. Sie können von der Detail-URL auf der rechten Seite fliegen. スクリーンショット 2019-12-17 21.27.47.png スクリーンショット 2019-12-17 21.35.16.png

3 Minuten zu Fuß zum nächsten Bahnhof 2LDK 54㎡ 7 Jahre alt

  1. Stock

Damit sind 130.000 Yen pro Monat sicherlich ein ziemlich guter Zustand ... ** Ich möchte wahnsinnig leben, um es gelinde auszudrücken ... ** Der vorhergesagte Wert betrug also 230.000 Yen ・ Bunkyo Ward ・ Innerhalb von 10 Jahren nach dem Bau ・ Innerhalb von 10 Minuten zu Fuß vom nächsten Bahnhof ・ Bereich 45㎡ oder mehr Als ich mit SUUMO nach den Bedingungen von suchte, stellte ich fest, dass es wirklich viele Eigenschaften von etwa 200.000 bis 230.000 gibt, und diese Eigenschaft ist sehr viel. (Übrigens war es kein Unfallgut)

Bitte benutzen Sie diese Tabelle, um nach Immobilien zu suchen!

Tatsächlich ...

In diesem Kapitel werden wir über "** Sie können leicht getäuscht werden, wenn Sie nicht maschinelles Lernen studieren **" sprechen. Der Tisch, den ich früher gemacht habe, scheint äußerst effektiv und wunderbar zu sein. ** Tatsächlich sind 67% der Informationen in dieser Tabelle fast bedeutungslos ** Tatsächlich besteht eine gute Möglichkeit, dass diese Daten eine Eigenschaft enthalten, die rentabler ist als die Eigenschaft, die Sie derzeit für das beste Angebot halten.

Der Grund ist: "Da das anhand der Trainingsdaten erstellte Modell auf die Trainingsdaten angewendet wird, ist es nicht möglich, den Gewinn als Gewinn zu erfassen."

Erstens ist eine preiswerte Immobilie eine Immobilie mit einem großen (geschätzten Wert) - (tatsächlichen Preis (Lehrerdaten)). Ich sagte voraus, dass es 230.000 Yen für die Wohnung sein würden, die ich zuvor erwähnt habe, aber in Wirklichkeit sind es 130.000 Yen, was sehr viel von 100.000 Yen sein kann. Wenn diese Eigenschaft jedoch in den Lerndaten enthalten ist, wird der vorhergesagte Wert als "Nein, ich weiß es" berechnet, was fast dem tatsächlichen Preis entspricht. Kurz gesagt, es passiert so etwas wie "Konserven". Egal wie schwierig und speziell das Problem ist, wenn Sie die Antwort kennen, können Sie es lösen. Da der Zweck "Lass uns ein gutes Geschäft finden" war, ist dieses Problem offensichtlich ziemlich schlimm.

Mit anderen Worten, ** Fügen Sie die Daten, die Sie vorhersagen möchten, nicht in die Trainingsdaten ein **.

Übrigens können Sie sich als Lösung, wie in der Abbildung unten gezeigt, eine Methode zum Lernen und Vorhersagen in mehreren Schritten vorstellen. スクリーンショット 2019-12-18 1.27.04.png

Es ist in Ordnung, wenn Sie denken "Ich weiß nicht, was es ist". Keine Sorge, wir reden etwas kompliziert. In diesem Kapitel ** Sie können sich ohne Kenntnis der Datenanalyse leicht täuschen lassen ... ** ** Datenanalyse ist tief ** Ich schreibe es, weil ich das vorstellen möchte.

Am Ende

Dies ist das Ende dieses Artikels. Vielen Dank, dass Sie bisher bei uns geblieben sind! Ich würde mich sehr freuen, wenn Sie den Spaß und die Dynamik der Datenanalyse sowie den Horror und die Tiefe spüren könnten. Datenanalyse ist wichtig, damit Sie glücklich und nicht unglücklich sein können. Menschen sind anfälliger für Zahlen als sie wissen. Wenn Sie die Datenanalyse damit studieren möchten, führt Anderer Artikel die Selbststudienmethode ein. Bitte versuchen Sie zu referenzieren.

Referenz

Ich habe mit maschinellem Lernen in Tokios 23 Bezirken nach einem Schnäppchen-Mietobjekt gesucht Der größte Teil des Scraping-Codes basierte auf dem Code dieser Person. Es gab jedoch einige Teile, die nicht mit demselben Kopieren und Einfügen funktionierten, daher behebe ich das Problem.

Recommended Posts

[Für Super-Anfänger] Python-Umgebungskonstruktion & Scraping & maschinelles Lernen & praktische Anwendung, die Sie genießen können, indem Sie mit Kopie umziehen [Lassen Sie uns mit SUUMO ein gutes Mietobjekt finden! ]]
Ich war frustriert von Kaggle und versuchte, durch Schaben und maschinelles Lernen ein gutes Mietobjekt zu finden
Erstellen Sie mit Python eine Entwicklungsumgebung für maschinelles Lernen
Erstellen einer Windows 7-Umgebung für eine Einführung in das maschinelle Lernen mit Python
Erstellen Sie eine Python-Umgebung für maschinelles Lernen mit Containern
Bis Sie mit Python unter Windows 7 eine maschinelle Lernumgebung erstellen und ausführen
Konstruktionsnotiz für eine maschinelle Lernumgebung von Python
Sie können es mit Kopie versuchen! Lassen Sie uns ein cooles Netzwerkdiagramm mit networkx von Python zeichnen