基于聚类与相关性分析对马来西亚房价数据进行分析

碎碎念:由于最近太忙了,更新的比较慢,提前祝大家新春快乐,万事如意!本数据集的下载地址,读者可以自行下载。

1.项目背景

本项目旨在对马来西亚房地产市场进行初步的数据分析,探索各州的房产市场特征。通过对房产中位数价格、每平方英尺价格和交易数量等指标的可视化,结合聚类分析和点二列相关性分析,试图揭示不同房产类型与市场趋势之间的关系。该分析可以帮助更好地理解市场的基本情况,并为后续研究或决策提供数据支持。

2.数据说明

字段说明
Township房产所在的市镇名称
Area房产所在的地区名称
State房产所在的州
Tenure土地所有权性质(如 Freehold 或 Leasehold)
Type房产类型(如 Terrace House, Cluster House 等)
Median_Price房产的中位数价格(单位:马币)
Median_PSF每平方英尺的中位数价格(单位:马币)
Transactions该地区的房产交易数量

3.Python库导入及数据读取

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.decomposition import PCA
from scipy.stats import pointbiserialr
data = pd.read_csv("/home/mw/input/01209371/malaysia_house_price_data_2025.csv")

4.数据预览及数据清洗

data.head()
TownshipAreaStateTenureTypeMedian_PriceMedian_PSFTransactions
0SCIENTEX SUNGAI DUATasek GelugorPenangFreeholdTerrace House331800.0304.0593
1BANDAR PUTRAKulaiJohorFreeholdCluster House, Terrace House590900.0322.0519
2TAMAN LAGENDA TROPIKA TAPAHChenderiangPerakFreeholdTerrace House229954.0130.0414
3SCIENTEX JASIN MUTIARABembanMelakaFreeholdTerrace House255600.0218.0391
4TAMAN LAGENDA AMANTapahPerakLeaseholdTerrace House219300.0168.0363
print('查看数据信息:')
data.info()
查看数据信息:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2000 entries, 0 to 1999
Data columns (total 8 columns):#   Column        Non-Null Count  Dtype  
---  ------        --------------  -----  0   Township      2000 non-null   object 1   Area          2000 non-null   object 2   State         2000 non-null   object 3   Tenure        2000 non-null   object 4   Type          2000 non-null   object 5   Median_Price  2000 non-null   float646   Median_PSF    2000 non-null   float647   Transactions  2000 non-null   int64  
dtypes: float64(2), int64(1), object(5)
memory usage: 125.1+ KB
characteristic = data.select_dtypes(include=['object']).columns
print('数据中分类变量的唯一值情况:')
for i in characteristic:print(f'{i}:')print(f'共有:{len(data[i].unique())}条唯一值')print(data[i].unique())print('-'*50)
数据中分类变量的唯一值情况:
Township:
共有:1946条唯一值
['SCIENTEX SUNGAI DUA' 'BANDAR PUTRA' 'TAMAN LAGENDA TROPIKA TAPAH' ...'TAMAN PUNCAK JELAPANG MAJU' 'TAMAN TIONG UNG SIEW''TAMAN DESA RISHAH INDAH']
--------------------------------------------------
Area:
共有:303条唯一值
['Tasek Gelugor' 'Kulai' 'Chenderiang' 'Bemban' 'Tapah' 'Tebrau''Pasir Gudang' 'Teluk Intan' 'Jasin' 'Kapar' 'Iskandar Puteri (Nusajaya)''Nilai' 'Skudai' 'Johor Bahru' 'Batu Pahat' 'Kluang' 'Ulu Tiram''Permas Jaya' 'Serendah' 'Chemor' 'Pagoh' 'Lenggeng' 'Perling' 'Penaga''Klang' 'Sungei Petai' 'Shah Alam' 'Padang Serai' 'Sitiawan' 'Ijok''Bukit Katil' 'Masai' 'Tampoi' 'Setia Alam' 'Kota Tinggi' 'Banting''Cheras' 'Tanjong Duabelas' 'Jalan Klang Lama (Old Klang Road)''Bukit Bintang' 'Rawang' 'Bandar Utama' 'Seri Iskandar' 'Ipoh' 'Senai''Tanjong Minyak' 'Labu' 'Jimah' 'Sungai Bakap' 'Batu Caves''Damansara Perdana' 'Kuantan' 'Kampar' 'Seremban 2' 'Pasir Panjang''Kijal' 'Segamat' 'Seri Kembangan' 'Rantau' 'Gurun' 'Dengkil''Subang Jaya' 'Sungai Petani' 'Puchong' 'Kajang' 'Lunas' 'Gopeng''Kepala Batas' 'Bandar Puncak Alam' 'Bangi' 'Bandar Sri Damansara''Kuala Pilah' 'Linggi' 'Bandar Sunway' 'Telok Panglima Garang' 'Beranang''Taman Tun Dr Ismail' 'Kamunting' 'Bandar Sungai Long' 'Sri Petaling''Pengerang' 'Jalan Kuching' 'Batu Arang' 'Kota Samarahan' 'Miri''Semenyih' 'Petaling Jaya' 'Simpang Ampat' 'Krubong' 'Taiping''Kota Damansara' 'Nibong Tebal' 'Bukit Mertajam' 'Wangsa Maju' 'Papar''Telok Kemang' 'Hulu Terengganu' 'Lumut' 'Merlimau' 'Ulu Klang''Damansara Heights' 'Seremban' 'Sabak Bernam' 'Parit Buntar''Seberang Jaya' 'Kepong' 'Bandar Kinrara' 'Gerisek' 'Tampin' 'Ayer Itam''Bahau' 'KLCC' 'Lukut' 'Batang Kali' 'Sungai Jawi' 'Selayang''Simpang Pulai' 'Batu Gajah' 'Sepang' 'Kuching' 'Kulim' 'Kerteh' 'Ampang''Ayer Molek' 'Bidor' 'Bayan Baru' 'Senggarang' 'Ampangan' 'Gelang Patah''Sungai Siput' 'Kota Kinabalu' 'Penampang' 'Ara Damansara' 'Segambut''Tawau' 'Bukit Rambai' 'Rasa' 'Simpang Rengam' 'Duyong' 'Mont Kiara''Durian Tunggal' 'Sibu' 'Alor Setar' 'Bachang' 'Balai Panjang''Hulu Lepar' 'Saujana Utama' 'Bukit Jalil' 'Georgetown' 'Juasseh''Sungai Rambai' 'Arau' 'Jelutong' 'Perai' 'Sungai Karang' 'Ulu Bernam''Paya Rumput' 'Sandakan' 'Tronoh' 'Kuala Terengganu' 'Setapak' 'Rasah''Kuala Selangor' 'Tanjong Tualang' 'Raub' 'Cyberjaya' 'Butterworth''Port Klang' 'Menglembu' 'Cheng' 'Sungai Buloh' 'Kuala Ibai''Bandar Sri Sendayan' 'Bayan Lepas' 'Bandar Tasik Selatan' 'Labuan''Senawang' 'Bukit Baru' 'Tanjong Tokong''Kampung Kerinchi (Bangsar South)' 'Kuala Kubu Baru' 'Bandar Enstek''Batu Berendam' 'Alor Gajah' 'Pandamaran' 'Sungai Ara' 'Dutamas''Sikamat' 'Tambun' 'Glenmarie' 'Muar' 'Mentakab' 'Pusing' 'Jenjarom''Pontian' 'Sungai Dua' 'Kuala Lipis' 'Batu Kawan' 'Lahat' 'Besut''Bukit Kepayang' 'Kuala Kedah' 'Port Dickson' 'KL Sentral' 'Sentul''Kuala Kangsar' 'Tangkak' 'Klebang' 'Kuchai Lama' 'Seri Manjong''Melaka City' 'Gelugor' 'Mantin' 'Bintulu' 'Hutan Melintang' 'Bangsar''Bagan Serai' 'Masjid Tanah' 'Balakong' 'Tuaran' 'Batu Ferringhi''Rompin' 'Tropicana' 'Bandar Menjalara' 'Bakri' 'Putrajaya' 'Taman Desa''Bukit Jambul' 'Desa Petaling' 'Kemaman' 'Kuala Ketil' 'Merbok''Sungai Lalang' 'Sungai Besi' 'Relau' 'Tanjung Bungah' 'Damansara Damai''Bedong' 'Jitra' 'Bentong' 'Teloi Kiri' 'Jementah' 'Paloh' 'Setiawangsa''Kubang Semang' 'Pantai' 'Genting Highlands' 'Jalan Ipoh' 'Bukit Minyak''Padang Enggang' 'Teras' 'Salak Selatan' 'Lahad Datu' 'Dungun''Sungai Udang' 'Triang' 'Desa ParkCity' 'KL City' 'Hulu Langat' 'Gurney''Kelana Jaya' 'Pengkalan Hulu' 'Kuah' 'Kota Marudu' 'Padang Rengas''Yong Peng' 'Tanjong Kling' 'Permatang Pauh' 'Jinjang' 'Labis' 'Umbai''Cherang Ruku' 'Saujana' 'Pekan' 'Simpang Pertang' 'Limbang' 'Paroi''Hulu Selangor' 'Brickfields' 'Balik Pulau' 'Bertam' 'Batu Kurau''Chenor' 'Ulu Langat' 'Simpang' 'Mersing' 'Juru' 'Pokok Sena' 'Rembau''Mutiara Damansara' 'Sungei Baru Tengah' 'Ampang Hilir' 'City Centre''Sri Hartamas' 'Kota Sarang Semut' 'Teluk Kumbar' 'Bandar Baharu' 'Gemas''Sungai Besar' 'Gerik' 'Sri Aman' 'Kuala Sungai Baru' 'Machang']
--------------------------------------------------
State:
共有:16条唯一值
['Penang' 'Johor' 'Perak' 'Melaka' 'Selangor' 'Negeri Sembilan' 'Kedah''Kuala Lumpur' 'Pahang' 'Terengganu' 'Sarawak' 'Sabah' 'Perlis' 'Labuan''Putrajaya' 'Kelantan']
--------------------------------------------------
Tenure:
共有:4条唯一值
['Freehold' 'Leasehold' 'Freehold, Leasehold' 'Leasehold, Freehold']
--------------------------------------------------
Type:
共有:46条唯一值
['Terrace House' 'Cluster House, Terrace House' 'Terrace House, Semi D''Terrace House, Cluster House' 'Cluster House' 'Bungalow, Terrace House''Service Residence' 'Semi D, Terrace House' 'Flat''Cluster House, Semi D' 'Terrace House, Semi D, Town House''Semi D, Cluster House' 'Apartment' 'Semi D, Terrace House, Bungalow''Semi D' 'Terrace House, Town House' 'Semi D, Town House, Terrace House''Condominium' 'Semi D, Bungalow' 'Bungalow, Semi D' 'Bungalow''Town House, Terrace House, Semi D' 'Terrace House, Semi D, Bungalow''Bungalow, Terrace House, Semi D' 'Terrace House, Bungalow''Cluster House, Terrace House, Semi D''Semi D, Terrace House, Cluster House' 'Semi D, Cluster House, Bungalow''Bungalow, Town House' 'Town House, Terrace House' 'Town House, Semi D''Terrace House, Bungalow, Semi D' 'Town House' 'Flat, Condominium''Town House, Bungalow, Terrace House' 'Apartment, Flat''Semi D, Bungalow, Terrace House' 'Town House, Semi D, Terrace House''Town House, Bungalow' 'Condominium, Service Residence''Cluster House, Bungalow' 'Flat, Apartment''Bungalow, Semi D, Terrace House' 'Semi D, Terrace House, Town House''Cluster House, Town House, Terrace House' 'Semi D, Town House']
--------------------------------------------------

