數據分析課程,資訊科技教育,資訊科技素養

一、NumPy 數值計算

1.1 NumPy 陣列的建立與操作

在數據分析的領域中,NumPy(Numerical Python)是 Python 生態系統中不可或缺的核心函式庫,其高效的多維陣列物件(ndarray)為數值計算提供了堅實的基礎。傳統 Python 的列表(list)雖然靈活,但在處理大量數據時,由於每個元素皆為物件,導致記憶體開銷巨大且運算速度緩慢。NumPy 陣列則解決了此痛點,它要求陣列內所有元素皆為相同資料型態,這使得數據能連續儲存於記憶體中,大幅提升存取與運算效率。舉例而言,當分析香港天文台提供的過去十年每日氣溫數據時,若使用 Python 串列進行逐項迴圈計算平均溫度的冷卻度日(Cooling Degree Days),可能需要數秒甚至更長的時間;但透過 NumPy 陣列,一行 `np.mean()` 指令便能瞬間完成,這正是向量化運算的威力。建立陣列的方法多元,最常見的是透過 `np.array()` 將列表或巢狀列表轉換為陣列,例如 `np.array([[22.5, 25.1, 28.3], [24.0, 26.7, 30.2]])` 即可產生一個 2x3 的二維陣列。此外,`np.zeros()`、`np.ones()`、`np.arange()` 以及 `np.random.randn()` 等函數,能快速建立特定形狀或隨機數據的陣列。陣列的操作亦極為直觀,包括索引與切片,例如 `data[0:5, :]` 可提取前五行所有欄位的數據;軸的變換如 `reshape()`、`transpose()` 或 `T` 屬性則能輕鬆調整資料結構。學會這些基本操作,是掌握後續數據處理與機器學習的第一步,也是許多優秀的數據分析課程中的首要環節。

1.2 數值運算:向量化運算、廣播機制

NumPy 最引人入勝的特性,莫過於其向量化運算與廣播機制。向量化運算意指對整個陣列執行數學運算,而不需撰寫顯式的迴圈。例如,若要將一組香港消費物價指數(CPI)的月度變化率(如 0.2%, 0.5%, -0.1%...)轉換為實際指數,傳統做法會是 `for i in range(len(percentages)): index[i+1] = index[i] * (1 + percentages[i])`。然而在 NumPy 中,我們可以直接對陣列做加法、乘法等操作,如 `index = 100 * np.cumprod(1 + percentages / 100)`,短短一行程式碼便完成了累積運算,其內部的 C 語言實作讓執行速度遠超 Python 原生迴圈。廣播機制則讓形狀不同的陣列之間也能進行運算,此功能極大簡化了數據標準化或特徵縮放的過程。例如,我們有一個形狀為 (100000, 5) 的香港各區住宅呎價數據集(包含五種不同房型),欲將每種房型減去其各自的平均值並除以標準差。若使用廣播,只需計算各房型的均值和標準差(均為長度 5 的一維陣列),然後直接對原始陣列進行減法和除法即可,NumPy 會自動將一維陣列「廣播」到二維陣列的每個欄位上。這種優雅且高效的計算方式,不僅讓程式碼更簡潔、可讀性更高,更大幅降低了出錯機率。在資訊科技教育中,理解向量化思維是從初學者晉升至進階資料科學家的重要分水嶺,因為它不僅關乎性能,更代表一種將數學邏輯直接轉化為程式碼的思維模式。

1.3 線性代數與統計函數

機器學習與數據分析的本質,往往離不開線性代數與統計學的應用。NumPy 的子模組 `numpy.linalg` 提供了完整的線性代數函數,例如矩陣乘法(`dot()` 或 `@` 運算子)、反矩陣(`inv()`)、行列式(`det()`)、特徵值與特徵向量(`eig()`)等。在實務中,這些函數廣泛應用於主成分分析(PCA)或線性迴歸的封閉解計算。例如,若要透過正規方程(Normal Equation)求解一個線性迴歸模型的係數,公式為 θ = (XTX)-1XTy,使用 NumPy 可以寫成 `theta = np.linalg.inv(X.T @ X) @ X.T @ y`,整個過程簡潔且精準。此外,統計函數亦極為實用,`numpy.random` 模組能夠生成服從各種機率分佈的隨機數,對於模擬蒙地卡羅方法或隨機森林的模型參數調整至關重要。`numpy` 內建的描述性統計函數,如 `mean()`、`std()`、`var()`、`min()`、`max()`、`percentile()` 等,可快速對數據進行初步探索。舉例來說,在分析香港住宅物業的按揭數據時,只需要一行 `np.percentile(loan_amounts, [25, 50, 75])` 就能迅速取得貸款金額的四分位距,幫助分析師判斷市場的整體貸款規模分佈。掌握這些數值計算工具,不僅為後續的 Scikit-learn 機器學習建模打下穩固根基,更是現代資訊科技素養中衡量數據處理能力的重要指標。

