探索性数据分析-ames房屋价格

1、背景介绍

这是一份ames房屋数据,您可以把它想象为房屋中介推出的成都市武侯区、锦江区以及高新区等各区县的房屋信息。

2、导入数据

library(tidyverse) 
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.4     ✔ tidyr     1.3.1
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
ames <- read_csv("D:/project/R/ames房屋价格_20250105/ames_houseprice.csv")
Rows: 1460 Columns: 81
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (43): MSZoning, Street, Alley, LotShape, LandContour, Utilities, LotConf...
dbl (38): Id, MSSubClass, LotFrontage, LotArea, OverallQual, OverallCond, Ye...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

3、数据结构

library(readxl)
library(kableExtra)

Attaching package: 'kableExtra'
The following object is masked from 'package:dplyr':

    group_rows
# 读取Excel文件中的数据
ExcelData <- read_excel("D:/project/R/ames房屋价格_20250105/ames_houseprice_explanation.xlsx", sheet = "Sheet1")

# 将数据框转换为Markdown格式的表格,并添加一些格式化选项
ExcelData %>%
  kable(format = "html", booktabs = TRUE) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
col_name explanation class
MSSubClass 住宅概况 住宅概况
MSZoning 建筑性质(农业、商业、高/低密度住宅) 建筑性质
LotFrontage 建筑离街道的距离 地理信息
LotArea 占地面积 地理信息
Street 建筑附近的路面材质 地理信息
Alley 建筑附近小巷的修建材质 周边环境
LotShape 建筑物的形状 设计及装修
LandContour 地面平坦程度 周边环境
Utilities 可用公用设施类型 房屋描述
LotConfig 房屋哪里配置多 设计及装修
LandSlope 建筑的斜率 设计及装修
Neighborhood 建筑在Ames城市的位置 地理信息
Condition1 建筑附近的交通网络 房屋周边
Condition2 建筑附近的交通网络 房屋周边
BldgType 住宅类别(联排别墅、独栋别墅...) 设计及装修
HouseStyle 建筑风格 设计及装修
OverallQual 房屋装饰材质水平 设计及装修
OverallCond 房屋整体状况评估 评估结果
YearBuilt 房屋修建日期 时间
YearRemodAdd 房屋改建日期 时间
RoofStyle 屋顶类型 设计及装修
RoofMatl 屋顶材质 设计及装修
Exterior1st 建筑外立面材质 设计及装修
Exterior2nd 建筑外立面材质 设计及装修
MasVnrType 建筑表层砌体类型 设计及装修
MasVnrArea 每平方英尺的砌体面积 设计及装修
ExterQual 建筑表层砌体材料质量评估 评估结果
ExterCond 建筑表层砌体材料现状评估 评估结果
Foundation 建筑基础的类型 设计及装修
BsmtQual 地下室高度评估 评估结果
BsmtCond 地下室总体状况评估 评估结果
BsmtExposure 走廊/花园外墙的评估 评估结果
BsmtFinType1 地下室完工区域的等级评价 评估结果
BsmtFinSF1 地下室完工区域的面积 设计及装修
BsmtFinType2 其他地下室完工区域的等级评价 设计及装修
BsmtFinSF2 其他地下室完工区域的面积 设计及装修
BsmtUnfSF 地下室未完工部分的面积 设计及装修
TotalBsmtSF 地下室总面积 设计及装修
Heating 房屋暖气类型(地暖、墙暖….) 房屋配套
HeatingQC 暖气设施的质量和条件 房屋配套
CentralAir 是否有中央空调 房屋配套
Electrical 电器系统配置标准 房屋配套
1stFlrSF 一楼面积 设计及装修
2ndFlrSF 二楼面积 设计及装修
LowQualFinSF 所有楼层中低质量施工面积 设计及装修
GrLivArea 地上居住面积 设计及装修
BsmtFullBath 地下室标准卫生间个数 房屋配套
BsmtHalfBath 地下室简易卫生间个数 房屋配套
FullBath 地上楼层标准卫生间个数 房屋配套
HalfBath 地上楼层简易卫生间个数 房屋配套
BedroomAbvGr 地上楼层卧室个数 房屋配套
KitchenAbvGr 地上楼层厨房个数 房屋配套
KitchenQual 厨房质量评估 评估结果
TopRmsAbvGrd 地上楼层房间总数(除去卧室) 设计及装修
Functional 房屋功能情况 设计及装修
Fireplaces 壁炉个数 设计及装修
FireplaceQu 壁炉质量 评估结果
GarageType 车库位置 设计及装修
GarageYrBlt 车库建成年份 时间
GarageFinish 车库内部装饰情况 设计及装修
GarageCars 车库容量 设计及装修
GarageArea 车库占地面积 设计及装修
GarageQual 车库质量 评估结果
GarageCond 车库条件 评估结果
PavedDrive 车道施工方式 设计及装修
WoodDeckSF 木甲板面积 设计及装修
OpenPorchSF 开放式门廊面积 设计及装修
EnclosedPorch 封闭式门廊面积 设计及装修
3SsnPorch 三季门廊面积 设计及装修
ScreenPorch 纱窗门廊面积 设计及装修
PoolArea 游泳池面积 设计及装修
PoolQC 游泳池质量 评估结果
Fence 栅栏质量 评估结果
MiscFeature 其他配套设施(网球场、电梯…) 房屋周边
MiscVal 其他配套设施的费用 房屋周边
MoSold 销售月份 交易信息
YrSold 销售年份 交易信息
SaleType 支付方式 交易信息
SaleCondition 房屋出售的情况 交易信息
# str(ames)

