新闻详情

新闻详情

首页 / 资讯中心 / 详情

R语言钻石价格分析:54000条数据揭示反直觉结论与回归建模

发布时间:2026/9/27 5:35:26来源:尧图网络
R语言钻石价格分析:54000条数据揭示反直觉结论与回归建模
简介这份资源面向R语言数据分析初学者与统计建模爱好者围绕ggplot2自带的diamonds数据集展开钻石价格分析帮助读者掌握从数据清洗到多元线性回归预测的完整流程。压缩包内为1个docx文档约2.4MB内容涵盖数据整体信息查看、缺失值与重复值检验、箱线图异常值剔除、价格直方图与核密度曲线分析以及切割质量、颜色、净度、克拉重量等变量与价格关系的可视化探索。文档还演示了定性变量因子化、新变量构造、简单线性回归与多元回归建模并给出克拉数每增加一克拉价格预期上涨约7760美元的结论可用于理解回归分析、特征筛选与价格预测思路。目前已有283人学习下载适合作为课程作业、数据分析练习或回归建模入门的参考案例。1. 钻石价格分析-基于R语言54000条数据里藏着多少反直觉结论买钻石这件事很多人默认一条铁律切工越好、颜色越透、净度越高价格就越贵。但真把 R 语言 ggplot2 包自带的 diamonds 数据集拉出来跑一遍你会发现事情没那么简单——理想切割Ideal的钻石里照样有一大批价格趴在地板上。这个数据集收录了约 54000 颗钻石的十项指标包括克拉重量 carat、切工 cut、颜色 color、净度 clarity、深度 depth、台宽 table以及长宽深 x/y/z 三个尺寸价格 price 从 326 美元到 18823 美元不等。它适合谁适合正在学 R 语言回归分析、想做完整数据清洗到建模预测闭环的人也适合想拿一个真实业务场景练手 ggplot2 数据可视化的从业者。下面我从数据读取一路拆到交互项回归模型把能复现的步骤和踩过的坑都摆出来。2. 数据加载与清洗从内置数据集到可建模的干净表2.1 加载 diamonds 并做第一轮体检diamonds 是 ggplot2 的内置数据集不需要额外下载 CSV但前提是 ggplot2 已经装好。我一般会先确认包版本再走一遍结构探查避免后面建模时才发现字段类型不对。# 安装并加载 ggplot2若尚未安装 if (!require(ggplot2)) install.packages(ggplot2) library(ggplot2) # 加载 diamonds 数据集 data(diamonds) # 查看前六行与后六行 head(diamonds) tail(diamonds) # 查看数据结构与各列类型 str(diamonds) # 总览维度、列名、类型、缺失情况 summary(diamonds)这段代码的逻辑很直白data(diamonds)把数据集挂到当前环境str()告诉你每列是 numeric 还是 Factorsummary()一次性给出连续变量的分位数和离散变量的频次。参数上没什么可调的但要注意summary()对因子型变量只给计数不会给均值所以 cut、color、clarity 的分布得另外用table()看。2.2 缺失值与重复值的排查很多人拿到数据第一反应是直接建模但 diamonds 虽然号称干净仍然值得走一遍缺失值和重复值检查。缺失值用 mice 包的md.pattern()可视化最直观重复值用duplicated()配合sum()统计。# 缺失值模式可视化 if (!require(mice)) install.packages(mice) library(mice) md.pattern(diamonds) # 统计重复行数量 sum(duplicated(diamonds)) # 去重若有重复 diamonds_clean - diamonds[!duplicated(diamonds), ]md.pattern()返回一个矩阵左侧数字表示该缺失模式下样本数右侧 1 表示有值、0 表示缺失。diamonds 跑出来全是 1说明无缺失。duplicated()返回逻辑向量sum()统计 TRUE 的个数。这里有个细节diamonds 原始数据没有重复行但如果你自己合并了外部数据这一步就不能省。2.3 异常值识别与剔除的边界异常值处理是钻石价格分析里最容易翻车的地方。箱线图能直观看到偏离三个标准差之外的点但直接一刀切剔除会损失真实的高价钻石样本。我的做法是先标记、再评估、最后决定是否剔除。# 绘制价格箱线图 boxplot(diamonds$price, main 钻石价格箱线图, ylab 价格美元) # 用 IQR 规则标记异常值 Q1 - quantile(diamonds$price, 0.25) Q3 - quantile(diamonds$price, 0.75) IQR_val - Q3 - Q1 lower_bound - Q1 - 1.5 * IQR_val upper_bound - Q3 1.5 * IQR_val # 查看超出边界的样本量 sum(diamonds$price lower_bound | diamonds$price upper_bound) # 剔除异常值谨慎使用 diamonds_no_outlier - diamonds[diamonds$price lower_bound diamonds$price upper_bound, ]IQR 规则里 1.5 倍是常规阈值3 倍是极端异常值阈值。参数怎么改如果你的业务场景里高价钻石本身就是分析目标建议用 3 倍 IQR 而不是 1.5 倍否则会把真正有预测价值的样本删掉。这一步没有后悔药删之前一定先看剔除前后的样本量差异。3. 描述性统计与 ggplot2 可视化价格分布到底偏成什么样3.1 价格直方图与核密度曲线价格分布是右偏的这个结论几乎每篇钻石分析都会提但偏到什么程度、峰值在哪得自己画出来才算数。library(ggplot2) # 价格直方图 核密度曲线 正态曲线 ggplot(diamonds, aes(x price)) geom_histogram(aes(y ..density..), bins 50, fill steelblue, alpha 0.6) geom_density(color red, size 1) stat_function(fun dnorm, args list(mean mean(diamonds$price), sd sd(diamonds$price)), color darkgreen, linetype dashed) labs(title 钻石价格分布, x 价格美元, y 密度) theme_minimal()bins 50控制直方图柱子数量太多会碎、太少会糊50 在这个量级下比较均衡。..density..把纵轴从计数转成密度才能和核密度曲线、正态曲线叠在同一坐标系。红色核密度曲线在 1000 美元左右出现峰值2000、4000、8000 美元附近有断层说明这些价位段存在市场心理定价或分级跳档。3.2 克拉重量与价格的散点关系克拉和价格正相关是常识但散点图会告诉你这种关系不是线性的而且离散程度随克拉增大而扩大。ggplot(diamonds, aes(x carat, y price)) geom_point(alpha 0.3, color darkorange) geom_smooth(method lm, color blue) labs(title 克拉重量与价格关系, x 克拉, y 价格美元) theme_minimal()alpha 0.3让重叠点透明化否则 54000 个点会糊成一团。geom_smooth(method lm)加线性拟合线你能看到整体趋势向上但局部波动很大。常见做法是再按 cut 或 color 分面看不同等级下的斜率差异。3.3 分类型变量的箱线图与小提琴图切工、颜色、净度对价格的影响用箱线图和小提琴图一起看最清楚。小提琴图能展示分布形状箱线图能标出中位数和四分位距。# 切工与价格的小提琴图价格取对数 ggplot(diamonds, aes(x cut, y log(price), fill cut)) geom_violin(trim FALSE) labs(title 不同切工等级的价格分布对数, x 切工, y log(价格)) theme_minimal() # 颜色与价格的箱线图 ggplot(diamonds, aes(x color, y price, fill color)) geom_boxplot() labs(title 不同颜色等级的价格分布, x 颜色, y 价格美元) theme_minimal()价格取对数是因为原始尺度下高价样本会把箱线图压扁。小提琴图trim FALSE保留尾部数据能看到理想切割里确实有一批低价样本。颜色从 J 到 D 价格中位数基本上升但净度 I1 反而比 SI2 高说明净度到达优质区间后价格更多由克拉和切工决定。4. 回归建模从简单线性到含交互项的多元模型4.1 变量类型转换与新特征构造cut、color、clarity 是定性变量必须转成 factor 才能进回归模型。另外可以构造一些衍生指标比如体积或深度比例帮助模型捕捉更多信息。# 定性变量转 factor diamonds$cut - as.factor(diamonds$cut) diamonds$color - as.factor(diamonds$color) diamonds$clarity - as.factor(diamonds$clarity) # 构造新变量体积近似 diamonds$volume - diamonds$x * diamonds$y * diamonds$z # 查看转换后结构 str(diamonds)as.factor()让 R 在回归时自动生成哑变量。volume用 x、y、z 相乘得到比单独放三个尺寸更简洁。注意 volume 为 0 的样本x/y/z 有 0 值要检查可能是录入错误。4.2 简单线性回归克拉数单独预测价格先用 carat 一个变量建模型看基准表现。# 简单线性回归 lm_simple - lm(price ~ carat, data diamonds) summary(lm_simple)summary()输出里重点看三处Coefficients 的 Estimate 是回归系数Pr(|t|) 是 p 值Multiple R-squared 是拟合优度。carat 系数约 7760意味着每增加一克拉价格预期增加约 7760 美元p 值远小于 0.001。但 R² 只有 0.85 左右说明克拉单独解释力度有限。4.3 无交互项多元回归与 R² 瓶颈把 cut、color、clarity、depth、table 都加进去看 R² 能提升多少。# 无交互项多元线性回归 lm_multi - lm(price ~ carat cut color clarity depth table volume, data diamonds) summary(lm_multi)跑出来 R² 约 0.88比简单回归好但提升幅度不大。原因在于 cut、color、clarity 和 carat 之间存在交互效应——克拉越大切工和颜色对价格的影响越明显。无交互项模型把这种效应平均掉了所以拟合不够理想。4.4 含交互项的逐步回归与 AIC 筛选加入 carat:cut、carat:color、carat:clarity 三个交互项再用向后逐步回归结合 AIC 准则选变量。# 含交互项的完整模型 lm_interact - lm(price ~ carat * cut carat * color carat * clarity depth table volume, data diamonds) # 向后逐步回归 lm_step - step(lm_interact, direction backward) # 查看最终模型 summary(lm_step)carat * cut是carat cut carat:cut的简写自动展开主效应和交互项。step()按 AIC 从大到小逐步剔除变量AIC 越小模型越好。跑完你会发现所有变量都被保留说明交互项确实有贡献。R² 提升到 0.95 以上残差分布也更接近正态。5. 避坑与排查钻石回归分析里最容易翻车的五件事5.1 现象R² 很高但预测新数据误差巨大原因模型过拟合交互项太多导致方差膨胀。解决用car::vif()检查方差膨胀因子VIF 大于 10 的变量考虑剔除或者改用交叉验证评估泛化误差。5.2 现象cut 的系数方向与直觉相反原因R 默认以第一个因子水平为基准cut 的基准是 Fair系数解释的是相对 Fair 的变化。解决用relevel()把 Ideal 设为基准或者直接看contrasts()确认编码方式。5.3 现象volume 为 0 的样本导致回归报错或系数异常原因x、y、z 中存在 0 值相乘后 volume 为 0取对数或标准化时出错。解决建模前用sum(diamonds$x 0 | diamonds$y 0 | diamonds$z 0)统计把这些样本单独检查或剔除。5.4 现象逐步回归跑完变量全被保留AIC 没降原因交互项之间高度共线AIC 无法通过剔除单个变量改善。解决改用 LASSO 或 Ridge 回归做正则化筛选或者手动构造更有业务含义的组合特征。5.5 现象箱线图显示大量异常值剔除后模型 R² 反而下降原因高价钻石本身就是价格分布的一部分剔除后样本偏向低价区间模型失去对高价段的预测能力。解决不要盲目剔除改用稳健回归如MASS::rlm()或对价格取对数后再建模。6. 模型验证与进阶技巧交叉验证、残差诊断与对数变换模型建完不算完得验证它在新数据上到底能不能用。我一般会走三步残差诊断、交叉验证、对数变换对比。# 残差诊断图 par(mfrow c(2, 2)) plot(lm_step) par(mfrow c(1, 1)) # 10 折交叉验证 if (!require(caret)) install.packages(caret) library(caret) set.seed(123) train_control - trainControl(method cv, number 10) cv_model - train(price ~ carat * cut carat * color carat * clarity volume, data diamonds, method lm, trControl train_control) print(cv_model) # 对数变换后的模型对比 lm_log - lm(log(price) ~ carat * cut carat * color carat * clarity volume, data diamonds) summary(lm_log)plot(lm_step)四张图分别看残差 vs 拟合值、正态 Q-Q、标准化残差 vs 拟合值、残差 vs 杠杆值。理想情况下残差随机分布、Q-Q 点贴近直线。trainControl(method cv, number 10)做 10 折交叉验证train()返回的 RMSE 和 Rsquared 比单次 R² 更可信。对数变换后模型 R² 通常更高残差也更接近正态但系数解释要换成“价格对数每增加一个单位”而不是“价格每增加一美元”。验证方法关注指标判断标准残差诊断残差 vs 拟合值无明显漏斗或曲线趋势10 折交叉验证RMSE、RsquaredRMSE 越小、Rsquared 越接近 1 越好对数变换对比残差正态性Q-Q 点越贴近直线越好有个细节值得单独说交叉验证的set.seed(123)必须固定否则每次跑出来的 RMSE 都不一样没法对比模型。我一般会把种子、折数、模型公式写在一个脚本里方便复现。从那以后我每次跑回归之前都强制走一遍“缺失值→重复值→异常值→类型转换→交互项”这条流水线少一步后面就得返工。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

