iT邦幫忙

2025 iThome 鐵人賽

DAY 19
0
Modern Web

每天一點 API:打造我的生活小工具系列 第 19

Day19 — API 數據怎麼解讀?描述性統計的基礎練習

  • 分享至 

  • xImage
  •  

從 API 抓回來的數字資料,如果直接看的話,會覺得很雜亂、不好懂。

所以今天我要學習的是描述性統計,透過計算數據的平均值、中位數、最大值和最小值,幫助我們快速了解資料內容。

為什麼要學描述性統計?

  • 快速了解資料特徵

可以幫助我們用簡單的數字,像是平均值、中位數、最大值和最小值,快速了解資料是怎麼分布的,不需要去看很多複雜的圖表,就能掌握大概情況。

  • 辨識異常值

異常值就是特別大或特別小的數字。如果資料中有極端值影響平均,中位數和數據範圍就很重要,能幫助我們看清楚資料的真實狀況。

  • 避免誤解資料

單用一個數值,像是平均值,不能代表整個資料,必須用多個指標一起來看,這樣才能完整了解數據,不會誤判。

常見的統計指標有哪些?它們有什麼特色?

平均數(Mean)

算法:把所有數字加起來,再除以數字的個數。
優點:直觀,告訴我們資料的整體平均水平。
缺點:如果有特別大或特別小的數字,平均值會被影響,可能無法代表真正的主要趨勢。

中位數(Median)

算法:把數字從小到大排列,找中間那個數字。(如果數字是偶數個的話,就取中間兩個數的平均)
優點:不會受到極端值影響,可以代表典型的數字。
缺點:無法告訴我們資料是不是偏斜或分布的形狀。

眾數(Mode)

  • 出現次數最多的數字。
  • 它表示資料中最常見的值,有時候很能反映普遍情況。

最大值 (Max) 和 最小值 (Min)

  • 資料中最小的數字和最大的數字。
  • 用來檢查資料範圍,找出異常值或特別高低的情況。

為什麼要多個指標一起看?

因為單看一個指標,像是平均數,可能會被極端值影響,讓資料分析不夠準確。
中位數可以補充說明主要的典型數值,眾數告訴我們最常見的情況,最大和最小值則幫助我們了解整體範圍和找出異常。

舉例來說:一班學生多數考70分,有一個人考0分。如果單看平均分,可能是偏低的分數,但中位數和眾數仍反映多數人的成績,這樣才能正確了解整體成績狀況。

多個指標一起看,才能讓我們更全面的理解資料,避免產生誤解。

實作:用 API 資料做描述性統計

步驟 0:準備

pip install requests

步驟 1:抓資料

  • 使用免費的 JSONPlaceholder API,取得裡面的 /posts(文章)資料。

  • 計算每篇文章標題的長度,當成分析的數字。

import requests

API = "https://jsonplaceholder.typicode.com/posts"

def fetch_posts(timeout=10):
    r = requests.get(API, timeout=timeout)
    r.raise_for_status()
    return r.json()  # list of dict

步驟 2:準備數據

  • 從資料中把每篇文章的標題長度取出來,存成一串長度的數字列。
def extract_title_lengths(posts):
    lengths = []
    for p in posts:
        title = (p.get("title") or "").strip()
        if title:  # 過濾空值
            lengths.append(len(title))
    return lengths

步驟 3:練習寫簡單程式計算這些統計數字

  • 算平均值:所有標題長度加起來除以篇數。

  • 算中位數:把標題長度由小到大排序,找中間的數字。

  • 算最大值和最小值:找最高和最低的標題長度。

def mean(nums):
    return sum(nums) / len(nums) if nums else 0

def median(nums):
    if not nums:
        return 0
    s = sorted(nums)
    n = len(s)
    mid = n // 2
    return (s[mid-1] + s[mid]) / 2 if n % 2 == 0 else s[mid]

def minmax(nums):
    return (min(nums), max(nums)) if nums else (0, 0)

步驟 4:把結果印出來

在終端機顯示分析結果

def main():
    try:
        posts = fetch_posts()
    except requests.exceptions.RequestException as e:
        print("API 失敗:", e)
        return

    lengths = extract_title_lengths(posts)

    if not lengths:
        print("(沒有可分析的數值資料)")
        return

    avg = mean(lengths)
    med = median(lengths)
    mn, mx = minmax(lengths)

    print("— 標題長度(字元)描述性統計 —")
    print(f"樣本數 n = {len(lengths)}")
    print(f"最小值 Min  = {mn}")
    print(f"中位數 Median = {med:.2f}")
    print(f"平均值 Mean  = {avg:.2f}")
    print(f"最大值 Max  = {mx}")

if __name__ == "__main__":
    main()

https://ithelp.ithome.com.tw/upload/images/20251001/20178708aMtj1IML6V.png

要怎麼解讀資料?需要注意什麼?

  1. 抽樣與代表性

首先我們要釐清這份資料是針對誰或哪段時間的?

例如:是全部人?還是只有某幾個地區或族群?

  • 有可能這只是測試用的假資料,不代表真實情況。

  • 如果資料只取了某一部分,就不能用來推論整體狀況。

  1. 時間範圍

這是今天的資料?還是過去一年的資料?

  • 不同時間範圍,計算出來的平均值或中位數可能會不一樣。

  • 比較不同資料時,要確保時間範圍一樣,才公平。

  1. 缺失和異常值
  • 在計算之前,要先去除沒填的資料(空值)。

  • 要檢查資料中最小值和最大值,看看有沒有不合理的數字(比如負數或特別大的值)。

  • 如果有非常極端的數值,除了平均值外,也要看中位數或四分位數。

  1. 定義要一致

比如完成是什麼意思?是完成訂單?還是完成付款?

  • 如果 API 的欄位名稱換了或意思改了,要記得修改程式和說明。
  1. 分母問題(計算比例時要注意)
  • 算平均值時,要確認計算用的數量是正確的(拿掉沒資料的部分)。

  • 算比例時,要知道分母是什麼(比如是全部人,還是只有特定時間內的人)。

  1. 截取資料和去重
  • 有些 API 資料很多,會分頁顯示,每次只給一部分資料,比如前 100 筆。

  • 如果只抓一部分,就不是全部資料,結果可能不完整。

  • 如果資料有重複,要先去掉重複的資料再算數。

  1. 重現性(方便下次查驗)

API 資料會一直更新,我們要記錄:

  • 什麼時候抓的資料

  • 用的是哪個接口和參數

  • 抓了多少筆資料或樣本數

今日總結

  • 學會了平均值、中位數、最大和最小值的意義與差異

  • 實作從 API 取資料並計算描述性統計的小練習

  • 理解 API 數據有限制,不能光看結果就直接判斷


上一篇
Day18 — 天氣數據視覺化:從 API 到折線圖
系列文
每天一點 API:打造我的生活小工具19
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言