# A tibble: 4,364 × 11
State DB `Meter type` Period Retailer Name Solar meter fee (c/d…¹
<chr> <chr> <chr> <date> <chr> <chr> <dbl>
1 NSW Essentia… Single 2024-06-30 Energy … Onli… 1
2 NSW Essentia… Single 2024-06-30 AGL Sola… 2
3 NSW Essentia… Single 2024-06-30 Alinta … Prio… 3
4 NSW Essentia… Single 2024-06-30 Diamond… Rene… 4
5 NSW Essentia… Single 2024-06-30 Dodo Po… Mark… 5
6 NSW Essentia… Single 2024-06-30 EnergyA… Sola… 6
7 NSW Essentia… Single 2024-06-30 Origin … Sola… 7
8 NSW Essentia… Single 2024-06-30 Powersh… Powe… 8
9 NSW Essentia… Single 2024-06-30 Red Ene… Sola… 9
10 NSW Essentia… Single 2024-06-30 Engie Solar 10
# ℹ 4,354 more rows
# ℹ abbreviated name: ¹`Solar meter fee (c/day)`
# ℹ 4 more variables: FiT_c_kWh <dbl>, First_kWh_per_quarter <dbl>,
# Second_FiT_c_kWh <dbl>, effective_FiT <dbl>
Sanity check
Code
violations <- final %>%filter(# Case A: two‐tier plans where effective_FiT should lie between FiT_c_kWh and Second_FiT_c_kWh!is.na(FiT_c_kWh) &!is.na(Second_FiT_c_kWh) & (effective_FiT <pmin(FiT_c_kWh, Second_FiT_c_kWh) | effective_FiT >pmax(FiT_c_kWh, Second_FiT_c_kWh))|# Case B: single‐tier plans (no second FIT) where effective_FiT should exactly match FiT_c_kWh!is.na(FiT_c_kWh) &is.na(Second_FiT_c_kWh) & effective_FiT != FiT_c_kWh )# Reportif (nrow(violations) ==0) {message("All effective_FiT values are within expected bounds.")} else {message("Found ", nrow(violations), " rows violating the effective_FiT logic:")print(violations %>%select(State, DB, `Meter type`, Period, Retailer, Name, FiT_c_kWh, Second_FiT_c_kWh, effective_FiT))}
Plot
All retailers
Code
final <- final %>%mutate(Period =as.Date(Period),effective_FiT =as.numeric(effective_FiT) )states <-unique(final$State)for (st in states) { df_st <- final %>%filter(State == st, !is.na(effective_FiT), `Meter type`=="Single") %>%group_by(Period, State, Retailer) %>%summarise(effective_FiT =mean(effective_FiT, na.rm =TRUE) ) p <-ggplot(df_st, aes(x = Period, y = effective_FiT, colour = Retailer, group = Retailer)) +geom_line() +scale_x_date(date_labels ="%b %Y", date_breaks ="6 months") +labs(title =paste("Feed-in tariff rates over time - ", st),x =NULL,y ="Effective FiT (c/kWh)",colour ="Retailer" ) +theme_minimal() +theme(axis.text.x =element_text(angle =45, hjust =1),plot.title =element_text(size =14, face ="bold"),legend.position ="none" )print(p)}
Major retailers & others
Code
# Define the retailers of interestcore_retailers <-c("AGL", "Origin Energy", "EnergyAustralia")other_label <-"Others"# Loop over each statefor (st inunique(final$State)) { df_plot <- final %>%filter(State == st, !is.na(effective_FiT), `Meter type`=="Single") %>%mutate(RetailerGroup =if_else(Retailer %in% core_retailers, Retailer, other_label) ) %>%group_by(Period, RetailerGroup) %>%summarise(effective_FiT =mean(effective_FiT, na.rm =TRUE), .groups ="drop") p <-ggplot(df_plot, aes(x = Period, y = effective_FiT, colour = RetailerGroup, group = RetailerGroup)) +geom_line() +geom_point() +scale_x_date(date_labels ="%b %Y", date_breaks ="6 months") +labs(title =paste("Effective FiT Over Time -", st),x =NULL,y ="Effective FiT (c/kWh)",colour ="Retailer" ) +theme_minimal(base_size =12) +theme(axis.text.x =element_text(angle =45, hjust =1),plot.title =element_text(size =14, face ="bold") )print(p)}