本案例將帶領我們學習一種非常強大的進階分析技術——降維 (Dimensionality Reduction)。當我們的資料特徵(欄位)過多時,要找出關鍵影響因素並不容易。主成分分析 (PCA) 能幫助我們從眾多相關的變數中,萃取出最核心的、最具代表性的「主成分」,以簡化問題並洞察其根本結構。
1. 環境設定:中文字型
核心概念: matplotlib 或 seaborn 套件預設並未包含中文字型,若直接繪圖,圖表中的中文(如標題、座標軸標籤)將會顯示為無法辨識的方塊亂碼(暱稱為豆腐)。因此,繪製中文圖表前的第一步,就是手動安裝並設定字型。
本案例應用重點:
!wget ...: 我們在 Colab 中使用wget這個指令,從網路上下載一個開源的思源黑體字型檔 (.otf檔),並將其存放在系統的字型路徑中。import matplotlib.font_manager as fm: 引入字型管理器,用來讀取我們剛下載的字型檔。plt.rcParams['font.family'] = ...: 這是最關鍵的一步,透過rcParams(runtime configuration parameters) 這個設定,我們明確地告知matplotlib:「接下來所有的圖表,請一律使用我們剛剛指定的那個中文字型來繪製。」
2. 載入數據:
files.upload(): 執行這行程式碼時,Colab 會在您的瀏覽器中跳出一個檔案上傳的對話視窗,讓您可以從本機電腦選擇要上傳的檔案uploaded = ...: 當您選擇檔案並完成上傳後,files.upload()會回傳一個 Python 字典 (dictionary),裡面包含了您上傳的檔案資訊(檔名作為key,檔案內容作為value)。這個字典會被存放在uploaded這個變數中。try: ... except Exception as e: ...:這是一個錯誤處理的結構。try:: 程式會嘗試執行try區塊內的所有程式碼。except Exception as e:: 如果在try的過程中,發生任何錯誤(例如,上傳的檔案不是 CSV 格式、檔案已損毀等),程式不會因此崩潰,而是會跳到except區塊,執行裡面的程式碼來處理這個例外狀況。
file_name = next(iter(uploaded)):因為uploaded是一個字典,我們需要從中取出檔名。iter(uploaded)會建立一個字典鍵(也就是檔名)的迭代器。next(...)則會從這個迭代器中取出第一個項目。由於我們一次只上傳一個檔案,所以這樣就能成功取得該檔案的檔名。
如果使用本地端的編輯器執行Python腳本(例如Spyder,VSCode),只要設定好工作目錄,就可以直接使用pandas read_csv() 方法載入數據集。upload()是用在當你使用colab環境時。
3. Pandas – 資料的準備與索引設定
核心概念: 在進行 PCA 分析前,我們需要將資料整理成適合模型讀取的格式。
本案例應用重點:
df.set_index('Brand'): 我們將Brand(品牌) 欄位設定為 DataFrame 的索引。這樣做的好處是,Brand欄位不會被當成數值特徵參與後續的數學運算,它只作為每一列的標籤存在,方便我們最後在視覺化圖表上標示出各個品牌的位置。
4. Scikit-learn – 資料標準化 (Standardization)
核心概念: PCA 對資料的尺度非常敏感。與分群演算法一樣,在執行 PCA 之前,必須對資料進行標準化,以消除不同特徵因單位不同所造成的影響,確保所有特徵都在同一個基準上進行比較。
本案例應用重點:
StandardScaler(): 初始化標準化轉換器。.fit_transform(): 對我們選定的所有數值特徵(價格、品質、創新分數等)進行標準化處理,得到一個全新的、標準化後的數據陣列。
5. Scikit-learn – 執行主成分分析 (PCA)
核心概念: PCA 是一種數學方法,它能將原始的多個特徵,線性組合成少數幾個全新的、彼此不相關的「主成分」(Principal Components),並最大程度地保留原始資料的變異性。
本案例應用重點:
from sklearn.decomposition import PCA: 從scikit-learn中匯入 PCA 模型。PCA(n_components=2): 初始化 PCA 模型,並透過n_components=2這個重要參數,指定我們希望將原始的多個特徵降維成兩個主成分。.fit_transform(): 將標準化後的資料投入 PCA 模型,執行降維。函式會回傳一個新的陣列,其中每一列代表一個品牌,而兩個欄位則分別是該品牌在「第一主成分」與「第二主成分」上的得分。
6. Matplotlib – 產品知覺圖 (Perceptual Map) 視覺化(分析產品定位)
核心概念: 產品知覺圖是 PCA 分析在行銷領域最經典的應用。它將降維後的結果繪製在一個二維平面上,讓我們能直觀地看出各品牌在消費者心目中的相對位置。
本案例應用重點:
plt.scatter(): 我們使用散佈圖,將 X 軸設為「第一主成分得分」,Y 軸設為「第二主成分得分」,每一個點就代表一個品牌。- 是在每一個代表品牌的散佈旁邊,標示出該品牌的名稱
plt.text(...):在matplotlib繪圖中,用來在圖表的特定座標位置上,加上文字註解x=df_pca.PC1[i]+0.05:設定文字標籤的 X 座標。程式會先取得第i個品牌在第一主成分 (PC1) 上的分數(也就是該點的 X 座標),然後加上一個微小的位移量0.05,目的是讓文字稍微偏離點的右側,避免文字直接蓋在點上。y=df_pca.PC2[i]+0.05:設定文字標籤的 Y 座標。同樣地,程式會取得第i個品牌在第二主成分 (PC2) 上的分數(Y 座標),並加上0.05,讓文字稍微偏離點的上方。s=df_pca.index[i]:s代表string,也就是要顯示的文字內容。df_pca.index[i]會取得第i個品牌的索引名稱(也就是我們一開始設定的Brand名稱)。fontdict=dict(color='black', size=12):fontdict是一個用來設定字型樣式的字典。這裡我們設定了文字的color(顏色) 為黑色,size(大小) 為 12。fontproperties=font_prop:這個參數用來指定顯示文字所使用的字型。font_prop是我們在程式碼開頭預先設定好的中文字型屬性。加上這個參數,才能確保圖表上的中文品牌名稱能夠正常顯示,而不會變成亂碼。
Perceptual Map(知覺圖)是什麼? 它是一種行銷分析工具,用來視覺化呈現消費者如何感知不同品牌、產品或服務之間的相對位置。它幫助行銷人員理解市場上競爭者的定位、顧客對品牌的認知,以及找出可能的市場空缺。通常是一張2D平面圖,有X軸和Y軸,各代表一個消費者關心的產品屬性或形容詞維度(如「價格高低」「品質好壞」)。每個品牌或產品會根據調查結果被標示在圖上某個位置,代表它在這兩個維度上的相對感知。
7. PCA 結果解讀:解釋變異與主成分負荷
核心概念: 降維後,我們需要透過觀察 “主成分負荷 (Loadings)” 來理解這兩個新的「主成分」分別代表什麼意義。
本案例應用重點:
pca.components_: 這是解讀主成分意義的關鍵。它儲存了每一個原始特徵對於構成新主成分的「貢獻度」或「權重」,也稱為主成分負荷 (Component Loadings)。透過觀察這些負荷值,我們可以為新的主成分命名(例如:高價格、高品質、高創新負荷 -> 或許可命名為「專業性能維度」) 。pca.explained_variance_ratio_: 這是 PCA 模型的一個重要屬性,它會告訴我們每一個主成分分別「解釋」了原始資料多少百分比的變異(資訊量)。例如,[0.75, 0.15]代表第一主成分解釋了 75% 的資訊,第二主成分解釋了 15%。loadings = pca.components_.T * np.sqrt(pca.explained_variance_):計算並縮放主成分的負荷量 (Loadings)。pca.components_:這本身儲存了主成分的「方向」或「權重」。它告訴我們,每一個原始特徵(如’價格’、’品質’)是如何組合 C 成新的主成分軸線的。.T:這是轉置 (Transpose) 的意思。它將pca.components_的行和列對調,使其結構變為每一列 (row) 代表一個原始特徵,方便後續的計算。pca.explained_variance_:這代表每一個主成分所能「解釋」的原始資料變異量。您可以將其理解為該主成分的重要性或影響力。np.sqrt(...):np.sqrt()是計算平方根。對變異量取平方根,得到的就是該主成分的標準差。這可以被視為該主成分軸線的「尺度」。*(相乘):最後,程式將代表「方向」的pca.components_.T與代表「尺度」的np.sqrt(pca.explained_variance_)相乘。
這行程式碼的物理意義,就像是將一個只有方向的單位向量,乘上一個代表其重要性的長度。
總結來說,這個案例的學習路徑是:
準備資料 -> 標準化 -> 執行 PCA 降維 -> 繪製產品定位圖 -> 解讀主成分 。