机器学习-2.0数据探索

该博客详细介绍了数据预处理的多个步骤,包括查看数据详情、数据类型、缺失值和异常值检测,以及数值和类别特征的分析。通过使用Seaborn库展示了数据的统计信息、箱线图、直方图、散点图和相关性分析,揭示了数据的分布和潜在问题。同时,对类别特征进行了独特分布的可视化,如箱形图、小提琴图和柱状图,以洞察数据的类别分布情况。
摘要由CSDN通过智能技术生成

目录

1、查看总体数据详情

2、查看总体数据缺失值

3、查看总体数据异常值

4、查看总体数据类型

5、数值特征分析

6、类别特征分析


数据源样例
import seaborn as sns
data_train= sns.load_dataset("tips")
data_train

1、查看总体数据详情

  1. 读取数据集并了解数据集大小
    data_train.head()
  2. 通过info熟悉数据类型
    data_train.info()
  3. 查看数据特征维度
    data_train.shape
  4. 查看数据列名称
    data_train.columns
  5. 查看各特征基本统计量
    data_train.describe()

2、查看总体数据类型

  1. 类别型数据(非数值类型)
    category_fea =list(data_train.select_dtypes(include=['object']).columns)
  2. 数值型数据
    numerical_fea=list(data_train.select_dtypes(exclude=['object']).columns)

3、查看总体数据缺失值

  1. 查看数据缺失值
    have_null_fea_dict = (data_train.isnull().sum()/len(data_train)).to_dict()
  2. 查看数据缺失率情况
    missing = data_train.isnull().sum()/len(data_train)

4、查看总体数据异常值

  1. 异常检测方法
    1.1.简单的统计
    data_train.describe()
    1.2.箱形图(只针对数值型)
    """
    箱形图
    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、数值特征分析

  1. 数值的相关性分析
    """
    相关性值: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)
    
  2. 数值的特征偏度和峰值
    一般会拿偏度和峰度来看数据的分布形态,而且一般会跟正态分布做比较,我们把正态分布的偏度和峰度都看做零。如果我们在实操中,算到偏度峰度不为0,即表明变量存在左偏右偏,或者是高顶平顶这么一说。
    Definition:是描述数据分布形态的统计量,其描述的是某总体取值分布的对称性,简单来说就是数据的不对称程度
    Kurtosis:偏度是描述某变量所有取值分布形态陡缓程度的统计量,简单来说就是数据分布顶的尖锐程度
    """
    查看特征的偏度和峰值
    """
    print(tips['total_bill'].skew())
    print(tips['total_bill'].kurt())
  3. 数值的特征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()
    #得出分布不一致特征,这会导致模型的泛化能力变差,可以删除
  4. 数值的特征回归关系可视化
    #线性回归关系图(运行时间较长)
    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、类别特征分析

  1. 类别特征unique分布
    ## 1) unique分布
    for fea in category_fea:
        print(train[fea].nunique())
  2. 类别特征的箱形图可视化
    ## 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")
  3. 类别特征的小提琴图可视化
    """
    # violinplot与boxplot扮演类似的角色,它显示了定量数据在一个(或多个)分类变量的多个层次上的分布,这些分布可以进行比较。
    # 不像箱形图中所有绘图组件都对应于实际数据点,小提琴绘图以基础分布的核密度估计为特征。
    """
    ax = sns.violinplot(x="day", y="total_bill", data=tips)
  4. 类别特征的柱形图可视化类别
    ## 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")
  5. 类别特征的单个类别频数可视化(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")

     

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值