【问题标题】:DataExplorer, customize univariate distributionDataExplorer,自定义单变量分布
【发布时间】:2021-09-18 19:09:17
【问题描述】:

我正在尝试使用 DataExplorer 来帮助进行快速 EDA。我喜欢它显示单变量分布的方式。这是一个可重现的示例。

A <- c(rep(c(1,2,3,4,5), 200))
A<- factor(A)
B <- c(x=rnorm(1000))
C <- c(x= rnorm(1000, mean = 100, sd=2))
D <- c(x= rnorm(1000, 2, 2))
df<- data.frame(A, B, C, D)
df %>%
  create_report(
    output_file = "trial",
    y= "A", #to get barplots, QQ plots and scatterplots by grouping variable "A"
    report_title = "trial_EDA",
    config = configure_report(
      add_plot_density = TRUE  #To add density plots to report
    )
  )

我想通过分组变量“A”来可视化密度,如附图所示。

但我不知道如何正确使用绘图密度参数来做到这一点。此外,请建议其他软件包以轻松浏览大型数据集作为初步分析。谢谢!

【问题讨论】:

    标签: r grouping density-plot exploratory-data-analysis r-data-explorer


    【解决方案1】:

    您尚未指定BCD 密度图应应用于哪个变量。 如果只有一个,例如B 然后这样做:

    library(tidyverse)
    library(ggpubr)
    
    A <- c(rep(c(1,2,3,4,5), 200))
    A<- factor(A)
    B <- c(x=rnorm(1000))
    C <- c(x= rnorm(1000, mean = 100, sd=2))
    D <- c(x= rnorm(1000, 2, 2))
    df<- data.frame(A, B, C, D)
    
    df %>% mutate(A = A %>% fct_inorder()) %>% 
      ggplot(aes(B, fill=A)) +
      geom_density(alpha=0.2)
    
    

    您也可以对一个图上的每个变量单独执行此操作。

    pB = df %>% mutate(A = A %>% fct_inorder()) %>% 
      ggplot(aes(B, fill=A)) +
      geom_density(alpha=0.2)
    pC = df %>% mutate(A = A %>% fct_inorder()) %>% 
      ggplot(aes(C, fill=A)) +
      geom_density(alpha=0.2)
    
    pD = df %>% mutate(A = A %>% fct_inorder()) %>% 
      ggplot(aes(D, fill=A)) +
      geom_density(alpha=0.2)
    
    ggarrange(pB, pC, pD, 
              labels = c("B", "C", "D"))
    

    如果你不喜欢馅料,你可以这样做

    df %>% mutate(A = A %>% fct_inorder()) %>% 
      ggplot(aes(B, color=A)) +
      geom_density()
    

    更新 1

    可以为任意数量的列创建图表。我将在下面的示例中向您展示。 首先,我们将以一种非常简单甚至微不足道的方式来完成它。

    library(tidyverse)
    df = tibble(
      A = rep(c(1,2,3,4,5), 200) %>% factor(),
      B = rnorm(1000),
      C = rnorm(1000, mean = 100, sd=2),
      D = rnorm(1000, 2, 2)
    )
    
    fPlot = function(x, group) tibble(x=x, group=group) %>% 
      ggplot(aes(x, color=group)) +
        geom_density()
    
    df %>% select_at(vars(B:D)) %>% 
        map(~fPlot(., df$A))
    

    如您所见,我们为变量 BCD 创建了三个图。

    第二种方式有点难以理解。但它会给你一些额外的奖励。

    fPlot2 = function(df, group) df$data[[1]] %>% 
      ggplot(aes(val, color=A)) +
      geom_density() +
      ggtitle(group)
    
    df %>% pivot_longer(B:D, names_to = "var", values_to = "val") %>% 
      group_by(var) %>% 
      nest() %>% 
      group_map(fPlot2)
    

    请注意,df %&gt;% pivot_longer(B:D, names_to = "var", values_to = "val") 之后的 tibble 看起来像这样。

    # A tibble: 3,000 x 3
       A     var        val
       <fct> <chr>    <dbl>
     1 1     B       1.06  
     2 1     C     100.    
     3 1     D       3.54  
     4 2     B      -0.652 
     5 2     C     100.    
     6 2     D       1.12  
     7 3     B       0.652 
     8 3     C      97.3   
     9 3     D       3.57  
    10 4     B      -0.0972
    # ... with 2,990 more rows
    

    df %&gt;% pivot_longer(B:D, names_to = "var", values_to = "val") %&gt;% group_by(var) %&gt;% nest()之后是这样的:

    # A tibble: 3 x 2
    # Groups:   var [3]
      var   data                
      <chr> <list>              
    1 B     <tibble [1,000 x 2]>
    2 C     <tibble [1,000 x 2]>
    3 D     <tibble [1,000 x 2]>
    

    如您所见,数据已折叠为变量data 中的三个内部tibble。 这种方法将允许您轻松地分别计算每列的所有统计信息。看看这个。

    fStat = function(df) df$data[[1]] %>% 
      group_by(A) %>% 
      summarise(
        n = n(),
        min = min(val),
        mean = mean(val),
        max = max(val),
        median = median(val),
        sd = sd(val),
        sw.stat = stats::shapiro.test(val)$statistic,
        sw.p = stats::shapiro.test(val)$p.value,
      )
    
    df %>% pivot_longer(B:D, names_to = "var", values_to = "val") %>% 
      group_by(var) %>% 
      nest() %>% 
      group_modify(~fStat(.x))
    

    输出

    # A tibble: 15 x 10
    # Groups:   var [3]
       var   A         n   min      mean    max     median    sd sw.stat  sw.p
       <chr> <fct> <int> <dbl>     <dbl>  <dbl>      <dbl> <dbl>   <dbl> <dbl>
     1 B     1       200 -2.14   0.139     3.16   0.153    0.960   0.994 0.561
     2 B     2       200 -2.00   0.0185    2.61   0.0162   0.923   0.992 0.373
     3 B     3       200 -3.15   0.0245    2.42   0.0718   1.02    0.992 0.347
     4 B     4       200 -2.75   0.00112   2.73  -0.00691  1.02    0.993 0.496
     5 B     5       200 -3.32  -0.00758   3.23  -0.000105 0.993   0.991 0.250
     6 C     1       200 94.6   99.8     104.    99.8      1.97    0.992 0.365
     7 C     2       200 94.8  100.      104.   100.       1.85    0.991 0.290
     8 C     3       200 94.5  100.      106.   100.       1.94    0.996 0.877
     9 C     4       200 94.4   99.9     107.    99.9      1.97    0.993 0.463
    10 C     5       200 94.3   99.8     106.    99.8      2.07    0.996 0.887
    11 D     1       200 -4.89   1.81      8.11   1.90     2.09    0.995 0.750
    12 D     2       200 -5.42   2.15      7.57   2.18     2.14    0.995 0.726
    13 D     3       200 -4.38   2.09      7.10   2.02     1.97    0.989 0.111
    14 D     4       200 -4.73   2.13      8.98   1.93     1.99    0.989 0.138
    15 D     5       200 -2.19   2.24      7.79   2.25     1.87    0.996 0.867
    

    Czy to nie fajne?

    【讨论】:

    • 密度图应该适用于所有数值变量。我有一个庞大的数据集,与示例中的数据集不同。手动检查数据的这些初始步骤很难完成! DataExplorer 包计算出数据集中的所有数值变量,并给了我这个图。不幸的是,我无法找到在 DataExplorer 参数中使用分组变量应用密度分布的方法!
    • 有没有办法用你的代码循环遍历所有数值变量列?
    • 是的,有这种可能。我可以告诉你怎么做。但是,请指定哪个图表更适合您有或没有填充。还要指定是否要将每个变量(列)放在单独的图上,或者您是否希望像在我的其他解决方案中一样将所有内容都收集在一个图上。
    • 你好,尼迪。如果我的回答有帮助,请记住,在 Stack Overflow 上,您可以通过标记接受的答案来表示感谢。
    猜你喜欢
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多