二、Matplotlib 數據視覺化

2.1 繪製基本圖表:折線圖、散點圖、柱狀圖、直方圖、盒鬚圖

數據視覺化是數據分析中傳遞洞察的關鍵環節,而 Matplotlib 作為 Python 中最經典且功能強大的繪圖庫,幾乎是所有視覺化的基石。Matplotlib 的設計哲學貼近 MATLAB,適合進行底層的自訂繪圖。基本圖表類型能應對絕大多數的數據呈現需求:折線圖(`plot()`)最常用於呈現時間序列的趨勢,例如繪製香港恆生指數過去一年的每日收盤價走勢;散點圖(`scatter()`)用於展示兩個變數之間的相關性,例如比較香港各區的「人均居住面積」與「家庭月收入」的關係;柱狀圖(`bar()`)則善於比較類別型數據,如比較香港 18 區在過去一年的的罪案發生數量;直方圖(`hist()`)可展示單一變數的數據分佈情況,例如分析香港中小學教師的年資分佈;盒鬚圖(`boxplot()`)則是展示數據離散程度與離群值的利器,常用於比較不同組別的數據,例如比較使用不同品牌智能手機的用戶在電池續航上的差異。這些基礎圖表的繪製語法非常直觀,使用者只需提供 x 與 y 軸數據,即可快速生成圖形骨架。對於任何希望提升數據分析技能的專業人士而言,熟悉這些圖表的使用時機與繪製方法,是必修的功課,同時也是評估個人資訊科技素養的具體展現。

2.2 圖表美化:設定標題、軸標籤、圖例、顏色

一張優秀的數據圖表,除了數據本身正確,更需注重視覺美學與可讀性。Matplotlib 提供了豐富的參數來客製化圖表外觀,讓分析師能將原始圖表打磨成符合出版標準或商業簡報需求的成品。首先是標題與標籤:透過 `plt.title()` 設定圖表標題,例如「香港 2023 年每月平均氣溫變化」;`plt.xlabel()` 與 `plt.ylabel()` 分別設定 x 軸與 y 軸的描述,並可加上 `fontsize` 參數調整字體大小。圖例(`legend()`)則讓多條曲線或多組數據得以區分,繪圖時需要先為每個繪圖對象加上 `label` 參數,最後再調用 `plt.legend()` 即可。顏色與樣式的自訂是美化圖表的另一重點,Matplotlib 支援數百種顏色名稱(如 'skyblue', 'coral')、十六進制色碼(如 '#FF5733')以及各種線條樣式(如實線 '-'、虛線 '--'、點線 ':')。例如,在繪製香港歷年 GDP 成長率時,可以將成長率為正的年份用綠色實線標示,為負的年份用紅色虛線標示,直觀呈現經濟週期。此外,網格(`grid()`)、圖形尺寸(`figsize`)、座標軸範圍(`xlim(), ylim()`)以及刻度標籤旋轉(`xticks(rotation=45)`)等細節,都能顯著提升圖表的專業度。這些美化技巧不僅讓數據溝通更具說服力,也反映了分析者對受眾體驗的尊重與重視。

2.3 子圖與多圖繪製

