Data Source

Source: Low-Income Energy Affordability Data, 2018 Update

About the Data

The US Department of Energy’s Low-Income Energy Affordability Data (LEAD) shows energy expenditures and energy burdens for households. This particular data, pulled from the 2018 Area Median Income data, also breaks households into income brackets. The income brackets are as a percentage of the area’s median income (AMI), where 100% indicates that household income is equivalent to the AMI. The income brackets in this data are 0-30%, 30-60%, 60-80%, 80-100%, and 100%+.

Variable Descriptions

glimpse(lead)
## Rows: 50
## Columns: 39
## $ FIP                      <dbl> 51003010100, 51003010201, 51003010202, 510030…
## $ state_fip                <dbl> 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 5…
## $ county_fip               <chr> "003", "003", "003", "003", "003", "003", "00…
## $ tract_fip                <chr> "010100", "010201", "010202", "010300", "0104…
## $ county                   <chr> "Albemarle", "Albemarle", "Albemarle", "Albem…
## $ totalinc                 <dbl> 258861238.7, 183602936.6, 192243103.3, 329144…
## $ totalelep                <dbl> 4257203.1, 3461893.8, 2766898.1, 5307149.1, 4…
## $ totalgas                 <dbl> 1048712.27, 587780.45, 698082.82, 895763.99, …
## $ totalother               <dbl> 5.733480e+05, 1.800686e+05, 2.793150e+05, 1.2…
## $ averageburden            <dbl> 2.271203, 2.303745, 1.947688, 1.923259, 2.919…
## $ avg_hh_exp               <dbl> 2393.537, 2451.253, 2585.068, 1715.611, 2999.…
## $ lowburden                <dbl> 1750.933158, 1504.638587, 1008.541509, 2810.7…
## $ highburden               <dbl> 190.17722, 133.26387, 76.66867, 147.13759, 29…
## $ veryhighburden           <dbl> 115.88093, 71.29768, 41.89234, 115.82400, 114…
## $ extremelyhighburden      <dbl> 55.616929, 25.143459, 71.777109, 110.487515, …
## $ totalunits               <dbl> 2112.60824, 1734.34359, 1198.87963, 3184.1515…
## $ numberburdened           <dbl> 361.67508, 229.70501, 190.33812, 373.44911, 4…
## $ percentburdened          <dbl> 17.119837, 13.244492, 15.876333, 11.728371, 2…
## $ total_0_30               <dbl> 155.60536, 95.61704, 99.49979, 246.48409, 106…
## $ total_30_60              <dbl> 276.2379, 177.3530, 81.6247, 395.1852, 288.12…
## $ total_60_80              <dbl> 202.76487, 248.88764, 57.15861, 424.89037, 19…
## $ total_80_100             <dbl> 207.11334, 233.06722, 77.81864, 352.95913, 15…
## $ total_over_100           <dbl> 1270.886801, 979.418685, 882.777886, 1764.632…
## $ burdened_0_30            <dbl> 128.62143, 93.05765, 94.56048, 237.15181, 104…
## $ burdened_30_60           <dbl> 183.41409, 104.48448, 77.91363, 132.27262, 27…
## $ burdened_60_80           <dbl> 31.7477293, 18.8320286, 5.3202464, 3.7823126,…
## $ burdened_80_100          <dbl> 17.89061934, 6.85006999, 12.54376158, 0.24236…
## $ burdened_over_100        <dbl> 0.001213645, 6.480778923, 0.000000000, 0.0000…
## $ percent_0_30             <dbl> 82.65874, 97.32330, 95.03586, 96.21384, 98.49…
## $ percent_30_60            <dbl> 66.39716, 58.91328, 95.45349, 33.47104, 95.15…
## $ percent_60_80            <dbl> 15.6574113, 7.5664781, 9.3078657, 0.8901855, …
## $ percent_80_100           <dbl> 8.63808158, 2.93909629, 16.11922526, 0.068665…
## $ percent_over_100         <dbl> 9.549591e-05, 6.616965e-01, 0.000000e+00, 0.0…
## $ total_owners             <dbl> 1717.57391, 1530.84877, 1121.92886, 2112.4528…
## $ total_renters            <dbl> 398.26352, 204.56073, 78.02610, 1090.28822, 3…
## $ burdened_owners          <dbl> 259.6989959, 204.2634172, 160.9956155, 164.01…
## $ burdened_renters         <dbl> 101.97609, 25.44159, 29.34250, 209.43103, 169…
## $ percent_burdened_owners  <dbl> 15.1201060, 13.3431480, 14.3498952, 7.7643427…
## $ percent_burdened_renters <dbl> 25.605179, 12.437181, 37.606009, 19.208777, 4…
meta %>% 
  mutate(label = paste0(varname, ": ", about)) %>% 
  select(label) %>% 
  as.list()
