第5章项目实战:房地产市场洞察与价值评估

数据分析流程

采集数据→确定分析方向→导入数据→数据清洗→数据分析→数据可视化

数据源介绍

字段名含义说明
city城市房屋所在的城市名称,例如“合肥”、“重庆”等。
address详细地址房屋的具体位置,包含街道、交叉口等信息。
area面积房屋的面积,单位为平方米(㎡)。
floor楼层房屋所在的楼层信息,例如“中层(共18层)”。
name小区名称房屋所在的小区或楼盘名称。
price价格房屋的总价,单位为“万”或“元”。
province省份房屋所在的省份或直辖市名称。
rooms户型房屋的户型结构,例如“3室2厅”。
toward朝向房屋的朝向,例如“南北向”、“南向”等。
unit单价房屋的单价,单位为“元/㎡”。
year建造年份房屋的建造年份,例如“2013年建”。
origin_url原始链接房屋信息的来源网页链接。

分析及统计问题

编号问题分析主题分析目标分组字段指标/方法
A1哪些变量最影响房价?面积、楼层、房间数哪个影响更大?特征相关性 了解房屋各特征对房价的线性影响无皮尔逊相关系数
A2全国房价总体分布是怎样的?是否存在极端值?描述性统计概览数值型字段的分布特征无平均数/中位数/四分位数/标准差
A3哪些城市房价最高?直辖市与非直辖市差异如何?城市对比比较不同城市房价水平city均价/单价中位数/箱线图
A4高价房在面积、楼层等方面有什么特征?价格分层识别不同价位房屋特征差异价格分段(低中高)列联表/卡方检验
A5哪种户型最受欢迎?三室比两室贵多少?户型分析分析不同户型的市场表现rooms占比/平均单价/溢价率
A6南北向是否真比单一朝向贵?贵多少?朝向溢价评估不同朝向的价格差异toward方差分析/多重比较
A7新房比10年老房贵多少?折旧规律如何?楼龄效应研究建筑年份对房价的影响year分段(5年间隔)趋势线/回归分析
A8哪些区域交易最活跃?新区和老城区哪个更贵?区域热度识别各城市热门交易区域address(提取区域关键词)交易量/价格增长率
A9哪个面积段的性价比最高?超大户型有溢价吗?面积区间分析不同面积段的价格特征area分段(50㎡间隔)密度图/价格梯度
A10中层真的比高层贵吗?差价是多少?楼层差异比较不同楼层的价格表现floor(高中低层)Kruskal-Wallis检验
A11直辖市房价是否显著更高?单价和总价差异如何?直辖市vs非直辖市对比直辖市与非直辖市的房价差异province独立样本t检验/曼-惠特尼U检验

代码实现

# 1. 导入库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['STHeiti']  # 显示中文
# 2. 导入数据
df = pd.read_csv('data/house_sales.csv')
df.info()
len(df)

# 3. 数据概览
print('数据概览')
print('总记录数:',len(df))
print('字段数量:',len(df.columns))
print('前5行数据:')
df.head(5)

# 4. 数据清洗
# 删除无用的数据列
df.drop(columns='origin_url',inplace=True)

# 缺失值检查
print(df.isnull().sum())
# 删除缺失值数据
df.dropna(inplace=True)
# 缺失值检查
print(df.isnull().sum())

# 处理重复值
print(df.duplicated().sum())
df.drop_duplicates(inplace=True)
print(df.duplicated().sum())

print(len(df))

# 数据类型的转换
# 价格处理(示例:"128万" "$128"-> 1280000)
df['price'] = df['price'].astype(str).str.replace('万', '')
df['price'] = df['price'].astype(str).str.replace('$', '').astype(float).round(1) * 10000

# 面积处理(示例:"90㎡" -> 90)
df['area'] = df['area'].astype(str).str.replace('㎡','').astype(float).round(1)

# 单价处理
df['unit'] = df['unit'].astype(str).str.replace('元/㎡','').astype(float).round(1)

# year处理
df['year'] = df['year'].astype(str).str.replace('年建','').astype(int)
#朝向处理
df['toward'] = df['toward'].astype('category')
df.head(10)

# 异常数据处理
q1 = df['price'].quantile(0.25)
q3 = df['price'].quantile(0.75)
iqr=q3-q1
low=q1-1.5*iqr
high=q3+1.5*iqr
df = df[(df['price'] > low) & (df['price'] < high)]
print(len(df))
print(f"价格异常值处理后记录数: {len(df)}")

# 面积合理性检查
df = df[(df['area'] > 20) & (df['area'] < 500)]
print(f"面积异常值处理后记录数: {len(df)}")

# 5. 新数据特征构造
df['district'] = df['address'].str.split('-').str[0]
df['building_age'] = 2025 - df['year']  # 计算楼龄
df['bedroom'] = df['rooms'].str.split('室').str[0].astype(int)
df['livingroom'] = df['rooms'].str.split('室').str[1].str.split('厅').str[0].astype(int)
df['livingroom2'] = df['rooms'].str.extract(r'(\d+)厅').astype(int)
# 楼层分类
def classify_floor(floor_str):
        if pd.isna(floor_str):
            return '未知'
        if '低层' in floor_str:
            return '低层'
        elif '中层' in floor_str:
            return '中层'
        elif '高层' in floor_str:
            return '高层'
        else:
            return '未知'
df['floor_type'] = df['floor'].apply(classify_floor)

municipalities = ['北京', '上海', '天津', '重庆']
df['is_municipality'] = df['city'].apply(lambda x: 1 if x in municipalities else 0)
df.is_municipality.value_counts()