在綜合性的數據分析報告中,經常需要將多張圖表排列在同一畫佈上,以便進行對比或從不同角度審視數據。Matplotlib 的 `subplot()` 與 `subplots()` 函數能夠輕鬆建立網格狀的子圖佈局。舉例來說,若我們要分析香港某月份的氣象數據,我們可以在一個 2x2 的網格中分別放置「每日最高氣溫的折線圖」、「降雨量的柱狀圖」、「風向的極座標圖」以及「相對濕度的直方圖」。撰寫方式為 `fig, axes = plt.subplots(2, 2, figsize=(12, 10))`,然後透過 `axes[0,0].plot(...)`、`axes[0,1].bar(...)` 等方式分別對指定位置的子圖進行操作。此處的 `axes` 是一個二維陣列,索引方式與 NumPy 陣列完全一致。進階使用者還可以利用 `gridspec` 或 `add_gridspec()` 來建立寬度或高度不等的非對稱佈局,例如上方放置一個大圖來展示整體趨勢,下方放置三個小圖展示細分類項。子圖之間的軸標籤、刻度、標題均能獨立設置,且可以透過 `fig.supxlabel()` 和 `fig.supylabel()` 設置整個圖形的共用軸標籤。掌握子圖繪製技巧,能讓分析報告的資訊密度與邏輯結構大幅提升,這在數據分析課程中常被視為進階操作,也是培養全面的資訊科技教育所應涵蓋的實戰技能。

三、Scikit-learn 機器學習入門

3.1 監督式學習:線性迴歸、邏輯迴歸、支持向量機

Scikit-learn 是 Python 機器學習領域應用最廣泛的函式庫,其一致的 API 設計與豐富的演算法庫,讓從數據探索到模型部署的流程變得標準化。監督式學習旨在從帶有標籤(Label)的訓練數據中學習一個函數,以便對未見過的數據進行預測。線性迴歸是最基礎的迴歸模型,假設目標變數與特徵之間存在線性關係。在分析香港住宅樓價時,可以將「實用面積」、「樓齡」、「是否臨海」等作為特徵(X),「成交價格」作為目標(y),透過 `from sklearn.linear_model import LinearRegression; model = LinearRegression(); model.fit(X, y)` 快速建立模型,並利用 `model.coef_` 觀察各特徵對價格的影響程度。邏輯迴歸雖然名為「迴歸」,實則是用於二元分類問題的線性模型,例如根據客戶的「年齡」、「收入」、「過往交易次數」來預測其是否會購買某項金融產品。通過 `LogisticRegression()` 加上 `sigmoid` 函數的轉換,模型會輸出一個 0 到 1 之間的機率值。支持向量機(SVM)則是更強大的分類與迴歸工具,其核心概念是尋找一個能將不同類別數據「最大間隔」分開的超平面。透過不同的核函數(Kernel),如 RBF 核,SVM 甚至能處理非線性的邊界問題。例如,可以使用 SVM 根據衛星影像的光譜特徵,來分類香港的土地使用類型(如「市區建築」、「林地」、「水域」)。這些模型都遵循 fit、predict、score 的統一流程,使得學習曲線相對平滑,非常適合在數據分析課程中作為機器學習的入門教材。

3.2 非監督式學習:K-means 聚類、主成分分析

與監督式學習不同,非監督式學習處理的是沒有標籤的數據,旨在從數據本身的結構中找出隱藏的模式或群體。K-means 聚類是最經典的聚類演算法之一,它根據數據點之間的特徵相似度,將數據分成 K 個群簇。在市場行銷領域,零售商可以根據香港客戶的「購買頻率」與「平均消費金額」進行 K-means 聚類,將客戶分為「高價值忠誠客戶」、「價格敏感型客戶」與「低活躍客戶」等群體,從而制定精準的行銷策略。使用 Scikit-learn 實作非常簡單:`from sklearn.cluster import KMeans; kmeans = KMeans(n_clusters=4); kmeans.fit(customer_data)`,之後便可透過 `kmeans.labels_` 查看每個客戶的所屬類別。主成分分析(PCA)則是一種降維技術,能將高維度數據壓縮到較少的維度,同時保留數據中最大的變異程度。PCA 常用於視覺化高維數據,例如將擁有數十個特徵的基因表現數據降至 2 維或 3 維,以便在散點圖上觀察樣本的整體分佈和可能的群聚情況。在分析香港的空氣質量監測數據時(包含 PM2.5、NO2、SO2 等多個維度),PCA 可以幫助我們找出對整體空氣品質變異貢獻最大的幾個主要因子。理解這些非監督式方法,有助於從複雜且無結構的真實數據中提煉出可操作的洞見。

