什么是誤差圖?今天帶你了解可視化誤差圖,讓數(shù)據(jù)一目了然
前言
這是Python數(shù)據(jù)可視化的系列短篇,針對(duì)初級(jí)和中級(jí)用戶,將理論和示例代碼相結(jié)合,使用matplotlib, seaborn, plotly等工具創(chuàng)建不同主題的圖表。
本文主題是如何在圖表中顯示誤差。
- import os
 - import warnings
 - import requests
 - import numpy as np
 - import pandas as pd
 - import matplotlib.pyplot as plt
 - from statsmodels.tsa.arima_model import ARIMA
 - %matplotlib inline
 - plt.style.use("fivethirtyeight")
 - warnings.filterwarnings("ignore")
 
1. 顯示測(cè)量誤差
科學(xué)測(cè)量往往存在誤差,準(zhǔn)確的報(bào)告誤差跟報(bào)告測(cè)量結(jié)果同樣重要。
測(cè)量誤差(也稱為觀察誤差)是測(cè)量值和真實(shí)值之間的差異,包括隨機(jī)誤差(任何實(shí)驗(yàn)中都會(huì)自然發(fā)生的誤差)和系統(tǒng)誤差(由影響所有測(cè)量的錯(cuò)誤校準(zhǔn)的儀器引起)。
舉一個(gè)例子,假設(shè)您正在測(cè)量100個(gè)學(xué)生的體重,有的學(xué)生穿較多的衣服,導(dǎo)致重500克,有的學(xué)生可能脫水導(dǎo)致輕200克,這些都是測(cè)量誤差。事實(shí)上所有收集的樣本都會(huì)存在誤差,大多數(shù)情況下它們不可避免。所以在數(shù)據(jù)可視化中,有效顯示這些錯(cuò)誤可以傳達(dá)更完整的信息。
在matplotlib中通過調(diào)用ax.errorbar()創(chuàng)建誤差圖(errorbar)。誤差圖由一個(gè)點(diǎn)和穿過這個(gè)點(diǎn)的線段組成,點(diǎn)對(duì)應(yīng)測(cè)量結(jié)果,線段代表測(cè)量誤差。
- # 設(shè)置隨機(jī)數(shù)種子
 - np.random.seed(123)
 - # 觀測(cè)值的數(shù)量
 - n_observations = 30
 - x = np.arange(n_observations)
 - # 虛擬測(cè)量值
 - y = np.sin(x) + np.random.randn(n_observations)
 - # 測(cè)量誤差,假設(shè)誤差服從均勻分布
 - errors = np.random.randint(1, 3, n_observations)
 - # 調(diào)用ax.errorbar接口,提供3個(gè)數(shù)組,x, y, yerr
 - # fmt控制點(diǎn)和線段的樣式,跟ax.plot的fmt相同
 - # color: 控制點(diǎn)的顏色
 - # ecolor: 代表誤差的線段的顏色
 - # elinewidth: 代表誤差的線段的大小
 - fig, ax = plt.subplots(figsize=(10, 7))
 - ax.errorbar(x, y, yerr=errors, fmt="o", color="black",
 - ecolor="lightgray", elinewidth=3)
 
2. 顯示預(yù)測(cè)誤差
在機(jī)器學(xué)習(xí)領(lǐng)域,回歸模型和時(shí)間序列模型用于預(yù)測(cè),模型會(huì)同時(shí)生成預(yù)測(cè)誤差(所謂置信區(qū)間),在可視化預(yù)測(cè)結(jié)果時(shí),通常要求顯示預(yù)測(cè)值和預(yù)測(cè)區(qū)間,這可以通過ax.plot()和ax.fill_between()實(shí)現(xiàn)。
接下來使用一個(gè)真實(shí)的案例說明,先從蜂鳥數(shù)據(jù)獲取黃金價(jià)格,然后用ARIMA(自回歸整合移動(dòng)平均)預(yù)測(cè)未來30天的價(jià)格,可視化預(yù)測(cè)結(jié)果。
- # 從蜂鳥數(shù)據(jù)下載黃金價(jià)格
 - params = {
 - "symbol": "XAUUSD", # 現(xiàn)貨黃金ID
 - "start_date": "2010-01-01",
 - "end_date": "2020-08-05",
 - "apikey": os.getenv("TROCHIL_API") # 在蜂鳥數(shù)據(jù)官網(wǎng)注冊(cè)獲取API密鑰
 - }
 - resp = requests.get("https://api.trochil.cn/v1/forex/history", params)
 - data = pd.DataFrame.from_records(resp.json()["data"])
 - data["datetime"] = pd.to_datetime(data["datetime"])
 - data.set_index("datetime", inplace=True)
 - # 創(chuàng)建ARMIA模型,預(yù)測(cè)未來30天價(jià)格走勢(shì)
 - model = ARIMA(data.close, order=(1, 1, 1))
 - results = model.fit()
 - fc, errors, conf = results.forecast(steps=30, alpha=0.05)
 - fc_df = pd.DataFrame({
 - "forecast": fc,
 - "lower": conf[:, 0],
 - "upper": conf[:, 1]
 - }, index=pd.date_range("2020-08-06", periods=30))
 - # 可視化預(yù)測(cè)結(jié)果,包括點(diǎn)預(yù)測(cè)值和預(yù)測(cè)區(qū)間
 - # 預(yù)測(cè)區(qū)間包括置信下限和上限,代表真實(shí)值可能落入的范圍
 - # 調(diào)用ax.plot顯示點(diǎn)預(yù)測(cè)值,ax.fill_between顯示預(yù)測(cè)區(qū)間
 - data_since_2020 = data["2020":]
 - fig, ax = plt.subplots(figsize=(12, 7))
 - data_since_2020.close.plot(ax=ax, label="Historical Prices")
 - ax.plot(fc_df.index, fc_df.forecast, label="Forecast Prices")
 - ax.fill_between(fc_df.index, fc_df.lower, fc_df.upper, color="gray", alpha=0.3, label="Forecast Interval")
 - ax.set_title("Plot Forecast Errors")
 - ax.legend(loc="upper left")
 - <matplotlib.legend.Legend at 0x7fbfa348d9a0>
 

















 
 
 







 
 
 
 