## $label
##  [1] "FIP: 11-digit FIPS code (State, County, Tract)"                                                                                                        
##  [2] "state_fip: 2-digt State FIPS code"                                                                                                                     
##  [3] "county_fip: 3-digit County FIPS code"                                                                                                                  
##  [4] "tract_fip: 6-digit Tract FIPS code"                                                                                                                    
##  [5] "county: County name"                                                                                                                                   
##  [6] "totalinc: Aggregated income for the entire census tract"                                                                                               
##  [7] "totalelep: Aggregated electric expenditures for the entire census tract"                                                                               
##  [8] "totalgas: Aggregated gas expenditures for the entire census tract"                                                                                     
##  [9] "totalother: Aggregated other energy expenditures for the entire census tract"                                                                          
## [10] "averageburden: Average household energy burden; energy burden is defined as the percent of income spent on energy"                                     
## [11] "avg_hh_exp: Average household yearly expenditure on electric + gas + other energy"                                                                     
## [12] "lowburden: Number of households with less than 6% energy burden"                                                                                       
## [13] "highburden: Number of households with 6-10% energy burden"                                                                                             
## [14] "veryhighburden: Number of households with 10-20% energy burden"                                                                                        
## [15] "extremelyhighburden: Number of households with greater than 20% energy burden"                                                                         
## [16] "totalunits: Total number of housing units in the census tract"                                                                                         
## [17] "numberburdened: Burdened households are those that bear at least a 6% energy burden (fall in the high, very high, or extremely high burden categories)"
## [18] "percentburdened: Percent of households that are energy burdened (numberburdened/totalunits)"                                                           
## [19] "total_0_30: Number of households with incomes that are 0-30% of the Area Median Income"                                                                
## [20] "total_30_60: Number of households with incomes that are 30-60% of the Area Median Income"                                                              
## [21] "total_60_80: Number of households with incomes that are 60-80% of the Area Median Income"                                                              
## [22] "total_80_100: Number of households with incomes that are 80-100% of the Area Median Income"                                                            
## [23] "total_over_100: Number of households with incomes that are more than 100% of the Area Median Income"                                                   
## [24] "burdened_0_30: Number of households in the 0-30% AMI range that are energy burdened"                                                                   
## [25] "burdened_30_60: Number of households in the 30-60% AMI range that are energy burdened"                                                                 
## [26] "burdened_60_80: Number of households in the 60-80% AMI range that are energy burdened"                                                                 
## [27] "burdened_80_100: Number of households in the 80-100% AMI range that are energy burdened"                                                               
## [28] "burdened_over_100: Number of households in the 100%+ AMI range that are energy burdened"                                                               
## [29] "percent_0_30: Percent of households in the 0-30% AMI range that are energy burdened (burdened_0_30/total_0_30)"                                        
## [30] "percent_30_60: Percent of households in the 30-60% AMI range that are energy burdened (burdened_30_60/total_30_60)"                                    
## [31] "percent_60_80: Percent of households in the 60-80% AMI range that are energy burdened (burdened_60_80/total_60_80)"                                    
## [32] "percent_80_100: Percent of households in the 80-100% AMI range that are energy burdened (burdened_80_100/total_80_100)"                                
## [33] "percent_over_100: Percent of households in the 100%+ AMI range that are energy burdened (burdened_over_100/total_over_100)"                            
## [34] "total_owners: Total number of households that are owned in the census tract"                                                                           
## [35] "total_renters: Total number of households that are rented in the census tract"                                                                         
## [36] "burdened_owners: Number of owned households that are energy burdened"                                                                                  
## [37] "burdened_renters: Number of rented households that are energy burdened"                                                                                
## [38] "percent_burdened_owners: Percent of owned households that are energy burdened (burdened_owners/total_owners)"                                          
## [39] "percent_burdened_renters: Percent of rented households that are energy burdened (burdened_renters/total_renters)"

Summaries

Summary of all non-missing variables:

lead %>% select(-c(FIP:county)) %>% 
  select(where(~is.numeric(.x) && !is.na(.x))) %>% 
  as.data.frame() %>% 
  stargazer(., type = "text", title = "Summary Statistics", digits = 0,
            summary.stat = c("mean", "sd", "min", "median", "max"))
