Freut mich, dich kennenzulernen. Mein Name ist S.I., ein Universitätsstudent im dritten Jahr, der zum Institut für Informationstechnik gehört. Ich habe mich nur mit Python-Erfahrungen in Universitätsversuchen befasst.
Die Data Science Division von Kakko Co., Ltd., in der ich Praktikant bin, hat die Aufgabe, während des Testzeitraums einen Crawler zu erstellen, um die Daten zu sammeln, zu verarbeiten und zu visualisieren und kurz zu diskutieren, was ich gelernt habe.
Ein Freund der Universität wird alleine leben. Wenn ich mir jedoch die Immobilien-Website anschaue, stehen zu viele Immobilien zur Auswahl. Bitte lösen Sie es durch Datenanalyse.
Innerhalb von 60 Minuten nach dem Pendeln von der JR Kanamachi Station
Bei der Suche nach einer Immobilie aus eigener Erfahrung bei der Suche nach einer Immobilie sind die "Informationen, die Sie wissen möchten" Ich dachte, es sei eine "Bedingung für die Suche nach einer Immobilie", dem Immobilienmakler, der als Vermittler fungiert, mitzuteilen, und beschloss, sie durch Datenanalyse zu lösen.
Dieses Mal werden wir Smightys "Pendel- / Schulzeitsuche" zum Crawlen verwenden, und die Suchergebnisse werden innerhalb von 60 Minuten zur Kanamachi Station gelangen.
Der Crawler-Code sieht folgendermaßen aus:
crawling.py
import requests
from bs4 import BeautifulSoup
import time
import os
import datetime
def crawling():
#Verzeichnispfad zum Speichern von HTML-Dateien
dirname = './html_files'
if not os.path.exists(dirname):
#Erstellen Sie ein Verzeichnis, wenn es nicht vorhanden ist
os.mkdir(dirname)
#Konvertieren Sie die erste Seite in HTML
url = "https://sumaity.com/chintai/commute_list/list.php?search_type=c&text_from_stname%5B%5D=%E9%87%91%E7%94%BA&cost_time%5B%5D=60&price_low=&price_high="
response = requests.get(url)
time.sleep(1)
#Speichern unter
page_count = 1 #Seitenzahl
with open('./html_files/page{}.html'.format(page_count), 'w', encoding='utf-8') as file:
file.write(response.text)
#Gesamtzahl der Immobilien(Theoretischer Wert)Erwerb (als Abnahmebedingung)
soup = BeautifulSoup(response.content, "lxml")
num_bukken = int(soup.find(class_='searchResultHit').contents[1].text.replace(',', ''))
print("Gesamtzahl der Objekte innerhalb von 60 Minuten nach der Pendelzeit:", num_bukken)
#Speichern Sie die Gesamtzahl der Eigenschaften in einer Textdatei, da diese zum Überprüfen der Akzeptanzbedingungen beim Scraping verwendet wird.
path = './data.txt'
with open(path, mode='w') as f:
f.write("{}\n".format(num_bukken))
#Fahren Sie mit dem Crawlen auf der zweiten und den folgenden Seiten fort, bis die nächste Seite leer ist
while True:
page_count += 1
#Finde die nächste URL
next_url = soup.find("li", class_="next")
#Unterbrechen und beenden, wenn die nächste Seite leer ist
if next_url == None:
print("Gesamtzahl der Seiten:", page_count-1)
with open(path, mode='a') as f:
f.write("{}\n".format(page_count-1))
break
#Holen Sie sich die URL der nächsten Seite und speichern Sie sie als HTML-Datei
url = next_url.a.get('href')
response = requests.get(url)
time.sleep(1)
with open('./html_files/page{}.html'.format(page_count), 'w', encoding='utf-8') as file:
file.write(response.text)
#Bereiten Sie sich auf die Analyse vor, um die URL der nächsten Seite zu erhalten
soup = BeautifulSoup(response.content, "lxml")
#Crawling-Fortschrittsausgabe
if page_count % 10 == 0:
print(page_count, 'Seite abrufen')
#Hauptfunktion
if __name__ == "__main__":
date_now = datetime.datetime.now()
print("Beginnen Sie mit dem Crawlen:", date_now)
crawling()
date_now = datetime.datetime.now()
print("Fertiges Krabbeln:", date_now)
Das Folgende sind die Variablen, die dieses Mal abgekratzt wurden.
Der Scraping-Code sieht folgendermaßen aus:
scraping.py
from bs4 import BeautifulSoup
import datetime
import csv
import re
#Regulärer Ausdruck für die Aufteilung einer Adresse in eine Präfektur und eine Stadt
pat = '(...??[Präfekturen])((?:Asahikawa|Datum|Ishikari|Morioka|Oshu|Tamura|Südsoma|Nasu Shiobara|Higashimurayama|Musashi Murayama|Hamura|Tokamachi|Joetsu|Toyama|Nono City|Omachi|Gamagun|Yokkaichi|Himeji|Yamato Koriyama|Hirohiichi|unter>Kiefer|Iwakuni|Tagawa|Omura|Miyako|Furano|Beppu|Saeki|Kurobe|Kleine Gegenstände|Shiojiri|Tamano|Shunan)Stadt|(?:余Stadt|高Stadt|[^Stadt]{2,3}?)Bezirk(?:Tamamura|Omachi|.{1,5}?)[Städte und Dörfer]|(?:.{1,4}Stadt)?[^Stadt, Dorf]{1,4}?Station|.{1,7}?[StadtStädte und Dörfer])(.+)'
def scraping(total_page, room_num):
#Initialisierung der Anzahl der Eigenschaften
room_count = 0
#Vorbereiten der CSV-Datei (Hinzufügen eines Headers)
with open('room_data.csv', 'w', newline='', encoding='CP932') as file:
header = ['No', 'building_name', 'category', 'prefecture', 'city', 'station_num', 'station', 'method', 'time', 'age', 'total_stairs', 'stairs', 'layout', 'room_num', 'space', 'south', 'corner', 'rent', 'unit_price', 'url']
writer = csv.DictWriter(file, fieldnames=header)
writer.writeheader()
for page_num in range(total_page):
#Ausgabe des Scraping-Fortschritts
if page_num % 10 == 0:
print(page_num , '/', total_page)
#Öffnen Sie die HTML-Datei, die mit Beautiful Soup abgekratzt werden soll
with open('./html_files/page{}.html'.format(page_num + 1), 'r', encoding='utf-8') as file:
page = file.read()
soup = BeautifulSoup(page, "lxml")
#Informieren Sie sich über jedes Gebäude
building_list = soup.find_all("div", class_="building")
for building in building_list:
#Gebäudekategorie: Herrenhaus oder Wohnung oder Einfamilienhaus
buildingCategory = building.find(class_="buildingCategory").getText()
#Gebäudename
buildingName = building.find(class_="buildingName").h3.getText().replace("{}".format(buildingCategory), "").replace("Neuankömmling", "")
#Extraktion von Kandidaten für die nächste Station und die Entfernung von der Station
traffic = building.find("ul", class_="traffic").find_all("li")
#Anzahl der nächstgelegenen Stationen
station_num = len(traffic)
#Extrahieren Sie diejenigen mit kurzer Gehzeit
min_time = 1000000 #Initialisieren Sie die minimal erforderliche Zeit
for j in range(station_num):
traffic[j] = traffic[j].text
figures = re.findall(r'\d+', traffic[j])
time = 0
for figure in figures:
#Berechnung der benötigten Zeit
time += int(figure)
#Speichern Sie die erforderliche Mindestzeit und indizieren Sie sie mindestens
if time < min_time:
min_time = time
index = j
#Wenn Sie Stations- oder Routeninformationen haben
if len(traffic[index].split(' ')) > 1:
#Routenentscheidung
line = traffic[index].split(' ')[0]
#Ermittlung der nächsten Station
station = traffic[index].split(' ')[1].split('Bahnhof')[0]
#Erwerb des Transports (Bus, Auto, Fußweg) zum Bahnhof
if len(traffic[index].split(' ')) > 2:
if "Bus" in traffic[index].split(' ')[1]:
method = "bus"
elif "Wagen" in traffic[index].split(' ')[2]:
method = "car"
else:
method = "walk"
#Keine Transportinformationen zum Bahnhof
else:
method = None
#Wenn keine Stations- oder Routeninformationen vorhanden sind
else:
station = None
line = None
method = None
time = None
#Adresse
address = building.find(class_="address").getText().replace('\n','')
address = re.split(pat, address)
if len(address) < 3:
prefecture = "Tokio"
city = "Adachi Ward"
else:
prefecture = address[1]
city = address[2]
#Details des Gebäudes (Alter, Struktur, Gesamtzahl der Stockwerke)
building_detail = building.find(class_="detailData").find_all("td")
for j in range(len(building_detail)):
building_detail[j] = building_detail[j].text
# ----Holen Sie sich nur die Anzahl der Alter----
#Alter unbekannt
if 'Unbekannte Konstruktion' == building_detail[0]:
building_detail[0] = None
#0 Jahre alt
elif 'Weniger als' in building_detail[0]:
building_detail[0] = 0
#Normaler Wert
else:
building_detail[0] = int(re.findall(r'\d+', building_detail[0])[0])
#Holen Sie sich nur die Gesamtzahl der Etagen
building_detail[2] = int(re.findall(r'\d+', building_detail[2])[0])
# ----Holen Sie sich Zimmerdetails----
rooms = building.find(class_="detail").find_all("tr",
{'class': ['estate applicable', 'estate applicable gray']})
for j in range(len(rooms)):
#Anzahl der Eigenschaften zählen
room_count += 1
# ----Anzahl der Etagen----
stairs = rooms[j].find("td", class_="roomNumber").text
#Nur Zahlen abrufen ("Etage" löschen, fehlende Werte verarbeiten)
if "-" == stairs:
stairs = None
else:
stairs = int(re.findall(r'\d+', stairs)[0])
#Machen Sie die Miete zu einem ganzzahligen Typ
price = rooms[j].find(class_="roomPrice").find_all("p")[0].text
price = round(10000 * float(price.split('Zehntausend')[0]))
#Verwaltungsgebühr
kanri_price = rooms[j].find(class_="roomPrice").find_all("p")[1].text
#Vereinheitlichung der Notation (Streichung der Notation von 10.000 Yen)-"Und" 0 Yen "fehlende Wertverarbeitung)
if "-" in kanri_price or "0 Yen" == kanri_price:
kanri_price = 0
else:
kanri_price = int(kanri_price.split('Kreis')[0].replace(',',''))
#Raumtyp (Aufteilung)
room_type = rooms[j].find(class_="type").find_all("p")[0].text
if room_type == "Studio":
room_type = "1R"
#Anzahl der Räume
num_of_rooms = int(re.findall(r'\d+', room_type)[0])
#Raumfläche, Streichung der Einheit "m2"
room_area = rooms[j].find(class_="type").find_all("p")[1].text
room_area = float(room_area.split('m')[0])
#Nach Süden ausgerichtetes Eckzimmer
special = rooms[j].find_all("span", class_="specialLabel")
south = 0
corner = 0
for label in range(len(special)):
if "Südlage" in special[label].text:
south = 1
if "Eckzimmer" in special[label].text:
corner = 1
#Holen Sie sich detaillierte URL
room_url = rooms[j].find("td", class_="btn").a.get('href')
#Miete=Miete+Fragen Sie nach der Verwaltungsgebühr
rent = price + kanri_price
# 1m^Finden Sie die Miete (Stückpreis) für jeweils 2
unit_price = rent / room_area
#Ausgabe in CSV-Datei: Codierungsstandard"utf-8", Wenn Sie in Windows mit Japanisch umgehen"cp932"
with open('room_data.csv', 'a', newline='', encoding='CP932') as file:
writer = csv.DictWriter(file, fieldnames=header)
writer.writerow(
{'No':room_count, 'building_name':buildingName, 'category':buildingCategory, 'prefecture':prefecture, 'city':city, 'station_num':station_num, 'station':station,
'method':method, 'time':min_time, 'age':building_detail[0], 'total_stairs':building_detail[2], 'stairs':stairs,
'layout':room_type, 'room_num':num_of_rooms, 'space':room_area, 'south':south, 'corner':corner, 'rent':rent, 'unit_price':unit_price, 'url':room_url})
print("{}Wir haben die Immobiliendaten erfasst.".format(room_count))
#Bestätigung der Abnahmebedingungen
if room_count == room_num:
print("Klare Abnahmebedingungen")
else:
print("{}Da ist ein Unterschied. Die Annahmebedingungen wurden nicht geklärt.".format(abs(room_count-room_num)))
if __name__ == "__main__":
date_now = datetime.datetime.now()
print("Beginnen Sie mit dem Schaben:", date_now)
#Übergeben Sie die Gesamtzahl der Seiten und die Anzahl der Eigenschaften an die Scraping-Funktion (Akzeptanzbedingung).
path = './data.txt'
with open(path) as f:
data = f.readlines()
scraping(int(data[1].replace("\n","")), int(data[0].replace("\n","")))
date_now = datetime.datetime.now()
print("Fertiges Schaben:", date_now)
Zuerst überprüfte ich das Histogramm, um zu sehen, wie die Miete verteilt ist, und entfernte Immobilien mit zu hoher Miete, die nicht für das Alleinleben geeignet waren.
Von hier aus wollen wir sehen, wie sich jede Variable auf die Miete auswirkt.
Schauen wir uns die Anzahl der Immobilien und die Verteilung der Miete für jede Etage an.
Wenn die Anzahl der Immobilien für jede Etage in einem Balkendiagramm angezeigt wird, wurde festgestellt, dass die Etagen von 1R bis 3LDK 98% der Gesamtmenge ausmachen. Wenn Sie sich die Verteilung der Miete für diese Stockwerke auf einem Geigengrundstück ansehen, sehen Sie, dass die Verteilung der Miete für jedes Stockwerk unterschiedlich ist. Daher ist das Layout wahrscheinlich eine Variable, die sich auf die Miete auswirkt.
Mal sehen, wo es viele Eigenschaften gibt.
In der Präfektur waren die meisten von ihnen Tokio und Chiba, und Saitama betrug etwa 3%. Wenn man sich jede Stadt, Gemeinde, Stadt und jedes Dorf genauer ansieht, übersteigt die Anzahl der Immobilien pro Arakawa-ku, Kashiwa-shi, Matsudo-shi, Katsushika-ku und Adachi-ku 1000 und es scheint gut zu sein, um Immobilien zu finden. Schauen wir uns die Verteilung der Mieten in jedem dieser Bezirke an.
Wenn wir uns das Miethistogramm nach Präfektur ansehen, können wir sehen, dass es in Tokio viele Immobilien gibt, aber viele Immobilien mit hoher Miete, und viele Immobilien in Chiba sind billiger. Wenn Sie sich die Karte des Mietbox-Bartes für jede Stadt, Gemeinde, Stadt und jedes Dorf im Detail ansehen, können Sie sehen, dass sich die Box im grünen Chiba-Bereich unten befindet. Es scheint, dass Sie günstige Immobilien in Matsudo, Kashiwa, Ryuyama, Ichikawa, Gagoko, Yoshikawa und Soka finden können. Wenn Sie sich die Box-Bart-Karte ansehen, können Sie sehen, dass die Verteilung der Miete je nach Bezirk unterschiedlich ist. Es scheint also, dass sich der Standort der Immobilie auch auf die Miete auswirkt.
Es gibt eine schwache negative Korrelation zwischen Reisezeit und Miete, und es scheint, dass die Miete umso billiger ist, je länger die Reisezeit ist. Darüber hinaus wird der Unterschied in der Miete in Abhängigkeit von den zu diesem Zeitpunkt verwendeten Transportmitteln wie Bus oder Fußgänger angezeigt. Es ist zu sehen, dass die Miete für den blauen Weg höher ist als die für den Bus. Daher können sowohl der Transport als auch die Reisezeit die Miete beeinflussen.
Wir gruppierten alle 5 Jahre das Alter der Gebäude und stellten eine Box-Bart-Karte der Miete aus.
Sie können sehen, dass die Miete von der Immobilie nach 15 Jahren allmählich billiger wird. Daher ist das Alter wahrscheinlich auch eine Variable, die sich auf die Miete auswirkt.
Betrachten wir die Verteilung der Miete auf die Gesamtzahl der Stockwerke des Gebäudes und das Histogramm der Gesamtzahl der Stockwerke.
Betrachtet man die Gesamtzahl der Stockwerke und die Verteilung der Miete, so scheint die Miete von Immobilien mit bis zu 2 Stockwerken günstig zu sein. Mit Blick auf das Histogramm der Gesamtzahl der Stockwerke waren die meisten zweistöckigen Immobilien Wohnungen. Außerdem befinden sich 95% der Immobilien innerhalb von 10 Stockwerken, sodass ich denke, dass Sie sich zum ersten Mal allein nach Hochhausimmobilien sehnen, aber es scheint schwierig, wenn es um Immobilien für das Alleinleben geht. Aus den obigen Ergebnissen wurde herausgefunden, dass Gebäudeinformationen auch die Miete beeinflussen.
Ich werde sehen, ob die nach Süden gerichtete Ausrichtung, die für die Immobilie charakteristisch ist, die Miete beeinflusst. Ich habe ein Histogramm der nach Süden ausgerichteten und der nicht nach Süden ausgerichteten Immobilien erstellt.
Wenn ich mir das Histogramm anschaue, ist die Verteilung ähnlich, also habe ich getestet, ob der Unterschied in der Miete signifikant war. Es gab einen signifikanten Unterschied in der Durchschnittsmiete für nach Süden ausgerichtete und nicht nach Süden ausgerichtete Immobilien. Zu diesem Zeitpunkt wurde der Test mit gleicher Dispersion durch den F-Test durchgeführt, und es wurde nicht verworfen, dass die gleiche Dispersion erhalten wurde, so dass der t-Test unter der Annahme einer gleichen Dispersion durchgeführt wurde. Infolgedessen ist die nach Süden ausgerichtete Immobilie etwa 1500 Yen billiger. Aus dem oben Gesagten wurde herausgefunden, dass es die Miete beeinflusst, ob es nach Süden ausgerichtet ist oder nicht.
Ebenso werden wir die Auswirkungen auf Eckräume untersuchen.
Da die gleiche Dispersion durch den F-Test verworfen wurde und die gleiche Dispersion verworfen wurde, wurde der t-Test unter der Annahme durchgeführt, dass die Varianzen nicht gleich waren. Als Ergebnis stellte sich heraus, dass der Unterschied signifikant war und der Preis für das Eckzimmer etwa 2000 Yen höher war. Aus dem oben Gesagten wurde herausgefunden, dass das Eckzimmer auch die Miete beeinflusst.
Basierend auf den bisherigen Ergebnissen möchte ich die Bedingungen der Immobilie, die ich meinen Freunden in der Universität empfehle, die tatsächlich in Schwierigkeiten sind, erneut analysieren und spezifisch bestimmen.
Das Verhältnis zwischen der Anzahl der Immobilien und der Durchschnittsmiete ist für jede Stadt aufgetragen.
Sie können sehen, dass Matsudo City viele Immobilien hat und die durchschnittliche Miete niedrig ist.
Die Anzahl der Immobilien und die durchschnittliche Miete für jede Etage sind wie folgt.
Die durchschnittliche Miete für 1R, 2K und 3K ist billiger, aber die Anzahl der 1K-Immobilien ist überwältigend. Wenn Sie alleine leben, brauchen Sie nicht so viel Platz, daher denke ich, dass 1K ein gutes Layout ist. Der Mietmarktpreis für 1K-Immobilien in Matsudo City betrug 56000 Yen unter Verwendung des Durchschnittspreises.
Eine Box-Bart-Tabelle mit Änderungen der Mietverteilung in Abhängigkeit vom Alter der 1K-Immobilien in Matsudo City.
Sie können sehen, dass es viele Immobilien unter dem Marktpreis gibt, wenn die Immobilie 15 Jahre oder älter ist. Ich denke, es ist eine gute Idee, in ungefähr 15 Jahren danach zu suchen.
Die von der Station benötigte Zeit wird in einem Balkendiagramm durch Farbcodierung entsprechend dem Transportmittel angezeigt.
Es ist ersichtlich, dass 95% der Grundstücke für das Alleinleben innerhalb von 20 Minuten zu Fuß erreichbar sind. Wir haben die Anzahl der Immobilien und die durchschnittliche Miete für jede vom Bahnhof benötigte Zeit aufgezeichnet. Sie können sehen, dass die Miete günstiger ist, wenn Sie sie innerhalb von 15 Minuten verlängern.
Basierend auf dem oben Gesagten sind die Bedingungen für die Suche nach einer Immobilie, um es einem Freund zu sagen, wie folgt.
Wenn Sie unter den oben genannten Bedingungen suchen, handelt es sich um ein Zimmer vom Typ ** Apartment **. Unter dieser Bedingung denke ich, dass Sie ein gutes Zimmer finden können, indem Sie zu einem Immobilienmakler in Matsudo gehen.
Der Reflexionspunkt ist, dass die Daten analysiert wurden, ohne dass eine Richtlinie festgelegt wurde. Es ist in Ordnung, wenn Sie es als Hobby tun, aber wenn Sie es tun, erhalten Sie ein Diagramm, in dem Sie nicht wissen, wo Sie es verwenden sollen. Dies ist eine enorme Zeitverschwendung, sodass Sie die Daten mit einem bestimmten Zweck analysieren müssen.
Ich halte dieses Problem für eine wertvolle Erfahrung, da ich Feedback geben konnte, indem ich Materialien und Präsentationen erstellte, nicht nur Analysen. Das Sammeln und Analysieren der Daten hat so lange gedauert, und es war schwierig, die Ergebnisse an die andere Partei weiterzugeben. Ich habe verschiedene Dinge bemerkt und möchte sie daher in Zukunft nutzen.
das ist alles.
Recommended Posts