钻石价格分析

一、数据描述

本文件探讨的数据集是有关钻石各种属性与价格,数据集中有53,943颗钻石,有10个特征(carat, cut, color, clarity, depth, table, price, x, y, z)。

数据集: ​​DiamondsPrices2022.csv​

1、数据集中变量特征

总共10个变量,其中3个为Object类型 [cut、 color 和 clarity],1个为整数(int64)类型[price],6个为数值(float64)类型[carat, depth, table, x, y, z]。

pandas 缺乏区分 str和object类型,都对应dtype('O')类型,既是强制类型为dtype('S')也无效。

Numpy 可以区分 str和object类型,dtype('O') 和 dtype('S')分别对应与 object 、str。

2、数据集中变量含义

变量

含义

范围

carat

钻石的重量,单位克拉

0.2-5.01

cut

切割质量

Fair(一般), Good(好), Very Good(非常好), Premium(优质), Ideal(理想)

color

钻石颜色

J (最差)到 D (最好)

clarity

钻石的透明度

I1(最差) ,SI2,SI1,VS2,VS1,VS2,VS1,IF (最好)

depth

总深度百分比

43-79

table

钻石顶部相对于最宽点的宽度,钻石的台面

43-95

price

钻石的美元价格,单位是美元

326-18823

x

钻石长度,单位mm

0-10.74

y

钻石宽度,单位mm

0-58.9

z

钻石深度,单位mm

0-31.8

二、问题提出

1、钻石中最常见的类别

2、不同属性与价格的相关度

3、每个分类的价格分布

三、数据预处理
1、数据预处理原因

原始数据存在以下问题:

1.不一致——数据内涵出现不一致情况

2.重复 3.不完整——感兴趣的属性没有值 4.含噪声——数据中存在着错误、或异常(偏离期望值)的数据 5.高维度

2、数据预处理的方法

方法

数据清洗

去掉噪声和无关数据

数据集成

将多个数据源中的数据结合起来存放在一个一致的数据存储中

数据变换

把原始数据转换成为适合数据挖掘的形式

数据归约

主要方法包括:数据立方体聚集,维归约,数据压缩,数值归约,离散化和概念分层等

3、数据预处理

在这里我们发现没有缺失值、也没有重复值,因此原始数据可以直接使用。

import pandas as pd

df = pd.read_csv('.dataDiamondsPrices2022.csv')
print(df.head()) # 数据集查看
# 数据统计信息
df.describe().to_excel(r'.resultdata1.xlsx')
print("-------------缺失值数量 可以发现该数据集中没有缺失值------------")
print(df.isnull().sum())
print("-------------数据类型统计--------------")
print(df.info())
print("-------------查看重复行数据 可以发现没有重复数据-----------------")
print(df[df.duplicated()])

输出结果

   Unnamed: 0  carat      cut color clarity  ...  table  price     x     y     z