## 
## Summary Statistics
## ===============================================================================
## Statistic                   Mean      St. Dev.    Min     Median        Max    
## -------------------------------------------------------------------------------
## totalinc                 177,919,174 90,029,492 662,819 173,393,476 405,427,996
## totalelep                 3,736,593  2,046,840  130,692  3,420,559   8,786,365 
## totalgas                   836,745    520,782      0      781,223    2,471,311 
## totalother                 184,122    142,104      0      171,001     573,348  
## averageburden                 3          3         2         3          20     
## avg_hh_exp                  2,379       590      1,623     2,281       4,011   
## lowburden                   1,369       669        1       1,212       3,208   
## highburden                   221        147        0        187         650    
## veryhighburden               142         95        0        126         443    
## extremelyhighburden          112         99        3        85          464    
## totalunits                  1,844       789       85       1,752       3,975   
## numberburdened               475        274       62        421        1,223   
## percentburdened              28          16        6        25          98     
## total_0_30                   228        131       39        225         666    
## total_30_60                  294        138        0        277         585    
## total_60_80                  199        107        0        191         488    
## total_80_100                 187        105        0        183         535    
## total_over_100               936        489        1        888        2,195   
## burdened_0_30                217        128       38        216         647    
## burdened_30_60               187        133        0        137         548    
## burdened_60_80               48          61        0        27          287    
## burdened_80_100              21          35        0        11          185    
## burdened_over_100             1          3         0         0          12     
## percent_0_30                 95          5        81        96          100    
## percent_30_60                62          28       19        64          98     
## percent_60_80                24          25        0        13          89     
## percent_80_100               10          13        0         7          62     
## percent_over_100              0          0         0         0           1     
## total_owners                1,248       770       17       1,186       3,459   
## total_renters                624        401       68        555        1,667   
## burdened_owners              273        231        0        193         892    
## burdened_renters             202        143       21        190         681    
## percent_burdened_owners      21          16        0        18          100    
## percent_burdened_renters     37          20        7        35          98     
## -------------------------------------------------------------------------------

Visual Distributions

Visual distributions of the data, shown with histograms and scatterplots

Spatial Distributions

Key Outcomes

Maps to show the distribution of variables across spatial units

Average Energy Burden

pal <- colorNumeric("plasma", reverse = TRUE, domain = cvlshapes$averageburden)
leaflet(cvlshapes) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = cvlshapes,
              fillColor = ~pal(averageburden),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("Tract Number: ", cvlshapes$tract, "<br>",
                             "Avg. Burden: ", round(cvlshapes$averageburden, 2))) %>%
  addLegend("bottomright", pal = pal, values = cvlshapes$averageburden,
            title = "Average Energy Burden", opacity = 0.7)

Average Yearly Household Energy Expenditures

pal <- colorNumeric("Blues", reverse = FALSE, domain = cvlshapes$avg_hh_exp)
leaflet(cvlshapes) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = cvlshapes,
              fillColor = ~pal(avg_hh_exp),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("Tract Number: ", cvlshapes$tract, "<br>",
                             "Avg. Household Energy Expenditures: ", round(cvlshapes$avg_hh_exp, 2))) %>%
  addLegend("bottomright", pal = pal, values = cvlshapes$avg_hh_exp,
            title = "Average Yearly Household Energy Expenditures", opacity = 0.7)

Number of Energy Burdened Households

pal <- colorNumeric("Blues", reverse = FALSE, domain = cvlshapes$numberburdened)
leaflet(cvlshapes) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = cvlshapes,
              fillColor = ~pal(numberburdened),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("Tract Number: ", cvlshapes$tract, "<br>",
                             "Number Burdened: ", round(cvlshapes$numberburdened, 2))) %>%
  addLegend("bottomright", pal = pal, values = cvlshapes$numberburdened,
            title = "Number of Energy Burdened Households", opacity = 0.7)

Percent of Energy Burdened Households

All AMI Levels

pal <- colorNumeric("Blues", reverse = FALSE, domain = cvlshapes$percentburdened)
leaflet(cvlshapes) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = cvlshapes,
              fillColor = ~pal(percentburdened),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("Tract Number: ", cvlshapes$tract, "<br>",
                            "Pct. Burdened: ", round(cvlshapes$percentburdened, 2))) %>%
  addLegend("bottomright", pal = pal, values = cvlshapes$percentburdened,
            title = "Percent of Energy Burdened Households", opacity = 0.7)

0-30% AMI