由于Township、Area的唯一值特别多,对后续的分析意义不大,考虑删除,只保留State作为地理信息,而Type里存在大量组合的数据,比如’Semi D, Terrace House’这种,这里考虑拆分看看,究竟真正涉及的Type有多少种类型。

# 提取所有的房产类型,并将其拆分为单独的词
all_types = []# 按照 ", " 来拆分每个类型中的词汇
for property_type in data['Type']:types = property_type.split(", ")  # 根据逗号加空格拆分all_types.extend(types)# 统计每个词的出现频次
unique_types = set(all_types)  # 获取唯一类型# 显示所有唯一的房产类型
unique_types
{'Apartment','Bungalow','Cluster House','Condominium','Flat','Semi D','Service Residence','Terrace House','Town House'}

可以看到,真正的Type并不多,这里考虑把这些转为0-1二值变量,表示该样本数据是否有某个类型,这样也不会导致维度爆炸,同样的针对Tenure特征也是一样的处理。

# 创建每个房产类型的 0-1 二值变量
for property_type in unique_types:data[property_type] = data['Type'].apply(lambda x: 1 if property_type in x else 0)
# 提取所有的产权类型,并将其拆分为单独的词
all_tenure = []# 按照 ", " 来拆分每个类型中的词汇
for property_tenure in data['Tenure']:tenure = property_tenure.split(", ")  # 根据逗号加空格拆分all_tenure.extend(tenure)# 统计每个词的出现频次
unique_tenure = set(all_tenure)  # 获取唯一类型# 显示所有唯一的产权类型
unique_tenure
{'Freehold', 'Leasehold'}
# 创建每个房产类型的 0-1 二值变量
for property_tenure in unique_tenure:data[property_tenure] = data['Tenure'].apply(lambda x: 1 if property_tenure in x else 0)
# 删除 'Township', 'Area', 'Type' 列
data.drop(columns=['Township', 'Area', 'Type','Tenure'], inplace=True)data.head()
StateMedian_PriceMedian_PSFTransactionsTerrace HouseBungalowService ResidenceTown HouseCluster HouseFlatSemi DCondominiumApartmentLeaseholdFreehold
0Penang331800.0304.059310000000001
1Johor590900.0322.051910001000001
2Perak229954.0130.041410000000001
3Melaka255600.0218.039110000000001
4Perak219300.0168.036310000000010

