目录
数据源样例
import seaborn as sns
data_train= sns.load_dataset("tips")
data_train
1、查看总体数据详情
- 读取数据集并了解数据集大小
data_train.head() - 通过info熟悉数据类型
data_train.info() - 查看数据特征维度
data_train.shape - 查看数据列名称
data_train.columns - 查看各特征基本统计量
data_train.describe()
2、查看总体数据类型
- 类别型数据(非数值类型)
category_fea =list(data_train.select_dtypes(include=['object']).columns)
- 数值型数据
numerical_fea=list(data_train.select_dtypes(exclude=['object']).columns)
3、查看总体数据缺失值
- 查看数据缺失值
have_null_fea_dict = (data_train.isnull().sum()/len(data_train)).to_dict()
- 查看数据缺失率情况
missing = data_train.isnull().sum()/len(data_train)
4、查看总体数据异常值
- 异常检测方法
1.1.简单的统计
1.2.箱形图(只针对数值型)data_train.describe()
""" 箱形图 boxplot 非重叠点的分类散点图 swarmplot """ ax = sns.boxplot(x="day", y="total_bill", data=data_train) ax = sns.swarmplot(x="day", y="total_bill", data=data_train, color=".25")
1.3.直方图和Q-Q图""" 采用直方图和Q-Q图 distplot """ ax=sns.distplot(data_train["total_bill"],color="y") #得出很多数据都不服从正态分布,数据存在异常点
1.4.散点图""" 散点图 scatterplot """ ax = sns.scatterplot(x='total_bill',y='tip',data=data_train)
5、数值特征分析
- 数值的相关性分析
""" 相关性值:corr() 热力图:heatmap """ numerical_fea=list(tips.select_dtypes(exclude=['object']).columns) price_numeric = tips[numerical_fea] correlation = price_numeric.corr() sns.heatmap(correlation,square = True, vmax=0.8)
- 数值的特征偏度和峰值
一般会拿偏度和峰度来看数据的分布形态,而且一般会跟正态分布做比较,我们把正态分布的偏度和峰度都看做零。如果我们在实操中,算到偏度峰度不为0,即表明变量存在左偏右偏,或者是高顶平顶这么一说。
Definition:是描述数据分布形态的统计量,其描述的是某总体取值分布的对称性,简单来说就是数据的不对称程度
Kurtosis:偏度是描述某变量所有取值分布形态陡缓程度的统计量,简单来说就是数据分布顶的尖锐程度。""" 查看特征的偏度和峰值 """ print(tips['total_bill'].skew()) print(tips['total_bill'].kurt())
- 数值的特征KDE关系可视化
#采用kde分布图(训练集合测试集分布情况) plt.figure(figsize=(80,240)) #指定绘图对象的宽度和高度 numerical_fea_size=numerical_fea.drop('price').size #训练集和测试集数据行名称保持一致 i=1 for j in range(numerical_fea_size): ax=plt.subplot(29,4,i) ax=sns.kdeplot(train[numerical_fea[j]],color="Red",shade=True) #kde核密度估计 ax=sns.kdeplot(test[test_numberical_fea[j]],color="Blue",shade=True) ax.set_xlabel(numerical_fea[j]) ax.set_ylabel("Frequency") ax.legend(["train","test"]) i+=1 plt.show() #得出分布不一致特征,这会导致模型的泛化能力变差,可以删除
- 数值的特征回归关系可视化
#线性回归关系图(运行时间较长) plt.figure(figsize=(80,240)) #指定绘图对象的宽度和高度 i=0 for j in range(numerical_fea_size): i+=1 ax=plt.subplot(train_rows,4,i) sns.regplot(x=numerical_fea[j],y='price',data=train,ax=ax, scatter_kws={'marker':'.','s':3,'alpha':0.3},line_kws={'color':'k'}) #直方图 plt.xlabel(numerical_fea[j]) plt.ylabel('price') plt.show() #得出很多数据都不存在关系
6、类别特征分析
- 类别特征unique分布
## 1) unique分布 for fea in category_fea: print(train[fea].nunique())
- 类别特征的箱形图可视化
## 2) 类别特征箱形图可视化 # 因为 name和 regionCode的类别太稀疏了,这里我们把不稀疏的几类画一下 categorical_features = ['model', 'brand', 'bodyType', 'fuelType', 'gearbox', 'notRepairedDamage'] for c in categorical_features: train[c] = train[c].astype('category') if train[c].isnull().any(): train[c] = train[c].cat.add_categories(['MISSING']) train[c] = train[c].fillna('MISSING') def boxplot(x, y, **kwargs): sns.boxplot(x=x, y=y) x=plt.xticks(rotation=90) f = pd.melt(train, id_vars=['price'], value_vars=categorical_features) g = sns.FacetGrid(f, col="variable", col_wrap=2, sharex=False, sharey=False, size=5) g = g.map(boxplot, "value", "price")
- 类别特征的小提琴图可视化
""" # violinplot与boxplot扮演类似的角色,它显示了定量数据在一个(或多个)分类变量的多个层次上的分布,这些分布可以进行比较。 # 不像箱形图中所有绘图组件都对应于实际数据点,小提琴绘图以基础分布的核密度估计为特征。 """ ax = sns.violinplot(x="day", y="total_bill", data=tips)
- 类别特征的柱形图可视化类别
## 4) 类别特征的柱形图可视化 def bar_plot(x, y, **kwargs): sns.barplot(x=x, y=y) x=plt.xticks(rotation=90) f = pd.melt(Train_data, id_vars=['price'], value_vars=categorical_features) g = sns.FacetGrid(f, col="variable", col_wrap=2, sharex=False, sharey=False, size=5) g = g.map(bar_plot, "value", "price")
- 类别特征的单个类别频数可视化(count_plot)
## 5) 类别特征的每个类别频数可视化(count_plot) def count_plot(x, **kwargs): sns.countplot(x=x) x=plt.xticks(rotation=90) f = pd.melt(Train_data, value_vars=categorical_features) g = sns.FacetGrid(f, col="variable", col_wrap=2, sharex=False, sharey=False, size=5) g = g.map(count_plot, "value")