音乐类网站开发报价全解析:3档预算方案助你避开隐形坑 2026/9/27 6:29:24

音乐类网站开发报价全解析:3档预算方案助你避开隐形坑

音乐类网站开发报价全解析:3档预算方案助你避开隐形坑 网站做好了没人访问,这是无数音乐人最心碎的噩梦。你花了大几万,请人把页面做得流光溢彩,结果上线三个月,后台流量统计还是个位数。很多人把锅甩给推广,但真相往往更残酷:…

阅读更多 →
债券流动性风险剖析:市场深度指标计算与DeepSeek预警实战 2026/9/27 6:29:17

债券流动性风险剖析:市场深度指标计算与DeepSeek预警实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
MCP和CLI 2026/9/27 6:29:11

MCP和CLI

大家好,我是荷兰豆 昨晚刷视频看到一个视频在讲CLI和MCP的优缺点,讲到cli替代mcp 先了解MCP: MCP:让应用与工具按统一规则交流的协议 MCP 全称是 Model Context Protocol。 假设你希望一个 AI 助手能够调用这个Text2SQL。它需要…

阅读更多 →
11、Linux 系统引导与 Systemd 服务管理详解 2026/9/27 6:29:11

11、Linux 系统引导与 Systemd 服务管理详解

一、Linux 系统引导过程Linux 系统从加电到进入登录界面,需要经历一系列引导步骤。下面按阶段梳理完整的引导流程。1. 加电开机自检过程:系统开机后,通过 BIOS 对 CPU、内存、显卡、键盘等设备进行初步检测,检测成功后根据 BIOS 设…

阅读更多 →
BugKu——Crack it 2026/9/27 6:29:04

BugKu——Crack it

一、题目二、方法下载得到一个show修改文件后缀,改txt,得到的以下内容:root:$6$HRMJoyGA$26FIgg6CU0bGUOfqFB0Qo9AE2LRZxG8N3H.3BK8t49wGlYbkFbxVFtGOZqVIq3qQ6k0oetDbn2aVzdhuVQ6US.:17770:0:99999:7:::这是 Linux 的 /etc/shadow 文件格式&…

阅读更多 →
3招看懂html静态网页源代码,避开建站报价大坑 2026/9/27 6:29:04

3招看懂html静态网页源代码,避开建站报价大坑

3招看懂html静态网页源代码,避开建站报价大坑 找建站公司怕被坑高价?这大概是每个准备做网站的人最头疼的事。市面上 建站报价 水分太大,有的公司收你两万块,做出来的东西连个像样的 html静态网页源代码…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