pal <- colorNumeric("Blues", reverse = FALSE, domain = cvlshapes$percent_0_30)
leaflet(cvlshapes) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = cvlshapes,
              fillColor = ~pal(percent_0_30),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("Tract Number: ", cvlshapes$tract, "<br>",
                            "Pct. Burdened - 0-30% AMI: ", round(cvlshapes$percent_0_30, 2))) %>%
  addLegend("bottomright", pal = pal, values = cvlshapes$percent_0_30,
            title = "Percent of Energy Burdened Households", opacity = 0.7)

30-60% AMI

pal <- colorNumeric("Blues", reverse = FALSE, domain = cvlshapes$percent_30_60)
leaflet(cvlshapes) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = cvlshapes,
              fillColor = ~pal(percent_30_60),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("Tract Number: ", cvlshapes$tract, "<br>",
                            "Pct. Burdened - 30-60% AMI: ", round(cvlshapes$percent_30_60, 2))) %>%
  addLegend("bottomright", pal = pal, values = cvlshapes$percent_30_60,
            title = "Percent of Energy Burdened Households", opacity = 0.7)

60-80% AMI

pal <- colorNumeric("Blues", reverse = FALSE, domain = cvlshapes$percent_60_80)
leaflet(cvlshapes) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = cvlshapes,
              fillColor = ~pal(percent_60_80),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("Tract Number: ", cvlshapes$tract, "<br>",
                            "Pct. Burdened - 60-80% AMI: ", round(cvlshapes$percent_60_80, 2))) %>%
  addLegend("bottomright", pal = pal, values = cvlshapes$percent_60_80,
            title = "Percent of Energy Burdened Households", opacity = 0.7)

80-100% AMI

pal <- colorNumeric("Blues", reverse = FALSE, domain = cvlshapes$percent_80_100)
leaflet(cvlshapes) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = cvlshapes,
              fillColor = ~pal(percent_80_100),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("Tract Number: ", cvlshapes$tract, "<br>",
                            "Pct. Burdened - 80-100% AMI: ", round(cvlshapes$percent_80_100, 2))) %>%
  addLegend("bottomright", pal = pal, values = cvlshapes$percent_80_100,
            title = "Percent of Energy Burdened Households", opacity = 0.7)

100%+ AMI

pal <- colorNumeric("Blues", reverse = FALSE, domain = cvlshapes$percent_over_100)
leaflet(cvlshapes) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = cvlshapes,
              fillColor = ~pal(percent_over_100),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("Tract Number: ", cvlshapes$tract, "<br>",
                            "Pct. Burdened - 100%+ AMI: ", round(cvlshapes$percent_over_100, 2))) %>%
  addLegend("bottomright", pal = pal, values = cvlshapes$percent_over_100,
            title = "Percent of Energy Burdened Households", opacity = 0.7)

Percent of Energy Burdened Renters/Owners

Renters

pal <- colorNumeric("Blues", reverse = FALSE, domain = cvlshapes$percent_burdened_renters)
leaflet(cvlshapes) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = cvlshapes,
              fillColor = ~pal(percent_burdened_renters),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("Tract Number: ", cvlshapes$tract, "<br>",
                             "Pct. of Renters Burdened: ", round(cvlshapes$percent_burdened_renters, 2))) %>%
  addLegend("bottomright", pal = pal, values = cvlshapes$percent_burdened_renters,
            title = "Percent of Energy Burdened Rented Households", opacity = 0.7)

Owners

pal <- colorNumeric("Blues", reverse = FALSE, domain = cvlshapes$percent_burdened_owners)
leaflet(cvlshapes) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(data = cvlshapes,
              fillColor = ~pal(percent_burdened_owners),
              weight = 1,
              opacity = 1,
              color = "white",
              fillOpacity = 0.6,
              highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
              popup = paste0("Tract Number: ", cvlshapes$tract, "<br>",
                             "Pct. of Owners Burdened: ", round(cvlshapes$percent_burdened_owners, 2))) %>%
  addLegend("bottomright", pal = pal, values = cvlshapes$percent_burdened_owners,
            title = "Percent of Energy Burdened Owned Households", opacity = 0.7)

Important Notes

Several census tracts in Charlottesville and Albemarle County are primarily composed of UVA students, which makes energy burden difficult to calculate for these areas. Students typically spend a large portion of their “income” on energy, because they typically do not make a lot of money and get most of their money from other sources.

Census tracts 109.01, 109.02, and 109.03 in Albemarle County encompass the university. Charlottesville census tracts 2.01, 2.02, and 6, while not officially university property, house primarily students.

These student-dominated census tracts look like outliers on many of the variables of interest - tract 109.03 especially stands out - but they do not capture the whole picture.