Blueprint Investasi: Mengoptimalkan Profit melalui Fitur Arsitektural pada Pasar Airbnb Bangkok

Author: Samsur Hidayat | Real Estate Data Analyst

1. Memahami Masalah dan Tujuan Bisnis

1.1 Latar Belakang

Bangkok adalah salah satu pasar Airbnb paling kompetitif di Asia Tenggara. Bagi investor, tantangan utamanya bukan lagi sekadar memiliki properti, melainkan strategi pemilihan aset yang tepat. Banyak investor terjebak membeli unit mewah yang sepi penyewa atau melakukan renovasi arsitektural yang mahal namun tidak memberikan pengembalian (ROI) yang signifikan. Analisis ini hadir untuk menjembatani celah antara desain arsitektural dan performa finansial.

1.2 Rumusan Masalah

Analisis ini bertujuan untuk memberikan panduan bagi calon pembeli properti di Bangkok dengan menjawab empat pertanyaan kunci:

  • Strategi Lokasi: Di distrik mana “titik panas” pendapatan berada untuk meminimalisir risiko investasi?

  • Performa Properti: Tipe properti (Apartemen, Rumah, Villa) mana yang menawarkan pendapatan paling stabil?

  • Nilai Arsitektural: Fitur fisik/amenitas apa yang paling kuat mendorong kenaikan harga sewa (Price Driver)?

  • Optimalisasi Ruang: Bagaimana hubungan kapasitas tamu terhadap efisiensi pendapatan (Revenue per Guest)?

1.3 Tujuan dan Ukuran Keberhasilan

Membangun strategi investasi berbasis data untuk mengidentifikasi properti dengan potensi pendapatan optimal dan efisiensi ruang yang tinggi.

Metrik Utama:

  1. Estimasi Pendapatan Bulanan (Gross Revenue): Mengukur daya tarik pasar secara absolut. Menggunakan asumsi Review Rate 50% dan Average Length of Stay 3 malam sebagai standar konservatif industri.

  2. Pendapatan per Tamu (Revenue per Guest): Mengukur efisiensi monetisasi setiap meter persegi/kapasitas properti, memungkinkan perbandingan adil antara unit kecil (Studio) dan unit besar (Villa).

Catatan: Fokus analisis adalah potensi pendapatan kotor dan efisiensi pasar mengingat data harga beli aset tidak tersedia secara publik.

2. Pembersihan dan Persiapan Data

Tujuan dari bab ini adalah mengubah data mentah yang berantakan menjadi dataset yang siap dianalisis. Fokus utama saya adalah menyeleksi variabel yang memiliki dampak langsung terhadap nilai investasi dan aspek arsitektural.

Sebelumnya, kita perlu mempersiapkan data dan melihat kolom secara keseluruhan.

🔍 Show/Hide code
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import folium
from folium.plugins import HeatMap
import contextily as ctx


# Konfigurasi tampilan pandas
pd.set_option('display.max_columns', None)

# Memuat data
df = pd.read_csv('data/listings.csv.gz', compression='gzip')

# Validasi awal ukuran data
print(f"Data berhasil dimuat.")
print(f"Total Rows (Listings): {df.shape[0]:,}")
print(f"Total Columns (Features): {df.shape[1]}")

display(df.head(3))

