Energy inefficiency and ill-health

Back in 2014, the UK’s Department for Energy and Climate Change was under pressure to show that green subsidies were not driving up household energy bills.

DECC produced handy infographic offering a transparent breakdown of average energy costs per household.

It’s pretty obvious that we all have to pay the wholesale costs of fuel. We also pay to maintain the pipes and wires that deliver gas an electricity to our doors. We pay (a low rate of) VAT and we cover the margin and supply costs of energy companies.

But there were a few things missing… whether we like it or not we are all paying for the energy inefficiency of housing: the costs of air pollution from all those boilers straining to keep houses warm, the NHS costs of ill-health from damp and cold homes, the cost of climate impacts and, as I discovered, the tax we pay to subsidise fossil fuels.

So I redrew that infographic with all those invisible costs.

Since I originally did this, the department of Energy and Climate Change has been renamed Business, Energy and Industrial Strategy. The government dropped the bit about pesky climate change. But in 2019 we have Greta Thunberg, we have climate strikes, we have Extinction Rebellion and we have talk of a Green New Deal.

We also have even less time to act.

So, maybe in 2019 there is room to change the story about how we really pay for energy inefficiency.

mutualised_costs_titled.png

At about the same time that DECC published their infographic, the UK government was also publishing data on the health costs of poor quality housing, air pollution and climate impacts. The ODI and Oil Change International also conducted independent analysis of fossil fuel subsidies.

Where there was a range, I took a conservative estimate and where I had to make an approximation, I took the lowest possible numbers.

Health costs of poor quality housing

£ 857 million

Source: The cost of poor housing which gives annual savings to NHS: if excess cold in housing, dampness, carbon monoxide and excess heat in housing were fixed.

Government spending on fossil fuel subsidies (excluding spending on carbon capture and storage)

£ 7,089 million

Source: Empty promises G20 subsidies to oil, gas and coal production via tax relief (mainly decommisiong oil and gas), domestic public finance, overseas public finance and via shares in multilateral development banks

Health costs of air pollution, right down to the proportion of this pollution coming from domestic boilers (straining to heat that poor quality housing)

£ 1,500 million

Source: Air Pollution: Action in a Changing Climate costs of only PM2.5 air pollution in 2008 (best data I could find in 2014) estimated by government at £18 billion (in a range of £9-20billion) and according to the National Atmospheric Emissions Directory about 10% of PM2.5 pollution comes from ‘residential stationary combustion’ aka boilers.

Costs to the UK economy of climate change-related damage inside and outside the UK

£ 402 million

Source: Foresight Future Flooding very rough conservative estimate based on 10% of current average annual damage (1.4 bn) and management costs of flooding (0.8 bn) and International Dimensions of Climate Change with my very rough conservative estimate based on 10% of current overseas humanitarian aid costs ( due to climate change related conflict or disaster 435m + 600m) and aid spending on health (683m) and water and sanitation (106m). This is highly conservative as it does not cover costs to UK business with overseas assets, disruption of critical infrastructure.

The code is here and on github - please feel free to use it and improve it. I’ve left it a bit raw and clunky because it makes the laying out easier to tweak.

The data are crying out for an update with the latest and most reliable sources.


import pandas as pd
import matplotlib.pyplot as plt
import squarify    
# pip install squarify (algorithm for treemap) 
# find location by running squarify in a notebook
# modify the following 4 lines of squarify code to rotate the treemap by 90degs 
#x = [rect["y"] for rect in rects]
#y = [-rect["x"] for rect in rects]
#dx = [rect["dy"] for rect in rects]
#dy = [-rect["dx"] for rect in rects]
import seaborn as sns
import numpy as np
import matplotlib.gridspec as gridspec
# Activate Seaborn
sns.set()
# data
mutual_costs = {
    "Fossil fuel subsidy via tax": 314, 
    "Air pollution from housing":66,#cost of air pollution from housing
    "Poor housing":38,#cost of poor housing on health
    "C.I.":18}#climate impacts

