【Python可视化实战】钻石数据可视化

news2024/11/17 21:44:40

一、项目引言

1.背景和目标

钻石作为一种珍贵的宝石,其价格受到多种因素的影响。为了深入了解钻石价格的决定因素,我们收集了大量关于钻石的数据,并希望通过数据可视化来揭示钻石特征与价格之间的关系。

2.内容

  • 收集钻石的各项特征数据,包括重量、颜色、刀工等。
  • 利用这些数据,我们进行初步的数据清洗和整理。
  • 使用Matplotlib和Seaborn进行数据可视化,探索各特征与钻石价格之间的关系。

3.技术方案和工具

  • Python编程语言:用于数据处理和可视化。
  • Matplotlib库:用于创建基础图表。
  • Seaborn库:用于创建高级统计图形。
  • Pandas库:用于数据处理和分析。
  • NumPy库:用于数值计算。

二、数据准备

1.数据源

我们使用的是ggplot2提供的经典的diamonds数据集,描述了不同钻石的结构特征及其价格。

2. 数据预处理

2.1 数据导入

import pandas as pd
import numpy as np
diamonds = pd.read_csv('./data/diamonds.csv')
diamonds.head(5)

删除没有意义的列 

diamonds.drop(diamonds.columns[0],axis=1,inplace=True)
diamonds.head(5)

 通过info()函数我们可以看所有列数据的类型信息:

diamonds.info()

数据集包含53940个样本,共有10个变量,其中有6个浮点型(float)变量、1个整型(int)变量和3个对象型(object)变量,不存在缺失值,目标标量为price,每个变量对应的含义如下所示: 

三、可视化分析 

3.1导入库 

import seaborn as sns
import matplotlib.pyplot as plt
# notebook格式,放大横纵坐标标记,显示刻度,更容易看清
sns.set_context("notebook",font_scale=1) 
sns.set_style('ticks')
# 配色使用Set2
sns.set_palette('Set2')      
#以内嵌方式画图
%matplotlib inline

3.2 数值变量描述性统计分析

f,axarr = plt.subplots(2,4,figsize=(15,10))
sns.boxplot(y='carat',data=diamonds,ax=axarr[0,0])
sns.boxplot(y='depth',data=diamonds,ax=axarr[0,1])
sns.boxplot(y='table',data=diamonds,ax=axarr[0,2])
sns.boxplot(y='price',data=diamonds,ax=axarr[0,3])
sns.boxplot(y='x',data=diamonds,ax=axarr[1,0])
sns.boxplot(y='y',data=diamonds,ax=axarr[1,1])
sns.boxplot(y='z',data=diamonds,ax=axarr[1,2])
plt.tight_layout()

我们看到所有变量都存在许多异常值。在之后的模型构建中,某些模型的训练易受到异常值的影响。(例如第六七张图差异过大,五为正常)

3.3 非数值变量描述性统计分析

sns.countplot(x='cut',data=diamonds)
plt.tight_layout()

大部分的钻石的切工还是比较理想的。我们还可以分析不同切工的钻石的价格情况,切工似乎跟价格并不成正比关系。 

sns.barplot(x='cut',y='price',data=diamonds)

sns.countplot(y='color',data=diamonds)

sns.countplot(x='clarity',data=diamonds)

3.4 相关性分析

sns.jointplot(x='carat',y='depth',height=8,alpha =.25,color='g',data=diamonds)
sns.jointplot(x='carat',y='price',height=8,alpha =.25,color='g',data=diamonds)
plt.tight_layout()

第一行代码创建了一个联合分布图,展示了 carat(钻石的重量)和 depth(钻石的深度)之间的关系。该图具有8的高度,使用绿色表示,并设置了0.25的透明度,以便观察重叠部分。第二行代码创建了另一个联合分布图,展示了 carat 和 price(钻石的价格)之间的关系。同样,该图具有8的高度,使用绿色表示,并设置了0.25的透明度。使用 plt.tight_layout() 函数调整图形布局,确保所有图形元素正确地定位。目的是通过绘制联合分布图来探索和理解钻石数据集中不同变量之间的关系,从而更好地理解数据集和进行进一步的数据分析。

我们可以看到caratprice存在正相关关系,证明钻石价格很大程度上与钻石的克拉重量有关,这也符合我们的实际经验。

在Seaborn中,存在pairplot函数,可以将所有变量之间的相关关系一并画出并分析。pariplotPairGrid的一个包装函数,它提供了Seaborn一个重要的抽象功能——Grid。Seaborn的Grid将Matplotlib中Figure和数据集中的变量联系起来了。

