一、数据描述
本文件探讨的数据集是有关钻石各种属性与价格,数据集中有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 pddf = pd.read_csv('.\data\DiamondsPrices2022.csv')
print(df.head()) # 数据集查看
# 数据统计信息
df.describe().to_excel(r'.\result\data1.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 z0 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 pdfrom 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'.\result\Counting_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%的数字。
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'.\result\IGS_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'.\result\Ideal_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、基于每个分类变量的价格分布
KDE分布图,是指Kernel Density Estimation核概率密度估计。可以理解为是对直方图的加窗平滑。通过KDE分布图,可以查看并对训练数据集和测试数据集中特征变量的分布情况。
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() 【本文来自:美国大带宽服务器 http://www.558idc.com/mg.html提供,感恩】