UK_data_2014 = {
    "Wholesale energy costs":637,
    "Other supply costs and margins":291,
    "Network costs":286,
    "Support costs":89,    
    "VAT @5%":66
}
Support_Breakdown = {
    "Large-scale renewables, such as wind (RO)": 36, 
    "Carbon taxes":23, 
    "Small-scale renewables such as solar (FITs)": 9,    
    "Price reduction from low carbon policies":-5, 
    "ECO":36,  
    "Warm Home Discount Support":13, 
    "Smart Meters":3,   
    "Government Electricity Rebate":-12, 
    "Warm Home Discount rebate (average)":-13}

mutual = sum(mutual_costs.values())
household = sum(UK_data_2014.values()) 
subs = sum(Support_Breakdown.values()) 

# setting up scaling dimensions
total_costs = mutual+household
total_area = 100
b_house = 10
b_ext = 6

h_ext = (total_area * mutual/total_costs) / b_ext
b_subs = 4
h_subs = 3

# creating dataframes to play with
df1 = pd.DataFrame()
df1['Description'] = mutual_costs.keys()
df1['Costs'] = mutual_costs.values()
df2 = pd.DataFrame()
df2['Description'] = UK_data_2014.keys()
df2['Costs'] = UK_data_2014.values()
df3 = pd.DataFrame()
df3['Description'] = Support_Breakdown.keys()
df3['Costs'] = Support_Breakdown.values()
df3['AbsCosts'] = abs(df3.Costs)

# creating text labels for infographic
label_text1 = []
for row, col in df1.iterrows():
    #text = str(df1.loc[row,'Description'])+" £"+str(df1.loc[row,'Costs'])
    text = str(df1.loc[row,'Description'])
    label_text1.append(text)
label_text1
df1['Label'] = label_text1
df1

label_text2 = []
for row, col in df2.iterrows():
    #text = str(df2.loc[row,'Description'])+" £"+str(df2.loc[row,'Costs'])
    text = str(df2.loc[row,'Description'])
    label_text2.append(text)
label_text2
df2['Label'] = label_text2
df2

label_text3 = []
for row, col in df3.iterrows():
    text = str(df3.loc[row,'Description'])+" £"+str(df3.loc[row,'Costs'])
    label_text3.append(text)
label_text3
df3['Label'] = label_text3
df3
from textwrap import fill
labels1 = [fill(l, 15) for l in df1.loc[:,'Label']]
labels2 = [fill(l, 20) for l in df2.loc[:,'Label']]
labels3 = [fill(l, 20) for l in df3.loc[:,'Label']]

# generating squarify coordinates for house data
rect = squarify.squarify(df2['Costs'],0,0,np.sqrt(household),np.sqrt(household))
coords = pd.concat([
    pd.DataFrame.from_dict(rect[0],orient='index').T,
    pd.DataFrame.from_dict(rect[1],orient='index').T,
    pd.DataFrame.from_dict(rect[2],orient='index').T,
    pd.DataFrame.from_dict(rect[3],orient='index').T,
    pd.DataFrame.from_dict(rect[4],orient='index').T
],ignore_index=True)
coords
all_data = pd.concat([df2,coords],axis=1,sort=False)

# generating squarify coordinates for externalities data
rect_m = squarify.squarify(df1['Costs'],0,0,np.sqrt(mutual),np.sqrt(mutual))
coords_m = pd.concat([
    pd.DataFrame.from_dict(rect_m[0],orient='index').T,
    pd.DataFrame.from_dict(rect_m[1],orient='index').T,
    pd.DataFrame.from_dict(rect_m[2],orient='index').T,
    pd.DataFrame.from_dict(rect_m[3],orient='index').T,
],ignore_index=True)
coords_m
all_data_m = pd.concat([df1,coords_m],axis=1,sort=False)

font_size = []
for row, col in all_data.iterrows():
    if col[1] > 500:
        font_size.append(30)
    elif col[1] < 100:
        font_size.append(20)
    else:
        font_size.append(25)
font_size
all_data['font_size'] = font_size

font_size_m = []
for row, col in all_data_m.iterrows():
    if col[1] > 500:
        font_size.append(25)
    elif col[1] < 100:
        font_size_m.append(14)
    else:
        font_size_m.append(25)