# 价格分段
bins = [0, 1000000, 2000000, 3000000, float('inf')]
labels = ['低价', '中价', '高价', '奢侈']
df['price_level'] = pd.cut(df['price'], bins=bins, labels=labels)
df.sample(5)
'''
问题编号: A1
问题: 哪些变量最影响房价?面积、楼层、房间数哪个影响更大?
分析主题: 特征相关性
分析目标: 了解房屋各特征对房价的线性影响
分组字段: 无
指标/方法: 皮尔逊相关系数
'''

# 选择数值型特征
num_features = ['price', 'area', 'unit', 'building_age']
corr_matrix = df[num_features].corr()
# 找出与价格最相关的特征
price_corr = corr_matrix['price'].sort_values(ascending=False)
print("\n与房价相关性最高的特征:")
price_corr[1:4] # 排除price自身
# 可视化:相关性热力图
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', center=0, fmt=".2f")
plt.title("房屋特征相关性矩阵", fontsize=14)
plt.xticks(rotation=45)
plt.tight_layout()
# plt.show()
'''
问题编号: A2
问题: 全国房价总体分布是怎样的?是否存在极端值?
分析主题: 描述性统计
分析目标: 概览数值型字段的分布特征
分组字段: 无
指标/方法: 平均数/中位数/四分位数/标准差
'''
data[numeric_cols].describe()
# 房价分布直方图
plt.subplot()  # 1行2列的第2个图
plt.hist(df['price'], bins=30, color='skyblue')
plt.title('房价分布直方图')
plt.xlabel('价格(元)')
plt.ylabel('房屋数量')
plt.tight_layout()  # 避免标题重叠
plt.show()
'''
问题编号: A3
问题: 哪些城市房价最高?直辖市与非直辖市差异如何?
分析主题: 城市对比
分析目标: 比较不同城市房价水平
分组字段: city
指标/方法: 均价/单价中位数/箱线图
'''
# 按城市统计
city_stats = df.groupby('city').agg({
    'price': ['mean', 'median', 'count'],
    'unit': ['mean', 'median']
})
print("\n各城市房价统计:")
display(city_stats.sort_values(('unit', 'mean'), ascending=False).head(10))

# 可视化前10城市
top_cities = city_stats.sort_values(('unit', 'mean'), ascending=False).head(10).index
df_top = df[df['city'].isin(top_cities)]

plt.figure(figsize=(12, 6))
sns.boxplot(x='city', y='price', data=df_top, order=top_cities)
plt.title('TOP10城市房价分布对比', fontsize=14)
plt.xlabel('城市')
plt.ylabel('价格(元)')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
'''
问题编号: A4
问题: 高价房在面积、楼层等方面有什么特征?
分析主题: 价格分层
分析目标: 识别不同价位房屋特征差异
分组字段: 价格分段(低中高)
指标/方法: 列联表/卡方检验
'''

'''
问题编号: A5
问题: 哪种户型最受欢迎?三室比两室贵多少?
分析主题: 户型分析
分析目标: 分析不同户型的市场表现
分组字段: rooms
指标/方法: 占比/平均单价/溢价率
'''

'''
问题编号: A6
问题: 南北向是否真比单一朝向贵?贵多少?
分析主题: 朝向溢价
分析目标: 评估不同朝向的价格差异
分组字段: toward
指标/方法: 方差分析/多重比较
'''

'''
问题编号: A6
问题: 南北向是否真比单一朝向贵?贵多少?
分析主题: 朝向溢价
分析目标: 评估不同朝向的价格差异
分组字段: toward
指标/方法: 方差分析/多重比较
'''
# 筛选主要朝向(出现次数>50次)
toward_counts = df['toward'].value_counts()
main_towards = toward_counts[toward_counts > 50].index
df_toward = df[df['toward'].isin(main_towards)]

# 朝向统计
toward_stats = df_toward.groupby('toward').agg({
    'price': ['mean', 'median'],
    'unit': 'median',
    'building_age': 'mean'
}).sort_values(('unit', 'median'), ascending=False)

print("\n各朝向价格表现:")
display(toward_stats)

# 方差分析
groups = [group['unit'].values for name, group in df_toward.groupby('toward')]

# 可视化
plt.figure(figsize=(12, 6))
sns.boxplot(x='toward', y='unit', data=df_toward,
            order=toward_stats.index)
plt.title('不同朝向单价分布', fontsize=14)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

'''
问题编号: A7
问题: 新房比10年老房贵多少?折旧规律如何?
分析主题: 楼龄效应
分析目标: 研究建筑年份对房价的影响
分组字段: year分段(5年间隔)
指标/方法: 趋势线/回归分析
'''

'''
问题编号: A8
问题: 哪些区域交易最活跃?新区和老城区哪个更贵?
分析主题: 区域热度
分析目标: 识别各城市热门交易区域
分组字段: address(提取区域关键词)
指标/方法: 交易量/价格增长率
'''

'''
问题编号: A9
问题: 哪个面积段的性价比最高?超大户型有溢价吗?
分析主题: 面积区间
分析目标: 分析不同面积段的价格特征
分组字段: area分段(50㎡间隔)
指标/方法: 密度图/价格梯度
'''

'''
问题编号: A10
问题: 中层真的比高层贵吗?差价是多少?
分析主题: 楼层差异
分析目标: 比较不同楼层的价格表现
分组字段: floor(高中低层)
指标/方法: Kruskal-Wallis检验
'''

'''
问题编号: A11
问题: 直辖市房价是否显著更高?单价和总价差异如何?
分析主题: 直辖市vs非直辖市
分析目标: 对比直辖市与非直辖市的房价差异
分组字段: province(直辖市/安徽)
指标/方法: 独立样本t检验/曼-惠特尼U检验
'''
© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发
头像-大赛人网
欢迎您留下宝贵的见解!
提交
头像-大赛人网

昵称

取消
昵称

    请登录后查看评论内容