從 API 抓回來的數字資料,如果直接看的話,會覺得很雜亂、不好懂。
所以今天我要學習的是描述性統計,透過計算數據的平均值、中位數、最大值和最小值,幫助我們快速了解資料內容。
可以幫助我們用簡單的數字,像是平均值、中位數、最大值和最小值,快速了解資料是怎麼分布的,不需要去看很多複雜的圖表,就能掌握大概情況。
異常值就是特別大或特別小的數字。如果資料中有極端值影響平均,中位數和數據範圍就很重要,能幫助我們看清楚資料的真實狀況。
單用一個數值,像是平均值,不能代表整個資料,必須用多個指標一起來看,這樣才能完整了解數據,不會誤判。
平均數(Mean)
算法:把所有數字加起來,再除以數字的個數。
優點:直觀,告訴我們資料的整體平均水平。
缺點:如果有特別大或特別小的數字,平均值會被影響,可能無法代表真正的主要趨勢。
中位數(Median)
算法:把數字從小到大排列,找中間那個數字。(如果數字是偶數個的話,就取中間兩個數的平均)
優點:不會受到極端值影響,可以代表典型的數字。
缺點:無法告訴我們資料是不是偏斜或分布的形狀。
眾數(Mode)
最大值 (Max) 和 最小值 (Min)
因為單看一個指標,像是平均數,可能會被極端值影響,讓資料分析不夠準確。
中位數可以補充說明主要的典型數值,眾數告訴我們最常見的情況,最大和最小值則幫助我們了解整體範圍和找出異常。
舉例來說:一班學生多數考70分,有一個人考0分。如果單看平均分,可能是偏低的分數,但中位數和眾數仍反映多數人的成績,這樣才能正確了解整體成績狀況。
多個指標一起看,才能讓我們更全面的理解資料,避免產生誤解。
步驟 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()
首先我們要釐清這份資料是針對誰或哪段時間的?
例如:是全部人?還是只有某幾個地區或族群?
有可能這只是測試用的假資料,不代表真實情況。
如果資料只取了某一部分,就不能用來推論整體狀況。
這是今天的資料?還是過去一年的資料?
不同時間範圍,計算出來的平均值或中位數可能會不一樣。
比較不同資料時,要確保時間範圍一樣,才公平。
在計算之前,要先去除沒填的資料(空值)。
要檢查資料中最小值和最大值,看看有沒有不合理的數字(比如負數或特別大的值)。
如果有非常極端的數值,除了平均值外,也要看中位數或四分位數。
比如完成是什麼意思?是完成訂單?還是完成付款?
算平均值時,要確認計算用的數量是正確的(拿掉沒資料的部分)。
算比例時,要知道分母是什麼(比如是全部人,還是只有特定時間內的人)。
有些 API 資料很多,會分頁顯示,每次只給一部分資料,比如前 100 筆。
如果只抓一部分,就不是全部資料,結果可能不完整。
如果資料有重複,要先去掉重複的資料再算數。
API 資料會一直更新,我們要記錄:
什麼時候抓的資料
用的是哪個接口和參數
抓了多少筆資料或樣本數
學會了平均值、中位數、最大和最小值的意義與差異
實作從 API 取資料並計算描述性統計的小練習
理解 API 數據有限制,不能光看結果就直接判斷