font_size_m
all_data_m['font_size'] = font_size_m

wrapping = [25,20,25,12,5]
wrapping_m = [50,25,10,12]

all_data['wrapping'] = wrapping 
all_data_m['wrapping'] = wrapping_m

#Create plot 
plt.style.use('fivethirtyeight')
plt.figure(figsize= [b_ext,h_ext])
plt.rc('font', weight='bold')# controls default text sizes
plt.rc('text', color='w')

fig = plt.figure(figsize= [25,10])
fig.patch.set_facecolor('w')
fig.patch.set_alpha(0)

#split the plot into 3 axes on a grid
gs1 = gridspec.GridSpec(1, 3, figure=fig,wspace=0)
gs1.tight_layout(fig, rect=[0, 0, 1, 1],pad=0,w_pad=0,h_pad=0)

ax1 = fig.add_subplot(gs1[0])
ax2 = fig.add_subplot(gs1[1])
ax3 = fig.add_subplot(gs1[2])

# generate tree map
squarify.plot(sizes=df1['Costs'],ax=ax1,norm_x=np.sqrt(mutual),norm_y=np.sqrt(mutual),color='r',linewidth='10',edgecolor=(1,1,1,0),alpha=1) #color = colors,
squarify.plot(sizes=df2['Costs'],ax=ax2,norm_x=37,norm_y=37, color='#9d9a01',linewidth='10',edgecolor=(1,1,1,0),alpha=1) #color = colors,

# lay out of axis to plot areas so that they are equivalent
ax1.set_xlim(-(41-np.sqrt(mutual)),np.sqrt(mutual))
ax1.set_ylim(-np.sqrt(mutual),37+2)
ax2.set_xlim(-2,37+2)
ax2.set_ylim(-37,np.sqrt(mutual))
ax3.set_xlim(-.15,.85)
ax3.set_ylim(0,1)

# transparent background
ax1.patch.set_facecolor('w')
ax1.patch.set_alpha(0)
ax2.patch.set_facecolor('w')
ax2.patch.set_alpha(0)
ax3.patch.set_facecolor('w')
ax3.patch.set_alpha(0)

# data labels for household energy
for row, col in all_data.iterrows():
    x = col[4]
    y = (-col[3])
    ax2.text(x+1,y-5,fill(col[0],col[8]),ha='left',va='baseline',fontsize=16)
    ax2.text(x+1,(y-7.5),'£ ',ha='left',va='baseline',fontsize=16)
    ax2.text(x+2,(y-7.5),col[1],ha='left',va='baseline',fontsize=col[7])

# data labels for externalities
for row, col in all_data_m.iterrows():
    x = col[4]
    y = (-col[3])
    ax1.text(x+0.8,y-1,fill(col[0],col[8]),ha='left',va='top',fontsize=12)
    ax1.text(x+0.8,(y-5),'£ ',ha='left',va='baseline',fontsize=12)
    ax1.text(x+1.4,(y-5),col[1],ha='left',va='baseline',fontsize=col[7])
    
ax1.axis('off')
ax2.axis('off')
ax3.axis('off')

# disaggregated support costs with labels
ax3.text(0.01,.99,fill("Support for cleaner energy and keeping the lights on",35),ha='left',va='top',color='w',fontsize=18)
ax3.text(0.01,.67,fill("Support for vulnerable households, energy efficiency, and Government Electricity Rebate",35),ha='left',va='top',color='w',fontsize=18)

