「市場區隔與產品定位分析(PCA)」詳解

本案例將帶領我們學習一種非常強大的進階分析技術——降維 (Dimensionality Reduction)。當我們的資料特徵(欄位)過多時,要找出關鍵影響因素並不容易。主成分分析 (PCA) 能幫助我們從眾多相關的變數中,萃取出最核心的、最具代表性的「主成分」,以簡化問題並洞察其根本結構。

1. 環境設定:中文字型

核心概念: matplotlibseaborn 套件預設並未包含中文字型,若直接繪圖,圖表中的中文(如標題、座標軸標籤)將會顯示為無法辨識的方塊亂碼(暱稱為豆腐)。因此,繪製中文圖表前的第一步,就是手動安裝並設定字型。

本案例應用重點:

  • !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 降維 -> 繪製產品定位圖 -> 解讀主成分