← 所有文章

工業報表缺測資料與估算值的呈現

· 站長

以10、12、缺、缺、缺、20、22的每分鐘產量案例核算觀測64、估算48、完整112與平均16,分開缺測、方法版本、quality與估算峰值。

先保留缺測 再談估算

報表遇到缺測時,第一步是保留原始空值與quality,不把未知改成零。估算值可以幫助趨勢或規劃,但必須有methodVersion、estimated、原始缺口起訖與可追溯的觀測點。本文用每分鐘產量離線案例,所有數字是手算假設。

案例七分鐘資料為10、12、缺、缺、缺、20、22。已觀測總量10+12+20+22=64,觀測四分鐘平均16。缺測三分鐘若採端點線性估算14、16、18,估算總量48,估算完整總量112,完整估算平均仍是16。112不是實際產量,只是含估值的報表摘要。

報表同時顯示observedTotal=64、estimatedGapTotal=48、reportedTotal=112、observedCount=4、estimatedCount=3與qualitySummary,讓讀者不會把完整估算當實測。

分鐘 原始值 狀態 線性估值
00 10 observed 10
01 12 observed 12
02 estimated 14
03 estimated 16
04 estimated 18
05 20 observed 20
06 22 observed 22

先確認資料語意再選方法。這七筆若是每分鐘增量,10、12、20、22各自代表該分鐘完成量;若是累計表值,就必須先以相鄰差分轉成增量,不能把兩種語意放在同一欄相加。本例明確採增量語意,因此觀測總和為10+12+20+22=64,觀測筆數為4,缺測筆數為3,總筆數為7。

比較排除 前值與線性

排除法只用四筆觀測,總量64、平均16,不能宣稱七分鐘實際總量。前值法把12延續三分鐘,估值總量36、完整總量100,假設缺測期間維持前一值。線性法用12到20的等距位置填14、16、18,缺口總48、完整112;三種結果不同,方法不能在報表中省略。

pandas DataFrame.interpolate的linear把值視為等距;time則依時間間隔,limit可限制連續缺值,搭配limit時,limit_area=inside只填前後都有有效值的內部缺口。此案例等距每分鐘才適合linear;不規則時間要先選time或明確方法。

缺口在序列開頭或結尾時,inside不會外推;不能用端點線性方法假裝有觀測。前值法適合經工程審查的保持型訊號,不適合每分鐘產量一定持續不變的設備。

方法 缺口估值 完整總量 解讀
排除 64 只報觀測
前值 12,12,12 100 保持假設
線性 14,16,18 112 端點內插估計
零值 0,0,0 64 不可當未知

零值替代會把未知變成已知,因而改變結論。若三個缺口填零,總和會變64、平均卻是64/7約9.14,這不是停機已確認的證據;若使用前值保持,三格可能各為12,總和100,平均約14.29,結果又不同。正確做法是並列observedTotal=64、estimatedTotal=112與missingCount=3,而不是只留一個看似精確的總數。

不規則時間戳要使用時間距離而非索引距離。00:00為12、00:01缺測、00:03為20時,按實際時間線性內插為12+(20−12)×1/3,約14.67;若缺的是00:02,則約17.33。資料表若只有排序索引而沒有時間戳,不能宣稱使用time方法,應將methodVersion標成index-linear並在報表說明等距假設。

總量 平均與峰值界線

觀測均值是64/4=16,完整線性估計均值112/7=16;這個巧合不能讓估值變成實測。觀測峰值22是已看到的最大值,不能寫成完整期間實際峰值;缺口可能有更高值。線性估值峰值22只是估值集合的峰值,報表應標estimated peak。

若要算產量率,確認每筆是增量還是累計。案例值視為每分鐘增量,直接加總;若是累計counter,應用差分並處理reset/wrap,不能把四筆累計值相加。

摘要需列coverage=4/7、estimatedRatio=3/7、methodVersion=linear-v1、gapStart=02、gapEnd=04與quality。估算結果若供計費、品質放行或安全判斷,通常要改用人工確認或標記不可用。

摘要 觀測 含估算 限制
總量 64 112 112含48估值
平均 16 16 不可證明真實
峰值 22 observed 22 estimated-set 不代表缺口峰值
覆蓋 4/7 7/7呈現 3筆非實測