for row, col in df3.iterrows():
    if row in range(0,4):
        #print(row)
        x = col[0]
        y = col[1]
        #y = (-col[3])
        if len(str(y)) == 1:
            y = str('£    '+str(y))
            #print(str('£    '+str(y)))
        elif len(str(y)) == 2:
            y = str('£   '+str(y))
            #print(str('£   '+str(y)))
        elif len(str(y)) == 3:
            y = str('£  '+str(y))
        ax3.text(0.01,0.91-((1+row)/20),fill(col[0],45),ha='left',va='baseline',fontsize=12)
        ax3.text(.5,0.91-((1+row)/20),y,ha='left',va='baseline',fontsize=16)
    if row in range(4,8):  
        #print(row)
        x = col[0]
        y = col[1]
        if len(str(y)) == 1:
            y = str('£    '+str(y))
            #print(str('£    '+str(y)))
        elif len(str(y)) == 2:
            y = str('£   '+str(y))
            #print(str('£   '+str(y)))
        elif len(str(y)) == 3:
            y = str('£  '+str(y))
        ax3.text(0.01,.79-((1+row)/20),fill(col[0],45),ha='left',va='baseline',fontsize=12)
        ax3.text(0.5,.79-((1+row)/20),y,ha='left',va='baseline',fontsize=16)
    if row in range(8,9):  
        #print(row)
        x = col[0]
        y = col[1]
        if len(str(y)) == 1:
            y = str('£    '+str(y))
            #print(str('£    '+str(y)))
        elif len(str(y)) == 2:
            y = str('£   '+str(y))
            #print(str('£   '+str(y)))
        elif len(str(y)) == 3:
            y = str('£  '+str(y))
        ax3.text(0.01,.32,fill(col[0],40),ha='left',va='baseline',fontsize=12)
        ax3.text(0.5,.32,y,ha='left',va='baseline',fontsize=16)

#triangular roof
t2= plt.Polygon([[-2,-12.1], [(37)/2,8], [39,-12.1]], color='#9d9a01')
ax2.add_patch(t2)

#cleaner energy
t3= plt.Polygon([[0,0.7], [0,1], [.6,1],[.6,.7]], color='#9d9a01')
ax3.add_patch(t3)

#vulnerable groups
t4= plt.Polygon([[0,.38], [0,.68], [.6,.68],[.6,0.38]], color='#9d9a01')
ax3.add_patch(t4)

#rebate
t5= plt.Polygon([[0,0.3], [0,.36], [.6,.36],[.6,.3]], color='#616266')
ax3.add_patch(t5)

#arrows
a1= plt.Polygon([[-.15,.97], [-0.15,.99], [0,.99],[0,0.97]], color='#9d9a01')
a2= plt.Polygon([[-.15,.3], [-.15,.97], [-.13,.97],[-.13,0.3]], color='#9d9a01')
a3= plt.Polygon([[-.11,.64], [-.11,.66], [0,.66],[0,0.64]], color='#9d9a01')
a4= plt.Polygon([[-.11,.26], [-.11,.64], [-.09,.64],[-.09,0.26]], color='#9d9a01')
a5= plt.Polygon([[-.07,.32], [-.07,.34], [-0,.34],[0,0.32]], color='#9d9a01')
a6= plt.Polygon([[-.07,.22], [-.07,.32], [-.05,.32],[-.05,0.22]], color='#9d9a01')

a7= plt.Polygon([[-.15,.26], [-.15,.28], [-.11,.28],[-.11,0.26]], color='#9d9a01')
a8= plt.Polygon([[-.15,.22], [-.15,.24], [-.07,.24],[-.07,0.22]], color='#9d9a01')

ax3.add_patch(a1)
ax3.add_patch(a2)
ax3.add_patch(a3)
ax3.add_patch(a4)
ax3.add_patch(a5)
ax3.add_patch(a6)
ax3.add_patch(a7)
ax3.add_patch(a8)

yaxis_length = 37+np.sqrt(mutual)
x1 = 36
x2 = 39
y1 = -(0.32*yaxis_length)
y2 = y1 - (0.02*yaxis_length)
y21 = -(0.36*yaxis_length)
y22 = y21 - (0.02*yaxis_length)
y31 = -(0.40*yaxis_length)
y32 = y31 - (0.02*yaxis_length)

b1 =  plt.Polygon([[x1,y2], [x1,y1], [x2,y1],[x2,y2]], color='#9d9a01')
b2 =  plt.Polygon([[x1,y22], [x1,y21], [x2,y21],[x2,y22]], color='#9d9a01')
b3 =  plt.Polygon([[x1,y32], [x1,y31], [x2,y31],[x2,y32]], color='#9d9a01')
ax2.add_patch(b1)
ax2.add_patch(b2)
ax2.add_patch(b3)