3.3 模型評估與選擇:交叉驗證、評估指標

建立機器學習模型並非終點,如何客觀且穩健地評估模型的泛化能力(Generalization Ability),才是確保模型能在真實世界數據中表現良好的關鍵。交叉驗證(Cross-validation)是避免模型過擬合的核心技術,最常見的是 K 折交叉驗證(K-fold CV)。其做法是將訓練數據均分為 K 份(通常 K=5 或 10),輪流以其中 K-1 份訓練模型,剩餘 1 份進行驗證,最後將 K 次驗證結果的平均值作為模型的最終評估分數。在 Scikit-learn 中,只需一行 `from sklearn.model_selection import cross_val_score; scores = cross_val_score(model, X, y, cv=5)` 即可完成。評估指標則因問題類型而異:迴歸問題常用均方誤差(MSE)或決定係數 R²;分類問題則常用準確率(Accuracy)、精確率(Precision)、召回率(Recall)與 F1-score。以香港銀行的信用卡詐騙偵測為例,由於詐騙案件通常只是極少數(類別不平衡),若只看準確率,一個永遠預測為「正常」的模型可能擁有高達 99% 的準確率,但卻完全無法抓出任何詐騙。因此在這種情況下,召回率(揪出詐騙的能力)就成為更重要的評估指標。Scikit-learn 提供了 `classification_report()` 和 `confusion_matrix()` 等工具來全面查看模型表現。透過交叉驗證與恰當的評估指標,數據分析師才能篩選出真正可靠的模型,這可說是資訊科技素養中關於批判性思維與科學方法的核心體現。

四、資料處理進階

4.1 分組、聚合、透視表

在真實世界的數據分析任務中,原始的數據集往往需要經過多層次的整理才能提煉出有價值的資訊,而 pandas 函式庫提供的分組(groupby)、聚合(aggregation)與透視表(pivot table)功能,是處理此類任務的殺手級工具。`groupby` 的概念類似於 SQL 中的 GROUP BY 子句,允許我們根據一個或多個分類欄位將數據分組,然後對每組數據執行聚合運算。例如,分析一個包含香港各中學資料的數據集,我們可以透過 `schools_df.groupby('地區')['DSE 成績平均分'].mean()` 來快速計算出各區學校的 DSE 平均成績。聚合運算不僅限於 `mean()`,還可以是 `sum()`、`count()`、`max()`、`min()` 等,甚至可以使用 `agg()` 函數同時進行多種運算:`schools_df.groupby('地區').agg({'DSE 成績平均分': ['mean', 'std'], '學生人數': 'sum'})`。透視表(`pivot_table()`)則提供了更接近 Excel 樞紐分析表的數據檢視方式,可以將數據從「整齊格式」重塑為「摘要矩陣」。例如,以「年份」作為索引(index)、「校區」作為欄位(columns)、「升學率」作為值(values),即可快速查看各年份各校區的升學率變化矩陣。這些進階技巧讓分析師能夠靈活地從多個維度拆解數據,快速回答各種商業問題。這類資料處理能力是任何實用型數據分析課程的核心內容,也是培養全面資訊科技教育不可或缺的一環。

4.2 時間序列數據處理

時間序列數據在金融、氣象、IoT 感測器等領域無處不在,pandas 對時間序列的支援可說是業界標竿。首先是時間索引的建立:使用 `pd.to_datetime()` 函數可以將日期字串轉換為標準的 datetime 物件,並設為 DataFrame 的索引。一旦設定了時間索引,pandas 就提供了強大的重取樣(resampling)功能,例如將高頻的每分鐘股票交易數據降採樣為每日收盤價:`stock_price.resample('D').last()`。時間位移與差異計算也是常見需求,比如計算每個月相對於上個月的物價指數變化率,可以使用 `price_series.pct_change()` 或 `price_series.diff()`。滑動窗口(Rolling Window)運算更是技術分析的基礎,例如計算香港恆生指數的 20 日移動平均線:`hs_index.rolling(window=20).mean()`。此外,時區的處理(`tz_localize()`, `tz_convert()`)、工作日曆(`pd.offsets.BDay`)以及滯後變數(`shift()`)的計算,都是在處理真實時間序列數據時會反覆用到的技法。例如,在分析香港機場每天出入境旅客流量時,可能需要考慮週末效應、颱風影響等,這些都可以透過時間序列功能來進行特徵工程。熟練掌握時間序列處理技術,讓分析師能在動態的商業環境中精確地捕捉趨勢、季節性與週期性模式,這是現代資訊科技素養在高階行業應用中的具體實踐。