# Cek missing values pada kolom krusial untuk Revenue Potential
missing_check = df[['price', 'number_of_reviews', 'review_scores_rating']].isnull().sum()
print("\nMissing Values pada kolom kunci:")
print(missing_check)
Data berhasil dimuat.
Total Rows (Listings): 28,806
Total Columns (Features): 79
id listing_url scrape_id last_scraped source name description neighborhood_overview picture_url host_id host_url host_name host_since host_location host_about host_response_time host_response_rate host_acceptance_rate host_is_superhost host_thumbnail_url host_picture_url host_neighbourhood host_listings_count host_total_listings_count host_verifications host_has_profile_pic host_identity_verified neighbourhood neighbourhood_cleansed neighbourhood_group_cleansed latitude longitude property_type room_type accommodates bathrooms bathrooms_text bedrooms beds amenities price minimum_nights maximum_nights minimum_minimum_nights maximum_minimum_nights minimum_maximum_nights maximum_maximum_nights minimum_nights_avg_ntm maximum_nights_avg_ntm calendar_updated has_availability availability_30 availability_60 availability_90 availability_365 calendar_last_scraped number_of_reviews number_of_reviews_ltm number_of_reviews_l30d availability_eoy number_of_reviews_ly estimated_occupancy_l365d estimated_revenue_l365d first_review last_review review_scores_rating review_scores_accuracy review_scores_cleanliness review_scores_checkin review_scores_communication review_scores_location review_scores_value license instant_bookable calculated_host_listings_count calculated_host_listings_count_entire_homes calculated_host_listings_count_private_rooms calculated_host_listings_count_shared_rooms reviews_per_month
0 27934 https://www.airbnb.com/rooms/27934 20250926165947 2025-09-27 city scrape Nice room with superb city view Our cool and comfortable one bedroom apartment... It is very center of Bangkok and easy access t... https://a0.muscache.com/pictures/566374/23157b... 120437 https://www.airbnb.com/users/show/120437 Nuttee 2010-05-08 Bangkok, Thailand Hi All, I am nuttee patranavik from Bangkok, T... NaN NaN 67% f https://a0.muscache.com/im/pictures/user/d05a6... https://a0.muscache.com/im/pictures/user/d05a6... Victory Monument 1.0 2.0 ['email', 'phone'] t t Samsen Nai, Bangkok, Thailand Ratchathewi NaN 13.75983 100.54134 Entire condo Entire home/apt 2 1.5 1.5 baths 1.0 1.0 ["Free parking on premises", "Dryer", "Hot wat... $1,595.00 15 240 30.0 30.0 240.0 240.0 30.0 240.0 NaN t 27 57 87 362 2025-09-27 65 0 0 93 1 0 0.0 2012-04-07 2024-09-17 4.86 4.95 4.82 4.97 4.91 4.66 4.75 NaN f 1 1 0 0 0.4
1 27979 https://www.airbnb.com/rooms/27979 20250926165947 2025-09-27 previous scrape Easy going landlord,easy place NaN NaN https://a0.muscache.com/pictures/106247594/1d6... 120541 https://www.airbnb.com/users/show/120541 Emy 2010-05-08 Bangkok, Thailand NaN NaN NaN NaN f https://a0.muscache.com/im/users/120541/profil... https://a0.muscache.com/im/users/120541/profil... NaN 2.0 4.0 ['email', 'phone'] t f NaN Bang Na NaN 13.66818 100.61674 Private room in rental unit Private room 2 NaN 1 bath NaN NaN ["Essentials", "Heating", "Free parking on pre... NaN 1 730 1.0 1.0 730.0 730.0 1.0 730.0 NaN NaN 0 0 0 0 2025-09-27 0 0 0 0 0 0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN f 2 1 1 0 NaN
2 28745 https://www.airbnb.com/rooms/28745 20250926165947 2025-09-27 previous scrape modern-style apartment in Bangkok A modern-style apartment situated in a cool ne... Ramkumheang neigbourhood - hip place with food... https://a0.muscache.com/pictures/160369/92a7ec... 123784 https://www.airbnb.com/users/show/123784 Familyroom 2010-05-12 Bangkok, Thailand Welcome to Familyroom Apartment.\r\n\r\nA Chic... NaN NaN NaN f https://a0.muscache.com/im/users/123784/profil... https://a0.muscache.com/im/users/123784/profil... Bang Kapi 1.0 1.0 ['email', 'phone'] t f Bangkok, Thailand Bang Kapi NaN 13.75232 100.62402 Private room in rental unit Private room 2 NaN 1 bath 1.0 NaN [] NaN 60 730 60.0 60.0 730.0 730.0 60.0 730.0 NaN NaN 0 0 0 0 2025-09-27 0 0 0 0 0 0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN f 1 0 1 0 NaN

Missing Values pada kolom kunci:
price                    5533
number_of_reviews           0
review_scores_rating    10090
dtype: int64

2.1 Seleksi Kolom Relevan

Dari 79 kolom yang tersedia pada dataset InsideAirbnb Bangkok, saya menyaringnya menjadi beberapa kolom kunci yang dibagi ke dalam tiga kategori utama:

  1. Identitas & Lokasi (id, neighbourhood_cleansed, latitude, longitude)

  2. Profil Arsitektural (property_type, room_type, accommodates, bathrooms_text, amenities)

  3. Metrik Performa (price, number_of_reviews, reviews_per_month, availability_30)

2.2 Langkah-Langkah Pembersihan Data

Proses pembersihan dilakukan untuk memastikan angka yang dihasilkan nantinya tidak bias atau menyesatkan.

  1. Seleksi Fitur Relevan

    Langkah pertama adalah menyaring dataset dari 79 fitur mentah menjadi 15 kolom kunci yang mencakup aspek identitas, lokasi geospasial, atribut fisik arsitektural, dan metrik performa ulasan. Hal ini dilakukan untuk meningkatkan efisiensi komputasi dan menjaga fokus analisis pada variabel yang berpengaruh langsung terhadap pendapatan.

  2. Pembersihan Nilai Moneter

    Kolom price pada data mentah tersimpan sebagai teks dengan simbol mata uang (contoh: ฿1,500.00). Saya melakukan transformasi untuk menghapus karakter non-numerik dan mengubah tipenya menjadi float agar dapat diproses secara matematis dalam perhitungan pendapatan.

  3. Standardisasi Data Arsitektural (Ekstraksi Kamar Mandi)

    Kolom bathrooms_text seringkali berisi teks deskriptif seperti “1.5 baths” atau “1 shared bath”. Saya melakukan ekstraksi numerik dari teks tersebut menjadi kolom baru bathrooms_count untuk memungkinkan perhitungan korelasi statistik antara jumlah fasilitas sanitasi dan harga sewa.

  4. Penanganan Data Kosong (Imputasi)

    Untuk menjaga integritas baris data, nilai kosong (missing values) ditangani dengan asumsi minimal: kolom reviews_per_month diisi dengan 0 (asumsi listing baru/tidak aktif), sementara kolom bedrooms dan bathrooms_count diisi dengan 1 sebagai representasi standar unit terkecil.

  5. Filter Listing Aktif (The Sanity Filter)

    Untuk menjaga relevansi analisis dari sisi investor, saya membatasi data hanya pada listing yang memenuhi kriteria “properti hidup”:

    • Memiliki minimal 1 ulasan dalam 12 bulan terakhir (number_of_reviews_ltm > 0).

    • Harga per malam logis secara operasional, yakni lebih besar atau sama dengan ฿100.

  6. Penghapusan Outlier (Pencilan)

    Saya menghapus listing dengan harga ekstrem yang tidak merepresentasikan harga pasar normal di Bangkok (seperti unit ultra-mewah atau kesalahan input data). Hal ini dilakukan menggunakan metode Interquartile Range (IQR) dengan rentang harga akhir ฿122 - ฿3.752 untuk memastikan rata-rata pendapatan tidak terdistorsi oleh nilai pencilan.