4、数据处理

# 查看缺失值
missing1 <- colSums(is.na(ames))
missing1
           Id    MSSubClass      MSZoning   LotFrontage       LotArea 
            0             0             0           259             0 
       Street         Alley      LotShape   LandContour     Utilities 
            0          1369             0             0             0 
    LotConfig     LandSlope  Neighborhood    Condition1    Condition2 
            0             0             0             0             0 
     BldgType    HouseStyle   OverallQual   OverallCond     YearBuilt 
            0             0             0             0             0 
 YearRemodAdd     RoofStyle      RoofMatl   Exterior1st   Exterior2nd 
            0             0             0             0             0 
   MasVnrType    MasVnrArea     ExterQual     ExterCond    Foundation 
            8             8             0             0             0 
     BsmtQual      BsmtCond  BsmtExposure  BsmtFinType1    BsmtFinSF1 
           37            37            38            37             0 
 BsmtFinType2    BsmtFinSF2     BsmtUnfSF   TotalBsmtSF       Heating 
           38             0             0             0             0 
    HeatingQC    CentralAir    Electrical      1stFlrSF      2ndFlrSF 
            0             0             1             0             0 
 LowQualFinSF     GrLivArea  BsmtFullBath  BsmtHalfBath      FullBath 
            0             0             0             0             0 
     HalfBath  BedroomAbvGr  KitchenAbvGr   KitchenQual  TotRmsAbvGrd 
            0             0             0             0             0 
   Functional    Fireplaces   FireplaceQu    GarageType   GarageYrBlt 
            0             0           690            81            81 
 GarageFinish    GarageCars    GarageArea    GarageQual    GarageCond 
           81             0             0            81            81 
   PavedDrive    WoodDeckSF   OpenPorchSF EnclosedPorch     3SsnPorch 
            0             0             0             0             0 
  ScreenPorch      PoolArea        PoolQC         Fence   MiscFeature 
            0             0          1453          1179          1406 
      MiscVal        MoSold        YrSold      SaleType SaleCondition 
            0             0             0             0             0 
    SalePrice 
            0 
# 选择分析对象
data <- ames %>% 
  select(
    SalePrice,
    Neighborhood,
    GrLivArea,
    YearBuilt
  )
data
# A tibble: 1,460 × 4
   SalePrice Neighborhood GrLivArea YearBuilt
       <dbl> <chr>            <dbl>     <dbl>
 1    208500 CollgCr           1710      2003
 2    181500 Veenker           1262      1976
 3    223500 CollgCr           1786      2001
 4    140000 Crawfor           1717      1915
 5    250000 NoRidge           2198      2000
 6    143000 Mitchel           1362      1993
 7    307000 Somerst           1694      2004
 8    200000 NWAmes            2090      1973
 9    129900 OldTown           1774      1931
