如何根據平均溫度表示每年的千瓦時使用量?
只是為了好玩,我想繪製我每月家庭用電量的逐年圖表。但是,我希望包括一些關於每月溫度的參考,以便我可以確定我的家庭或行為在 kWh 使用方面是否正在改善、惡化或保持穩定。
我正在使用的數據:
+----------+--------+-----------+----------------+----------+-----------+------------+ | Month | # Days | kWh Usage | Daily kWh Avg. | Avg. Low | Avg. High | Avg. Temp. | +----------+--------+-----------+----------------+----------+-----------+------------+ | Mar 2015 | 32 | 1048 | 33 | 40 | 60 | 50 | | Feb 2015 | 29 | 1156 | 40 | 32 | 54 | 43 | | Jan 2015 | 33 | 1143 | 35 | 38 | 57 | 47 | | Dec 2014 | 30 | 887 | 30 | 39 | 61 | 50 | | Nov 2014 | 29 | 645 | 22 | 45 | 67 | 56 | | Oct 2014 | 29 | 598 | 21 | 60 | 78 | 69 | | Sep 2014 | 32 | 893 | 28 | 70 | 85 | 77 | | Aug 2014 | 30 | 965 | 32 | 72 | 87 | 79 | | Jul 2014 | 29 | 784 | 27 | 72 | 87 | 79 | | Jun 2014 | 32 | 1018 | 32 | 69 | 87 | 78 | | May 2014 | 30 | 702 | 23 | 63 | 82 | 72 | | Apr 2014 | 33 | 722 | 22 | 50 | 71 | 60 | | Mar 2014 | 29 | 830 | 29 | 41 | 62 | 52 | | Feb 2014 | 28 | 1197 | 43 | 32 | 52 | 42 | | Jan 2014 | 33 | 1100 | 33 | 38 | 59 | 49 | | Dec 2013 | 30 | 856 | 29 | 40 | 63 | 51 | | Nov 2013 | 33 | 686 | 21 | 48 | 70 | 59 | | Oct 2013 | 30 | 527 | 18 | 61 | 77 | 69 | | Sep 2013 | 30 | 817 | 27 | 69 | 86 | 77 | | Aug 2013 | 28 | 991 | 35 | 72 | 86 | 79 | | Jul 2013 | 31 | 993 | 32 | 73 | 86 | 79 | | Jun 2013 | 30 | 847 | 28 | 66 | 83 | 74 | | May 2013 | 29 | 605 | 21 | 59 | 76 | 67 | | Apr 2013 | 34 | 791 | 23 | 47 | 66 | 57 | +----------+--------+-----------+----------------+----------+-----------+------------+
我從一個柱形圖開始,很容易比較每月的值:
我設想了一個很好的背景區域或線圖,映射到顯示高/低範圍的次要(右)垂直軸,但意識到多年分組會出現問題。
一年很容易:
我很想知道是否有人可以推荐一種將所有年度數據組合成一個帶有溫度比較的圖表的方法?
是否有一些我可以使用的比率可以有效地將千瓦時的使用量與平均溫度聯繫起來……或者我忽略的其他一些顯示技術……還是我每年都堅持一張圖表?
我想建議重要的是開發一個物理上現實的、實用的能源成本模型。 這將比原始數據的任何可視化效果更好地檢測成本變化。通過將其與SO 上提供的解決方案進行比較,我們有一個很好的案例研究,說明了將曲線擬合到數據和執行有意義的統計分析之間的差異。
(此建議基於十年前已將此類模型擬合到我自己的家庭使用情況並將其應用於跟踪該期間的變化。請注意,一旦模型擬合,它可以很容易地在電子表格中計算以進行跟踪變化,所以我們不應該受到電子表格軟件的(in)功能的限制。)
對於這些數據,與簡單的替代模型(每日使用量與月平均溫度的二次最小二乘擬合)**相比,這種物理上合理的模型產生的能源成本和使用模式的圖景大不相同。**因此,不能將更簡單的模型視為理解、預測或比較能源使用模式的可靠工具。
分析
牛頓冷卻定律說,在一個很好的近似下,加熱成本(在單位時間內)應該與外部溫度之間的差異成正比和內部溫度. 讓比例常數為. 冷卻成本也應該與溫差成正比,具有相似但不一定相同的比例常數. (每一項都取決於房屋的隔熱能力以及加熱和冷卻系統的效率。)
**估計和(表示為每單位時間每度的千瓦(或美元))是可以完成的最重要的事情之一,**因為它們使我們能夠預測未來的成本,以及衡量房屋及其能源系統的效率。
因為這些數據是總用電量,它們包括非供暖成本,如照明、烹飪、計算和娛樂。 同樣令人感興趣的是對平均基礎能源使用量(每單位時間)的估計,我將其稱為:它為可以節省多少能源提供了一個底線,並且可以在進行已知幅度的效率改進時預測未來的成本。(例如,四年後,我用一個聲稱效率提高了 30% 的爐子替換了一個爐子——事實上確實如此。)
最後,作為(總)近似值,我將假設房子保持在幾乎恆定的溫度全年。(在我的個人模型中,我假設兩個溫度,,分別適用於冬季和夏季——但在這個例子中還沒有足夠的數據來可靠地估計它們,而且它們無論如何都會非常接近。)知道這個值有助於評估以稍微不同的方式維護房子的後果溫度,這是重要的節能選擇之一。
這些數據提出了一個非常重要和有趣的複雜情況:它們反映了室外溫度波動期間的總成本——它們波動很大,通常每月約為其年度範圍的四分之一。正如我們將看到的,這在剛剛描述的正確的基礎瞬時模型和每月總計的值之間產生了很大的差異。這種效果在中間月份尤其明顯,加熱和冷卻都發生(或兩者都不發生)。任何不考慮這種變化的模型都會錯誤地“認為”能源成本應該是基本費率在平均氣溫為,但實際情況卻大相徑庭。
除了它們的範圍之外,我們沒有(很容易)獲得有關每月溫度波動的詳細信息。我建議用一種實用但有點不一致的方法來處理它。除極端溫度外,每個月通常都會經歷逐漸升高或降低的溫度。這意味著我們可以使分佈大致均勻。當統一變量的範圍有長度時,該變量的標準差為. 我使用這種關係將範圍(從
Avg. Low
到Avg. High
)轉換為標準差。但是,基本上為了獲得一個表現良好的模型,我將通過使用正態分佈(這些估計的 SD 和均值由 給出)來降低這些範圍末端的變化權重Avg. Temp
。最後,我們必須將數據標準化為一個共同的單位時間。 雖然這已經存在於
Daily kWh Avg.
變量中,但它缺乏精度,所以讓我們將總數除以天數,以恢復丟失的精度。因此,單位時間冷卻成本模型在室外溫度是
在哪裡是指標函數和表示此模型中未明確捕獲的所有內容。它有四個要估計的參數:, 和. (如果你真的確定你可以確定它的價值而不是估計它。)
一個時間段內報告的總成本到當溫度隨時間變化因此將是
如果模型有任何好處,那麼波動應該平均到一個值接近於零,並且會出現每月隨機變化。近似波動均值正態分佈(月平均值)和標準差(如先前從每月範圍給出的)並進行積分收益率
在這個公式中,是零均值和標準差的正態變量的累積分佈;是它的密度。
模型擬合
該模型雖然表達了成本和溫度之間的非線性關係,但在變量中卻是線性的和. 但是,由於它是非線性的, 和未知,我們需要一個非線性擬合程序。為了說明,我只是將它轉儲到似然最大化器(
R
用於計算),假設是獨立同分佈的,均值為零和共同標準差的正態分佈.對於這些數據,估計值是
這意味著:
- 加熱成本約為千瓦時/天/華氏度。
- 冷卻成本約為千瓦時/天/華氏度。冷卻效率更高一些。
- 基本(非加熱/冷卻)能源使用量為千瓦時/天。(這個數字相當不確定;額外的數據將有助於更好地確定它。)
- 房子的溫度保持在接近華氏度。
- 模型中未明確考慮的其他變量的標準偏差為千瓦時/天。
這些估計中的置信區間和其他不確定性的定量表達可以用最大似然機制以標準方式獲得。
可視化
為了說明這個模型,下圖繪製了數據、基礎模型、每月平均值的擬合以及簡單的最小二乘二次擬合。
月度數據顯示為暗十字。它們所在的水平灰線顯示了每月的溫度範圍。我們的基本模型反映了牛頓定律,由在溫度為. 我們對數據的擬合不是曲線,因為它取決於溫度範圍。因此,它顯示為單獨的實心藍色和紅色點。(儘管如此,由於每月的範圍變化不大,這些點似乎確實描繪出一條曲線——幾乎與虛線二次曲線相同。)最後,虛線曲線是二次最小二乘擬合(到黑色十字)。
注意擬合偏離基礎(瞬時)模型的程度,尤其是在中間溫度下!這是每月平均的效果。(想想紅色和藍色線的高度在每個水平灰色段上“塗抹”。在極端溫度下,一切都以線條為中心,但在中等溫度下,“V”的兩側平均在一起,反映了需要在一個月內的某些時間加熱和在其他時間冷卻。)
型號比較
這兩種擬合——這裡精心開發的一種和簡單、容易的二次擬合——彼此之間以及與數據點都非常吻合。二次擬合不太好,但仍然不錯:調整後的平均殘差(三個參數)為kWh/天,而牛頓定律模型(四個參數)的調整後平均殘差是千瓦時/天,降低約 5%。 如果您只想通過數據點繪製一條曲線,那麼二次擬合的簡單性和相對保真度將推薦它。
但是,二次擬合對於了解正在發生的事情完全沒有用!它的公式,
沒有直接顯示任何用處。平心而論,我們可以稍微分析一下:
- 這是一個頂點為的拋物線華氏度。我們可以將此作為恆定房屋溫度的估計值。它與我們最初的估計沒有顯著差異度。然而,在這個溫度下的預測成本是千瓦時/天。 這是符合牛頓定律的基本能量使用量的兩倍。
- 加熱或冷卻的邊際成本是從導數的絕對值獲得的, . 例如,使用這個公式,我們可以估算當室外溫度為度為千瓦時/天/華氏度。 這是用牛頓定律估算的值的兩倍。
同樣,在室外溫度下取暖房屋的成本為度數將被估計為千瓦時/天/華氏度。 這是牛頓定律估計值的兩倍多。
在中間溫度下,二次擬合在另一個方向上出錯。事實上,在它的頂點到度範圍它預測的邊際加熱或冷卻成本幾乎為零,即使這個平均溫度包括與度和溫暖度。(閱讀這篇文章的人很少會在度(=攝氏度)!)
簡而言之,雖然它在可視化中看起來幾乎一樣好,但二次擬合在估計與能源使用相關的基本興趣量時嚴重錯誤。 因此,將其用於評估使用變化是有問題的,應該不鼓勵使用。
計算
這段
R
代碼執行了所有的計算和繪圖。它可以很容易地適應類似的數據集。# # Read and process the raw data. # x <- read.csv("F:/temp/energy.csv") x$Daily <- x$Usage / x$Length x <- x[order(x$Temp), ] #pairs(x) # # Fit a quadratic curve. # fit.quadratic <- lm(Daily ~ Temp+I(Temp^2), data=x) # par(mfrow=c(2,2)) # plot(fit.quadratic) # par(mfrow=c(1,1)) # # Fit a simple but realistic heating-cooling model with maximum likelihood. # response <- function(theta, x, s) { alpha <- theta[1]; beta <- theta[2]; gamma <- theta[3]; t.0 <- theta[4] x <- x - t.0 gamma + (beta-alpha)*s^2*dnorm(x, 0, s) + x*(beta + (alpha-beta)*pnorm(-x, 0, s)) } log.L <- function(theta, y, x, s) { # theta = (alpha, beta, gamma, t.0, sigma) # x = time # s = estimated SD # y = response y.hat <- response(theta, x, s) sigma <- theta[5] sum((((y - y.hat) / sigma) ^2 + log(2 * pi * sigma^2))/2) } theta <- c(alpha=-1, beta=5/4, gamma=20, t.0=65, sigma=2) # Initial guess x$Spread <- (x$Temp.high - x$Temp.low)/sqrt(6) # Uniform estimate fit <- nlm(log.L, theta, y=x$Daily, x=x$Temp, x$Spread) names(fit$estimate) <- names(theta) #$ # Set up for plotting. # i.pad <- 10 plot(range(x$Temp)+c(-i.pad,i.pad), c(0, max(x$Daily)+20), type="n", xlab="Temp", ylab="Cost, kWh/day", main="Data, Model, and Fits") # # Plot the data. # l <- matrix(mapply(function(l,r,h) {c(l,h,r,h,NA,NA)}, x$Temp.low, x$Temp.high, x$Daily), 2) lines(l[1,], l[2,], col="Gray") points(x$Temp, x$Daily, type="p", pch=3) # # Draw the models. # x0 <- seq(min(x$Temp)-i.pad, max(x$Temp)+i.pad, length.out=401) lines(x0, cbind(1, x0, x0^2) %*% coef(fit.quadratic), lwd=3, lty=3) #curve(response(fit$estimate, x, 0), add=TRUE, lwd=2, lty=1) t.0 <- fit$estimate["t.0"] alpha <- fit$estimate["alpha"] beta <- fit$estimate["beta"] gamma <- fit$estimate["gamma"] cool <- "#1020c0"; heat <- "#c02010" lines(c(t.0, 0), gamma + c(0, -alpha*t.0), lwd=2, lty=1, col=cool) lines(c(t.0, 100), gamma + c(0, beta*(100-t.0)), lwd=2, lty=1, col=heat) # # Display the fit. # pred <- response(fit$estimate, x$Temp, x$Spread) points(x$Temp, pred, pch=16, cex=1, col=ifelse(x$Temp < t.0, cool, heat)) #lines(lowess(x$Temp, pred, f=1/4)) # # Estimate the residual standard deviations. # residuals <- x$Daily - pred sqrt(sum(residuals^2) / (length(residuals) - 4)) sqrt(sum(resid(fit.quadratic)^2) / (length(residuals) - 3))