5.描述性分析

data.describe(include='all')
StateMedian_PriceMedian_PSFTransactionsTerrace HouseBungalowService ResidenceTown HouseCluster HouseFlatSemi DCondominiumApartmentLeaseholdFreehold
count20002.000000e+032000.0000002000.0000002000.0000002000.0000002000.0000002000.0000002000.000002000.0000002000.0000002000.0000002000.0000002000.0000002000.000000
unique16NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
topSelangorNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
freq545NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
meanNaN4.906854e+05328.86250028.0915000.6395000.0485000.0485000.0180000.048000.0675000.1420000.0845000.1000000.3410000.688000
stdNaN4.686322e+05193.28173937.7023850.4802660.2148740.2148740.1329840.213820.2509490.3491370.2782060.3000750.4741640.463426
minNaN2.704900e+0438.00000010.0000000.0000000.0000000.0000000.0000000.000000.0000000.0000000.0000000.0000000.0000000.000000
25%NaN2.699500e+05201.00000012.0000000.0000000.0000000.0000000.0000000.000000.0000000.0000000.0000000.0000000.0000000.000000
50%NaN3.900000e+05293.00000016.0000001.0000000.0000000.0000000.0000000.000000.0000000.0000000.0000000.0000000.0000001.000000
75%NaN5.735000e+05412.00000028.0000001.0000000.0000000.0000000.0000000.000000.0000000.0000000.0000000.0000001.0000001.000000
maxNaN1.142050e+073017.000000593.0000001.0000001.0000001.0000001.0000001.000001.0000001.0000001.0000001.0000001.0000001.000000
state_counts = data['State'].value_counts()
plt.figure(figsize=(10, 6))plt.bar(state_counts.index, state_counts.values, edgecolor='black')
# 添加标题和标签
plt.title('各州房产分布', fontsize=16)
plt.xlabel('州', fontsize=12)
plt.ylabel('数量', fontsize=12)# 在柱子上方标注数量
for p in plt.gca().patches:plt.gca().annotate(f'{int(p.get_height())}', (p.get_x() + p.get_width() / 2., p.get_height()),ha='center', va='center', fontsize=11, color='black', xytext=(0, 5),textcoords='offset points')plt.xticks(rotation=45)  # 让x轴标签倾斜,防止重叠
plt.tight_layout()  # 优化图像布局
plt.show()
# 提取房屋类型
type_columns = data.iloc[:, 4:13]# 统计每种类型的数量
type_counts = type_columns.sum().sort_values(ascending=False)plt.figure(figsize=(10, 6))ax = sns.barplot(x=type_counts.index, y=type_counts.values)
plt.title('房产类型数量分布', fontsize=16)
plt.xlabel('房产类型', fontsize=12)
plt.ylabel('数量', fontsize=12)# 添加标签
for p in ax.patches:ax.annotate(f'{int(p.get_height())}',(p.get_x() + p.get_width() / 2., p.get_height()),ha='center', va='center', fontsize=11, color='black', xytext=(0, 5),textcoords='offset points')plt.tight_layout()
plt.show()
tenure_counts = data[['Leasehold', 'Freehold']].sum()plt.figure(figsize=(8, 8))
plt.pie(tenure_counts,labels=tenure_counts.index,autopct='%1.1f%%',startangle=90,colors=plt.cm.Paired.colors[:len(tenure_counts)],pctdistance=0.85,  # 将百分比的标签放得更近圆心labeldistance=1.1,  # 增加标签与饼图的距离
)# 添加标题并保证饼图是圆形
plt.title('房产所有权类型分布', fontsize=14)
plt.axis('equal')  # 保证饼图是圆形plt.show()
# 设置画布大小
plt.figure(figsize=(15, 5))# 绘制 Median_Price 的直方图和核密度曲线
plt.subplot(1, 3, 1)
sns.histplot(data['Median_Price'], kde=True, color='skyblue', bins=30)
plt.title('房产中位数价格分布', fontsize=14)
plt.xlabel('中位数价格(马币)', fontsize=12)
plt.ylabel('频数', fontsize=12)# 绘制 Median_PSF 的直方图和核密度曲线
plt.subplot(1, 3, 2)
sns.histplot(data['Median_PSF'], kde=True, color='lightcoral', bins=30)
plt.title('每平方英尺价格分布', fontsize=14)
plt.xlabel('每平方英尺价格(马币)', fontsize=12)
plt.ylabel('频数', fontsize=12)# 绘制 Transactions 的直方图和核密度曲线
plt.subplot(1, 3, 3)
sns.histplot(data['Transactions'], kde=True, color='lightgreen', bins=30)
plt.title('交易数量分布', fontsize=14)
plt.xlabel('交易数量', fontsize=12)
plt.ylabel('频数', fontsize=12)# 调整布局
plt.tight_layout()
plt.show()
  1. Selangor(雪兰莪州)Johor(柔佛州) 是房产数量最多的地区,合计达到45%以上,占据明显优势。
  2. 房产分布存在较大的区域差异,例如 Labuan(纳闽)Perlis(玻璃市) 等州的房产数量极少,仅为1个。
  3. 房产类型以 Terrace House(排屋) 为主,数量高达1279,占主导地位。相比之下, Semi D(半独立别墅)Apartment(公寓) 数量分别为284和200。
  4. 大多数房产为 Freehold(永久产权),占66.9%,而 Leasehold(租赁产权) 占比为33.1%。这表明永久产权房产更受购房者青睐。
  5. 房产中位数价格:价格集中在较低的区间,大多数房产价格低于 2,000,000 马币,但右侧存在少数极高价格的房产,表现出右偏态,可能与高端市场有关。
  6. 每平方英尺价格:大多数房产的每平方英尺价格集中在 200-600 马币 范围内,表明市场主要集中在相对中低端。
  7. 交易数量:交易数量大多数集中在 50以下,但少数地区的交易数量较高,可能与特定地区或房产类型的高市场需求有关。