🔍 Show/Hide code
# 1. Seleksi Kolom
cols_to_keep = [
    'id', 'neighbourhood_cleansed', 'latitude', 'longitude',
    'property_type', 'room_type', 'accommodates', 'bathrooms_text', 
    'bedrooms', 'beds', 'amenities', 'price', 
    'number_of_reviews', 'number_of_reviews_ltm', 'reviews_per_month'
]
df_clean = df[cols_to_keep].copy()

# 2. Pembersihan Kolom 'Price' 
# Menghapus karakter non-numerik (seperti $ atau ฿) kecuali titik desimal
df_clean['price'] = df_clean['price'].str.replace(r'[^\d.]', '', regex=True).astype(float)

# 3. Ekstraksi Jumlah Kamar Mandi
df_clean['bathrooms_count'] = df_clean['bathrooms_text'].str.extract('(\d+\.?\d*)').astype(float)

# 4. Penanganan Missing Values
df_clean['reviews_per_month'] = df_clean['reviews_per_month'].fillna(0)
df_clean['bedrooms'] = df_clean['bedrooms'].fillna(1)
df_clean['bathrooms_count'] = df_clean['bathrooms_count'].fillna(1)

# 5. Filter Properti Aktif
df_clean = df_clean[
    (df_clean['number_of_reviews_ltm'] > 0) & 
    (df_clean['price'] >= 100)
].reset_index(drop=True)

# 6. Menghapus Outlier Harga (IQR)
Q1 = df_clean['price'].quantile(0.25)
Q3 = df_clean['price'].quantile(0.75)
IQR = Q3 - Q1

lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

df_final = df_clean[
    (df_clean['price'] >= lower_bound) & 
    (df_clean['price'] <= upper_bound)
].copy()

print("Ringkasan Statistik Harga Setelah Pembersihan (IQR):")
# Menggunakan describe() khusus untuk kolom price
display(df_final['price'].describe().to_frame().T)

print(f"\nSisa data: {df_final.shape[0]:,}")
display(df_final.head())
Ringkasan Statistik Harga Setelah Pembersihan (IQR):
count mean std min 25% 50% 75% max
price 12574.0 1420.289327 742.272799 122.0 874.0 1251.0 1776.0 3752.0

