exploreDispersion <- function(DT
  , colGroups=list(value = c(units="units", revenue="revenue"))
  , byCols.aggregate=c("store_name", "transac_type_abbr", "GroupWk1")
  ) {
  ## Sample DT is DT.EU_aggd
  ##  "~/git/orch/src/EU_PricingTest_2015/02 Analysis.r"

  DT.nm <- capture.output(substitute(DT))

  tmp_DT.dispersion_check <- normalizeAndStack(DT, colGroups=colGroups, byCols.aggregate=byCols.aggregate)
  tmp_DT.dispersion_check <- merge(aggregateDT(tmp_DT.dispersion_check, aggFunc=meann, colsToAgg=c(mean="value"))
                                 , aggregateDT(tmp_DT.dispersion_check, aggFunc=sd,    colsToAgg=c(SD  ="value"))
                                  )

  lims <- tmp_DT.dispersion_check[, rangen(c(mean, SD))] * 1.02
  # x <- "mean"
  # y <- "SD"
  browser(expr=inDebugMode("exploreDispersion"), text="in exploreDispersion() after agg before plotting")
  
  print(key(tmp_DT.dispersion_check))
  color <- head(key(tmp_DT.dispersion_check), 1)
  shape <- "variable"
  if (lunique(tmp_DT.dispersion_check[[shape]]) < 2) shape <- NULL
  
  {
  ggplot(data=tmp_DT.dispersion_check, aes(x=mean, y=SD)) + 
      geom_point() + 
      gg_xyline() + 
      ylim(lims) + 
      xlim(lims) + 
      labs(
          x = "Mean   Underdispersed ~~~> ",
          y = "SD     Overdispersed  ~~~> ",
          title = sprintf("Exploring Dispersion for %s", DT.nm)
          ) + 
      {if (!is.null(color)) aes_string(color=color)} +
      {if (!is.null(shape)) aes_string(shape=shape)}
  }
}