補值範圍也要設上限。缺口前後都有有效值且連續缺三筆時,limit=3、limit_area=inside可以處理本例;若連續缺四筆且採預設向前填補,第四筆保持未知;若改雙向填補,可能補滿四筆。若政策要求缺口超過三筆就整段不估,應先檢查缺口長度,不能只靠limit=3。開頭缺測沒有左端點,結尾缺測沒有右端點,不能用內插硬填;要另訂前值、後值或外插規則,且外插產生的quality必須與內插不同。

平均值相同不代表方法正確。本例觀測平均64/4=16,線性補值後112/7=16,只是數字巧合;它沒有證明缺測三分鐘真的各產出14、16、18。若缺測期間可能有突增,實際峰值可能高於已觀測峰值22,因此報表只能寫observedPeak=22,estimatedSeriesPeak=22,不得把22稱為完整實際峰值。

操作 排錯與限制

先保存原始表,再設定缺測規則、最大連續缺口、方法版本與是否只填內部缺口;計算後把估值寫入獨立欄,不覆蓋raw。若端點沒有兩側觀測,保持NaN並報缺口。

排錯先查時間是否等距、單位、資料型別、缺測是否真的NaN、是否誤把零當缺測、聚合欄位是否混合estimated與observed。若總量與手算不符,逐筆列出來源與methodVersion,不只看最後摘要。

估算不得冒稱峰值、實際產量或已驗證數字。平台可能有自己的interpolate、fillna或報表聚合行為;未指定平台時只描述公式與欄位契約,不造PLC或報表API。

驗收用本案例重算64、48、112、16,另測開頭/結尾缺口、兩段缺口、超過limit與時間不等距,確認結果與quality一致。

每一筆補值都要保留來源欄位。例如14、16、18的row可寫rawValue=null、reportedValue=14/16/18、sourceQuality=Missing、estimateQuality=Estimated、estimateReason=linear_between_valid、methodVersion=linear-v1、gapStart=00:02、gapEnd=00:04。報表顯示補值時加上估算標誌,匯出仍保留null原值,讓後續人員能重算或改用新方法。

FAQ 來源與驗證

若管理者要比較班次,先固定計算口徑與覆蓋率。例中coverage為4/7約57.14%,estimateRatio為3/7約42.86%;可以設定覆蓋率低於80%時只發布觀測總和,另提供估算欄位,不把112直接放進實績排行榜。每次重算記錄runAt、資料快照識別碼與methodVersion,避免同一報表因規則改版而無法解釋差異。

驗收可用四組資料逐一核對:完整資料不應產生估算;內部三筆缺口應得到14、16、18;尾端缺口應保持null;連續四筆缺口在limit=3且向前填補時至少有一筆仍為null。再檢查每個估算row的quality、方法版本與原因欄都存在,並核對報表的總和公式只使用相同口徑的欄位。

若原始訊號是累計計數器,缺測期間的處理流程不同:先保存每次有效讀值,再以計數器差值求區間增量,並處理重啟歸零、回繞與負差值。不能把累計值10、12、20、22當成每分鐘產量直接相加。本篇案例已明確排除這種語意;實作時可在schema加入valueKind=interval_increment或cumulative_counter,讓錯誤資料在進入報表前被拒絕。

取消或重跑也要有明確狀態。使用者在報表計算中途按取消時,不應發布半套總數;先完成快照讀取與方法計算,再以狀態Succeeded發布結果,取消則留下Cancelled與原因。重跑同一快照時應得到同一112與同一14、16、18,若方法版本不同則另建結果版本,不能靜默覆蓋原有實績。

FAQ1:缺測可填0嗎?不可,零可能是有效產量,未知要保留空值與quality。

FAQ2:線性估算總量112是實際產量嗎?不是,是含48估算值的報表數字。

FAQ3:峰值22可以寫成完整期間峰值嗎?不可以,只能寫觀測峰值或估值集合峰值。

FAQ4:time與linear一樣嗎?不一定,linear視為等距,time依時間間隔。

本文案例為離線手算。

參考:pandas DataFrame.interpolate:linear等距、time依時間、limit與limit_area='inside'。

延伸閱讀


使用 PLC 工具箱 →