Analysis
Q1: Demand reduction
Simple comparison of the ‘demand response session’ day half-hourly demand with the mean half-hourly demand for the previous n weekdays or weekend days as appropriate. Default n is 10.
All sorts of caveats apply:
- not all of these sessions were national ‘live’ events, some were trials by a single retailer (Octopus)
- even though we compare with weekdays or weekend days as appropriate, we may still not be comparing like with like (cold vs warm, holiday vs non-holiday etc)
- we can’t tell from this analysis what demand would have looked like without the demand response intervention. That would require all the retailers to aggregate the ‘savings’ they estimate… or a randomised control trial
Q2: Twitter sentiment analysis
Inspired by https://www.tidytextmining.com/sentiment.html (sentiment analysis) and https://towardsdatascience.com/create-a-word-cloud-with-r-bde3e7422e8a (word clouds)
Extract the tweets for the day of each DFS event and the day after.
Remove stop words (to, the, and, a, for, etc) & profanity etc from the tweets and sentiment them.
In each case we report the number of negative and positive codings (according to tidytext::get_sentiments("bing")) for the unique words. This will add up to the Number of unique words by sentiment. We then report the total frequency of words that are negative or positive (which will add up to the total number of words).
Remember the size of the (positive/negative) words in the word cloud is relative to the count of all (positive/negative) words in the wordcloud, not the total word count.
Saving sessionsID | type | start_hh | end_hh |
|---|
1 | octopus | 2022-11-15 17:00:00 | 2022-11-15 17:30:00 |
2 | octopus | 2022-11-22 17:30:00 | 2022-11-22 18:00:00 |
3 | octopus | 2022-11-30 17:30:00 | 2022-11-30 18:00:00 |
4 | octopus | 2022-12-01 17:30:00 | 2022-12-01 18:00:00 |
5 | octopus | 2022-12-12 17:00:00 | 2022-12-12 17:30:00 |
6 | octopus | 2023-01-19 09:00:00 | 2023-01-19 09:30:00 |
7 | NG-ESO live | 2023-01-23 17:00:00 | 2023-01-23 17:30:00 |
8 | NG-ESO live | 2023-01-24 16:30:00 | 2023-01-24 17:30:00 |
9 | octopus | 2023-01-30 09:00:00 | 2023-01-30 09:30:00 |
10 | octopus | 2023-02-13 17:30:00 | 2023-02-13 18:00:00 |
11 | octopus | 2023-02-21 17:30:00 | 2023-02-21 18:00:00 |
12 | NG-ESO live | 2023-03-15 18:30:00 | 2023-03-15 19:00:00 |
13 | octopus | 2023-03-23 18:30:00 | 2023-03-23 19:00:00 |
Session 1 (Octopus: Tue 15 Nov 2022 17:00)
- 2022-11-15 17:00:00 to
- 2022-11-15 18:00:00
(Not all retailers may have taken part in this one)
According to https://energycentral.com/news/octopus-energy-provide-108mw-grid-flexibility-first-%E2%80%98saving-session%E2%80%99:
“Over 200,000 households reduced their energy demand by 108MW collectively, the same as a gas power station can generate in an hour. If replicated by all UK energy suppliers, this would be over 1GW.”
But https://www.current-news.co.uk/news/octopus-energy-customers-provide-108mw-of-flexibility-during-first-saving-session quotes Octopus as actually saying:
“if the program was scaled to all electric smart meter customers with all supplier[s] in Great Britain, it could create over 1GW of flexible energy load”
The following plot compares GB electricity demand during the DFS event with mean GB electricity demand over the last n similar days (i.e. weekdays or weekends as appropriate).
MW comparisonshms | Comparison mean | Saving session | diff | pc_diff |
|---|
17:00:00 | 41,153.5 | 42,925.0 | 1,771.5 | 4.3 |
17:30:00 | 41,173.7 | 42,736.0 | 1,562.3 | 3.8 |
Confounding factors:
- recent temperature trends
- recent holidays
- etc
Note that the comparison plot/table shows the difference between the DFS event day and the previous similar days. This does not show what the event day energy use would have been in the absence of the intervention - we’d need a randomised control on the day for that (or a sophisticated demand model as the counterfactual).
Octopus customers’ 108 MW was 0.252 % of mean GB generation (42.925 GW) over the hour of the session (see NG-ESO data above).
108 MW over 200,000 customers is 5.4^{-4} MW per household or, more sensibly, 0.54 kW per household. A pretty reasonable reduction.
But if 200,000 produced a 108 MW power reduction (0.54 kW per household ), the 1 GW estimate implies we only have 1,851,852 GB households with a smart meter. Really? Or did they mean all suppliers taking part in the scheme?
Anyway, the latest data has 14 million domestic eletricity smart meters as of Q1 2022 - 45% of all domestic meters.
So:
- If all ~28 million households in the UK did this it would be 1.512^{7} kW. That’s 15.12 GW…
- If we reduce ambition a bit and assume that only the 14 million domestic GB customers with a smart meter as of Q2 2022 did this then that would provide 7.56 GW. Which would be 17.61 % of generation. Not bad aye?
The trouble is… these are octopus customers self-selecting into a trial. You just have to read the tweets to see that there are households with installed batteries, pausable heat pumps in well-insulated homes and EV V2G. At what point will we all be similarly equipped?
Carbon intensity
And just to keep in mind the carbon context:
Turning to hashtags, we only have #savingSessions tweets for this event.
Session 2 (Octopus: Tue 22 Nov 2022 17:30)
- 2022-11-22 17:30:00 to
- 2022-11-22 18:30:00
(Not all retailers may have taken part in this one)
The same caveats about the comparisons apply here…
MW comparisonshms | Comparison mean | Saving session | diff | pc_diff |
|---|
17:30:00 | 42,352.4 | 41,354.0 | -998.4 | -2.4 |
18:00:00 | 42,027.6 | 40,784.0 | -1,243.6 | -3.0 |
Carbon intensity
And just to keep in mind the carbon context:
Turning to hashtags, we only have #savingSessions tweets for this event.
Session 3 (Octopus: Wed 30 Nov 2022 17:30)
- 2022-11-30 17:30:00 to
- 2022-11-30 18:30:00
(Not all retailers may have taken part in this one)
The same caveats about the comparisons apply here…
MW comparisonshms | Comparison mean | Saving session | diff | pc_diff |
|---|
17:30:00 | 42,851.4 | 41,489.0 | -1,362.4 | -3.2 |
18:00:00 | 42,469.4 | 41,011.0 | -1,458.4 | -3.4 |
Carbon intensity
And just to keep in mind the carbon context:
Turning to hashtags, we only have #savingSessions tweets for this event.
Session 4 (Octopus: Thu 01 Dec 2022 17:30)
- 2022-12-01 17:30:00 to
- 2022-12-01 18:30:00
(Not all retailers may have taken part in this one)
The same caveats about the comparisons apply here…
MW comparisonshms | Comparison mean | Saving session | diff | pc_diff |
|---|
17:30:00 | 42,810.5 | 42,194.0 | -616.5 | -1.4 |
18:00:00 | 42,393.3 | 41,516.0 | -877.3 | -2.1 |
Carbon intensity
And just to keep in mind the carbon context:
Turning to hashtags, we only have #savingSessions tweets for this event.
Session 5 (Octopus: Mon 12 Dec 2022 17:00)
- 2022-12-12 17:00:00 to
- 2022-12-12 18:00:00
(Not all retailers may have taken part in this one)
The same caveats about the comparisons apply here…
MW comparisonshms | Comparison mean | Saving session | diff | pc_diff |
|---|
17:00:00 | 43,741.7 | 47,821.0 | 4,079.3 | 9.3 |
17:30:00 | 43,777.1 | 48,470.0 | 4,692.9 | 10.7 |
Carbon intensity
And just to keep in mind the carbon context:
Turning to hashtags, we only have #savingSessions tweets for this event.
Session 6 (Octopus: Thu 19 Jan 2023 09:00)
- 2023-01-19 09:00:00 to
- 2023-01-19 10:00:00
(Not all retailers may have taken part in this one)
The same caveats about the comparisons apply here…
MW comparisonshms | Comparison mean | Saving session | diff | pc_diff |
|---|
09:00:00 | 40,592.8 | 45,823.0 | 5,230.2 | 12.9 |
09:30:00 | 41,228.5 | 46,740.0 | 5,511.5 | 13.4 |
Carbon intensity
And just to keep in mind the carbon context:
Turning to hashtags, we only have #savingSessions tweets for this event.
Session 7 (NG-ESO ‘live’: Mon 23 Jan 2023 17:00)
- 2023-01-23 17:00:00 to
- 2023-01-23 18:00:00
This was a more generalised call for DFS
The same caveats about the comparisons apply here…
MW comparisonshms | Comparison mean | Saving session | diff | pc_diff |
|---|
17:00:00 | 44,751.7 | 46,086.0 | 1,334.3 | 3.0 |
17:30:00 | 44,894.9 | 45,684.0 | 789.1 | 1.8 |
Carbon intensity
And just to keep in mind the carbon context:
Turning to hashtags, we have both #savingSessions and #demandFlexibilityService tweets for this event.
#demandFlexibilityService tweets
Number of tweets: 169
Positive words…
Joining with `by = join_by(word)`
Joining with `by = join_by(word)`
Tweets from Mon 23 Jan 2023 00:00 to Tue 24 Jan 2023 00:00
Negative words…
Joining with `by = join_by(word)`
Joining with `by = join_by(word)`
Total word and unique word counts…
Number of unique words by sentiment
| Var1 |
Freq |
| negative |
23 |
| positive |
32 |
Number of words by sentiment
| sentiment |
freq |
| negative |
69 |
| positive |
113 |
Session 8 (NG-ESO ‘live’: Tue 24 Jan 2023 16:30)
- 2023-01-24 16:30:00 to
- 2023-01-24 18:00:00
This was another generalised call for DFS:
The same caveats about the comparisons apply here…
Also this event followed very soon after the last one so this will affect the comparison ‘baseline’ (previous n days).
MW comparisonshms | Comparison mean | Saving session | diff | pc_diff |
|---|
16:30:00 | 44,093.7 | 44,975.0 | 881.3 | 2.0 |
17:00:00 | 44,965.3 | 45,275.0 | 309.7 | 0.7 |
17:30:00 | 45,027.4 | 44,814.0 | -213.4 | -0.5 |
Carbon intensity
And just to keep in mind the carbon context:
Turning to hashtags, we have both #savingSessions and #demandFlexibilityService tweets for this event.
#demandFlexibilityService tweets
Number of tweets: 72
Positive words…
Joining with `by = join_by(word)`
Joining with `by = join_by(word)`
Tweets from Tue 24 Jan 2023 00:00 to Wed 25 Jan 2023 00:00
Negative words…
Joining with `by = join_by(word)`
Joining with `by = join_by(word)`
Total word and unique word counts…
Number of unique words by sentiment
| Var1 |
Freq |
| negative |
9 |
| positive |
19 |
Number of words by sentiment
| sentiment |
freq |
| negative |
37 |
| positive |
61 |
Session 9 (Octopus: Mon 30 Jan 2023 09:00)
- 2023-01-30 09:00:00 to
- 2023-01-30 10:00:00
The same caveats about the comparisons apply here…
MW comparisonshms | Comparison mean | Saving session | diff | pc_diff |
|---|
09:00:00 | 43,861.3 | 42,191.0 | -1,670.3 | -3.8 |
09:30:00 | 44,589.2 | 42,699.0 | -1,890.2 | -4.2 |
Carbon intensity
And just to keep in mind the carbon context:
Turning to hashtags, we have both #savingSessions and #demandFlexibilityService tweets for this event.
#demandFlexibilityService tweets
Unlikely to be many of these as this was not a system-wide NG-ESO ‘live’ event.
Number of tweets: 12
Positive words…
Joining with `by = join_by(word)`
Joining with `by = join_by(word)`
Tweets from Mon 30 Jan 2023 00:00 to Tue 31 Jan 2023 00:00
Negative words…
Joining with `by = join_by(word)`
Joining with `by = join_by(word)`
Total word and unique word counts…
Number of unique words by sentiment
| Var1 |
Freq |
| negative |
1 |
| positive |
3 |
Number of words by sentiment
| sentiment |
freq |
| negative |
2 |
| positive |
3 |
Session 10 (Octopus: Mon 13 Feb 2023 17:30)
- 2023-02-13 17:30:00 to
- 2023-02-13 18:30:00
The same caveats about the comparisons apply here…
MW comparisonshms | Comparison mean | Saving session | diff | pc_diff |
|---|
17:30:00 | 42,913.7 | 40,609.0 | -2,304.7 | -5.4 |
18:00:00 | 42,434.7 | 40,555.0 | -1,879.7 | -4.4 |
MW comparisons
Carbon intensity
And just to keep in mind the carbon context:
Turning to hashtags, we have both #savingSessions and #demandFlexibilityService tweets for this event.
#demandFlexibilityService tweets
Unlikely to be many of these as this was not a system-wide NG-ESO ‘live’ event.
Number of tweets: 15
Positive words…
Joining with `by = join_by(word)`
Joining with `by = join_by(word)`
Tweets from Mon 13 Feb 2023 00:00 to Tue 14 Feb 2023 00:00
Negative words…
Joining with `by = join_by(word)`
Joining with `by = join_by(word)`
Total word and unique word counts…
Number of unique words by sentiment
| Var1 |
Freq |
| negative |
1 |
| positive |
2 |
Number of words by sentiment
| sentiment |
freq |
| negative |
2 |
| positive |
6 |
Session 11 (Octopus: Tue 21 Feb 2023 17:30)
- 2023-02-21 17:30:00 to
- 2023-02-21 18:30:00
The same caveats about the comparisons apply here…
MW comparisonshms | Comparison mean | Saving session | diff | pc_diff |
|---|
17:30:00 | 41,665.0 | 39,528.0 | -2,137.0 | -5.1 |
18:00:00 | 41,248.7 | 39,276.0 | -1,972.7 | -4.8 |
MW comparisons
Carbon intensity
And just to keep in mind the carbon context:
Turning to hashtags, we have both #savingSessions and #demandFlexibilityService tweets for this event.
#demandFlexibilityService tweets
Unlikely to be many of these as this was not a system-wide NG-ESO ‘live’ event.
Number of tweets: 4
Positive words…
Joining with `by = join_by(word)`
Joining with `by = join_by(word)`
Warning in max(freq): no non-missing arguments to max; returning -Inf
Warning in max(freq): no non-missing arguments to max; returning -Inf
Error in strwidth(words[i], cex = size[i], ...) : invalid 'cex' value
Tweets from Tue 21 Feb 2023 00:00 to Wed 22 Feb 2023 00:00
Negative words…
Joining with `by = join_by(word)`
Joining with `by = join_by(word)`
Warning in max(freq): no non-missing arguments to max; returning -Inf
Warning in max(freq): no non-missing arguments to max; returning -Inf
Error in strwidth(words[i], cex = size[i], ...) : invalid 'cex' value
Total word and unique word counts…
Number of unique words by sentiment
| Var1 |
Freq |
| negative |
4 |
| positive |
14 |
Number of words by sentiment
| sentiment |
freq |
| negative |
12 |
| positive |
35 |
Session 12 (NG-ESO ‘live’ (?): Wed 15 Mar 2023 18:30)
- 2023-03-15 18:30:00 to
- 2023-03-15 19:30:00
The same caveats about the comparisons apply here…
MW comparisonshms | Comparison mean | Saving session | diff | pc_diff |
|---|
18:30:00 | 42,237.6 | 41,357.0 | -880.6 | -2.1 |
19:00:00 | 40,892.1 | 40,730.0 | -162.1 | -0.4 |
MW comparisons
Carbon intensity
And just to keep in mind the carbon context:
Turning to hashtags, we have both #savingSessions and #demandFlexibilityService tweets for this event.
#demandFlexibilityService tweets
Number of tweets: 1
Positive words…
Joining with `by = join_by(word)`
Joining with `by = join_by(word)`
Tweets from Wed 15 Mar 2023 00:00 to Wed 15 Mar 2023 00:00
Negative words…
Joining with `by = join_by(word)`
Joining with `by = join_by(word)`
Warning in max(freq): no non-missing arguments to max; returning -Inf
Warning in max(freq): no non-missing arguments to max; returning -Inf
Error in strwidth(words[i], cex = size[i], ...) : invalid 'cex' value
Total word and unique word counts…
Number of unique words by sentiment
| Var1 |
Freq |
| positive |
1 |
Number of words by sentiment
| sentiment |
freq |
| positive |
1 |
Session 13 (Octopus (?): Thu 23 Mar 2023 18:30)
- 2023-03-23 18:30:00 to
- 2023-03-23 19:30:00
The same caveats about the comparisons apply here…
MW comparisonshms | Comparison mean | Saving session | diff | pc_diff |
|---|
18:30:00 | 39,905.6 | 38,362.0 | -1,543.6 | -3.9 |
19:00:00 | 38,711.5 | 37,611.0 | -1,100.5 | -2.8 |
MW comparisons
Carbon intensity
And just to keep in mind the carbon context:
Turning to hashtags, we have both #savingSessions and #demandFlexibilityService tweets for this event.
#demandFlexibilityService tweets
Number of tweets: 0
Positive words…
Joining with `by = join_by(word)`
Joining with `by = join_by(word)`
Warning in max(freq): no non-missing arguments to max; returning -Inf
Warning in max(freq): no non-missing arguments to max; returning -Inf
Error in strwidth(words[i], cex = size[i], ...) : invalid 'cex' value
Tweets from Thu 23 Mar 2023 00:00 to Fri 24 Mar 2023 00:00
Negative words…
Joining with `by = join_by(word)`
Joining with `by = join_by(word)`
Warning in max(freq): no non-missing arguments to max; returning -Inf
Warning in max(freq): no non-missing arguments to max; returning -Inf
Error in strwidth(words[i], cex = size[i], ...) : invalid 'cex' value
Total word and unique word counts…
Number of unique words by sentiment
| Var1 |
Freq |
| negative |
19 |
| positive |
50 |
Number of words by sentiment
| sentiment |
freq |
| negative |
22 |
| positive |
75 |