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

news2025/2/1 7:51:37

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

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   float64
 6   Median_PSF    2000 non-null   float64
 7   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.coloradmin.cn/o/2289223.html

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

相关文章

ARM嵌入式学习--第十一天(中断处理 , ADC)

--中断的概念 中断是指计算机运行过程中&#xff0c;出现某些意外情况需主机干预时&#xff0c;机器能自动停止正在运行的程序并转入处理新情况的程序&#xff0c;处理完毕后又返回被暂停的程序继续运行 --CPU处理事情的方式 -轮询方式 不断查询是否有事情需要处理&#xff0c…

消息队列篇--通信协议篇--网络通信模型(OSI7层参考模型,TCP/IP分层模型)

一、OSI参考模型&#xff08;Open Systems Interconnection Model&#xff09; OSI参考模型是一个用于描述和标准化网络通信功能的七层框架。它由国际标准化组织&#xff08;ISO&#xff09;提出&#xff0c;旨在为不同的网络设备和协议提供一个通用的语言和结构&#xff0c;以…

“新月之智”智能战术头盔系统(CITHS)

新月人物传记&#xff1a;人物传记之新月篇-CSDN博客 相关文章链接&#xff08;更新&#xff09;&#xff1a; 星际战争模拟系统&#xff1a;新月的编程之道-CSDN博客 新月智能护甲系统CMIA--未来战场的守护者-CSDN博客 目录 一、引言 二、智能头盔控制系统概述 三、系统架…

实验七 JSP内置对象II

实验七 JSP内置对象II 目的&#xff1a; 1、掌握JSP内置对象的使用。 2、理解JSP的作用域 3、掌握session&#xff0c;application对象的使用 实验要求&#xff1a; 1、完成实验题目 2、要求提交实验报告&#xff0c;将代码和实验结果页面截图放入报告中 实验过程&#xff1a…

OpenCV:Harris、Shi-Tomasi角点检测

简述 在计算机视觉和图像处理领域&#xff0c;角点是一种重要的特征点&#xff0c;通常是图像中梯度变化剧烈的区域&#xff0c;例如建筑物的拐角、棋盘的交点等。角点检测广泛应用于目标跟踪、运动检测、拼接全景图 等任务。 本文将介绍 Harris 角点检测 和 Shi-Tomasi 角点…

零代码搭建个人博客—Zblog结合内网穿透发布公网

目录 一、准备工作二、Z-blog 网站搭建1. XAMPP 环境设置2. Z-blog 安装3. Z-blog 网页测试 三、内网穿透工具 Cpolar 的安装和配置1. Cpolar 安装2. Cpolar 云端设置3. Cpolar 本地设置 四、本地网页发布五、注意六、本次经历总结 大家好&#xff0c;我是学问小小谢。 最近心血…

宏_wps_宏修改word中所有excel表格的格式_设置字体对齐格式_删除空行等

需求&#xff1a; 将word中所有excel表格的格式进行统一化&#xff0c;修改其中的数字类型为“宋体&#xff0c; 五号&#xff0c;右对齐&#xff0c; 不加粗&#xff0c;不倾斜”&#xff0c;其中的中文为“宋体&#xff0c; 五号&#xff0c; 不加粗&#xff0c;不倾斜” 数…

xss靶场

xss-labs下载地址&#xff1a;GitHub - do0dl3/xss-labs: xss 跨站漏洞平台 xss常见触发标签&#xff1a;XSS跨站脚本攻击实例与防御策略-CSDN博客 level-1 首先查看网页的源代码发现get传参的name的值test插入了html里头&#xff0c;还回显了payload的长度。 <!DOCTYPE …

线段树(Segment Tree)和树状数组

线段树&#xff08;Segment Tree&#xff09;和树状数组 线段树的实现链式&#xff1a;数组实现 解题思路树状数组 线段树是 二叉树结构 的衍生&#xff0c;用于高效解决区间查询和动态修改的问题&#xff0c;其中区间查询的时间复杂度为 O(logN)&#xff0c;动态修改单个元素的…

MySQL注入中load_file()函数的使用

前言 在Msql注入中&#xff0c;load_file()函数在获得webshell以及提权过程中起着十分重要的作用&#xff0c;常被用来读取各种配置文件 而load_file函数只有在满足两个条件的情况下才可以使用&#xff1a; 文件权限&#xff1a;chmod ax pathtofile 文件大小&#xff1a;必须…

