Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 41 additions & 12 deletions reports/il_lea/index.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ The authors would like to thank:

## Data and Methods

### Data collected directly from rate cases {#sec-data-sources}
### Data collected from rate case filings {#sec-data-sources}
| Utility | Data | Source |
|-------------|---------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Nicor | LEA spending | [ICC Rate Case 23-0066](https://www.documentcloud.org/documents/26188653-nicor-p2023-0066-pio-exhibit-12-30205654/), [ICC Rate Case 25-0055](https://www.documentcloud.org/documents/26193423-nicor_p2025-0055-pio-cross-exhibit-20-51703648/) |
Expand All @@ -178,26 +178,55 @@ The authors would like to thank:
| Ameren | Material spending on new gas connections | [ICC Rate Case 23-0067](https://www.documentcloud.org/documents/26188848-ameren-p2023-0067-pio-exhibit-12-96925852/) |
| Ameren | Standard cost equivalent for new connection | [ICC Rate Case 25-0084](https://www.documentcloud.org/documents/26193410-ameren_p2025-0084-pio-exhibit-12-57399815/) |

### Data availability

```{r}
gt_table
```

### Estimated data
#### Peoples Gas
Peoples Gas did not report a cost per service line connection, so the figure is based on the average reported "per project" cost, which we interpret to mean connections.
Per project service line costs were calculated by subtracting the customer contribution from the total extension cost and dividing by the number of service line projects in each year.

Peoples Gas reported "the NonQIP main expenditures, excluding customer contributions, for projects that required main extensions. The expenditures include main related costs for the entire project". @peoplesgas_Docket230068Peoples_2023 Qualified Infrastructure Plant (QIP) typically refers to infrastructure replacement or modernization projects. We cannot be certain that all of these expenses were related to line extension allowances. The figures reported here should be considered an upper bound on the true cost of main line extension allowances for Peoples Gas.
For utilities that did not provide complete data, we calculated missing figures using available information. When a gas utility connects a new customer, there are costs for installing pipes and equipment. Line Extension Allowances (LEAs) are the portion of these costs that the utility covers as an incentive for new customers. The customer typically contributes the remainder. Together, these two amounts represent the total cost of extending service. This section explains our methodology for each utility.

**Peoples Gas**
Peoples Gas reported their main line extension costs under "NonQIP main expenditures" for projects requiring main extensions. [@peoplesgas_Docket230068Peoples_2023] NonQIP refers to expenses that don't qualify as Qualified Infrastructure Plant—typically new construction rather than replacement or modernization projects. These figures include all main-related costs for the entire project.

**What we calculated:**

- **Total LEA spending**: Used the reported total expenditures on [mains](https://www.documentcloud.org/documents/26189740-peoplesgas-p2023-0068-pio-exhibit-12-64269107/#document/p36/a2674688) and [service](https://www.documentcloud.org/documents/26189740-peoplesgas-p2023-0068-pio-exhibit-12-64269107/#document/p36/a2674690) values directly from their filings
- **Cost per connection**: Used their reported [cost_per_new_service](https://www.documentcloud.org/documents/26189763-peoples-gas-p2023-0069-pio-cross-exhibit-100-95312469/#document/p1/a2674697) values, which represent the average subsidy per new customer hookup. We understood this to be a combined average of the total subsidized cost of connecting "a single new **residential single-family home** to its distribution system". @peoplesgas_Docket230069PIO_2023


**Important caveat**: The reported "main expenditures" include "the entire project" costs. We cannot be certain that all of these expenses were specifically for line extension allowances versus other new service costs. The figures reported here should be considered an upper bound on the true cost of main line extension allowances for Peoples Gas.



**Nicor Gas**
Nicor Gas provided detailed breakdowns of their line extension program costs across two rate case dockets. @northernillinoisgascompany_Docket230066Nicor_2023, @northernillinoisgascompany_Docket250055LongTerm_2025 . Their data distinguished between main line extensions (the larger distribution pipes in streets) and service line extensions (the smaller pipes connecting individual properties to the main).

**What we calculated:**

- **Total LEA spending**: Used the utility's [extension cost](https://www.documentcloud.org/documents/26188653-nicor-p2023-0066-pio-exhibit-12-30205654/#document/p33/a2675139) (what Nicor spent) and subtracted the [customer contribution](https://www.documentcloud.org/documents/26188653-nicor-p2023-0066-pio-exhibit-12-30205654/#document/p34/a2675143) (what customers paid) to get the total cost of line extensions. The LEA subsidy is the portion Nicor covers.
- **Cost per connection (mains)**: Used Nicor's reported estimates from their "200 foot free main allowance" program, which provides their [average cost per customer](https://www.documentcloud.org/documents/26188653-nicor-p2023-0066-pio-exhibit-12-30205654/#document/p31/a2674817) for main line extensions. Note: It's unclear whether multi-family buildings with multiple units count as one or multiple "customers" in this calculation.
- **Cost per connection (service lines)**: Divided the total extension costs by the number of service line projects. We assume one project equals one new connection.

**Data note**: For 2026, Nicor provided both aggregated and itemized forecasts across two rate cases. The earlier rate case forecasted a lower LEA spending figure than the later rate case. To avoid double-counting, we adjusted the 2026 figures by subtracting the aggregate forecast from one case and keeping only the additional detail from the other.



#### Nicor Gas
The total LEA spending figure was calculated by subtracting the reported customer contribution from the reported total extension cost for main service lines in each year. @northernillinoisgascompany_Docket230066Nicor_2023
**Ameren Gas**
Ameren Gas does not track line extension spending as a separate category. Instead, they provided data on two "standing work orders" (SWOs)—essentially budget categories for ongoing types of work—related to new customer connections. [@kilhoffer_Docket230067Ameren_2023]

Nicor provided estiamtes of their average cost in 200 foot free main allowance per foot and per customer. We interpret per customer to mean the average cost per new connection. It is unclear if this figure would include mulitple customers per connection in the case of a multi-family building.
The **transmission SWO** covers large-scale equipment like meter sets, regulator station upgrades, and monitoring systems needed for major customer loads. The **distribution SWO** covers the everyday connection work: gas mains, service lines, fittings, and other materials for new service requests.

The per connection cost estimates for service line extensions were calculated by subtracting the reported customer contribution from the reported total extension cost for service line extensions in each year and dividing by the reported number of service line projects in each year. We assume that one project is equal to one new connection.
For each SWO, Ameren also reported Customer Contributions in Aid of Construction (CIAC)—the portion customers pay upfront.

#### Ameren Gas
Ameren Gas did not report total LEA spending for service or main line extensions. Instead they provided data for two standing work orders (SWOs) for new business for transmission and distribution related work. The report describes **transmission SWO** includes "work for large meter sets, regulator station upgrades and SCADA when such equipment is required for acustomer load addition."" The **distribution SWO** includes "gas mains, service lines, fittings and other material associated with new service requests". For each of these SWOs, they also provided dollar values for the total Customer Contributions in Aid of Construction (CIAC). @kilhoffer_Docket230067Ameren_2023 We estiamted the total LEA spending by subtracting the distribution SWO CIAC from the distribution SWO total.
**What we calculated:**

Ameren Gas reported the standard cost equivalent for a new connection as 400 feet. We interpret this to mean the maximum LEA subsidy per new connection. The remainder of the connection cost is the responsibility of the customer. There was no data on the actual average cost per connection, so we used the standard cost equivalent which should be considered an upper bound.
- **Total LEA spending**: Calculated the net distribution SWO costs by **subtracting** [customer contributions](https://www.documentcloud.org/documents/26188848-ameren-p2023-0067-pio-exhibit-12-96925852/#document/p13/a2674478) from the [total distribution work order expenses](https://www.documentcloud.org/documents/26188848-ameren-p2023-0067-pio-exhibit-12-96925852/#document/p13/a2674478) to get the full cost of distribution-related new service work. This gives us a proxy for line extension activity, though it's not a perfect match since SWOs may include some work beyond traditional line extensions.
- **Cost per connection**: Used Ameren's ["standard cost equivalent"](https://www.documentcloud.org/documents/26193410-ameren_p2025-0084-pio-exhibit-12-57399815/#document/p20/a2675137) of 400 feet of main per new connection, which represents the maximum LEA subsidy a customer receives. Customers pay for any additional distance beyond this allowance. @amerenillinoiscompany_Docket250084Response_2025

**Important caveat**: We do not have data on actual average costs per connection, only the standard allowance. The 400-foot standard should be considered an upper bound—some connections likely cost less. Additionally, the SWO data includes all new service work, which may be broader than traditional line extension allowances.

## Assumptions

Expand Down
115 changes: 114 additions & 1 deletion reports/il_lea/notebooks/analysis.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ format:
```{r}
library(tidyverse)
library(tidyplots)

library(gt)
source("/workspaces/reports2/lib/ggplot/switchbox_theme.R")
```

Expand Down Expand Up @@ -266,6 +266,119 @@ peoples_per_connect_22 <- lea_df |>

```

```{r}
#| label: tbl-data-availability
#| tbl-cap: "Data availability by utility and metric. Green indicates data provided directly by utility, yellow indicates estimated/calculated values, red indicates missing data."

# Create data availability matrix - color info embedded in data
data_avail <- tribble(
~Utility, ~Period, ~`Mains Total`, ~`Services Total`, ~`Mains Per Connection`, ~`Mains Per Customer`, ~`Services Per Connection`, ~`Services Per Customer`, ~`N Mains`, ~`N Services`,
# Nicor Historical
"Nicor Gas", "Historical",
"2018-2022|green", "2018-2022|green", "red", "2019-2023|green", "2018-2022|yellow", "red", "2018-2022|green", "2018-2022|green",
# Nicor Forecast
"Nicor Gas", "Forecast",
"2023-2026|green", "2023-2026|green", "red", "red", "2023-2026|yellow", "red", "2023-2026|green", "2023-2026|green",
# Ameren Historical
"Ameren Gas", "Historical",
"2021-2022|yellow", "2021-2022|yellow", "2021-2025|yellow", "red", "red", "red", "red", "red",
# Ameren Forecast
"Ameren Gas", "Forecast",
"2023-2024|yellow", "2023-2025|yellow", "red", "red", "red", "red", "red", "red",
# Peoples Historical
"Peoples Gas", "Historical",
"2018-2022|yellow", "2018-2022|yellow", "red", "red", "2020-2022;2023|yellow", "2020-2022|yellow", "2018-2022|yellow", "2018-2022|green",
# Peoples Forecast
"Peoples Gas", "Forecast",
"2023-2024|yellow", "red", "red", "red", "red", "red", "2023-2024|yellow", "red"
)

# Extract display text
data_display <- data_avail |>
mutate(across(-c(Utility, Period), ~ {
case_when(
str_detect(.x, "\\|green") ~ str_remove(.x, "\\|green"),
str_detect(.x, "\\|yellow") ~ str_remove(.x, "\\|yellow"),
.x == "red" ~ "—",
TRUE ~ .x
)
}))

# Extract colors
data_colors <- data_avail |>
mutate(across(-c(Utility, Period), ~ {
case_when(
str_detect(.x, "\\|green") ~ "green",
str_detect(.x, "\\|yellow") ~ "yellow",
.x == "red" ~ "red",
TRUE ~ "none"
)
}))

# Color mapping
color_hex <- c(green = "#d4edda", yellow = "#fff3cd", red = "#f8d7da", none = "#ffffff")

# Create base gt table
gt_table <- data_display |>
gt() |>
cols_label(
Period = "Period",
`Mains Total` = "Mains Total",
`Services Total` = "Services Total",
`Mains Per Connection` = "Per Connection",
`Mains Per Customer` = "Per Customer",
`Services Per Connection` = "Per Connection",
`Services Per Customer` = "Per Customer",
`N Mains` = "Mains",
`N Services` = "Services"
) |>
tab_spanner(
label = "Total Spending Allowance",
columns = c(`Mains Total`, `Services Total`)
) |>
tab_spanner(
label = "Mains Allowance Spending",
columns = c(`Mains Per Connection`, `Mains Per Customer`)
) |>
tab_spanner(
label = "Services Allowance Spending",
columns = c(`Services Per Connection`, `Services Per Customer`)
) |>
tab_spanner(
label = "Projects Per Year",
columns = c(`N Mains`, `N Services`)
) |>
cols_align(
align = "center",
columns = -c(Utility, Period)
) |>
tab_options(
table.font.size = px(11),
column_labels.font.weight = "bold"
) |>
tab_footnote(
footnote = "Green: Provided directly by utility | Yellow: Best estimate or calculated | Red: Not available"
)

# Apply colors programmatically from the data
data_cols <- names(data_display)[-(1:2)] # All columns except Utility and Period

for (i in 1:nrow(data_display)) {
for (col_name in data_cols) {
cell_color <- data_colors[[col_name]][i]
if (cell_color != "none") {
gt_table <- gt_table |>
tab_style(
style = cell_fill(color = color_hex[cell_color]),
locations = cells_body(columns = all_of(col_name), rows = i)
)
}
}
}

gt_table
```

```{r}
save.image("/workspaces/reports2/reports/il_lea/report_vars.RData")
```
7 changes: 4 additions & 3 deletions reports/il_lea/notebooks/data_cleaning.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@ nicor_tmp <- nicor_23 |>
) |>
pivot_wider(names_from = c(type), values_from = value) |>
mutate(
lea_cost = extension_cost + customer_contribution,
# Customer contributions are negative in source data, so we subtract the absolute value
lea_cost = extension_cost - abs(customer_contribution),
cost_per_project = lea_cost / n_projects,
cost_per_connection = lea_cost_per_customer
) |>
Expand Down Expand Up @@ -127,8 +128,8 @@ ameren_tmp <- ameren_23 |>
filter(type != "lea_allowance") |>
pivot_wider(names_from = c(type), values_from = value) |>
mutate(
lea_cost = distribution_extensions_total +
distribution_extensions_customer_contributions,
# Customer contributions are negative in source data, so we subtract the absolute value
lea_cost = distribution_extensions_total - abs(distribution_extensions_customer_contributions),
cost_per_project = NA,
cost_per_connection = NA
) |>
Expand Down