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.
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.
** ・ 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.
・ ** 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" ...)
macOS High Sierra ver10.13.6 (~~ Sei nicht müde ~~) python3.7.3 Jupyter lab
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 |
---|
Gesamtdurchfluss |
Umgebung |
Schaben |
Datenanalyse |
Entdecken Sie tolle Angebote |
Tatsächlich... |
Am Ende |
Lassen Sie uns zunächst den Gesamtfluss überprüfen. In diesem Artikel
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!
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/】
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.
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.
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.
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. 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.
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.
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.
Lassen Sie uns das Modell komplizieren, um diesen Fehler weiter zu reduzieren.
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.
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. Befolgen Sie die nachstehenden Anweisungen, um die Generalisierungsleistung zu messen.
In diesem Teil des maschinellen Lernens werden 67% der gesammelten Daten in Trainingsdaten und die restlichen 33% in Testdaten unterteilt.
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. 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 ... Grundlegende Statistiken jeder Variablen, Es wird sogar die Korrelationskoeffizientenmatrix angezeigt ... Zu bequem ...
** Nachtrag (2020/1/7) ** ** Derzeit scheint lightgbm nicht in der Lage zu sein, Japanisch für Merkmalsmengennamen zu verwenden **
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"]
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
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. ~~
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.
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.3 Minuten zu Fuß zum nächsten Bahnhof 2LDK 54㎡ 7 Jahre alt
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!
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.
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.
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.
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