我们有两种方式可以和grids进行交互操作。其一,Seaborn提供了类似于pairplot的包装函数,它提前设置了许多常见任务的参数;其二,如果你需要更多的自定义选项,那么你可以直接利用Grid方法。

sns.pairplot(diamonds,hue='cut')

3.5 异常值处理与grids交互

 选取数值

diamonds_num = diamonds.select_dtypes(include=[np.number])
diamonds_num.head(5)

去掉异常值

diamonds_cl = diamonds_num[(diamonds_num > diamonds_num.quantile(.05)).all(1) & (diamonds_num < diamonds_num.quantile(.95)).all(1)]
diamonds_cl.head(5)

制图 

def core(diamonds, alpha=.05):
    mask = (diamonds > diamonds.quantile(alpha)).all(1) & (diamonds_cl < diamonds.quantile(1 - alpha)).all(1)
    return diamonds[mask]



cmap = sns.cubehelix_palette(as_cmap=True, dark=0, light=1, reverse=True)

(diamonds.select_dtypes(include=[np.number])
   .pipe(core)
   .pipe(sns.PairGrid)
   .map_upper(plt.scatter, marker='.', alpha=.25)
   .map_diag(sns.kdeplot)
   .map_lower(plt.hexbin, cmap=cmap, gridsize=20)
)

这段代码是使用Python的Seaborn库和Matplotlib库对“diamonds”数据集进行可视化的。Seaborn是基于matplotlib的高级接口,它提供了一种方便的方法来创建复杂的统计图形。让我们逐步分析代码的各个部分:(1)代码创建了一个颜色映射(colormap)对象,名为“cmap”,它使用cubehelix颜色方案。这种颜色方案在数据可视化中很常用,因为它在视觉上更吸引人,并且可以更好地表示数据的层次结构。(2)代码选择了数据框“diamonds”中所有数值型的数据列。这是为了确保我们只处理数值型数据,忽略分类数据或其他非数值型数据。(3)使用.pipe()方法将上一步的结果传递给名为“core”的函数或方法。这个“core”函数或方法的具体细节并未在代码中给出。(4)将结果传递给Seaborn的PairGrid类,创建一个网格,其中每个单元格都表示一对特征之间的联合分布。在网格的上部分,为每个单元格添加散点图,其中数据点用点(.)表示,透明度设置为0.25。在网格的对角线上,为每个单元格添加核密度估计图(KDE)。核密度估计是一种可视化单变量分布的方法。最后在网格的下部分,为每个单元格添加六边形bin图(hexbin)。这用于显示两个变量之间的联合分布。颜色映射(cmap)应用于六边形bin图,而gridsize参数定义了每个六边形的网格大小。

g = sns.FacetGrid(diamonds, row='cut', aspect=4, height=2, margin_titles=True)
g.map(sns.kdeplot, 'price', shade=True, color='g')
for ax in g.axes.flat:
    ax.yaxis.set_visible(False)
sns.despine(left=True)
g.fig.subplots_adjust(hspace=0.1)
g.set(xlim=(0, 15000))
plt.tight_layout()

FaceGrid可以通过控制分面变量来生成Grid图形,其中PairGrid是它的一个特例。接下来的案例中,我们将以数据集中的cut变量为分面变量来绘制图像:

最后一个案例展示了如何将Seaborn和Matplotlib结合起来。g.axesmatplotlib.Axes的一个数组,g.figmatplotlib.Figure的一个特例。这是使用Seaborn时常见的一个模式:利用Seaborn的方法来绘制图像,然后再利用Matplotlib来调整细节部分。 我认为Seaborn之所以吸引人是因为它的绘图语法具有很强的灵活性。你不会被作者所设定的图表类型所局限住,你可以根据自己的需要创建新的图表。

agged = diamonds.groupby(['cut', 'color']).mean().sort_index().reset_index()

g = sns.PairGrid(agged, x_vars=agged.columns[2:], y_vars=['cut', 'color'],
                height=5, aspect=.65)
g.map(sns.stripplot, orient="h", size=10, palette='Blues_d')
plt.tight_layout()

最后我们来画出在不同颜色的钻石中,克拉重量与价格的关系:

g = sns.FacetGrid(diamonds, col='color', hue='color', col_wrap=4)
g.map(sns.regplot, 'carat', 'price')

 

四、项目总结