10    118000 BrkSide           1077      1939
# ℹ 1,450 more rows
# 查看缺失值
missing2 <- colSums(is.na(data))
missing2
   SalePrice Neighborhood    GrLivArea    YearBuilt 
           0            0            0            0 
# 删除缺失值
# data <- data %>% 
#   drop_na()
# missing3 <- colSums(is.na(data))
# missing3

5、数据分析

5.1、各区域的房屋数量和价格均值

#  data %>% count(Neighborhood)
neighborhood_counts <- data %>%
  count(Neighborhood) %>%
  arrange(desc(n))
print(neighborhood_counts)
# A tibble: 25 × 2
   Neighborhood     n
   <chr>        <int>
 1 NAmes          225
 2 CollgCr        150
 3 OldTown        113
 4 Edwards        100
 5 Somerst         86
 6 Gilbert         79
 7 NridgHt         77
 8 Sawyer          74
 9 NWAmes          73
10 SawyerW         59
# ℹ 15 more rows
data %>% 
  group_by(Neighborhood) %>% 
  summarise(
    mean_sale = mean(SalePrice)
  ) %>% 
  
  ggplot(
    aes(x = mean_sale, y = fct_reorder(Neighborhood, mean_sale))
  ) +
  geom_col(aes(fill = mean_sale < 180000),show.legend = FALSE) +
  geom_text(aes(label = round(mean_sale, 0)), hjust = 1) +
  scale_x_continuous(
    expand = c(0, 0),
    labels = scales::dollar
  ) +
  #scale_fill_viridis_d(option = "D") + 
  scale_fill_manual(values = c("TRUE" = "Gray", "FALSE" = "Pink")) +
  theme_classic() +
  labs(x = "价格", y = "位置")

5.2、房屋价格均值趋势

# 对数据进行汇总,计算每年建造房屋的平均售价
summarized_data <- data %>%
  group_by(YearBuilt) %>%
  summarise(AverageSalePrice = mean(SalePrice, na.rm = TRUE))

# 创建时间趋势图
ggplot(summarized_data, aes(x = YearBuilt, y = AverageSalePrice)) +
  geom_line() + # 绘制线条图
  geom_point() + # 在数据点上添加标记
  labs(
    title = "房屋价格均值",
    x = "年份",
    y = "均值"
  ) +
  geom_line(color = "#1f77b4", size = 0.5) + # 设置线条颜色和粗细
  geom_point(color = "#1f77b4", size = 1) + # 设置点的颜色和大小
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16), # 自定义标题
    axis.title = element_text(size = 14), # 自定义轴标题
    axis.text = element_text(size = 12), # 自定义轴文本
    panel.grid.major = element_line(colour = "#d3d3d3", size = 0.5) # 添加网格线
  ) +
  theme_minimal() + # 使用简洁的主题
  scale_y_continuous(labels = scales::label_dollar())
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.
Warning: The `size` argument of `element_line()` is deprecated as of ggplot2 3.4.0.
ℹ Please use the `linewidth` argument instead.

5.3、房屋面积和价格的关系

# 创建面积与价格的散点图,并添加拟合曲线
ggplot(data, aes(x = GrLivArea, y = SalePrice)) +
  geom_point(alpha = 0.6, color = "#1f77b4") +  # 绘制半透明散点
  geom_smooth(method = "lm", col = "#ff7f0e", se = FALSE) +  # 添加线性拟合曲线(无置信区间)
  labs(
    title = "房屋面积与价格的关系",
    x = "房屋面积",
    y = "价格"
  ) +
  theme_minimal() +  # 应用简洁主题
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16),  # 自定义标题样式
    axis.title = element_text(size = 14),  # 自定义轴标题大小
    axis.text = element_text(size = 12),  # 自定义轴文本大小
    panel.grid.major = element_line(colour = "#d3d3d3", size = 0.5)  # 添加网格线
  ) +
  scale_y_continuous(labels = scales::label_dollar()) +  # 格式化y轴标签为美元
  coord_cartesian(xlim = c(0, max(data$GrLivArea) * 1.1), ylim = c(0, max(data$SalePrice) * 1.1))  # 稍微扩展坐标轴范围,避免数据点紧贴边缘
`geom_smooth()` using formula = 'y ~ x'