Amsterdam, die Hauptstadt der Niederlande, ist ein sehr berühmtes Touristenziel mit einem sehr schönen Stadtbild. Es ist eine Stadt mit vielen charakteristischen Kanälen in Europa und berühmt als Touristenort, an dem zu viele Touristen zum Problem werden.
Airbnb Airbnb ist ein berühmter privater Unterkunftsservice. Airbnb kommt von Air Bed and Bed & Breakfast. Es ist ein Service, der angeblich begonnen hat, als Brian Chesky von Zeit zu Zeit sein Loft vermietet hat. Es ist die Hauptunterkunft in Übersee.
Ziel ist es, die Situation von Airbnb zu verstehen, wenn Amsterdamer Touristen versuchen, bei Airbnb zu bleiben. Dieses Mal habe ich die Airbnb-Unterkunftsdaten in Amsterdam analysiert, um herauszufinden, welche Merkmale es gibt und welche Variablen den Preis für Airbnb-Unterkünfte beeinflussen.
[Inside Airbnb -Adding data to the debate] http://insideairbnb.com/get-the-data.html Inside Airbnb ist eine Website, die aktuelle Daten zu Airbnb bereitstellt. Es handelt sich um sehr gut organisierte Daten, die im CSV-Format bereitgestellt werden, sodass selbst Anfänger wie ich sie leicht analysieren können.
https://towardsdatascience.com/exploring-machine-learning-for-airbnb-listings-in-toronto-efdbdeba2644 https://note.com/ryohei55/n/n56f723bc3f90
calendar = pd.read_csv('calendar.csv')
print(calendar.date.nunique(), 'days', calendar.listing_id.nunique(), 'unique listings')
366 days 20025 unique listings Die Daten stammen vom 08.12.2020 bis zum 06.12.2020, aber aus irgendeinem Grund liegt ein geringfügiger Fehler von 366 Tagen vor. Soweit ich die Daten sehen kann, scheint es kein Problem zu geben, daher werde ich fortfahren. Es gibt 20025 Einträge, und ich bin dankbar für die große Datenmenge.
calendar.head(5)
Ich habe versucht grafisch darzustellen, wie viel Airbnb bereits reserviert ist und wie viel Speicherplatz in chronologischer Reihenfolge verfügbar ist.
calendar_new = calendar[['date', 'available']]
calendar_new['busy'] = calendar_new.available.map( lambda x:0 if x == 't' else 1)
calendar_new = calendar_new.groupby('date')['busy'].mean().reset_index()
calendar_new['date'] = pd.to_datetime(calendar_new['date'])
plt.figure(figsize=(10, 5))
plt.plot(calendar_new['date'], calendar_new['busy'])
plt.title('Airbnb Amsterdam Calendar')
plt.ylabel('Busy %')
plt.show()
** Erwägung ** Insgesamt liegt die Auslastung bei über 80%, sodass zu erkennen ist, dass das Airbnb in Amsterdam das ganze Jahr über überfüllt ist. Es wird im Laufe des Jahres sehr voll. Dies kann auf den Einfluss von Touristen zurückzuführen sein, die im Laufe des Jahres zu Feuerwerkskörpern kommen.
Die Überlastungsrate wird nach März steigen. Ein ähnlicher plötzlicher Anstieg ist im Juni zu beobachten. Es wird jedoch davon ausgegangen, dass diese Anstiege auf die Tatsache zurückzuführen sind, dass der Airbnb-Gastgeber das Zimmer nicht verlassen hat, da Reservierungen, die etwas weit von der gegenwärtigen Zeit entfernt sind, nicht entschieden werden können, da der Zeitplan des Gastgebers nicht festgelegt wurde.
calendar['date'] = pd.to_datetime(calendar['date'])
calendar['price'] = calendar['price'].str.replace('$', '')
calendar['price'] = calendar['price'].str.replace(',', '')
calendar['price'] = calendar['price'].astype(float)
calendar['date'] = pd.to_datetime(calendar['date'])
mean_of_month = calendar.groupby(calendar['date'].dt.strftime('%B'), sort=False)['price'].mean()
mean_of_month.plot(kind = 'barh', figsize=(12, 7))
plt.xlabel('Average Monthly Price')
** Erwägung ** Der Durchschnittspreis für Airbnb in Amsterdam liegt das ganze Jahr über bei 160 Euro pro Nacht. Ich habe den Eindruck, dass Januar und Februar etwas billiger sein werden, wenn Sie sagen, dass es stark ist.
calendar['dayofweek'] = calendar.date.dt.weekday_name
cats = [ 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
price_week = calendar[['dayofweek', 'price']]
price_week = calendar.groupby(['dayofweek']).mean().reindex(cats)
price_week.drop(['listing_id','maximum_nights', 'minimum_nights'], axis=1, inplace=True)
price_week.plot(grid=True)
ticks = list(range(0,7,1))
labels = "Mon Tues Weds Thurs Fri Sat Sun".split()
plt.xticks(ticks, labels)![download (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505543/155809c6-0f06-2623-2d6e-78405d07ab30.png)
** Erwägung ** Von Montag bis Donnerstag liegt der Durchschnittspreis unter 170 Euro, aber bei einem Aufenthalt von Freitag bis Samstag ist der Preis extrem hoch. Es wird angenommen, dass die Nachfrage nach Airbnb an Wochenenden voreingenommen ist, da Schulen und Unternehmen freitags und samstags besuchen, wenn sie geschlossen sind.
Airbnb Enthält Daten zu jeder Unterkunft.
listings = pd.read_csv('listings.csv')
print('We have', listings.id.nunique(), 'listings in the listing data.')
listings.head(5)
Es sieht aus wie das.
listings.groupby(by = 'neighbourhood_cleansed').count()[['id']].sort_values(by='id', ascending=False).head(10)
listings.loc[(listings.price <= 1000) & (listings.price > 0)].price.hist(bins=200)
plt.ylabel('Count')
plt.xlabel('Listing price in EUR')
plt.title('Histogram of listing prices')
Die Preisverteilung ist so.
select_neighbourhood_over_100 = listings.loc[(listings.price <= 1000) & (listings.price > 0)].groupby('neighbourhood_cleansed')\
.filter(lambda x: len(x)>=100)["neighbourhood_cleansed"].values
listings_neighbourhood_over_100 = listings.loc[listings['neighbourhood_cleansed'].map(lambda x: x in select_neighbourhood_over_100)]
sort_price = listings_neighbourhood_over_100.loc[(listings_neighbourhood_over_100.price <= 1000) & (listings_neighbourhood_over_100.price > 0)]\
.groupby('neighbourhood_cleansed')['price'].median().sort_values(ascending=False).index
sns.boxplot(y='price', x='neighbourhood_cleansed', data=listings_neighbourhood_over_100.loc[(listings_neighbourhood_over_100.price <= 1000) & (listings_neighbourhood_over_100.price > 0)],
order=sort_price)
ax = plt.gca()
ax.set_xticklabels(ax.get_xticklabels(), rotation=45, ha='right')
plt.show()
** Erwägung ** Wie Sie von Centrum-West Centrum-Oost aus sehen können, sind die Preise in der Nähe des Hauptbahnhofs recht hoch. Man kann sagen, dass die günstigste Preisspanne darin besteht, in ein Gebiet wie Bijnmer zu fahren, das mit der Straßenbahn etwa 30 Minuten dauert. Grundsätzlich scheint der Preis für Airbnb in der Umgebung von der Entfernung zum Hauptbahnhof abhängig zu sein. ![xxamsterdam-train-station-map.jpg.pagespeed.ic.POsCpucKFr.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505543/2a9486e8-df14 -64f2-c508-7e172c11656b.jpeg)
select_property_over_100 = listings.loc[(listings.price <= 1000) & (listings.price > 0)].groupby('property_type')\
.filter(lambda x:len(x) >=20)["property_type"].values
listings_property_over_100 = listings.loc[listings["property_type"].map(lambda x: x in select_property_over_100)]
sort_price = listings_property_over_100.loc[(listings_property_over_100.price <= 1000) & (listings_property_over_100.price >0)]\
.groupby('property_type')['price'].median().sort_values(ascending=False).index
sns.boxplot(y='price', x ='property_type', data=listings_property_over_100.loc[(listings_property_over_100.price <= 1000) & (listings_property_over_100.price >0)],
order = sort_price)
ax = plt.gca()
ax.set_xticklabels(ax.get_xticklabels(), rotation=45, ha='right')
plt.show()
** Erwägung ** Zunächst zeigt das Box-Whisker-Diagramm die Variation der Daten, die Mittellinie zeigt auf den Mittelwert, die dunkle Linie darunter ist der erste Quadrant und die dunkle Linie darüber ist der dritte Quadrant. Es ist eine Zahl. Ein Hostel ist eine Unterkunft, in der Sie zu einem in Europa üblichen Schnäppchenpreis übernachten können. Obwohl es billig ist, obwohl es als Hostel eingestuft ist, scheint es in Amsterdam viele zu geben, die 1000 EUR kosten. Es muss jedoch berücksichtigt werden, dass diesmal 1000 EUR oder mehr als Ausreißer ausgeschlossen sind.
Die Daten für das Hotel variieren ebenfalls. Wahrscheinlich, weil einige Hotels einen erstklassigen Geschmack haben. Da der Medianwert selbst bei rund 180 EUR liegt, scheint Airbnb als Hotel grundsätzlich eine billige Klassifizierung zu sein.
listings.loc[(listings.price <= 1000) & (listings.price > 0)].pivot(columns='room_type', values='price').plot.hist(stacked=True, bins=100)
plt.xlabel('Listing Price in EUR')
** Erwägung ** Zuerst werden Sie feststellen, dass es nur wenige Mehrbettzimmer und Hotelzimmer gibt. Sie können das gesamte Haus / die gesamte Wohnung oder nur das Zimmer vermieten. Und die meisten von ihnen scheinen für jedes Haus / jede Wohnung vermietet zu sein. Wenn Sie es billiger machen möchten, scheint es effizienter zu sein, Ihre Suche auf private Räume zu beschränken. Bei der Vermietung des gesamten Hauses / der gesamten Wohnung ist natürlich nur das Zimmer teurer als die Vermietung.
pd.Series(np.concatenate(listings['amenities'].map(lambda amns: amns.split(",")))).value_counts().head(20).plot(kind='bar')
ax = plt.gca()
ax.set_xticklabels(ax.get_xticklabels(), rotation=45, ha='right', fontsize=12)
plt.show()
** Erwägung ** Es gibt viel Wifi. In den Niederlanden ist es im Winter kalt und die meisten von ihnen sind mit Heizung ausgestattet. Es gibt viele Orte, an denen es keine Annehmlichkeiten wie Eisenshampoo-Trockner gibt, daher müssen Sie ein wenig nachsehen.
Familien- und kinderfreundlich ist ein wenig ... aber ich möchte nicht von Airbnb gestört werden, daher wird dies als Vorteil angesehen und morgen. Sie können auch sehen, dass sich kostenlose Parkplätze nicht oben befinden. Seien Sie also vorsichtig, wenn Sie mit dem Auto anreisen.
amenities = np.unique(np.concatenate(listings['amenities'].map(lambda amns: amns.split(","))))
amenity_prices = [(amn, listings[listings['amenities'].map(lambda amns: amn in amns)]['price'].mean()) for amn in amenities if amn != ""]
amenity_srs = pd.Series(data=[a[1] for a in amenity_prices], index=[a[0] for a in amenity_prices])
amenity_srs.sort_values(ascending=False)[:20].plot(kind='bar')
ax = plt.gca()
ax.set_xticklabels(ax.get_xticklabels(), rotation=45, ha='right', fontsize=12)
plt.show()
** Erwägung ** Ich weiß nicht, ob Waschmaschine / Trockner am preisgünstigsten ist ... Es ist jedoch für Veranstaltungen geeignet, die typisch für Amsterdam sind. Viele Veranstaltungen finden in Amsterdam statt. Es scheint, dass die Räume, die leicht zu besuchen sind und sich am richtigen Ort befinden, tendenziell teuer sind. Abgesehen von diesen beiden ist die Beziehung fast einheitlich.
listings.loc[(listings.price <= 1000)&(listings.price > 0)].pivot(columns = 'beds', values='price').plot.hist(stacked=True, bins=100)
plt.xlabel('Listing price in EUR')
** Erwägung ** Meistens ein oder zwei Betten. Ist das das Ergebnis, das Sie sich vorgestellt haben? Übrigens 32 Betten! ?? Ich dachte, also habe ich es versucht. https://www.airbnb.jp/rooms/779175?source_impression_id=p3_1577402659_vntGlW7Yj5I5pX4U Es war eine Geschichte, dass diese Fähre 32 Betten hat. Ich bin überrascht.
col = ['host_listings_count', 'accommodates', 'bedrooms', 'price', 'number_of_reviews', 'review_scores_rating']
corr = listings.loc[(listings.price<=1000)&(listings.price > 0)][col].dropna().corr()
plt.figure(figsize=(6,6))
sns.set(font_scale=1)
sns.heatmap(corr, cbar=True, annot=True, square=True, fmt='.2f', xticklabels=col, yticklabels=col)
plt.show()
** Erwägung ** Dies ist eine Heatmap, mit der jede Korrelation in den Auflistungsdaten leicht nach Farbe angezeigt werden kann. Aber nur dieses Mal gibt es in den meisten Teilen keine Korrelation. Es besteht jedoch eine starke Korrelation zwischen Schlafzimmern und Unterkünften. Da dies die Anzahl der Personen ist, die bleiben können, und die Anzahl der Betten, ist es verständlich, dass eine Korrelation besteht. Eine solche Bestimmung der Anzahl der Unterkünfte anhand der Anzahl der Betten wird jedoch als Pseudokorrelation angesehen, da die Anzahl der Gäste künstlich als Anzahl der Betten und nicht als Korrelation bestimmt wird.
Das Folgende ist die Datenaufbereitung. Die Daten werden zu einer Dummy-Variablen gemacht.
from sklearn.feature_extraction.text import CountVectorizer
count_vectorizer = CountVectorizer(tokenizer=lambda x:x.split(','))
amenities = count_vectorizer.fit_transform(listings['amenities'])
df_amenities = pd.DataFrame(amenities.toarray(), columns=count_vectorizer.get_feature_names())
df_amenities = df_amenities.drop('', 1)
columns = ['host_is_superhost', 'host_identity_verified', 'host_has_profile_pic', 'is_location_exact', 'requires_license', 'instant_bookable', 'require_guest_profile_picture', 'require_guest_phone_verification']
for c in columns:
listings[c] = listings[c].replace('f',0,regex=True)
listings[c] = listings[c].replace('t',1,regex=True)
listings['security_deposit'] = listings['security_deposit'].fillna(value=0)
listings['security_deposit'] = listings['security_deposit'].replace('[\$,]', '', regex=True).astype(float)
listings['cleaning_fee'] = listings['cleaning_fee'].fillna(value=0)
listings['cleaning_fee'] = listings['cleaning_fee'].replace('[\$,]', '', regex=True).astype(float)
listings_new = listings[['host_is_superhost', 'host_identity_verified', 'host_has_profile_pic','is_location_exact',
'requires_license', 'instant_bookable', 'require_guest_profile_picture',
'require_guest_phone_verification', 'security_deposit', 'cleaning_fee',
'host_listings_count', 'host_total_listings_count', 'minimum_nights',
'bathrooms', 'bedrooms', 'guests_included', 'number_of_reviews','review_scores_rating', 'price']]
for col in listings_new.columns[listings_new.isnull().any()]:
listings_new[col] = listings_new[col].fillna(listings_new[col].median())
for cat_feature in ['zipcode', 'property_type', 'room_type', 'cancellation_policy', 'neighbourhood_cleansed', 'bed_type']:
listings_new = pd.concat([listings_new, pd.get_dummies(listings[cat_feature])], axis=1)
listings_new = pd.concat([listings_new, df_amenities], axis=1, join='inner')
Wir werden RandomForestRegressor verwenden.
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
from sklearn.metrics import mean_squared_error
from sklearn.ensemble import RandomForestRegressor
y = listings_new['price']
x = listings_new.drop('price', axis=1)
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=123)
rf = RandomForestRegressor(n_estimators=500, random_state=123, n_jobs=-1)
rf.fit(X_train, y_train)
y_train_pred = rf.predict(X_train)
y_test_pred = rf.predict(X_test)
rmse_rf = (mean_squared_error(y_test, y_test_pred))**(1/2)
print('RMSE test: %.3f' % rmse_rf)
print('R^2 test: %.3f' % (r2_score(y_test, y_test_pred)))
RMSE test: 73.245 R^2 test: 0.479 Das Ergebnis sieht so aus. Es ist 0,479 im R ^ 2-Test, also ziemlich genau. Schauen wir uns vorerst an, welchen Punkt der Entscheidungsbaum als wichtig erachtet hat.
coefs_df = pd.DataFrame()
coefs_df['est_int'] = X_train.columns
coefs_df['coefs'] = rf.feature_importances_
coefs_df.sort_values('coefs', ascending=False).head(20)
** Erwägung ** Sie sehen, dass die Anzahl der Schlafzimmer einen erheblichen Einfluss auf den Preis hat. Bei Airbnb wird eine Reinigungsgebühr getrennt von der Zimmergebühr erhoben. Es ist jedoch ersichtlich, dass die Gebühr auch den Preis beeinflusst. Dies scheint eine ziemlich direkte Wirkung zu haben.
from sklearn.linear_model import Lasso
lasso = Lasso()
lasso.fit(X_train, y_train)
#Regressionskoeffizienten
print(lasso.coef_)
#Sektion(Error)
print(lasso.intercept_)
#Entscheidungskoeffizient
print(lasso.score(X_test, y_test))
[ 1.85022916e-03 1.31073590e+00 -0.00000000e+00 0.00000000e+00 5.23464952e+00 5.97640655e-01 6.42296851e-01 3.67942959e+01 8.80302532e+00 -3.96520183e-02 8.39294507e-01] -30.055848397234712 0.27054071146797
Ich habe auch eine multiple Regressionsanalyse versucht, aber ich konnte die Genauigkeit nicht sehr verbessern. Nun, das ist unvermeidlich, weil es zu einer Dummy-Variablen gemacht wird, nicht wahr? richtig? ??
Ich habe gerade Datenanalyse gelernt, bin aber als Anfänger dankbar, da das interne Airbnb sehr gut organisierte Daten enthält. Ich möchte so analysieren! Es ist etwas schwierig, offene Daten zu finden. Bitte beziehen Sie sich darauf.
Dieses Mal habe ich viele Teile gerade kopiert, aber ich bin froh, dass ich lernen konnte, was ich beabsichtigte und wie ich die Daten verarbeite.
Ich würde mich über jeden Rat freuen!
Recommended Posts