0 1 0.23 Ideal E SI2 ... 55.0 326 3.95 3.98 2.43
1 2 0.21 Premium E SI1 ... 61.0 326 3.89 3.84 2.31
2 3 0.23 Good E VS1 ... 65.0 327 4.05 4.07 2.31
3 4 0.29 Premium I VS2 ... 58.0 334 4.20 4.23 2.63
4 5 0.31 Good J SI2 ... 58.0 335 4.34 4.35 2.75
[5 rows x 11 columns]
-------------缺失值数量 可以发现该数据集中没有缺失值-----------------
Unnamed: 0 0
carat 0
cut 0
color 0
clarity 0
depth 0
table 0
price 0
x 0
y 0
z 0
dtype: int64
-------------数据类型统计-----------------
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 53943 entries, 0 to 53942
Data columns (total 11 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Unnamed: 0 53943 non-null int64
1 carat 53943 non-null float64
2 cut 53943 non-null object
3 color 53943 non-null object
4 clarity 53943 non-null object
5 depth 53943 non-null float64
6 table 53943 non-null float64
7 price 53943 non-null int64
8 x 53943 non-null float64
9 y 53943 non-null float64
10 z 53943 non-null float64
dtypes: float64(6), int64(2), object(3)
memory usage: 4.5+ MB
None
-------------查看重复行数据 可以发现没有重复数据-----------------
Empty DataFrame
Columns: [Unnamed: 0, carat, cut, color, clarity, depth, table, price, x, y, z]
Index: []
四、数据可视化
1、导入模块与数据
color_palette()详解

默认6种颜色:deep,muted, pastel, bright, dark, colorblind seaborn, color_palette(palette=None, n_colors = None, desat = None)

import pandas as pd
from matplotlib import pyplot as plt

# 加这两行避免在plt中使用中文时报运行时错误 RuntimeWarning: Glyph 20363 missing from current font. font.set_text(s, 0, flags=flags)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文标签
plt.rcParams['axes.unicode_minus'] =

# 生成颜色
colors = sns.color_palette('pastel')[0:5]

diamonds = pd.read_csv('./data/DiamondsPrices2022.csv')
diamonds = diamonds.drop(['Unnamed: 0'], axis=1) # 删除指定索引标签 axis=1代表列 0代表行
print(diamonds.head()) # 查看部分数据
2、有序因子变量、数值型列分类
diamonds_cat = ['cut', 'color', 'clarity']
diamonds_num = ['carat', 'depth', 'table', 'price', 'x', 'y', 'z']
3、钻石中常见类别
for c in diamonds_cat:
print('----', c, '----')
print(diamonds[c].value_counts())
diamonds[c].value_counts().plot(kind='bar', title=f'Counting diamonds per {c.title()}.')
plt.savefig(r'.resultCounting_diamonds per_' + f'{c.title()}.png')
plt.show()

可以得出结论:对应属性最多数量的是---->最理想的切割钻石21551,G的颜色是11292,SI1的净度是13067

---- cut ----
Ideal 21551
Premium 13793
Very Good 12083
Good 4906
Fair 1610
Name: cut, dtype: int64
---- color ----
G 11292
E 9799
F 9543
H 8304
D 6775
I 5422
J 2808
Name: color, dtype: int64
---- clarity ----
SI1 13067
VS2 12259
SI2 9194
VS1 8171
VVS2 5066
VVS1 3655
IF 1790
I1 741

![Counting_diamonds per_Cut](assets/Counting_diamonds per_Cut.png)

![Counting_diamonds per_Color](assets/Counting_diamonds per_Color.png)

![Counting_diamonds per_Clarity](assets/Counting_diamonds per_Clarity.png)

4、最昂贵的钻石属性
print(diamonds[diamonds.price == diamonds.price.max()])
5、计算钻石价格在Q3范围内的各类属性的数量
关于Q3解析
  • 第1四分位数 (Q1),又称“较小四分位数”,等于该样本中所有数值由小到大排列后第25%的数字。
  • 第2四分位数 (Q2),又称“中位数”,等于该样本中所有数值由小到大排列后第50%的数字。
  • 第3四分位数 (Q3),又称“较大四分位数”,等于该样本中所有数值由小到大排列后第75%的数字。
for c in diamonds_cat:
dlv = diamonds.loc[(diamonds.price >= diamonds.price.quantile(q=.75))][c].value_counts()
print(c, '--n', dlv)
dlv.plot(kind='bar').set_title(f'Counting Diamonds for kind of {c.title()}.')
plt.show()
6、最常见属性的钻石数据
ascending 解析

ascending表示排序方式,值为True表示升序,可以省缺,值为False表示降序。

IGS_ByPriDesc = diamonds[(diamonds.cut == 'Ideal') & (diamonds.color == 'G') & (diamonds.clarity == 'SI1')].sort_values('price', ascending=False)
IGS_ByPriDesc.to_excel(r'.resultIGS_ByPriDesc.xlsx')
7、特定特征所占比例
# 每种属性数量最多的钻石:最理想的切割钻石是21551,G的颜色是11292,SI1的净度是13067
# 特定特征所占比例
a = diamonds[(diamonds.cut == 'Ideal') & (diamonds.color == 'G') & (diamonds.clarity == 'SI1')].shape[0]
b = diamonds.shape[0]
# 用饼图表示
plt.pie([a, b], labels=['Ideal+G+SI1数量', '钻石总数量'], colors=colors, autopct='%.6f%%')
plt.title('特定特征所占比例.')
plt.savefig(r'.resultIdeal_G_SI1_pie.png')
plt.show()
8、不同属性与价格的相关度
corr()详解

corr()函数的作用是用于求解不同变量之间的相关性,值越大表示变量之间的相关性越大。

# print(diamonds.sort_values('carat', ascending=False))
print(diamonds['carat'].corr(diamonds['price'])) # 克拉数与价格几乎是正相关,克拉数增加的越多,价格增加也越多
print(diamonds['depth'].corr(diamonds['price'])) # 总深度百分比越高,价格越低,呈负相关
print(diamonds['table'].corr(diamonds['price'])) # 台面宽度与价格相关性很低
9、Carat, Table, Depth and Priced 的相关热图
plt.figure(figsize=(16, 6))
sns.heatmap(diamonds.loc[:, ['carat', 'table', 'depth', 'price']].corr(), vmin=-1, vmax=1, annot=True).set_title(
'Carat, Table, Depth, Priced 的相关热图', fontdict={'fontsize': 12}, pad=12)
plt.show()
10、基于每个分类变量的价格分布
for c in ['cut', 'color', 'clarity']:
sns.displot(data=diamonds, x="price", hue=f"{c}", kind='kde')
plt.title(f'基于{c.title()}的价格分布图')
plt.subplots_adjust(top=0.95) # 设置图表距画布上边的空白
plt.savefig(fr'.result基于{c.title()}的价格分布图.png')
plt.show()
发表评论

相关文章