4.3 字串高級操作

數據集中除數值數據外,文本數據也佔據極大比例,而 pandas 的字串方法(透過 `.str` 訪問器)為批次處理文字提供了強大的武器庫。傳統 Python 字串操作基於逐個元素的迴圈,在處理大型 DataFrame 時效能欠佳;而 pandas 的 `.str` 方法則繼承了向量化運算的優點。常見操作包括大小寫轉換(`.str.lower()`, `.str.upper()`)、字元去除(`.str.strip()`)、字串分割(`.str.split()`)、字串取代(`.str.replace()`)以及判斷是否包含特定模式(`.str.contains()`)。舉例來說,在處理香港的地址數據時,地址欄位可能包含「九龍」、「新界」、「香港島」等字樣,我們可以用 `df['地址'].str.contains('九龍')` 來快速標記出九龍地區的資料。正則表達式(Regular Expression)的支援更是讓字串處理如虎添翼,透過 `.str.extract(r'...')` 可以從複雜的字串中提取結構化的資訊,例如從混合文字中提取身分證號碼或電話號碼。此外,`.str.get_dummies()` 可將類別型字串快速轉換為虛擬變量(One-hot encoding),以便餵入機器學習模型。例如,將香港餐廳的「菜式類型」欄位(如粵菜、川菜、西餐...)進行編碼。這些高級字串操作技巧,對於清理混亂的真實世界數據(尤其是從網頁爬蟲或 C 級系統匯出的報告)至關重要,是任何認真的數據分析課程中不可或缺的進階主題。

五、性能優化:使用 Vectorization 和 NumPy 加速數據處理

在處理大規模數據時,性能優化往往成為決定專案成敗的關鍵因素。Python 作為直譯式語言,其原生迴圈的執行速度並不理想,尤其是在數據量大到億級別時,使用 for 迴圈可能導致程式耗時數小時甚至數天。性能優化的核心策略,就是盡可能地避免 Python 顯式迴圈,轉而利用底層由 C 或 Fortran 實作的函式。這正是前文反覆強調的向量化運算的優勢所在。以一個具體場景為例:假設我們有一個包含 500 萬筆香港住宅物業資料的 DataFrame,並希望創建一個新欄位,根據「樓齡」與「是否位於地鐵站 500 米內」來計算一個「翻新潛力分數」。使用傳統的 `.iterrows()` 或 `apply()` 方法,可能會耗時數分鐘;但若能將所有邏輯轉換為純 NumPy 或 pandas 的向量化表達式(例如使用 `np.where()` 進行條件式賦值),執行時間往往能縮減到幾秒鐘。另一個常見的優化技巧是善用 NumPy 的 `ufunc`(通用函數)與 `aggregate` 函數。例如,將 Series 中的 NaN 值填充為平均值,應避免使用迴圈逐一判斷,而是採用 `series.fillna(series.mean())`,其內部已是最佳化實作。此外,在處理大型矩陣運算時,務必使用 NumPy 的 `dot()` 或 `@` 運算子來替代 Python 的巢狀迴圈;在進行條件篩選時,使用布林索引(Boolean indexing)而非迴圈。對於記憶體使用,也需要留意資料型態的選擇,例如將整數欄位從預設的 int64 降為 int32 或 int16,能在不影響精度的情況下大幅降低記憶體佔用。最後,pandas 的 `eval()` 與 `query()` 函數也能透過字串表達式來實現向量化運算,進一步加速大型 DataFrame 的查詢與計算。這些性能優化技術,是本篇文章從基礎操作到進階實戰的最後一塊拼圖,它不僅能讓你的數據分析工作變得更加流暢,也是展現頂尖資訊科技素養的實質證明。將這些技巧整合到你的工作流程中,你將會發現即使面對海量數據,Python 依然能維持令人滿意的執行效率,而這正是所有數據分析課程最終希望學員達到的技術境界。

數據分析 Python 機器學習

3

868
有情鏈