本次项目的目标是深入了解钻石价格的决定因素,通过收集大量关于钻石的数据,并利用数据可视化技术来揭示钻石特征与价格之间的关系。在项目实施过程中,我们首先收集了钻石的各项特征数据,包括重量、颜色、刀工等。接下来,我们对这些数据进行了初步的数据清洗和整理,以确保数据的准确性和可靠性。为了更好地探索各特征与钻石价格之间的关系,我们采用了Matplotlib和Seaborn这两个强大的数据可视化库。通过创建散点图、核密度估计图和六边形bin图等多种图形,我们能够直观地展示钻石特征与价格之间的关系。通过本次项目,我们成功地揭示了钻石特征与价格之间的潜在关系,为相关行业的从业人员提供了有价值的参考信息。同时,我们也锻炼了数据处理和分析能力,加深了对数据可视化的理解和应用。最后,本次项目达到了预期的目标,为探索钻石价格的决定因素提供了有益的视角。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1359291.html

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

相关文章

【NR技术】 NR多连接处理流程(Multi-Connectivity operation)

1 概述 本文描述NR多连接处理流程。 2 辅节点添加Secondary Node Addition 2.1 EN-DC en-gNB由gNB-CU和gNB-DU组成&#xff0c;下图给出了EN-DC中SgNB的添加过程。 图1 SgNB addition procedure in EN-DC MN决定请求SN为特定的E-RAB分配资源&#xff0c;表明E-RAB的特征(E…

openGauss + Datakit

openGauss Datakit 1. 简介1.1 openGauss1.2 Datakit 2. 环境准备2.1 支持系统2.2 安装包获取2.3 注意事项2.4 系统环境设置 3. openGauss 安装3.1 创建用户和组3.2 创建工作目录3.3 关闭HISTORY记录/关闭交换内存3.4 解压安装包3.5 安装3.6 启动数据库3.7 连接数据库3.8 添加…

使用Go语言的HTTP客户端库进行API调用

随着微服务架构和RESTful API的普及&#xff0c;API调用成为了日常开发中的常见任务。Go语言提供了多种工具和库来帮助开发者轻松地与API进行交互。本文将介绍如何使用Go语言的HTTP客户端库进行API调用。 在Go语言中&#xff0c;标准库中的net/http包提供了基本的HTTP客户端功…

Nginx(十五) proxy_pass和proxy_redirect指令的组合测试

Nginx反向代理配置文件参数详解请参考 Nginx(十三) 配置文件详解 - 反向代理&#xff08;超详细&#xff09; 测试1&#xff1a;proxy_redirect http://127.0.0.1:8080/three/ http://www.read*******l.cn:8688/four/; http {server {listen 8688;server_name www.read****…

汇编 8259 中断实验

汇编 8259 中断实验 一、实验目的 &#xff08;1&#xff09;掌握微机中断处理系统的基本原理。 &#xff08;2&#xff09;掌握8259中断控制器的工作原理&#xff0c;学会编写中断服务程序。 &#xff08;3&#xff09;掌握8259级联方式的使用方法。 二、实验设备 &#x…

企业级实践为“燃料”,大模型助推Kyligence产品力向上

回顾2023年&#xff0c;最火热的科技话题无疑是生成式AI。 从ChatGPT横空出世&#xff0c;到“千模大战”如火如荼&#xff0c;AIGC正式破圈&#xff0c;成为企业数字化转型的新关键词。 在红杉中国《2023企业数字化年度指南》中&#xff0c;通过调研235家企业可知&#xff0…

Eclipse先关的一些配置

启动配置设置 配置项详细说明&#xff1a; -Xms&#xff1a;初始堆内存大小&#xff0c;设定程序启动时占用内存大小&#xff0c;默认物理内存1/64 -Xms -XX:InitialHeapSiz-Xmx&#xff1a;最大堆内存&#xff0c;设定程序运行期间最大可占用的内存大小。如果程序运行需要…

软件测试|SQL中的null值,该如何理解?

深入理解SQL中的Null值&#xff1a;处理缺失数据的重要概念 简介 Null值在SQL中是用于表示缺失或未知数据的特殊值。本文将深入探讨Null值的概念、处理方法和注意事项&#xff0c;以帮助读者更好地理解和处理SQL中的缺失数据。 在SQL数据库中&#xff0c;Null值是一种特殊的…

BEV+Transformer感知架构共识下,传感器「火药味」再升级

