> For the complete documentation index, see [llms.txt](https://docs.cortex.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.cortex.io/improve/eng-intelligence/data-explorer.md).

# Data Explorer

Data Explorer is your window into the metrics that matter. Analyze trends over time, drill into individual data points, and uncover the patterns shaping your development process. Whether you're diagnosing a slowdown or looking for opportunities to improve, Data Explorer gives you the visibility to act with confidence.

Found a view you'll want to revisit? Save it as a **module** and skip the work of reapplying filters and display settings every time. Report modules make it effortless to keep an eye on the metrics you care about—like cycle time for a specific team or time period—and they double as building blocks for [custom dashboards](/improve/eng-intelligence/dashboards/custom.md), so the insights you've curated can power views across your organization.

## Using Data Explorer

### Step 1: Selecting a metric to view

Users with the `View Dev Metrics` permission can select a metric to view.

The Data Explorer provides three view options, allowing you to choose the format that best fits your analysis:

* **Chart** - A standard line chart designed for visualizing a single metric over time. Use this view when you want to track trends or fluctuations in one specific measurement.
* **Table** - A tabular layout that displays multiple metrics at once, including Scorecard scores, making it ideal for side-by-side comparisons and detailed analysis. The tabular view also supports a hierarchical, nested structure similar to the [Bird's Eye](/improve/reports/birds-eye.md) report for drilling into grouped data.
* **KPI** - A compact widget that shows a single metric with its current value, a trend comparison (directional arrow, percentage/absolute change), and an optional mini chart. This gives engineering leaders an at-a-glance, standardized way to highlight a key metric.

#### **Configuring chart view**

1. From the main sidebar, expand **Eng Intelligence**, then select **Data Explorer**.
2. In the right pane, select **Chart**.<br>

   <div align="left" data-with-frame="true"><figure><img src="/files/6pZHEFPLBpEwvzPnozPA" alt="" width="375"><figcaption></figcaption></figure></div>
3. By default, the **cycle time** metric is displayed. To select a different metric, click the tab below **Data** in the right pane. The **Metrics** window opens.<br>

   <div align="left" data-with-frame="true"><figure><img src="/files/xZl3qWEM4WpN0NIGK0dB" alt="" width="375"><figcaption></figcaption></figure></div>
4. Select a metric to view.
   * Cortex organizes metrics into six categories: AI tools, Custom, Deployment, Incident, Project management, and Version control, each with its own set of available metrics. Refer to [Available metrics in Data Explorer](/improve/eng-intelligence/data-explorer/available-metrics-in-data-explorer.md) for definitions.
5. Click **View metric**. The chart updates, reflecting the new metric.
   * By default, the data uses a time range of the last 30 days, but you can [select a different time range](#filtering-by-time-range). Metrics can be [grouped by](#grouping-metrics) team, owner, repository, entity, and more.
6. Optionally, toggle off **Show table** in the right pane to hide the metric overview below the graph.

#### Configuring table view

{% hint style="info" %}
**Scorecards are now metrics!**\
Scorecard scores are now fully supported as a metric type in table reports. Add them to tabular views, combine them with custom metrics, and analyze them using the same filtering and time-range controls available for all other metrics.
{% endhint %}

1. From the main sidebar, expand **Eng Intelligence**, then select **Data Explorer**.
2. In the right pane, select **Table**.<br>

   <div align="left" data-with-frame="true"><figure><img src="/files/tXghffNL9IEbrBNchqpt" alt="" width="375"><figcaption></figcaption></figure></div>
3. In the right pane, click **Add column**. The **Metrics** window opens.
4. Select a metric to view.
   * Cortex organizes metrics into six categories: AI tools, Custom, Deployment, Incident, Project management, and Version control, each with its own set of available metrics. Refer to [Available metrics in Data Explorer](/improve/eng-intelligence/data-explorer/available-metrics-in-data-explorer.md) for definitions.
5. Click **View metric**. The table updates, reflecting the new metric.
   * By default, the data uses a time range of the last 30 days, but you can [select a different time range](#filtering-by-time-range). Metrics can be [grouped by](#grouping-metrics) team, owner, repository, entity, and more.
6. To remove a metric from the tabular view, click the **X icon** next to the metric's name.<br>

   <div align="left" data-with-frame="true"><figure><img src="/files/Gr6FMPCUOn6XyKdIkWh9" alt="" width="136"><figcaption></figcaption></figure></div>

#### **Configuring KPI view**

1. From the main sidebar, expand **Eng Intelligence**, then select **Data Explorer**.
2. In the right pane, select **KPI**.

   <div align="left" data-with-frame="true"><figure><img src="/files/rE6gUj1b6vMMGM2l5eAP" alt="" width="375"><figcaption></figcaption></figure></div>
3. By default, the **cycle time** metric is displayed. To select a different metric, click the tab below **Metric** in the right pane. The **Metrics** window opens.
4. Select a metric to view.
   * Cortex organizes metrics into six categories: AI tools, Custom, Deployment, Incident, Project management, and Version control, each with its own set of available metrics. Refer to [Available metrics in Data Explorer](/improve/eng-intelligence/data-explorer/available-metrics-in-data-explorer.md) for definitions.
5. Click **View metric**. The chart updates, reflecting the new metric.
   * By default, the data uses a time range of the last 30 days, but you can [select a different time range](#filtering-by-time-range).&#x20;
6. Optionally, toggle off the following card options:
   1. **Show module header** - Hides the card's header for a cleaner, more minimal look
   2. **Show chart preview** - Hides the mini chart when you only want the metric value and trend
   3. **Show trend** - Hides the trend indicator (arrow and percentage change). If toggled on, use the **Comparison format** drop-down menu to display the trend in percentage or absolute terms.

### Step 2: Filtering and grouping metrics

Users with the `View Dev Metrics` permission can filter and group metrics.

You can filter and group metrics by individual, entity, PR, or owner, and you can filter the chart/table by time range, teams, author, and repository. You can also sort the columns.

#### Filtering metrics

To filter by metrics such as entity, team, repo, or user, click **Filter** in the upper-right corner of the graph. If using the KPI view, **Filter** appears in the card's header.

<div align="left" data-with-frame="true"><figure><img src="/files/62S3MNRhdB2xjbMumu08" alt="The &#x27;Filter&#x27; option in Data Explorer." width="563"><figcaption></figcaption></figure></div>

Configure a single filter or a combination of filters. When you are done adding filters, click **Apply** at the bottom of the filter window.

When filtering by teams or domains, **Include child teams** **/** **Include child domains** is toggled on by default, so the full team hierarchy rolls up:

* **Entity Owner (Team)** includes entities owned by the selected team and any of its nested sub-teams.
* **Team** includes contributors who belong to the selected team or any of its nested sub-teams.

Toggle this off to limit to direct ownership or membership only.

See the [full list of filters](/improve/eng-intelligence/data-explorer/data-explorer-reference.md) and their definitions.

#### Filtering by time range

To filter by time period, click the **time range** filter in the upper-right corner of the graph. By default, **Last 30 days** is displayed. If using the KPI view, **time range** appears in the card's header.

<div align="left" data-with-frame="true"><figure><img src="/files/OGYnlIz4lonh17c3Ri2k" alt="" width="563"><figcaption></figcaption></figure></div>

Select a new time range and configure the dates. Optionally, toggle on **Exclude weekends** to remove Saturday and Sunday from aggregations and visualizations. Because activity typically dips on weekends, excluding them eliminates recurring noise and makes trends easier to spot. The graph automatically reloads.

To change the grouping of the time range in the graph, click **Display** in the upper-right corner of the graph:

<div align="left" data-with-frame="true"><figure><img src="/files/CRHrSEpvQhQReepkM7xW" alt="" width="563"><figcaption></figcaption></figure></div>

You can choose whether to display the data grouped by day, week, or month.

#### Filtering by time attribute

A pull request has several dates attached to it: when it was opened, when its first commit landed, when it was merged, and so on. The **time attribute** filter tells Data Explorer which of these dates to use when placing each PR on the timeline. Changing it doesn't change the metric you're measuring; it changes which time bucket each PR falls into, and therefore which PRs appear inside your selected time range.

For version control and PR-related metrics, click the **time attribute** filter in the upper-right corner of the graph. If using the KPI view, the time attribute filter appears in the card's header.

<div align="left" data-with-frame="true"><figure><img src="/files/jRFCpCy1reNdDcbi5oLY" alt="" width="563"><figcaption></figcaption></figure></div>

**Example**

Say a PR was opened on May 28 and merged on June 3, and you're viewing a chart with a time range set for the last 30 days.

* With the time attribute set to **Open date**, the PR counts toward May.
* With it set to **Close/merge date**, the same PR counts toward June.

If the time range was "June only," that PR would appear when filtering by close/merge date but disappear when filtering by open date, even though nothing about the PR changed. When a PR seems to be missing from (or unexpectedly present in) a report, the time attribute is usually why.

**Available time attributes**

<table><thead><tr><th width="177.26171875">Time attribute</th><th width="198.765625">Anchors the PR to...</th><th>Use it to answer...</th></tr></thead><tbody><tr><td><strong>Open date</strong></td><td>When the PR was opened</td><td><em><strong>How much work was started in this period?</strong></em></td></tr><tr><td><strong>Close/merge date</strong></td><td>When the PR was merged or closed</td><td><em><strong>How much work shipped in this period?</strong></em> (Best for throughput and "what did we deliver" reporting)</td></tr><tr><td><strong>First commit date</strong></td><td>The timestamp of the PR's first commit</td><td><em><strong>When did coding actually begin, regardless of when the PR was opened?</strong></em></td></tr><tr><td><strong>Date first authored</strong></td><td>When the PR was first authored</td><td><em><strong>When did authoring begin for cycle-time analysis?</strong></em></td></tr><tr><td><strong>First review date</strong></td><td>When the PR received its first review</td><td><em><strong>When did review activity happen in this period?</strong></em></td></tr><tr><td><strong>Approval date</strong></td><td>When the PR was approved</td><td><em><strong>When did PRs get approved (as opposed to opened or merged)?</strong></em></td></tr><tr><td><strong>Date last updated</strong></td><td>The most recent activity on the PR</td><td><em><strong>Which PRs saw activity in this period, regardless of when they opened?</strong></em></td></tr></tbody></table>

{% hint style="info" %}
For most throughput and delivery reporting, **Close/merge date** is the best defaultas it reflects work that actually shipped. Switch to **Open date** or **First commit date** when you care about when work started rather than when it finished.
{% endhint %}

#### Grouping metrics (chart and table views)

To group your metrics differently, click the **Group by** drop-down in the right pane and select an option:

<div align="left" data-with-frame="true"><figure><img src="/files/sMZrnvQtIiFNk816CCRf" alt="" width="563"><figcaption></figcaption></figure></div>

When you select a grouping with an inherent hierarchy, such as Team, Entity owner, or Domain, a **Show hierarchy** toggle appears. Enable it to see metrics aggregated by hierarchy level and drill down into nested groups, similar to the hierarchy views in the [Bird's Eye](/improve/reports/birds-eye.md) and [All Scorecards](/improve/reports/all-scorecards.md) reports.

See the [full list of grouping options](/improve/eng-intelligence/data-explorer/data-explorer-reference.md#segment-definitions).

{% hint style="info" %}
The metrics segmented by team are based on the individual users within that team. In order to have data appear, the teams must have members and the team's [identity mappings](/configure/settings/managing-users/identity-mapping.md) must be configured.
{% endhint %}

#### Sorting the columns (chart and table views)

{% hint style="info" %}
Sorting is only available if **Show hierarchy** is toggled off.
{% endhint %}

To sort data within the graph, click in the **Sort rows** field in the right pane. Select an option to sort by. Note that options differ depending on the metric you're viewing.

<div align="left" data-with-frame="true"><figure><img src="/files/XNEf4IgJSK1pxhaXF1WN" alt="" width="563"><figcaption></figcaption></figure></div>

### Step 3: Saving the view

Users with the `Edit Eng Intel Dashboards` permission can save a view as a report.

After setting up a view with your preferred metric, filters, and time range, you can save it as a report in Cortex. Note that Cortex refers to these saved reports as **modules**.

1. While viewing a graph, click **Save As** in the upper-right corner of the page. The **Save module** side panel opens.
2. Below **Module name**, enter a name for the report (required).
3. Below **Description**, enter a description of the report.
4. Below **Display icon**, select an icon for the report.
5. Click **Save module**.\
   The report is saved as a module and can be found via **Eng Intelligence > Modules**. From here you can:
   * Add it to a [custom dashboard](/improve/eng-intelligence/dashboards/custom.md)
   * Reopen it at any time without reconfiguring filters
   * Rename, update metric/filter settings, and re-save as needed
     * Locate the report, then click the **overflow icon**. Select **Edit** to reconfigure the graph or **Rename** to change the name of the report.
   * Create a duplicate of the report
     * Locate the report, then click the **overflow icon**. Select **Duplicate**.
   * Share a link with team members
     * Locate the report, then click the **overflow icon**. Select **Share**. The URL is copied to your clipboard. The URL query parameters include timestamps, so the shared Data Explorer page reflects the same results across different timezones.
   * Delete when no longer needed
     * Locate the report, then click the **overflow icon**. Select **Delete**.

{% hint style="info" %}
To encourage transparency and shared focus, every saved module and edit is automatically available to all members of your Eng Intelligence team.
{% endhint %}

### Understanding aggregation types

When you view a metric in Data Explorer, you can choose how the individual data points (e.g. each PR's Time to Merge) are aggregated into a single headline number. The aggregation you choose changes the story the number tells, but it does **not** change which metric or which underlying dates are being measured.

{% hint style="info" %}

#### **Aggregations are only comparable within the same metric**

A P95 of 'Time to Merge' and a median of 'Cycle Time' measure different things over different date ranges, so their values can't be meaningfully compared. Before comparing two numbers, confirm that the metric name shown at the top of the module is the same for both;  changing the aggregation should not change the metric you're measuring.
{% endhint %}

<table><thead><tr><th width="149.16796875">Aggregation</th><th>What it tells you</th></tr></thead><tbody><tr><td><strong>Average</strong> (mean)</td><td>The sum of all values divided by the number of values. Useful for a general sense of the typical result, but sensitive to outliers.</td></tr><tr><td><strong>Median</strong> (P50)</td><td>The middle value—half of your data points are faster and half are slower. More resistant to outliers than the average.</td></tr><tr><td><strong>P95</strong></td><td>The value that 95% of your data points come in under. Represents the slow tail; the experience of your slowest 5%.</td></tr><tr><td><strong>Min / Max</strong></td><td>The single fastest or slowest value in the range.</td></tr><tr><td><strong>Sum</strong></td><td>The total across all values (used for count-style custom metrics).</td></tr></tbody></table>

{% hint style="info" %}

#### **Why P95 is usually higher than the median or average**

Most PR-timing metrics are right-skewed, meaning the majority of PRs complete quickly, and a small number take much longer. For this kind of data, P95 will almost always be higher than both the median and the average, because P95 deliberately sits out in the slow tail while the average is pulled down by the fast majority.

This is expected and correct. By definition, P95 is always greater than or equal to the median (P50) **for the same metric**. If P95 ever appears lower than the median or average, you are more than likely comparing two different metrics.
{% endhint %}