DeepSeek-R1 论文解读 —— 强化学习大语言模型新时代来临?

近年来&#xff0c;人工智能&#xff08;AI&#xff09;领域发展迅猛&#xff0c;大语言模型&#xff08;LLMs&#xff09;为通用人工智能&#xff08;AGI&#xff09;的发展开辟了道路。OpenAI 的 o1 模型表现非凡&#xff0c;它引入的创新性推理时缩放技术显著提升了推理能力…

使用Pygame制作“贪吃蛇”游戏

贪吃蛇 是一款经典的休闲小游戏&#xff1a;玩家通过操控一条会不断变长的“蛇”在屏幕中移动&#xff0c;去吃随机出现的食物&#xff0c;同时要避免撞到墙壁或自己身体的其他部分。由于其逻辑相对简单&#xff0c;但可玩性和扩展性都不错&#xff0c;非常适合作为新手练习游戏…

海外问卷调查如何影响企业的经营?在品牌建设中有何指导意义?

市场调查的定义&#xff1a;通过科学的方法&#xff0c;有目的地、系统地搜集整理一些市场信息&#xff0c;其目的在于了解当下市场现状和发展前景&#xff0c;为企业生产和品牌打造提供一些科学的指导意见&#xff0c;这是任何大企业、中小企业、初创企业都必须重视的一个重要…

unity学习23:场景scene相关,场景信息,场景跳转

目录 1 默认场景和Assets里的场景 1.1 scene的作用 1.2 scene作为project的入口 1.3 默认场景 2 场景scene相关 2.1 创建scene 2.2 切换场景 2.3 build中的场景&#xff0c;在构建中包含的场景 &#xff08;否则会认为是失效的Scene&#xff09; 2.4 Scenes in Bui…

CPU 100% 出现系统中断 怎么解决

CPU 100% 出现系统中断 怎么解决 电脑开机时会掉帧&#xff0c;切换到桌面时就会卡顿&#xff0c;然后打开任务管理器就会看到系统中断的cpu占用率达到100%&#xff0c;过一段时间再打开还是会有显示100%的占用率&#xff0c;这个问题怎么解决&#xff1f; 文章目录 CPU 100% …

数据分析系列--⑥RapidMiner构建决策树(泰坦尼克号案例含数据)

一、资源下载 二、数据处理 1.导入数据 2.数据预处理 三、构建模型 1.构建决策树 2.划分训练集和测试集 3.应用模型 4.结果分析 一、资源下载 点击下载数据集 二、数据处理 1.导入数据 2.数据预处理 三、构建模型 1.构建决策树 虽然决策树已经构建,但对于大多数初学者或…

【MyDB】4-VersionManager 之 4-VM的实现

【MyDB】4-VersionManager 之 4-VM的实现 VM 的实现VM(VersionManager)的基本定义与实现优化具体功能实现begin()开启事务commit()提交事务abort 中止事务read 读取uid对应的数据记录所在的entryinsert方法&#xff0c;插入数据delete方法 VM 的实现 本章代码位于&#xff1a;t…

计算机网络 笔记 传输层

概述&#xff1a; 主要功能&#xff1a; TCP&#xff1a; 特点***&#xff1a; 数据格式&#xff1a; 连接管理***&#xff1a; 建立连接&#xff08;三次握手&#xff09; 释放连接&#xff08;四次挥手&#xff09; 应用场景 UDP&#xff1a; 特点&#xff1a; 数…

(leetcode 213 打家劫舍ii)

代码随想录&#xff1a; 将一个线性数组换成两个线性数组&#xff08;去掉头&#xff0c;去掉尾&#xff09; 分别求两个线性数组的最大值 最后求这两个数组的最大值 代码随想录视频 #include<iostream> #include<vector> #include<algorithm> //nums:2,…

《TCP 网络编程实战:开发流程、缓冲区原理、三次握手与四次挥手》

一、 TCP 网络应用程序开发流程 学习目标 能够知道TCP客户端程序的开发流程1. TCP 网络应用程序开发流程的介绍 TCP 网络应用程序开发分为: TCP 客户端程序开发TCP 服务端程序开发说明: 客户端程序是指运行在用户设备上的程序 服务端程序是指运行在服务器设备上的程序,专门…