对钻石属性表进行数据可视化分析(使用seaborn工具)
对钻石属性表进行可视化分析
一、数据描述
1.数据解释
该数据是对钻石的一些属性进行可视化分析,共53940条数据,共10个字段,下面开始介绍个字段:
- carat:表示钻石的重量,重量的单位是克拉;
- cut:表示钻石的切割质量,切割质量分为Ideal、Premium、Good、Very Good、Fail(理想、优质、良好、非常好、失败)。
- color:表示钻石的色彩,J (worst) to D (best)(从最差到最佳)。
- clarity:表示钻石的净度,净度分为IF、VVS1、VVS2、VS1、VS2、SI1、SI2(内含物的含量,从内无瑕疵到内含等级)。
- depth:表示钻石的全深比。
- table:表示钻石的台面。
- price:表示钻石的价格。
- x:长,单位mm
- y:宽,单位mm
- z:深,单位mm
2.导入数据

3.查看数据集信息


从统计信息可以看出数字型的总数、count,数据个数(非空数据),mean,均值,std,标准差,min,最小值,25%,第1四分位数,即第25百分位数,50%,第2四分位数,即第50百分位数,75%,第3四分位数,即第75百分位数,max,最大值等信息。
二、问题提出
1.钻石的各个属性之间是否有关?
2.钻石的属性和钻石的数量是否有关系?
3.钻石的长、宽、深之间有关系吗?
三、数据清洗
1.查找缺失值


从数据集中,可以看到没有缺失值。
2.查看数据类型

可以看到有三个属性是非数字型的,后面可以对其进行处理,把它转换为数字型。
3.类型转换


4.处理缺失值

把缺失值删除。
四、数据可视化
1.对查看整体多对关系

把数据放大,查看关系

从图中可以看出它们之间都有关系。
2.使用热地图显示相关系数


从图中可以看到,钻石的每个属性都存在较强的相关性。
3.查看x、y、z之间的关系



从图中看x,y,z的相关性还是很高的。
4.从不同属性来看钻石数量比
下面来做个饼图看看从色彩,切割等属性来看看不同品质的钻石数量占比:



5.查看切割质量和价格比

从图中可以看出,切割质量越好,价格越高。
五、数据预处理
1.查看是否存在异常值
使用箱线图查看数据是否存在异常值:


