zoukankan      html  css  js  c++  java
  • EDA cheat sheet

    %config InlineBackend.figure_format = 'svg'

    在jupyter notebook中使用这个命令绘制更清晰的图像,注意百分号后不能有空格。

    1. Univariate visualization

    单变量分析每次查看一个特征。当我们独立地分析一个特征时,我们通常最感兴趣的是它的值的分布。

    1.1 数量特征

    数量特征取有序的数值。这些值可以是离散的,像整数,或者是连续的,像实数,通常表达计数或者度量的含义。

    使用 Histograms and density plots

    # method in pandas
    df['feature'].hist()
    df['feature'].plot(kind='density')
    # pandas的绘图函数中可以通过传入 subplot=True & layout=(m,n)来自定义绘制的多个子图的布局
    
    # method in seaborn
    sns.displot(df[feature])
    # seaborn中的displot会同时绘制直方图和密度图
    

    使用 Box plot and Violin plot

    关于 Box plot 的很好的图视化解释参考 箱形图。Box plot中的离群值需要特别关注。

    # method in pandas,不知道是缺少相关参数的问题还是什么,没有画出离群点,seaborn中有画
    df['feature'].plot(kind = 'box')
    df['feature'].plot.box()
    
    # method in seaborn
    sns.boxplot(data=df['feature'])
    sns.violinplot(data=df['feature'])
    

    1.2 类别特征和二元特征

    类别特征取固定数目的值。二元特征是类别特征只有两种取值时的一个特例情况。如果在类别特征上的值可以是无序的也可以是由顺序的。

    使用频率表

    df['feature'].value_counts()
    # 默认结果中的 entry 按照最大频率到最小频率排列
    

    使用 Bar plot

    Bar plot 是频率表的图形化展示。

    # method in pandas
    df['feature'].value_counts().plot.bar()
    
    # method in seaborn
    sns.countplot(x='feature', data=df) # 至少传两个参数
    

    seaborn中的barplot() 利用矩阵条的高度反映数值变量的集中趋势,这个barplot并不是我们在此处想要使用的barplot。一定要记住,seaborn中的barplot展示的是某种变量分布的平均值 ,当需要精确观察每类数值变量(数值变量在类别变量上做groupby)的分布趋势,boxplot与violinplot往往是更好的选择。

    Tips: 将多幅图对比绘制的方法

    figure, axes = plt.subplots(nrows=m, ncols=n,figsize=(m*x_length,n*y_length))
    sns.plot(..., ax=axes[0])
    df.plot(..., ax=axes[1])
    figure.show()
    

    总结:

    1. 直方图表示数值变量的分布情况,而条形图表示类别变量的频率的分布情况。
    2. 直方图的x轴是连续的,条形图的x轴是离散的;二者的y轴都是连续的。

    2. Multivariate visualization

    多变量图表允许我们去看两个或多个变量(注意:可以通过技巧在二维平面上绘制三个变量之间的某些关系) 之间的关系。

    2.1 数量 vs 数量

    使用 Correlation matrix and heatmap

    # method : {‘pearson’, ‘kendall’, ‘spearman’}
    corr_matrix = df[num_features].corr()
    sns.heatmap(corr_matrix)
    

    使用 Scatter plot

    # method in matplotlib
    plt.scatter(df['num_x'], df['num_y'])
    
    # method in pandas
    df.plot.scatter(x='num_x', y= 'num_y')
    
    # method in seaborn
    sns.jointplot(x='num_x', y='num_y', data = df, kind='scatter')
    
    # this is the smoothed version of bivariate distribution
    sns.jointplot('num_x', 'num_y', data=df, kink='kde')
    

    使用 Scatterplot matrix

    # method in pandas 
    pd.scatter_matrix(df['num_features'])
    
    # method in seaborn
    sns.pairplot(df['num_features'])
    
    

    2.2 数量 vs 类别

    前面我们提到过可以在二维平面展示三个变量之间的关系,这种技巧就是利用pandas或者seaborn的语义映射能力,将第三个变量(只能是类别)用不同颜色区分开来。下面是一个例子:

    sns.scatter('num_x', 'num_y', data=df, hue='cate_third_var')
    

    使用 Box plot and Violin plot

    一般是观察一个数值变量在不同类别下的分布情况

    sns.boxplot(x='..._feat', y='..._feat', orient='v')
    # orient 默认为'v',这时传给x类别特征,传给y数值特征;当x,y的特征类型反着传时,必须把 orient设置为'h'才能正确绘图。orient可以看作时数值特征轴的方向。
    
    # sns.violinplot()类似
    

    使用 sns.catplot()

    当我们想要一次在两个类别变量维度来分析一个数值变量时,在seaborn中有一个非常适合的函数叫做catplot()。

    sns.catplot(x='cate_feature1', y='num_feature', col='cate_feature2', data=df, kind='box', col_wrap=n, height=m, aspect=.8)
    
    

    上面的代码将会画m*n个子图,每个子图中是一个sns.boxplot(x='cate_feature1', y='num_feature', data=df), 但是每个子图中的数据df是cate_feature2取某个类别时的子集。

    2.3 类别 vs 类别

    使用 sns.countplot() plus "hue semantic"

    原理是通过条形图来描述类别的分布,并且通过颜色语义映射的方法来加入第二个类别变量。注意,这种方法研究的主要对象仍然是第一个类别变量,语义映射只是把第二个类别变量对其的影响表示出来,语义映射的变量相当于辅助变量。

    sns.countplot(x='cate_feature1', hue='cate_feature2', data=df)
    

    使用 Contingency table

    除了使用图形的方式来分析类别变量,还有一个来自统计学的传统工具:列联表(contingency table)也叫做交叉表(cross tabulation)。它将多个类别变量的频率分布用一张表格来表示。特别的是,它允许我们通过沿着一行或是沿着一列来查看一个变量在其他变量某些条件下的分布。

    pd.crosstab(df['cate_feautre1'], df['cate_feature2'])
    

    3. Whole dataset

    3.1 Naive approach

    最简单的方法就是使用前面介绍的分析一个,两个或者是三个变量的方法逐个地探索完整个数据集。也可以使用sns.pairplot()或者pd.scatter_matrix()一次完成。

    3.2 Dimensional reduction

    使用 t-SNE

    from sklearn.manifold import TSNE
    from sklearn.preprocessing import StandardScaler
    
    # step1 对数值变量做归一化处理
    # step2 对两类变量用LabelEncoder()
    tsne = TSNE(random_state=17)
    tsne_repr = tsne.fit_transform(X_scaled)
    
    plt.scatter(tsne_repr[:,0], tsne_repr[:,1], alpha =.5)
    
    
  • 相关阅读:
    第十七天——类与类之间的关系(一)
    Eclipse替代keil
    ssm_crud 测试mapper生成结果
    ssm_crud mybatis-generator逆向生成
    ssm_crud 搭建项目
    ssm_crud 目录篇
    mybatis SQL语句 打印
    Caused by: java.lang.ClassNotFoundException: javax.servlet.SessionCookieConfig
    Caused by: java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be ope
    Spring Security开发安全的REST服务 下载
  • 原文地址:https://www.cnblogs.com/ZeroTensor/p/10268834.html
Copyright © 2011-2022 走看看