Sisa data: 12,574
id neighbourhood_cleansed latitude longitude property_type room_type accommodates bathrooms_text bedrooms beds amenities price number_of_reviews number_of_reviews_ltm reviews_per_month bathrooms_count
0 55681 Bang Rak 13.719340 100.517600 Private room in serviced apartment Private room 2 1 private bath 1.0 1.0 ["Free parking on premises", "Bed linens", "Dr... 1368.0 39 5 0.22 1.0
1 145343 Lat Krabang 13.721868 100.771713 Private room in rental unit Private room 2 1.5 baths 1.0 1.0 ["Bed linens", "Central air conditioning", "Cl... 1080.0 75 4 0.57 1.5
2 1026451 Sathon 13.711920 100.515350 Entire condo Entire home/apt 2 1 bath 1.0 2.0 ["Bed linens", "Hot water", "Shared patio or b... 731.0 570 35 3.78 1.0
3 1035589 Thawi Watthana 13.792740 100.333770 Private room in rental unit Private room 2 1 private bath 1.0 1.0 ["Drying rack for clothing", "Hot water", "Eth... 1700.0 5 3 0.14 1.0
4 1041976 Parthum Wan 13.747570 100.528780 Entire home Entire home/apt 6 1 bath 1.0 3.0 ["Free parking on premises", "Outdoor furnitur... 3048.0 370 46 2.52 1.0

2.3 Rekayasa Fitur (Feature Engineering)

Untuk mengevaluasi Nilai Arsitektural, saya melakukan ekstraksi fitur fisik dari kolom amenities. Saya mengubah data teks menjadi variabel biner (Boolean) untuk fitur-fitur kunci seperti Kolam Renang, Ruang Kerja, Dapur, Gym, dan AC. Hal ini memungkinkan analisis statistik untuk melihat pengaruh fitur fisik tersebut terhadap harga sewa dan efisiensi pendapatan.

🔍 Show/Hide code

# --- TAHAP 1: Ekstraksi Fitur (Memastikan Kolom Tersedia) ---
# Kita buat fungsi kecil untuk mendeteksi kata kunci di kolom amenities
def check_amenity(amenity_list, keyword):
    if pd.isna(amenity_list):
        return 0
    return 1 if keyword.lower() in str(amenity_list).lower() else 0

# Ekstraksi kolom-kolom arsitektural
df_final['has_pool'] = df_final['amenities'].apply(lambda x: check_amenity(x, 'pool'))
df_final['has_workspace'] = df_final['amenities'].apply(lambda x: check_amenity(x, 'workspace'))
df_final['has_kitchen'] = df_final['amenities'].apply(lambda x: check_amenity(x, 'kitchen'))
df_final['has_gym'] = df_final['amenities'].apply(lambda x: check_amenity(x, 'gym'))
df_final['has_ac'] = df_final['amenities'].apply(lambda x: check_amenity(x, 'air conditioning'))

# --- TAHAP 2: Menampilkan Ringkasan ---
amenities_summary = {
    "Fitur Fisik": ["Kolam Renang", "Ruang Kerja", "Dapur", "Gym", "AC"],
    "Total Unit": [
        df_final['has_pool'].sum(),
        df_final['has_workspace'].sum(),
        df_final['has_kitchen'].sum(),
        df_final['has_gym'].sum(),
        df_final['has_ac'].sum()
    ],
    "Persentase (%)": [
        (df_final['has_pool'].mean() * 100).round(2),
        (df_final['has_workspace'].mean() * 100).round(2),
        (df_final['has_kitchen'].mean() * 100).round(2),
        (df_final['has_gym'].mean() * 100).round(2),
        (df_final['has_ac'].mean() * 100).round(2)
    ]
}

df_amenities = pd.DataFrame(amenities_summary).sort_values("Persentase (%)", ascending=False)
print("Ringkasan Ketersediaan Fitur Arsitektural di Bangkok:")
display(df_amenities)
Ringkasan Ketersediaan Fitur Arsitektural di Bangkok:
Fitur Fisik Total Unit Persentase (%)
4 AC 10839 86.20
2 Dapur 9775 77.74
1 Ruang Kerja 8756 69.64
0 Kolam Renang 7209 57.33
3 Gym 5526 43.95

Wawasan Awal (Initial Insights):

  1. Fasilitas Standar: Dengan tingkat ketersediaan mencapai 86.20%, AC dan Dapur (77.74%) telah menjadi fasilitas standar di pasar Bangkok. Artinya, memiliki fasilitas ini adalah kewajiban untuk bisa bersaing, namun keberadaannya mungkin tidak lagi memberikan premi harga yang signifikan.

  2. Fasilitas Diferensiasi: Sebaliknya, Gym (43.95%) dan Kolam Renang (57.33%) memiliki distribusi yang lebih kompetitif. Menariknya, meskipun kolam renang tersedia di lebih dari separuh properti, fitur ini tetap menjadi poin diferensiasi kuat bagi segmen kondominium menengah ke atas di pusat kota Bangkok.

Tahap akhir persiapan data adalah mengonversi metrik operasional menjadi metrik finansial. Saya mengimplementasikan Sanity Model untuk menghitung Estimasi Pendapatan Bulanan dan Pendapatan per Tamu. Metrik ini akan menjadi instrumen utama dalam mengevaluasi efisiensi investasi dan performa properti pada tahap analisis berikutnya.

🔍 Show/Hide code
# Menghitung Metrik Utama untuk Analisis Investasi
# Asumsi: Review Rate 50% (0.5) dan Average Length of Stay 3 malam
df_final['est_monthly_revenue'] = df_final['price'] * (df_final['reviews_per_month'] / 0.5) * 3

# Menghitung Efisiensi Ruang (Revenue per Guest)
df_final['rev_per_guest'] = df_final['est_monthly_revenue'] / df_final['accommodates']

# Cek hasil perhitungan
display(df_final[['neighbourhood_cleansed', 'est_monthly_revenue', 'rev_per_guest']].head())
neighbourhood_cleansed est_monthly_revenue rev_per_guest
0 Bang Rak 1805.76 902.88
1 Lat Krabang 3693.60 1846.80
2 Sathon 16579.08 8289.54
3 Thawi Watthana 1428.00 714.00
4 Parthum Wan 46085.76 7680.96

Bab 3: Analisis Data dan Eksplorasi (EDA)

Pada bab ini, saya melakukan eksplorasi data untuk menjawab strategi investasi “membeli properti yang tepat” melalui empat sudut pandang utama.

Sebelum melangkah lebih jauh, perlu ditekankan bahwa metrik Estimated Monthly Revenue yang digunakan dalam analisis ini merupakan sebuah Indeks Potensi Pendapatan, bukan angka transaksi riil (gross income) dari setiap listing. Metrik ini dihitung menggunakan ‘Sanity Model’ berbasis jumlah review sebagai proksi aktivitas pemesanan. Meskipun memberikan gambaran performa pasar yang andal secara statistik, angka ini berfungsi untuk membandingkan performa antar-wilayah atau tipe aset, bukan sebagai laporan keuangan mutlak.

3.1 Strategi Lokasi: Pemetaan Titik Panas (Hotspot)

Langkah pertama dalam memilih properti adalah menentukan lokasi dengan permintaan dan nilai sewa tertinggi. Saya menganalisis median pendapatan bulanan di berbagai distrik di Bangkok untuk menghindari bias dari properti mewah yang terisolasi.

🔍 Show/Hide code

# --- Bab 3.1: Analisis Strategi Lokasi ---

# 1. Agregasi data per distrik
district_analysis = df_final.groupby('neighbourhood_cleansed').agg({
    'id': 'count',
    'est_monthly_revenue': 'median'
}).rename(columns={'id': 'listing_count', 'est_monthly_revenue': 'median_revenue'})

# 2. Filter distrik yang representatif (minimal 50 listing)
top_10_districts = district_analysis[district_analysis['listing_count'] > 50].sort_values('median_revenue', ascending=False).head(10)

# 3. Visualisasi Bar Chart
plt.figure(figsize=(12, 5))
sns.barplot(
 x=top_10_districts['median_revenue'], 
 y=top_10_districts.index, 
 hue=top_10_districts.index, 
 palette='viridis', 
 legend=False
)
plt.title('Top 10 Distrik di Bangkok berdasarkan Median Pendapatan Bulanan', fontsize=14)
plt.xlabel('Median Pendapatan Bulanan (Estimasi)')
plt.show()

# 4. Visualisasi Heatmap (Memastikan folium sudah siap)
map_bangkok = folium.Map(location=[13.7563, 100.5018], zoom_start=11, tiles='CartoDB positron')

# Menyiapkan data untuk Heatmap
heat_data = df_final[['latitude', 'longitude', 'est_monthly_revenue']].dropna().values.tolist()

# Menambahkan HeatMap ke objek peta
HeatMap(heat_data, radius=12, blur=8, max_zoom=1).add_to(map_bangkok)

# Menampilkan peta
map_bangkok

Make this Notebook Trusted to load map: File -> Trust Notebook

Strategi investasi dimulai dengan mengidentifikasi area dengan performa finansial terbaik. Melalui perbandingan antar distrik, kita dapat melihat bahwa Samphanthawong mendominasi pasar dengan median pendapatan tertinggi. Namun, angka administratif saja tidak cukup.

Dengan memetakan koordinat properti ke dalam sebuah Heatmap, terlihat pola distribusi yang lebih spesifik. Pendapatan tinggi tidak tersebar merata di seluruh distrik, melainkan terkonsentrasi secara linier mengikuti jalur transportasi utama (BTS/MRT) dan kawasan pusat bisnis (CBD).

Bagi investor, temuan ini memberikan panduan presisi: properti yang berada di distrik populer namun jauh dari akses transportasi utama kemungkinan besar tidak akan mencapai potensi pendapatan maksimal yang ditunjukkan oleh median distrik tersebut.

3.2 Performa Properti: Menentukan Tipe Aset yang Tepat

Setelah menentukan lokasi, langkah krusial berikutnya adalah memilih tipe aset. Analisis ini menggunakan Box Plot untuk membandingkan median pendapatan sekaligus melihat risiko melalui sebaran data (outlier).

🔍 Show/Hide code
# 3.2 Performa Properti: Potensi Pendapatan & Stabilitas Berdasarkan Tipe

# Menghitung median dan standar deviasi untuk melihat potensi & stabilitas
property_perf = df_final.groupby('property_type').agg({
    'id': 'count',
    'est_monthly_revenue': ['median', 'std']
})

# Meratakan nama kolom
property_perf.columns = ['listing_count', 'median_revenue', 'revenue_std']

# Filter tipe properti yang memiliki sampel cukup (minimal 30 listing) agar data tidak bias
property_perf = property_perf[property_perf['listing_count'] >= 30].sort_values('median_revenue', ascending=False)

# Visualisasi Box Plot untuk melihat sebaran dan stabilitas
plt.figure(figsize=(14, 8))
sns.boxplot(
    data=df_final[df_final['property_type'].isin(property_perf.index)],
    x='est_monthly_revenue',
    y='property_type',
    hue='property_type',
    palette='magma',
    legend=False
)

plt.title('Sebaran Pendapatan Berdasarkan Tipe Properti (Stabilitas vs Potensi)', fontsize=14)
plt.xlabel('Estimasi Pendapatan Bulanan', fontsize=12)
plt.ylabel('Tipe Properti', fontsize=12)
plt.grid(axis='x', linestyle='--', alpha=0.6)
plt.show()

display(property_perf)

listing_count median_revenue revenue_std
property_type
Entire townhouse 236 21481.02 22134.020717
Entire home 461 15101.16 19753.416579
Entire loft 97 11610.00 42797.566496
Room in aparthotel 47 10763.28 29110.708238
Entire rental unit 5733 5712.00 22642.177553
Entire serviced apartment 170 5321.52 35249.313550
Entire condo 2592 5044.56 20518.660241
Entire guesthouse 40 4947.30 9003.503091
Private room in townhouse 288 4946.97 12885.638613
Private room in home 427 4722.00 9968.270226
Private room in bed and breakfast 82 4221.60 7837.783493
Room in boutique hotel 131 3803.04 8772.471904
Private room in guesthouse 83 3488.40 5850.483161
Private room in rental unit 1065 3207.96 6501.437205
Private room in serviced apartment 111 3029.40 6834.995359
Room in hotel 346 2990.82 12444.389365
Private room in condo 231 2935.62 8300.392999
Room in hostel 33 2791.26 4916.867283
Private room in hostel 85 2101.20 15088.775882
Shared room in hostel 47 626.40 2411.713817

Analisis tipe properti mengungkap dinamika antara potensi imbal hasil dan stabilitas pasar:

  • Potensi Tertinggi (High Yield): Entire Townhouse dan Entire Home memimpin dengan median pendapatan tertinggi. Hal ini dipicu oleh kelangkaan unit berkapasitas besar di pusat kota, meski memiliki variansi pendapatan yang lebar (risiko tinggi).

  • Dominasi Pasar (Market Leader): Entire Condominium dan Rental Unit berfungsi sebagai tulang punggung pasar dengan volume permintaan paling stabil dan risiko investasi yang lebih terukur.

  • Performa Terendah: Private Room mencatatkan pendapatan paling rendah secara signifikan, mengonfirmasi dominasi preferensi tamu pada privasi penuh (Entire Unit) di pasar Bangkok.

3.3 Nilai Arsitektural: Pergeseran dari Fasilitas Standar ke Fungsionalitas

Sebagai investor, keputusan untuk menambah fasilitas fisik harus didasarkan pada potensi return. Analisis ini membandingkan median pendapatan properti berdasarkan keberadaan fitur arsitektural tertentu.

🔍 Show/Hide code
# 3.3 Nilai Arsitektural: Analisis Dampak Fitur Fisik

features = ['has_pool', 'has_workspace', 'has_kitchen', 'has_gym', 'has_ac']
feature_names = ['Kolam Renang', 'Ruang Kerja', 'Dapur', 'Gym', 'AC']

impact_data = []

for col, name in zip(features, feature_names):
    # Menghitung median pendapatan untuk masing-masing kondisi (Ada vs Tidak Ada)
    stats = df_final.groupby(col)['est_monthly_revenue'].median()
    
    # Jika fitur ada (1) dan tidak ada (0)
    rev_with = stats.get(1, 0)
    rev_without = stats.get(0, 0)
    
    # Menghitung % Kenaikan (Premium)
    premium = ((rev_with - rev_without) / rev_without * 100) if rev_without > 0 else 0
    
    impact_data.append({
        'Fitur': name,
        'Median Pendapatan (Ada)': rev_with,
        'Median Pendapatan (Tidak Ada)': rev_without,
        'Price Premium (%)': premium
    })

df_impact = pd.DataFrame(impact_data).sort_values('Price Premium (%)', ascending=False)

# Visualisasi
plt.figure(figsize=(12, 6))
sns.barplot(
    data=df_impact, 
    x='Price Premium (%)', 
    y='Fitur', 
    hue='Fitur',
    palette='rocket',
    legend=False
)

plt.title('Fitur Arsitektural dengan Dampak Pendapatan Tertinggi', fontsize=14)
plt.xlabel('Kenaikan Pendapatan Estimasi (%)', fontsize=12)
plt.axvline(0, color='black', linestyle='-', alpha=0.3)
plt.grid(axis='x', linestyle='--', alpha=0.7)
plt.show()

display(df_impact)

Fitur Median Pendapatan (Ada) Median Pendapatan (Tidak Ada) Price Premium (%)
2 Dapur 5579.04 4066.92 37.180962
1 Ruang Kerja 5520.00 4379.40 26.044664
3 Gym 5206.05 5196.21 0.189369
4 AC 5133.60 5616.00 -8.589744
0 Kolam Renang 4967.82 5590.62 -11.140088

Analisis terhadap fitur fisik memberikan temuan yang kontraintuitif namun krusial bagi investor. Dapur (37,18%) dan Ruang Kerja (26,04%) menjadi fitur peningkat pendapatan (Price Premium) yang paling dominan. Hal ini menunjukkan bahwa penyewa di Bangkok saat ini sangat menghargai kemandirian dan fasilitas pendukung produktivitas.

Di sisi lain, fitur seperti AC (-8,58%) dan Kolam Renang (-11,14%) menunjukkan angka premium negatif. Hal ini tidak berarti fitur tersebut menurunkan nilai properti, melainkan mengindikasikan bahwa kedua fitur ini telah menjadi komoditas standar yang tersedia secara masif di pasar. Kelompok properti tanpa kedua fitur ini kemungkinan besar didominasi oleh segmen ‘niche’ atau properti unik yang memiliki basis harga tinggi, sehingga keberadaan fasilitas standar seperti AC tidak lagi menjadi faktor pembeda harga di pasar yang sudah jenuh.

3.4 Optimalisasi Ruang dan Efisiensi Pendapatan

Analisis terakhir berfokus pada efisiensi ruang dengan mengukur Revenue per Guest. Metrik ini sangat krusial bagi investor untuk menentukan apakah lebih menguntungkan memiliki unit besar dengan kapasitas tamu banyak, atau unit kecil yang lebih padat dan efisien.

🔍 Show/Hide code
# 3.4 Optimalisasi Ruang: Hubungan Kapasitas Tamu dan Efisiensi Pendapatan

plt.figure(figsize=(12, 6))
sns.lineplot(data=df_final, x='accommodates', y='rev_per_guest', estimator='median', marker='o', color='teal')

plt.title('Efisiensi Pendapatan per Tamu berdasarkan Kapasitas Properti', fontsize=14)
plt.xlabel('Kapasitas Tamu (Accommodates)', fontsize=12)
plt.ylabel('Median Pendapatan per Tamu (Rev per Guest)', fontsize=12)
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()

# Melihat angka pastinya
efficiency_stats = df_final.groupby('accommodates')['rev_per_guest'].median().sort_values(ascending=False)
display(efficiency_stats.head(5))

accommodates
9     3180.786667
5     3060.540000
13    2870.972308
7     2575.285714
6     2506.990000
Name: rev_per_guest, dtype: float64

Analisis efisiensi pendapatan per tamu (Revenue per Guest) mengungkap urutan kapasitas properti yang memberikan imbal hasil individu paling optimal. Berdasarkan data median, berikut adalah temuan objektifnya:

  • Puncak Efisiensi (Peringkat 1): Properti dengan kapasitas 9 tamu mencatatkan efisiensi tertinggi dengan nilai 3.180,78. Ini menunjukkan bahwa pada segmen grup besar tertentu, terdapat kemampuan monetisasi per individu yang sangat maksimal.

  • Efisiensi Menengah-Tinggi (Peringkat 2 & 3): Kapasitas 5 tamu (3.060,54) dan 13 tamu (2.870,97) menempati posisi berikutnya. Kehadiran kapasitas 5 tamu di peringkat atas mengindikasikan adanya permintaan kuat pada unit keluarga menengah, sementara angka tinggi pada kapasitas 13 tamu menunjukkan potensi pada unit ultra-large.

  • Titik Penurunan (Diminishing Returns): Data menunjukkan pola yang tidak linear. Meskipun kapasitas besar seperti 9 dan 13 sangat efisien, kapasitas 14 hingga 16 tamu justru mengalami penurunan drastis dalam efisiensi pendapatan per kepala. Hal ini mengindikasikan bahwa menambah kapasitas tanpa batas tidak menjamin kenaikan profitabilitas proporsional.

3.5 Dimensi Privasi: Analisis Kapasitas vs Jumlah Kamar Mandi

Analisis sebelumnya menunjukkan bahwa kapasitas besar tidak selalu linear dengan keuntungan. Salah satu faktor pembatasnya adalah privasi. Di sini, kita menguji bagaimana jumlah kamar mandi (sebagai indikator privasi fisik) memengaruhi nilai jual properti.

🔍 Show/Hide code
# --- Bagian 1: Analisis Dampak Absolut ---
# Menghitung median pendapatan berdasarkan jumlah kamar mandi
bath_impact = df_final.groupby('bathrooms_count')['est_monthly_revenue'].median().reset_index()
bath_impact = bath_impact[bath_impact['bathrooms_count'] <= 4]

# --- Bagian 2: Analisis Rasio (Kualitas Privasi) ---
# Menghitung rasio tamu per kamar mandi
df_final['guests_per_bath'] = df_final['accommodates'] / df_final['bathrooms_count']

# --- Visualisasi ---
plt.figure(figsize=(12, 5))

# Plot 1: Dampak Jumlah Kamar Mandi (Sudah diperbaiki agar tidak muncul warning)
plt.subplot(1, 2, 1)
sns.barplot(
    data=bath_impact, 
    x='bathrooms_count', 
    y='est_monthly_revenue', 
    hue='bathrooms_count', # Menetapkan hue agar sesuai aturan baru Seaborn
    palette='magma', 
    legend=False           # Menghilangkan legenda karena sumbu X sudah cukup jelas
)
plt.title('Median Pendapatan vs Jumlah Kamar Mandi')
plt.xlabel('Jumlah Kamar Mandi')
plt.ylabel('Median Pendapatan (฿)')

# Plot 2: Analisis Rasio (Efisiensi Privasi)
plt.subplot(1, 2, 2)
# Menampilkan tren hubungan antara rasio tamu per kamar mandi dengan pendapatan
sns.regplot(
    data=df_final[df_final['guests_per_bath'] <= 5], 
    x='guests_per_bath', 
    y='est_monthly_revenue', 
    scatter_kws={'alpha':0.1}, 
    line_kws={'color':'red'}
)
plt.title('Efisiensi Pendapatan vs Rasio Tamu/KM')
plt.xlabel('Rasio Tamu per Kamar Mandi')
plt.ylabel('Pendapatan Estimasi (฿)')

plt.tight_layout()
plt.show()

# Menampilkan angka korelasi untuk validasi teknis
correlation = df_final['bathrooms_count'].corr(df_final['est_monthly_revenue'])
print(f"Korelasi Kamar Mandi terhadap Pendapatan: {correlation:.2f}")

Korelasi Kamar Mandi terhadap Pendapatan: 0.08

Meskipun penambahan jumlah kamar mandi secara absolut meningkatkan pendapatan (Plot Kiri), Plot Kanan (Rasio Tamu/KM) menunjukkan tren penurunan pendapatan seiring bertambahnya beban tamu per satu kamar mandi. Ini membuktikan bahwa kenyamanan fungsional adalah kunci; properti dengan rasio tamu-ke-kamar-mandi yang rendah (lebih privat) mampu mempertahankan harga sewa yang lebih tinggi di pasar Bangkok.

Bab 4: Kesimpulan dan Rekomendasi Strategis

4.1 Kesimpulan Strategis

Berdasarkan serangkaian eksplorasi data yang dilakukan pada Bab 3, penelitian ini berhasil merumuskan empat temuan kunci yang menjadi fondasi strategi investasi Airbnb di Bangkok:

  1. Aksesibilitas sebagai Penentu Nilai: Lokasi properti tidak lagi hanya dipandang berdasarkan batas administrasi distrik. Analisis spasial membuktikan bahwa titik panas (hotspot) pendapatan terkonsentrasi secara linier mengikuti jalur transportasi utama (BTS/MRT). Bagi investor, kedekatan dengan stasiun adalah variabel yang lebih krusial daripada nama besar sebuah distrik.

  2. Keunggulan Unit Utuh: Terdapat perbedaan profitabilitas yang kontras antara jenis aset. Strategi menyewakan unit utuh (Entire Condo/Townhouse) memberikan margin pendapatan yang jauh lebih superior dan stabil dibandingkan model kamar privat (shared-room), yang cenderung memiliki tingkat efisiensi rendah di pasar ini.

  3. Terjadi pergeseran nilai tambah dari fasilitas gedung ke fungsionalitas unit. Fasilitas standar seperti AC dan Kolam Renang telah mengalami saturasi pasar dan tidak lagi memberikan jaminan premium pendapatan. Sebaliknya, investasi pada interior unit berupa Dapur dan Ruang Kerja (Workspace) terbukti lebih efektif dalam meningkatkan profitabilitas investasi.

  4. Analisis ini juga membuktikan bahwa keseimbangan arsitektural antara kapasitas tidur dan fasilitas sanitasi adalah penentu harga yang kritis. Privasi fisik, yang direpresentasikan oleh jumlah kamar mandi, bukan sekadar pelengkap tetapi merupakan Price Driver utama. Properti yang mampu menjaga rasio tamu-per-kamar-mandi yang rendah terbukti memiliki daya tawar harga yang lebih tinggi dibandingkan unit yang hanya mengejar kapasitas maksimal tanpa memperhatikan kenyamanan fungsional.

  5. Skalabilitas Ekonomi yang Efisien: Efisiensi pendapatan per tamu memuncak pada unit berkapasitas 9 orang, diikuti oleh unit kapasitas 5 orang. Strategi penentuan kapasitas harus difokuskan pada angka-angka kunci ini untuk menghindari penurunan margin per kepala pada unit yang terlalu besar (>13 tamu).

4.2 Rekomendasi (Action Plan)

Berdasarkan temuan objektif bahwa pasar telah mengalami saturasi pada fasilitas standar, berikut adalah strategi investasi yang direkomendasikan:

  1. Prioritas Investasi Interior (High Impact)

    Fokus pada Fasilitas Mandiri: Alokasikan anggaran utama untuk penyediaan Dapur (Kitchen) yang lengkap. Data menunjukkan fitur ini memberikan kenaikan pendapatan estimasi tertinggi (37,18%).

    Penyediaan Ruang Kerja: Mengingat Price Premium sebesar 26,04%, investor disarankan merancang area kerja yang fungsional (meja, kursi ergonomis, dan koneksi internet stabil) untuk menyasar segmen pelancong bisnis atau digital nomad.

  2. Efisiensi Biaya dan Pengelolaan Aset (Low Impact)

    Evaluasi Fasilitas Mewah: Mengingat Kolam Renang (-11,14%) dan Gym (0,18%) tidak memberikan dampak signifikan terhadap kenaikan harga sewa, investor sebaiknya menghindari properti dengan biaya service charge tinggi hanya demi fasilitas gedung tersebut.

    Manajemen Ekspektasi AC: Tidak perlu melakukan investasi berlebih pada sistem AC yang mahal atau mewah. Data menunjukkan AC hanya berfungsi sebagai fasilitas dasar (komoditas). Selama unit memiliki pendingin udara yang berfungsi normal, dana selebihnya lebih baik dialihkan untuk peningkatan estetika interior atau peralatan dapur.

  3. Optimalisasi Rasio Privasi (Golden Ratio)

    Investor dan pengelola properti disarankan untuk tidak hanya fokus pada penambahan jumlah tempat tidur (beds), tetapi juga memastikan ketersediaan kamar mandi yang proporsional. Berdasarkan data, rasio ideal untuk mempertahankan pendapatan premium adalah maksimal 3 tamu per 1 kamar mandi. Penambahan kamar mandi kedua pada unit yang menargetkan pasar grup (kapasitas 4 orang ke atas) memberikan imbal hasil (yield) yang lebih pasti dibandingkan investasi pada amenitas dekoratif lainnya.

  4. Strategi Kapasitas dan Skalabilitas

    Optimalisasi Unit Menengah: Investor dengan aset luas disarankan mengoptimalkan tata ruang untuk kapasitas 9 tamu guna meraih efisiensi tertinggi. Bagi aset yang lebih terbatas, kapasitas 5 tamu merupakan target paling logis untuk menjaga performa pendapatan per tamu tetap kompetitif.

  5. Pemilihan Lokasi Strategis

    Tetap fokus pada radius jalan kaki dari stasiun BTS/MRT, karena aksesibilitas tetap menjadi pilar utama pendapatan di Bangkok meskipun fitur arsitektural di dalam unit bervariasi.

4.3 Batasan Penelitian (Limitations)

Meskipun analisis ini memberikan wawasan strategis yang kuat, terdapat beberapa batasan yang perlu dipertimbangkan dalam menginterpretasikan hasil penelitian ini:

  1. Akurasi Estimasi Pendapatan: Perhitungan Estimated Monthly Revenue didasarkan pada asumsi Review Rate sebesar 50%. Dalam realitasnya, tingkat konversi tamu yang memberikan ulasan dapat bervariasi tergantung pada kualitas pelayanan masing-masing host, sehingga angka pendapatan nyata mungkin berbeda dari estimasi.

  2. Faktor Eksternal & Musiman: Data ini bersifat snapshot (satu waktu tertentu) dan tidak sepenuhnya menangkap fluktuasi musiman (seasonality). Sektor pariwisata Bangkok sangat dipengaruhi oleh hari libur nasional, festival (seperti Songkran), dan kondisi ekonomi global yang dapat memengaruhi tingkat okupansi secara dinamis.

  3. Kualitas Data Fasilitas (Amenities): Analisis fasilitas bergantung pada kejujuran dan kelengkapan host dalam mencantumkan fitur properti mereka di platform. Fasilitas yang tidak dicantumkan oleh host (meskipun tersedia di unit) tidak dapat terdeteksi dalam analisis ini.

  4. Ketiadaan Data Biaya Operasional: Analisis ini berfokus pada pendapatan kotor (gross revenue). Untuk mendapatkan gambaran keuntungan bersih (net profit), investor perlu mempertimbangkan biaya tambahan seperti biaya manajemen, tagihan listrik, biaya pembersihan, dan pajak properti yang tidak tersedia dalam dataset ini.