plt.show()

Thanks to Kevin Wubert for the blog on how to embed python code in Squarespace.

Humanitarians do Innovation: ecosystems, intention and language

In 2018, Practical Action published Managing Humanitarian Innovation: The Cutting Edge of Aid, a collection of contributions on how to do innovation.

Of the 25 chapters:

  • 16 framed the problem that innovation would address as the humanitarian sector or system itself: organisational inefficiency, ineffectiveness, cumbersome and costly processes and staff (managers and leaders) mindsets and thinking. I tend to think of this as bureaucratic reform rather than innovation but pedanticsemantics…

  • 6 chapters framed the problem around ways of working or methods: covering ways of deploying design thinking, making, influencing, problem solving and empathising but often with little distinction between different audiences (ie the handful of enthusiastic examples included projects in collaboration with: the US military; groups of specialists like Nepali amateur radio enthusiasts or orthopaedic surgeons; a humanitarian agency; and an affected community)

  • Only 3 chapters framed the problem around the differences and power or knowledge inequalities between the humanitarian system and people affected

This publication seems to be part of a bigger story: the changing language we are using to understand the world while we are caught between techno-optimism and despondency at declining faith in traditional institutions; the benefits of globalisation and the concentrated local pain of changing trade; deserving entrepreneurial heroes and an undeserving poor.

The language of humanitarian innovation reflects this with references to complexity, ecosystems, experimentation, risk taking and adaptation as ways of describing how the humanitarian system should think about and respond to the world. This is often in contrast to (implicitly inferior and old fashioned) linear, binary, planned or static models for conceptualising relationships in the real world.

Where does this language come from?

This language is familiar to innovation economists because it is directly linked to a historical preference for mathematical models that tried to explain economic growth as a ‘linear’ or proportional combination of labour, capital and ‘technology’. These models failed to explain how technology and innovation were related to growth. The search for a better explanation led to an ‘evolutionary theory’. In this framework, innovation was seen as uncertain and systemic: it depended on different, specific firms and networks that are embedded in sectors and places. This thinking highlighted “the strong feedback effects that exist among innovation, growth and market structure” and the notion of an innovation ecosystem stems from here (Mazzucato 2015a). This ‘ecosystem’ is geographic, regional or national so this thinking gets applied to national growth strategies (Karvonen and van Heur 2013 and this talk at UCL Urban Lab)

This language is also familiar to proponents of a practical and experimental approach and to activists trying to think about how change happens. Underpinning the innovation discourse is at least a century of (American) pragmatism that emphasises the ways people “are constantly confronted by unexpected events, chance occurrences, and a general sense of uncertainty about how best to act in a precarious world” (Karvonen and Heur 2013). This has been more recently overlaid by both “open innovation” and a “democratic idea that innovation can’t simply be left to the experts, to the experimenters, it needs to include the general public, those that are most affected by these changes”.

The language of complexity and adaptation have also been long-borrowed.

These terms track through the work of Robert Chambers from asking ‘Whose Reality Counts’ (Chambers 1997) to his 2005 plea that thinking about poverty and livelihoods should include ‘them’ and ‘us’ and a more recent call for “adaptive pluralism” in the Managing Humanitarian Innovation book. The language of experimenting and learning is familiar in the development sector more broadly: “The challenge for the future is not an intellectual one ... we already know the principles of project success: engage with local realities, take your time, experiment and learn…” (Edwards and Hulme 2000 - notice the date - this conversation is more than 20 years old). Duncan Green argues that imagining the world as a complex system is more illuminating than relying on narratives of the past that tend to be linear. In a complex system change might be slow, steady and explicable but it might also happen in unforeseeable jumps and around ‘critical junctures’ (Green and Oxfam GB. 2016a). Examining the history of humanitarianism, Johannes Paulman also argues for a view of events that recognises “continuities”, “overlaps” “conjunctures and contingencies… the coming together of different forces, events and structures at particular times” (Paulmann 2013).

