本节源码+数据集:点击此处跳转文末名片获取
本文件探讨的数据集是有关钻石各种属性与价格,
数据集中有53,943颗钻石,
有10个特征(carat, cut, color, clarity, depth, table, price, x, y, z)。
数据集: DiamondsPrices2022.csv
总共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。
变量 | 含义 | 范围 |
---|---|---|
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 |
钻石中最常见的类别
不同属性与价格的相关度
每个分类的价格分布
本节源码+数据集:点击此处跳转文末名片获取
原始数据存在以下问题:
不一致——数据内涵出现不一致情况
重复
不完整——感兴趣的属性没有值
含噪声——数据中存在着错误、或异常(偏离期望值)的数据
高维度
方法 | |
---|---|
数据清洗 | 去掉噪声和无关数据 |
数据集成 | 将多个数据源中的数据结合起来存放在一个一致的数据存储中 |
数据变换 | 把原始数据转换成为适合数据挖掘的形式 |
数据归约 | 主要方法包括:数据立方体聚集,维归约,数据压缩,数值归约,离散化和概念分层等 |
在这里我们发现没有缺失值、也没有重复值,
因此原始数据可以直接使用。
import pandas as pd
df = 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 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
-------------数据类型统计-----------------
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: []
本节源码+数据集:点击此处跳转文末名片获取
默认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)
print(diamonds.head())
diamonds_cat = ['cut', 'color', 'clarity']
diamonds_num = ['carat', 'depth', 'table', 'price', 'x', 'y', 'z']
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
print(diamonds[diamonds.price == diamonds.price.max()])
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()
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')
# 每种属性数量最多的钻石:最理想的切割钻石是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()
corr()函数的作用是用于求解不同变量之间的相关性,值越大表示变量之间的相关性越大。
print(diamonds['carat'].corr(diamonds['price']))
print(diamonds['depth'].corr(diamonds['price']))
print(diamonds['table'].corr(diamonds['price']))
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()
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')