state_mean = data.groupby('State')[['Median_Price', 'Median_PSF', 'Transactions']].mean()
normalized_means = state_mean.apply(lambda x: (x - x.min()) / (x.max() - x.min()))
# 绘制热力图
plt.figure(figsize=(12, 8))
sns.heatmap(normalized_means, cmap='coolwarm',center=0.5,      vmin=0, vmax=1,annot=state_mean.round(2),  # 显示原始值而不是归一化后的值fmt='.2f',cbar_kws={'label': '标准化得分'})
plt.title('各州房产中位数价格、每平方英尺价格和交易数量的热力图')
plt.xlabel('指标')
plt.ylabel('州')
plt.tight_layout()
plt.show()
binary_columns = data.columns[4:]  # 根据实际数据修改起始列state_percentage = data.groupby('State')[binary_columns].mean() * 100  # 计算占比,转换为百分比# 绘制热力图
plt.figure(figsize=(15, 10))
sns.heatmap(state_percentage, annot=True, cmap='coolwarm', fmt='.2f', cbar=True)
plt.title('各州0-1变量占比的热力图')
plt.xlabel('房产特征')
plt.ylabel('州')
plt.tight_layout()
plt.show()

1. 高房价和高交易量

  • Kuala Lumpur(吉隆坡) 在房产中位数价格(Median_Price)和每平方英尺价格(Median_PSF)上均居首位,显示出其作为马来西亚高端房地产市场的主导地位。同时,吉隆坡的交易量也在较高水平,表明其房产市场非常活跃。
  • Selangor(雪兰莪)Johor(柔佛) 的房产中位数价格和每平方英尺价格也较高,且两地的交易数量均较大,显示出它们作为马来西亚主要的房地产市场之一,且在多项指标上表现出强劲的市场需求。

2. 低房价和低交易量

  • Labuan(纳闽)Terengganu(登嘉楼) 的房产中位数价格和每平方英尺价格都在较低水平,且交易数量也较低,这可能是由于这些地区房地产市场需求较少,房价较低且交易不活跃。
  • Kedah(吉打)Kelantan(吉兰丹) 在房价和交易量上也较低,表明这些地区的房地产市场相对较为冷清,可能需要政策支持或其他市场刺激措施。

3. 房产特征的区域差异

  • Service Residence(服务公寓)Condominium(公寓) 在像 Kuala Lumpur(吉隆坡) 这样的高房价城市中占据主导地位,且占比较高。特别是在吉隆坡,服务公寓的占比接近 100%,说明它们在这些高端市场中非常受欢迎。
  • Terrace House(排屋)Cluster House(集体别墅) 在柔佛州和槟城等地的占比也较高,这些地区可能偏向于中低价房产市场,且交易量较大。
  • Leasehold(租赁产权) 在一些州,如 Perak(霹雳)Sarawak(砂拉越) 中占比较大,可能表明这些地区的土地使用权更多以租赁为主。

4. 市场的稳定性与差异

  • Perlis(玻璃市)Putrajaya(布城) 显示出较高的 Freehold(永久产权) 占比,尤其是 Putrajaya(布城),显示出这些地区的高端市场可能依赖于永久产权的吸引力。
  • Bungalow(独立别墅)Semi D(半独立别墅) 在一些州,如 Johor(柔佛)Penang(槟城) 中占比较高,这表明这些类型的房产在这些州较为常见,且市场需求较强。

6.聚类分析

data_scaled = data[['Median_Price', 'Median_PSF','Transactions']]
# 对数据进行标准化
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data_scaled)
# 使用肘部法则来确定最佳聚类数
inertia = []
silhouette_scores = []
k_range = range(2, 11)
for k in k_range:kmeans = KMeans(n_clusters=k, random_state=15).fit(data_scaled)inertia.append(kmeans.inertia_)silhouette_scores.append(silhouette_score(data_scaled, kmeans.labels_))
plt.figure(figsize=(15,5))plt.subplot(1, 2, 1)
plt.plot(k_range, inertia, marker='o')
plt.xlabel('聚类中心数目')
plt.ylabel('惯性')
plt.title('肘部法则图')plt.subplot(1, 2, 2)
plt.plot(k_range, silhouette_scores, marker='o')
plt.xlabel('聚类中心数目')
plt.ylabel('轮廓系数')
plt.title('轮廓系数图')plt.tight_layout()
plt.show()