高阶智能驾驶战火愈演愈烈&#xff0c;正带动感知方案卷入新一轮军备竞赛。 根据高工智能汽车研究院最新发布数据显示&#xff0c;2023年1-9月&#xff0c;中国市场&#xff08;不含进出口&#xff09;乘用车前装标配&#xff08;软硬件&#xff09;NOA交付新车37.73万辆&…

Linux下NUMA 内存管理初步理解

LINUX 系统在多核下,以及NUMA架构技术下 如何管理物理内存? 经过初步了解 发现系统对内存有以下工作 1 映射 2 内存碎片 3 内存回收 4 内存池 5 冷热页 6 水位线和保留内存 7 支持内存条热插拔 8 大页管理 这些功能给人感觉,尤其是DBA感觉是重新实现了数据缓存池的功…

机器学习(三) -- 特征工程(1)

系列文章目录 机器学习&#xff08;一&#xff09; -- 概述 机器学习&#xff08;二&#xff09; -- 数据预处理&#xff08;1-3&#xff09; 机器学习&#xff08;三&#xff09; -- 特征工程&#xff08;1-2&#xff09; 未完待续…… 目录 系列文章目录 前言 一、特征…

大数据开发的专业术语

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列专栏目录 [Java项…

画中画视频剪辑:创意与技术的完美结合,批量制作视频不再难

随着科技的飞速发展&#xff0c;视频制作已成为信息时代的一种重要表达方式。其中画中画视频剪辑技术更是以其独特的创意性和技术性&#xff0c;为观众的视觉体验带来了全新的冲击。它不仅为创作者提供了更广阔的创意空间&#xff0c;同时也降低了视频制作的门槛。现在一起来看…

VSCode Jupyter print 函数输出在错误的单元格(cell)

问题描述 最近在复现一个开源项目时&#xff0c;发现执行过该项目中的代码单元格后&#xff0c;其余单元格的print函数输出也会续在该单元格后。而正常情况下print函数输出应该位于其所属的单元格。下图中&#xff0c;我将出现问题的单元格执行后清空了输出&#xff0c;但是在…

深度解析 Compose 的 Modifier 原理 -- Modifier.composed()、ComposedModifier

众所周知&#xff1a;原理性分析的文章&#xff0c;真的很难讲的通俗易懂&#xff0c;讲的简单了就没必要写了&#xff0c;讲的繁琐难懂往往大家也不乐意看&#xff0c;所以只能尽量找个好的角度&#xff08;比如从 Demo 代码示例出发&#xff09;慢慢带着大家去钻源码&#xf…

书生·浦语大模型全链路开源开放体系

书生浦语大模型全链路开源体系_哔哩哔哩_bilibili 大模型全链路开源开放体系等你来探索~ https://github.com/internLM/tutorial 书生浦语全链条开源开放体系 1&#xff09;数据: 书生万卷 2TB数据&#xff0c;并行训练&#xff0c;极致优化涵盖多种模态与任务 预训练: I…

聚道云软件连接器助力某动漫行业公司实现财务自动化

客户介绍 某动漫行业公司是一家专注于文化创意领域&#xff0c;致力于为人们提供独特、有趣的文化产品。公司拥有一支充满活力和创造力的团队&#xff0c;他们以卓越的创意和精湛的技术&#xff0c;创造出了一系列令人惊叹的作品。未来&#xff0c;该公司将继续秉承这一理念&a…

低代码开发平台支持复杂的业务逻辑和API对接吗

当今数字化时代&#xff0c;企业和组织面临着日益复杂的业务需求。为了应对这些挑战&#xff0c;低代码开发平台应运而生。白码低代码开发平台是一种高效、灵活且可扩展的开发工具&#xff0c;能够支持复杂的业务逻辑和第三方API对接&#xff0c;为企业带来更快速、更灵活的解决…

Rust 字符串 初步了解

rust 的字符串 。字符串不是复合类型&#xff0c; String 和 &str &#xff1a; String 具有所有权&#xff0c;是存储在堆上的。&str 没有所有权&#xff0c;是对 String 的引用。字符串字面量也是 &str 类型&#xff0c;存储在栈上。 切片&#xff08;slice&a…

线性代数 --- 为什么LU分解中L矩阵的行列式一定等于(+-)1?

以下是关于下三角矩阵L的行列式一定等于-1的一些说明 证明&#xff1a;在LU分解中&#xff0c;下三角矩阵L的行列式一定是. 在证明之前&#xff0c;我这里先补充几条关于行列式的性质&#xff1a; 性质1&#xff1a;对于三角矩阵而言&#xff0c;不论是上三角矩阵还是下三角矩…