What is missing?

What gets downplayed when talking about ‘ecosystems’ is power and intentionality. Do ecosystems in the biological and undesigned sense have anything analogous to our human-made institutions with will, intentionality and capacity to learn? This depends on your definition of living things and consciousness and obviously ‘living things have “intentionality”: they deliberately do things to other things to make life easier for themselves’ (Vlatko, 2018). (Another view might be that humanity is not as intentional as it thinks and that sociopathic leaders are an emergent property of the system not an intentional conspiracy!) But it’s the casual deployment of the word ‘ecosystem’ - as a complex, indeterminate, naturally occurring whole that resists dissection - that has a way of taking the system for granted and gets us off the hook of any critical thinking about power, institutions and intention.

Mariana Mazucato in her analysis of “the entrepreneurial state” suggests it is “less important to talk about partnerships and ecosystems and more important to talk about the ‘type of’ ecosystems” and the actors involved because ecosystems in which public and private sector organisations operate can be “parasitic” or “symbiotic” (Mazzucato 2015b), or more prosaically, the why as well as the how of innovation ecosystem relationships (MIT 2017). Similarly, Duncan Green recognises that without “counterveiling forces” like the government, we can have an ‘evolution’ that favours “survival of the fattest, rather than the fittest” (Green and Oxfam GB. 2016b)

What is missed when we celebrate open innovation is a connection between the “democratic impulse” of these technologists and that of “participatory planners who have been working with communities for three or four decades”, thinking hard about “democratic procedures” and about “representation” (Karvonen and Heur 2013).

What is lost in techno-optimism and the reverence for design tools as a solution is perhaps Anna Tsing’s more humble and fruitful notion of design as “the artful staging of an issue”.

What is lost with a focus on pragmatic action and problem-solving is the reflex to ask questions like those posed by Jenny Pearce twenty years ago when she asked NGOs to think about what and who the work is for; or the anthropologist Liisa Malkii who explores the humanitarian “need to help” (Malkii 2015); or Audre Lorde who recognises the overlaps of excitement and power and what life becomes when work is full of “sensation without feeling” (Lorde 1978); or those who see a language that allows us to “misunderstand or put off the need for long-lasting systemic and structural change” (Vega 2015).

Indeed, some thinkers see this “ideology of pragmatism” as “NGOization” or ways of thinking that “compartmentalize the world into ‘issues,’ and ‘projects’ and undermine and contain critical thinking” (Choudry 2012).

What can get overlooked in dismissing the simplistic linear constraints of a narrative arc, is that humanitarian organisations often remain powerful and simplistic narrators, following a formula and deciding what to include and exclude.

Systems thinking is perhaps just “enabling us to become more aware of the stories that we tell ourselves” (Stroh 2015). For example, the history of humanitarianism can be sketched as a history of organisations but this can miss important stories of people, politics and motivations and can disempower “recipients” or neglect national, colonial or imperial dimensions. It can be told as if aid is a function of political economy but this can present action as unhelpful, inefficient or harmful and neglect actual urgent need. It can be told in terms of global governance but this can miss humanitarian criticism of imperial rule (Paulman2013)…

Why does this matter?

Sharing a human imperative to “get on with things” is not malign but scepticism is easy when the story of humanitarian innovation reads as:

  • ahistorical ignoring previous waves of institutional reform or previous participation revolutions,

  • apolitical ignoring political and societal factors that are making the humanitarian sector big and unwieldy in the first place, or

  • self-regarding ignoring how change - other than innovation - really happens or any problems with a techno-centric view that sees innovation processes as neutral or “objective”, “scientific” or “evolutionary” rather than a social and political process where power dynamics are grinding in the background and in which certain people have agency and power.

To be sure, “a better understanding of the past will help ensure a humanitarian system that is more self-aware, clearer about its identity and better prepared for engagement with the world in which it operates” (Davey et al. 2013).

This requires us to engage with our sometimes disproportionate power as the narrators of change and tendency to repeatedly assume “history starts now” or “history started when we got here”.