这里选择分成3类。

kmeans = KMeans(n_clusters=3, random_state=15)
kmeans.fit(data_scaled)
# 获取聚类标签
cluster_labels = kmeans.labels_
# 将聚类标签添加到原始数据中以进行分析
data['Cluster'] = cluster_labels
# 使用 PCA 将数据降维到 2 维
pca = PCA(n_components=2)
data_pca = pca.fit_transform(data_scaled)# 将 PCA 结果转为 DataFrame,并添加聚类标签
data_pca_df = pd.DataFrame(data_pca, columns=['PCA1', 'PCA2'])
data_pca_df['Cluster'] = cluster_labels# 绘制 PCA 降维后的聚类结果
plt.figure(figsize=(12, 8))
sns.scatterplot(x=data_pca_df['PCA1'], y=data_pca_df['PCA2'], hue=data_pca_df['Cluster'], palette='viridis', legend='full')
plt.title(f'K-Means聚类结果 - PCA 降维展示')
plt.xlabel('主成分 1 (PCA1)')
plt.ylabel('主成分 2 (PCA2)')
plt.legend(title='Cluster', loc='upper left')
plt.grid(True)
plt.show()

感觉分成3类是比较合理的选择,各类之间边界明显。

# 对每个特征进行归一化处理(每个特征单独归一化)
cluster_means = data.groupby('Cluster')[['Median_Price', 'Median_PSF','Transactions']].mean()
# 对每个特征进行归一化处理(每个特征单独归一化)
normalized_means = cluster_means.apply(lambda x: (x - x.min()) / (x.max() - x.min()))plt.figure(figsize=(10, 6))
sns.heatmap(normalized_means.T, cmap='coolwarm',center=0.5,      vmin=0, vmax=1,annot=cluster_means.T.round(2),  # 显示原始值而不是归一化后的值fmt='.2f',cbar_kws={'label': '标准化得分'})plt.xlabel('聚类')
plt.title('各聚类特征分布热力图(颜色深浅表示在该特征中的相对大小)')
plt.tight_layout()
plt.show()

聚类 0

  • Median_Price:价格中等(69,164.22),属于中等价房产类别。
  • Median_PSF:每平方英尺价格中等(463.20),表明单位面积价格接近平均水平。
  • Transactions:交易数量最高(48.09),反映该类房产可能位于活跃的市场区域。

聚类 1

  • Median_Price:价格非常低(33,088.74),为房产中价格最低的一类。
  • Median_PSF:单位面积价格最低(246.14),可能是面积较大的房产。
  • Transactions:交易数量最低(20.07),表明这类房产市场需求较低。

聚类 2

  • Median_Price:价格非常高(2,237,694.95),属于高端房产类别。
  • Median_PSF:每平方英尺价格最高(963.17),表明这类房产单位面积的价格较高,可能是高端物业。
  • Transactions:交易数量中等(23.98),表明高端房产市场需求适中,但不如低价房产活跃。

7.相关性分析

target_variable = 'Median_Price'
binary_variables = data.columns[4:-1]correlation_results = []# 对每个 0-1 变量计算点二列相关性
for binary_var in binary_variables:correlation, p_value = pointbiserialr(data[binary_var], data[target_variable])correlation_results.append({'Variable': binary_var,'Correlation': correlation,'P-Value': p_value})correlation_results_df = pd.DataFrame(correlation_results)
print('房产的中位数价格与其他0-1变量之间点二列相关性分析结果:')
correlation_results_df
房产的中位数价格与其他0-1变量之间点二列相关性分析结果:
VariableCorrelationP-Value
0Terrace House-0.0064697.724725e-01
1Bungalow0.2006301.315120e-19
2Service Residence0.1518928.597954e-12
3Town House0.0129865.616265e-01
4Cluster House0.0465543.736301e-02
5Flat-0.1907157.782496e-18
6Semi D0.0994578.345519e-06
7Condominium0.1089581.038324e-06
8Apartment-0.1459065.520686e-11
9Leasehold-0.1335362.034471e-09
10Freehold0.1382885.284742e-10

根据房产中位数价格与其他 0-1 变量之间点二列相关性分析结果发现:

  1. 正相关影响

    • Bungalow(独立别墅)Service Residence(服务公寓)Freehold(永久产权) 对房产中位数价格有正相关影响,表明这些类型房产通常价格较高,是高端房产的代表。
  2. 负相关影响

    • Flat(廉租房/公寓式房产)Apartment(公寓)Leasehold(租赁产权) 对房产中位数价格有负相关影响,表明这些类型房产通常价格较低,属于中低价市场。
  3. 无显著相关影响

    • Terrace House(排屋)Condominium(公寓楼)Semi D(半独立别墅)Town House(联排别墅)Cluster House(集体别墅) 对房产中位数价格无显著相关影响,说明这些类型房产价格变化较为稳定。
target_variable = 'Median_PSF'
correlation_results = []# 对每个 0-1 变量计算点二列相关性
for binary_var in binary_variables:correlation, p_value = pointbiserialr(data[binary_var], data[target_variable])correlation_results.append({'Variable': binary_var,'Correlation': correlation,'P-Value': p_value})correlation_results_df = pd.DataFrame(correlation_results)
print('每平方英尺的中位数价格与其他0-1变量之间点二列相关性分析结果:')
correlation_results_df
每平方英尺的中位数价格与其他0-1变量之间点二列相关性分析结果:
VariableCorrelationP-Value
0Terrace House-0.2197352.720014e-23
1Bungalow-0.0207023.547983e-01
2Service Residence0.4040712.018608e-79
3Town House-0.0053348.115854e-01
4Cluster House-0.0340231.282435e-01
5Flat-0.1173321.423677e-07
6Semi D-0.1160741.936375e-07
7Condominium0.2363128.781923e-27
8Apartment0.0143485.213337e-01
9Leasehold-0.1391314.139900e-10
10Freehold0.1245672.282456e-08

根据每平方英尺的中位价格与其他 0-1 变量之间点二列相关性分析结果发现:

  1. 正相关影响

    • Service Residence(服务公寓)Condominium(公寓楼)Freehold(永久产权) 对每平方英尺的中位价格有正相关影响,表明这些房产类型的单位面积价格更高,通常为高端房产。
  2. 负相关影响

    • Terrace House(排屋)Flat(廉租房/公寓式房产)Semi D(半独立别墅)Leasehold(租赁产权) 对每平方英尺的中位价格有负相关影响,表明这些房产类型的单位面积价格更低,更适合中低价市场。
  3. 无显著相关影响

    • Transactions(交易数量)Bungalow(独立别墅)Apartment(公寓)Town House(联排别墅)Cluster House(集体别墅) 对每平方英尺的中位价格无显著相关影响,说明这些类型房产的单位面积价格较为稳定。
target_variable = 'Transactions'
correlation_results = []# 对每个 0-1 变量计算点二列相关性
for binary_var in binary_variables:correlation, p_value = pointbiserialr(data[binary_var], data[target_variable])correlation_results.append({'Variable': binary_var,'Correlation': correlation,'P-Value': p_value})correlation_results_df = pd.DataFrame(correlation_results)
print('房产交易数量与其他0-1变量之间点二列相关性分析结果:')
correlation_results_df
房产交易数量与其他0-1变量之间点二列相关性分析结果:
VariableCorrelationP-Value
0Terrace House0.1725867.734399e-15
1Bungalow-0.0174064.365811e-01
2Service Residence-0.0282122.072595e-01
3Town House-0.0131005.582136e-01
4Cluster House0.1317543.331929e-09
5Flat-0.0669562.736866e-03
6Semi D-0.0007609.729200e-01
7Condominium-0.0907344.832550e-05
8Apartment-0.0942402.429166e-05
9Leasehold-0.0705281.599190e-03
10Freehold0.0686602.124288e-03

根据房产交易数量与其他 0-1 变量之间点二列相关性分析结果发现:

  1. 正相关影响

    • Terrace House(排屋)Cluster House(集体别墅)Freehold(永久产权) 对交易数量有正相关影响,表明这些类型的房产交易较为频繁,市场活跃度较高。
  2. 负相关影响

    • Condominium(公寓楼)Apartment(公寓)Flat(廉租房/公寓式房产)Leasehold(租赁产权) 对交易数量有负相关影响,表明这些类型房产的交易频率较低,市场需求相对较小。
  3. 无显著相关影响

    • Service Residence(服务公寓)Bungalow(独立别墅)Semi D(半独立别墅)Town House(联排别墅) 对交易数量无显著相关影响,说明这些房产类型对市场活跃度的贡献较小,交易较为稳定。

8.结论

基于对2000条房产数据的全面分析,本项目得出了以下主要结论:
1.描述性分析:

  • Selangor(雪兰莪州)Johor(柔佛州) 是房产数量最多的地区,合计达到45%以上,占据明显优势。
  • 房产分布存在较大的区域差异,例如 Labuan(纳闽)Perlis(玻璃市) 等州的房产数量极少,仅为1个。
  • 房产类型以 Terrace House(排屋) 为主,数量高达1279,占主导地位。相比之下, Semi D(半独立别墅)Apartment(公寓) 数量分别为284和200。
  • 大多数房产为 Freehold(永久产权),占66.9%,而 Leasehold(租赁产权) 占比为33.1%。这表明永久产权房产更受购房者青睐。
  • 房产中位数价格:价格集中在较低的区间,大多数房产价格低于 2,000,000 马币,但右侧存在少数极高价格的房产,表现出右偏态,可能与高端市场有关。
  • 每平方英尺价格:大多数房产的每平方英尺价格集中在 200-600 马币 范围内,表明市场主要集中在相对中低端。
  • 交易数量:交易数量大多数集中在 50以下,但少数地区的交易数量较高,可能与特定地区或房产类型的高市场需求有关。
  • Kuala Lumpur(吉隆坡) 在房产中位数价格(Median_Price)和每平方英尺价格(Median_PSF)上均居首位,显示出其作为马来西亚高端房地产市场的主导地位。同时,吉隆坡的交易量也在较高水平,表明其房产市场非常活跃。
  • Selangor(雪兰莪)Johor(柔佛) 的房产中位数价格和每平方英尺价格也较高,且两地的交易数量均较大,显示出它们作为马来西亚主要的房地产市场之一,且在多项指标上表现出强劲的市场需求。
  • Labuan(纳闽)Terengganu(登嘉楼) 的房产中位数价格和每平方英尺价格都在较低水平,且交易数量也较低,这可能是由于这些地区房地产市场需求较少,房价较低且交易不活跃。
  • Kedah(吉打)Kelantan(吉兰丹) 在房价和交易量上也较低,表明这些地区的房地产市场相对较为冷清,可能需要政策支持或其他市场刺激措施。
  • Service Residence(服务公寓)Condominium(公寓) 在像 Kuala Lumpur(吉隆坡) 这样的高房价城市中占据主导地位,且占比较高。特别是在吉隆坡,服务公寓的占比接近 100%,说明它们在这些高端市场中非常受欢迎。
  • Terrace House(排屋)Cluster House(集体别墅) 在柔佛州和槟城等地的占比也较高,这些地区可能偏向于中低价房产市场,且交易量较大。
  • Leasehold(租赁产权) 在一些州,如 Perak(霹雳)Sarawak(砂拉越) 中占比较大,可能表明这些地区的土地使用权更多以租赁为主。
  • Perlis(玻璃市)Putrajaya(布城) 显示出较高的 Freehold(永久产权) 占比,尤其是 Putrajaya(布城),显示出这些地区的高端市场可能依赖于永久产权的吸引力。
  • Bungalow(独立别墅)Semi D(半独立别墅) 在一些州,如 Johor(柔佛)Penang(槟城) 中占比较高,这表明这些类型的房产在这些州较为常见,且市场需求较强。

2.聚类分析:
将数据分为3类,其中:

  • 聚类 0:中低价位房产

    • 价格较低,单位面积价格适中,交易数量最高。
    • 适合普通购房者,市场需求较高,房产交易较为频繁。
  • 聚类 1:低价房产

    • 总价和单位面积价格均最低,交易数量也最低。
    • 可能是郊区或市场冷门地区的房产,市场需求较低。
  • 聚类 2:高端房产

    • 总价和单位面积价格均非常高,交易数量适中。
    • 适合高收入购房者,市场相对小众但稳定。

3.相关性分析:

  • 根据房产中位数价格与其他 0-1 变量之间点二列相关性分析结果,发现:Bungalow(独立别墅)Service Residence(服务公寓)Freehold(永久产权) 对房产中位数价格有正相关影响,表明这些房产通常价格较高,属于高端市场;Flat(廉租房)Apartment(公寓)Leasehold(租赁产权) 对房产中位数价格有负相关影响,通常价格较低,适合中低价市场;Terrace House(排屋)Condominium(公寓楼)Semi D(半独立别墅)Town House(联排别墅)Cluster House(集体别墅) 对房产中位数价格影响较小,价格变化较稳定。
  • 根据每平方英尺的中位价格与其他 0-1 变量之间点二列相关性分析结果,发现:Service Residence(服务公寓)Condominium(公寓楼)Freehold(永久产权) 对每平方英尺的价格有正相关影响,通常为高端房产;Terrace House(排屋)Flat(廉租房)Semi D(半独立别墅)Leasehold(租赁产权) 对每平方英尺的价格有负相关影响,更适合中低价市场;Transactions(交易数量)Bungalow(独立别墅)Apartment(公寓)Town House(联排别墅)Cluster House(集体别墅) 对每平方英尺价格无显著相关影响,单位面积价格较为稳定。
  • 根据房产交易数量与其他 0-1 变量之间点二列相关性分析结果,发现:Terrace House(排屋)Cluster House(集体别墅)Freehold(永久产权) 对交易数量有正相关影响,说明这些类型房产市场活跃,交易频繁;Condominium(公寓楼)Apartment(公寓)Flat(廉租房)Leasehold(租赁产权) 对交易数量有负相关影响,说明市场需求较小,交易较少;Service Residence(服务公寓)Bungalow(独立别墅)Semi D(半独立别墅)Town House(联排别墅) 对交易数量无显著影响,市场相对稳定。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/68640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

范冰冰担任第75届柏林电影节主竞赛单元评委 共鉴电影佳作

近日&#xff0c;备受瞩目的柏林电影节迎来了新一届盛事&#xff0c;而华人演员范冰冰将以主竞赛单元评委身份亮相&#xff0c;引发了广泛关注。此前她已担任过戛纳国际电影节、东京国际电影节、圣塞巴斯蒂安国际电影节等众多电影节主竞赛单元评委。作为国际影坛的知名人物&…

Ollama 运行从 ModelScope 下载的 GGUF 格式的模型

本文系统环境 Windows 10 Ollama 0.5.7 Ollama 是什么&#xff1f; Ollama 可以让你快速集成和部署本地 AI 模型。它支持各种不同的 AI 模型&#xff0c;并允许用户通过简单的 API 进行调用 Ollama 的安装 Ollama 官网 有其下载及安装方法&#xff0c;非常简便 但如果希…

“腾讯、钉钉、飞书” 会议开源平替,免费功能强大

在数字化时代&#xff0c;远程办公和线上协作越来越火。然而&#xff0c;市面上的视频会议工具要么贵得离谱&#xff0c;要么功能受限&#xff0c;甚至还有些在数据安全和隐私保护上让人不放心。 今天开源君给大家安利一个超棒的开源项目 - Jitsi Meet&#xff0c;这可是我在网…

【教学类-89-01】20250127新年篇01—— 蛇年红包(WORD模版)

祈愿在2025蛇年里&#xff0c; 伟大的祖国风调雨顺、国泰民安、每个人齐心协力&#xff0c;共同经历这百年未有之大变局时代&#xff08;国际政治、AI技术……&#xff09; 祝福亲友同事孩子们平安健康&#xff08;安全、安全、安全&#xff09;、巳巳如意&#xff01; 背景需…

2025年1月30日(任意截面、自定义截面梁的设置)

Ansys 在ANSYS中&#xff0c;以下是这些术语的详细解释&#xff1a; Nodal Solution (节点解): Nodal Solution指的是在有限元分析中计算出的节点处的物理量解。通常包括节点的位移、反应力等信息。节点解是分析结果的基础&#xff0c;因为它们可以用来计算其他重要的物理量&a…

unity使用内置videoplayer打包到安卓手机进行视频播放

1.新建UI&#xff0c;新建RawImage在画布当作视频播放的显示载体 2.新建VideoPlayer 3.新建Render Texture作为连接播放器视频显示和幕布的渲染纹理 将Render Texture同时挂载在VideoPlayer播放器和RawImage上。这样就可以将显示的视频内容在RawImage上显示出来了。 问题在于&a…

【Envi遥感图像处理】008:波段(批量)分离与波段合成

文章目录 一、波段分离提取1. 提取单个波段2. 批量提取单个波段二、波段合成相关阅读:【ArcGIS微课1000例】0058:波段合成(CompositeBands)工具的使用 一、波段分离提取 1. 提取单个波段

MongoDB平替数据库对比

背景 项目一直是与实时在线监测相关&#xff0c;特点数据量大&#xff0c;读写操作大&#xff0c;所以选用的是MongoDB。但按趋势来讲&#xff0c;需要有一款国产数据库可替代&#xff0c;实现信创要求。选型对比如下 1. IoTDB 这款是由清华大学主导的开源时序数据库&#x…

C语言------数组从入门到精通

1.一维数组 目标:通过思维导图了解学习一维数组的核心知识点: 1.1定义 使用 类型名 数组名[数组长度]; 定义数组。 // 示例&#xff1a; int arr[5]; 1.2一维数组初始化 数组的初始化可以分为静态初始化和动态初始化两种方式。 它们的主要区别在于初始化的时机和内存分配的方…

物联网智能项目之——智能家居项目的实现!

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于物联网智能项目之——智能家居项目…

Nxopen 直齿轮参数化设计

NXUG1953 Visualstudio 2019 参考论文&#xff1a; A Method for Determining the AGMA Tooth Form Factor from Equations for the Generated Tooth Root Fillet //FullGear// Mandatory UF Includes #include <uf.h> #include <uf_object_types.h>// Internal I…

蓝桥杯模拟算法:蛇形方阵

P5731 【深基5.习6】蛇形方阵 - 洛谷 | 计算机科学教育新生态 我们只要定义两个方向向量数组&#xff0c;这种问题就可以迎刃而解了 比如我们是4的话&#xff0c;我们从左向右开始存&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4 到5的时候y就大于4了就是越界了&…

VLLM性能调优

1. 抢占 显存不够的时候&#xff0c;某些request会被抢占。其KV cache被清除&#xff0c;腾退给其他request&#xff0c;下次调度到它&#xff0c;重新计算KV cache。 报这条消息&#xff0c;说明已被抢占&#xff1a; WARNING 05-09 00:49:33 scheduler.py:1057 Sequence gr…

HTML特殊符号的使用示例

目录 一、基本特殊符号的使用 1、空格符号&#xff1a; 2、小于号 和 大于号&#xff1a; 3、引号&#xff1a; 二、版权、注册商标符号的使用 1、版权符号&#xff1a;© 2、注册商标符号&#xff1a; 三、数学符号的使用 四、箭头符号的使用 五、货币符号的使用…

three.js用粒子使用canvas生成的中文字符位图材质

three.js用粒子使用canvas生成中文字符材质 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Three.…

STM32 PWM驱动直流电机

接线图&#xff1a; 代码配置&#xff1a; 根据驱动舵机的代码来写&#xff0c;与舵机不同的是&#xff0c;这次的引脚接到了PA2上&#xff0c;所以需要改一下引脚以及改为OC3通道。 另外还需在配置两个GPIO引脚&#xff0c;来控制电机的旋转方向&#xff0c;这里连接到了PA4与…

【外文原版书阅读】《机器学习前置知识》2.用看电影推荐的例子带你深入了解向量点积在机器学习的作用

目录 3.3 Where Are You Looking, Vector? The Dot Product 个人主页&#xff1a;Icomi 大家好&#xff0c;我是Icomi&#xff0c;本专栏是我阅读外文原版书《Before Machine Learning》对于文章中我认为能够增进线性代数与机器学习之间的理解的内容的一个输出&#xff0c;希望…

Conditional DETR for Fast Training Convergence论文学习

1. 写作背景 最近提出的 DETR 成功地将 transformer 引入到物体检测任务中&#xff0c;获得了很不错的性能。DETR 的重要意义在于去除了物体检测算法里需要人工设计的部分&#xff0c;比如 anchor 的生成和 NMS 操作。这大大简化了物体检测的设计流程。基本的结构还是沿用了以…

低代码产品表单渲染架构

在React和Vue没有流行起来的时候&#xff0c;低代码产品的表单渲染设计通常会使用操作Dom的方式实现。 下面是一个表单的例子&#xff1a; 产品层 用户通过打开表单&#xff0c;使用不同业务场景业务下的表单页面&#xff0c;中间的Render层就是技术实现。 每一个不同业务的表单…

XSS 漏洞全面解析:原理、危害与防范

目录 前言​编辑 漏洞原理 XSS 漏洞的危害 检测 XSS 漏洞的方法 防范 XSS 漏洞的措施 前言 在网络安全的复杂版图中&#xff0c;XSS 漏洞&#xff0c;即跨站脚本攻击&#xff08;Cross - Site Scripting&#xff09;&#xff0c;是一类极为普遍且威胁巨大的安全隐患。随着互…