从图中可以看出,不存在明显的异常值。
六、总结
1.从以上分析可以看出,各个属性之间的相关性很高
2.钻石的各个属性与钻石的数量有关系,钻石色彩越差或越小钻石数量就少,切割质量最差的,数量最少,净度最差的,数量也相对其它的要少。
3.钻石越长,宽度越低,深度越高
4.切割质量越好,钻石的价格越高
5.价格与钻石的长宽深有很强的相关性,而且基本都是正相关。
七、代码分析
# coding: utf-8 # In[1]: import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib.cm as sns get_ipython().run_line_magic('matplotlib', 'inline') df=pd.read_csv(r'diamonds.csv') print("输出数据集:") print(df.head()) # In[2]: print("数据统计信息:") print(df.describe()) # In[3]: print("数据集基本信息:") print(df.info()) # In[4]: #查看数据集 df.value_counts() # In[5]: #查看缺失值 df.isnull().sum() # In[6]: #数据清理 #把非数字型转换为数字型 import collections #统计列表元素出现的次数 collections.Counter(df['color']) # In[7]: collections.Counter(df['clarity']) # In[8]: collections.Counter(df['cut']) # In[9]: df['cut_no']=df['cut'] df['clarity_no']=df['clarity'] df['color_no']=df['color'] # 准备好替换map cut_rp_map={'Fair':1,'Good':2,'Very Good':3,'Premium':4,'Ideal':5} co_rp_map={'J':1,'I':2,'H':3,'G':4,'F':5,'E':6,'D':7} cl_rp_map={'I1': 1,'SI2': 2,'SI1': 3,'VS2': 4,'VS1': 5,'VVS2': 6,'VVS1': 7,'IF': 8} # inplace 默认值是False,为True则替换原数据集,否则不替换原数据而是返回替换结果 df['cut_no'].replace(cut_rp_map,inplace=True) df['clarity_no'].replace(cl_rp_map,inplace=True) df['color_no'].replace(co_rp_map,inplace=True) # In[14]: # 应用于原数据集 df.dropna(inplace=True) # 删除至少两个空值的行 df.dropna(thresh=2) # 删除所有值都是空的行 df.dropna(how='all') # 删除列 df.dropna(axis='columns') # In[13]: import seaborn as sns # 用Seaborn画成对关系 sns.pairplot(df) plt.show() # In[11]: # Correlation matrix def plotCorrelationMatrix(df1, graphWidth): df1 = df1.dropna('columns') # drop columns with NaN df1 = df1[[col for col in df1 if df1[col].nunique() > 1]] # keep columns where there are more than 1 unique values if df1.shape[1] < 2: print(f'No correlation plots shown: The number of non-NaN or constant columns ({df1.shape[1]}) is less than 2') return corr = df1.corr() plt.figure(num=None, figsize=(graphWidth, graphWidth), dpi=80, facecolor='w', edgecolor='k') corrMat = plt.matshow(corr, fignum = 1) plt.xticks(range(len(corr.columns)), corr.columns, rotation=90) plt.yticks(range(len(corr.columns)), corr.columns) plt.gca().xaxis.tick_bottom() plt.colorbar(corrMat) plt.title(f'Correlation Matrix for Diamonds', fontsize=15) plt.show() plotCorrelationMatrix(df, 14) # In[15]: # 用Seaborn画散点图 sns.jointplot(x="x", y="y", data=df,color='blue', kind='scatter'); plt.show() # In[16]: # 使用Seaborn画折线图 sns.lineplot(x="x", y="z", data=df) plt.show() # In[17]: # 用Seaborn画直方图 sns.distplot(df['z'], kde=False) plt.show() sns.distplot(df['z'], kde=True) plt.show() # In[18]: # 用Seaborn画箱线图 sns.boxplot(data=df['z']) plt.show() # In[17]: #删除/选取某行含有特定数值的行 r=[x for i,x in enumerate(df.index) if df.z[i]>10] #利用enumerate对row0进行遍历,将含有数字3的列放入r中 print('Remvove row: ',r) #利用drop方法将含有特定数值的列删除 df.drop(r,axis=0,inplace=True) # 用Seaborn画箱线图 sns.boxplot(data=df['z']) plt.show() # In[19]: new_df=df[~df['z'].isin([31.8])] #通过取反 print(new_df.z) # In[20]: import collections # 统计列表元素出现次数 color_cnt=collections.Counter(df['color']) color_keys=color_cnt.keys() color_values=color_cnt.values() # 用Matplotlib画饼图 plt.pie(x = color_values, labels=color_keys) plt.show() # In[21]: fig,axj=plt.subplots(nrows=2,ncols=2,figsize=(8, 8),dpi=200) #建立饼图坑 axes = axj.flatten() #子图展平 color_cnt=collections.Counter(df['color']) color_keys=[x for x in color_cnt.keys()] color_values=[x for x in color_cnt.values()] c_cnt=collections.Counter(df['cut']) c_keys=[x for x in c_cnt.keys()] c_values=[x for x in c_cnt.values()] cl_cnt=collections.Counter(df['clarity']) cl_keys=[x for x in c_cnt.keys()] cl_values=[x for x in c_cnt.values()] axes[0].set_title("color pie") axes[0].pie(x=color_values,labels=color_keys) axes[1].set_title("cut pie") axes[1].pie(x=c_values,labels=c_keys) axes[2].set_title("clarity pie") axes[2].pie(x=cl_values,labels=cl_keys) plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.5, hspace=0.2) # 调整子图间距 plt.show() # In[23]: # 用Seaborn画二元变量分布图(散点图,核密度图,Hexbin图) sns.jointplot(x="cut_no", y="price", data=df, kind='scatter') sns.jointplot(x="cut_no", y="price", data=df, kind='kde') sns.jointplot(x="cut_no", y="price", data=df, kind='hex') plt.show() # In[24]: # 使用Seaborn画折线图 sns.lineplot(x="cut_no", y="price", data=df) plt.show() # In[ ]:
浙公网安备 33010602011771号