## Is your feature request related to a problem?

#4947 added a new query to the backend – time to convert. It works well, just one point is kind of rough: bin width and count.

## Describe the solution you'd like

Currently the number of bins is hardcoded. Ideally we should have two options:
- return a user-specified number of bins,
- otherwise infer a reasonable number of bins using some algorithm (auto option).

@alexkim205 [suggested](https://github.com/PostHog/posthog/issues/4855#issuecomment-872423877) the [Freedman-Diaconis rule](https://en.wikipedia.org/wiki/Freedman%E2%80%93Diaconis_rule) for determining bin width (and interval based on that), but unfortunately from my testing its formula would not be the most practical – it's great for keeping a pretty constant "smoothness" of the histogram esp. with normal distribution, but we face some additional constraints that make it less than ideal:
- we can't have histograms too dense visually in the UI, from my testing a practical limit is 60 bins (above that it gets too dense),
- our data generally doesn't follow much of a normal distribution.

Clamping may help though, or maybe a different formula may work better outright – I'll be testing this.

## Additional context

Issue pertaining to the experience of time to convert: #4855

#### *Thank you* for your feature request – we love each and every one!

ee/clickhouse/views/insights.py
@cached_function()
    def calculate_trends(self, request: Request) -> Dict[str, Any]:
        team = self.team
        filter = Filter(request=request)
        if filter.insight == INSIGHT_STICKINESS or filter.shown_as == TRENDS_STICKINESS:
            stickiness_filter = StickinessFilter(
                request=request, team=team, get_earliest_timestamp=get_earliest_timestamp
            )
            result = ClickhouseStickiness().run(stickiness_filter, team)
        else:
            trends_query = ClickhouseTrends()
            result = trends_query.run(filter, team)
        self._refresh_dashboard(request=request)
        return {"result": result}
    @cached_function()
    def calculate_session(self, request: Request) -> Dict[str, Any]:
        return {
            "result": ClickhouseSessions().run(
                team=self.team, filter=SessionsFilter(request=request, data={"insight": INSIGHT_SESSIONS})
            )
        }
    @cached_function()
    def calculate_path(self, request: Request) -> Dict[str, Any]:
        team = self.team
        filter = PathFilter(request=request, data={"insight": INSIGHT_PATHS})
        resp = ClickhousePaths().run(filter=filter, team=team)
        return {"result": resp}
    @action(methods=["GET", "POST"], detail=False)
    def funnel(self, request: Request, *args: Any, **kwargs: Any) -> Response: