数据分析流程
采集数据→确定分析方向→导入数据→数据清洗→数据分析→数据可视化
数据源介绍
| 字段名 | 含义 | 说明 |
| 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












请登录后查看评论内容