行銷應用案例與標籤

一、🔧 Python 程式基礎(語法與處理)

類別名稱Tags
Python 語法結構import, def, for loop, if else, try...except, f-string, list comprehension
資料結構與處理pandas, dataframe, csv, data preprocessing, 數據處理, groupby, 字串處理, Standardization, JSON

二、📈 資料視覺化工具與中文支援

類別名稱Tags
視覺化函式庫matplotlib, seaborn
中文視覺化支援視覺化中文支援, 資料視覺化

三、🤖 機器學習與統計技術

類別名稱Tags
回歸分析(Regression)迴歸分析, Scikit-learn,
分類分析(Classification)分類模型, confusion matrix, accuracy, precision, recall, f1 score, label encoding, one-hot encoding, Multicollinearity
分群分析(Clustering)分群演算法, K-Means, Elbow method
降維技術(Dimensionality Reduction)降維分析, PCA, Perceptual Map

四、💡 AI 應用與生成式技術

類別名稱Tags
AI 提示詞與應用AI生成, prompt engineering, AI 數據洞察, AI 摘要, AI 文字分析, 主題分類, 情感分析

五、📊 行銷與商業分析應用

類別名稱Tags
行銷應用類社群媒體行銷, 顧客洞察, 客戶關係管理, 市場研究

案例與標籤彙整總表

標籤 / 案例AI 文案草稿生成AI 競品分析爬蟲AI 智慧客服回饋分析社群貼文探索性分析(EDA)AI 廣告成效分析與視覺化顧客終身價值預測 (LTV)客戶流失預測模型顧客分群模型市場區隔與產品定位分析
import
try...except
f-string
JSON
def
for loop
AI生成
prompt engineering
requests
if else
list comprehension
字串處理
網頁爬蟲
AI 摘要
pandas
dataframe
csv
AI 文字分析
主題分類
情感分析
matplotlib
seaborn
資料視覺化
視覺化中文支援
數據處理
客戶關係管理(CRM)
groupby
社群媒體行銷
AI 數據洞察
data preprocessing
feature engineering
機器學習
Scikit-learn
迴歸分析
label encoding
one-hot encoding
Multicollinearity
分類模型
confusion matrix
accuracy
precision
recall
f1 score
Standardization
分群演算法
K-Means
Elbow method
顧客洞察
降維分析
PCA
Perceptual Map
市場研究

「市場區隔與產品定位分析(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 降維 -> 繪製產品定位圖 -> 解讀主成分

「顧客分群」詳解

本案例將帶領我們進入「非監督式學習 (Unsupervised Learning)」的領域。與之前的預測模型不同,這次我們的資料沒有「正確答案」(如 Churn 欄位)。我們的目標是讓機器自動從數據中找出潛在的結構與群體,這個過程稱為分群 (Clustering)

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. Scikit-learn – 資料標準化 (Standardization)

核心概念: K-Means 演算法是透過計算「距離」來進行分群的。如果我們的特徵單位或尺度差異過大(例如「年收入」的數值遠大於「消費分數」),那麼尺度較大的特徵將會主導整個分群過程,導致結果失準。因此,在進行分群前,我們必須先將所有特徵「標準化」,讓它們處於同一個比較基準上。

本案例應用重點:

  • from sklearn.preprocessing import StandardScaler: 從 scikit-learn 中匯入標準化工具。
  • StandardScaler(): 初始化一個標準化轉換器。
  • .fit_transform(): 這是標準化的核心步驟。它會自動計算資料的平均值與標準差,然後對資料進行轉換,讓轉換後的資料平均值為 0,標準差為 1。

4. Scikit-learn – 使用 K-Means 演算法進行分群

核心概念: K-Means 是最經典的分群演算法之一。一旦我們決定了 k 值,就可以用它來訓練模型並找出分群結果。

本案例應用重點:

  • from sklearn.cluster import KMeans: 從 scikit-learn 中匯入 K-Means 模型。
  • KMeans(n_clusters=5, ...): 初始化 K-Means 模型,其中最重要的參數 n_clusters 就是我們直接指定(本案例為5),會是透過手肘法 (elbow) 決定的最佳分群數。
  • .fit_predict(): 這個方法會一次性完成兩件事:首先,它會根據資料訓練模型,找出 5 個最佳的群體中心點 (fit);接著,它會為資料中的每一個顧客,分配一個所屬的群組編號(0, 1, 2, 3, 或 4),並回傳這個結果 (predict)。
決定分群數 (k值) ,除了主觀設定一個值之外,也可以利用 Elbow方法,請看本文最後說明。

5. Matplotlib – 分群結果的視覺化

核心概念: 視覺化是驗證與解讀分群結果最直觀的方式。

本案例應用重點:

  • 使用 seaborn 函式庫來繪製一個進階且美觀的彩色散點圖,目的是將分群結果視覺化。
    • sns.scatterplot()snsseaborn 函式庫的通用縮寫。scatterplot 是專門用來繪製散點圖的函式。
    • data=df:告訴函式「請從我們整理好的 df 這張資料表來抓取數據。」
    • x='Annual Income (k$)':設定圖表的 X 軸(水平軸)要對應到 df 資料表中,名為「Annual Income (k$)」的那個欄位。
    • y='Spending Score (1-100)':設定圖表的 Y 軸(垂直軸)要對應到名為「Spending Score (1-100)」的那個欄位。
    • hue='Cluster':這是繪製分群圖的最關鍵參數。hue 的意思是「色調」。這個參數會指示 seaborn 根據 Cluster 欄位中的數值(例如 0, 1, 2, 3, 4)來為每一個點上不同的顏色。這使得我們能夠一眼就看出不同群體的分佈位置。
    • palette='viridis'palette 是調色盤的意思。這個參數用來設定 hue 上色時的顏色主題。'viridis' 是一個專業且美觀的漸層色盤。
    • s=100s 代表 size,用來設定散點圖上每個點的大小。
    • alpha=0.8:設定每個點的透明度。0.8 代表 80% 的不透明度,當點重疊時,顏色會加深,有助於觀察資料的密度。
    • edgecolor='k':設定每個點的邊框顏色。'k' 是黑色 (black) 的縮寫,為點加上黑色邊框可以讓視覺效果更清晰。
  • kmeans.cluster_centers_: 這是 K-Means 模型訓練完後,用來儲存各個群體中心點座標的屬性。我們會再用一次 plt.scatter(),將這些中心點以不同的樣式(如紅色的星號)標示在地圖上。
    • plt.scatter():呼叫 scatter 函式,代表我們要在同一張圖上,再畫一層新的散佈圖。
    • centers[:, 0]centers[:, 1]centers 是一個儲存了所有群組中心點座標的陣列(Array)。centers[:, 0] 是一種陣列切片 (slicing) 的語法,意思是「取出所有列的第 0 個欄位」,也就是所有中心點的 X 座標。
    • 同理,centers[:, 1] 就是取出所有中心點的 Y 座標。
    • c='red'c 代表 color。將這些中心點的顏色設定為紅色,使其在圖上非常顯眼。
    • s=250s 代表 size。將中心點的大小設定為 250,比一般的資料點大很多,以凸顯其重要性。
    • alpha=0.9:設定點的透明度為 90%(接近不透明),讓中心點的顏色更飽和。
    • marker='X'marker 代表標記樣式。將中心點的形狀設定為 ‘X’,以區別於代表個別顧客的圓點。
    • label='群組中心':為這些紅色的 ‘X’ 標記設定一個圖例名稱,叫做「群組中心」。當我們稍後呼叫 plt.legend() 時,圖例上就會顯示「X 群組中心」的說明。

手肘法 (The Elbow Method)

核心概念: 在使用 K-Means 之前,我們需要先決定到底要將顧客分成幾群 (k 值)。「手肘法」是一種常用的、透過視覺化來輔助判斷最佳 k 值的方法。

重點說明:

  • for k in range(1, 11):: 使用一個 for 迴圈,來依序測試將顧客分為 1 群、2 群、… 直到 10 群的各種情況。
  • kmeans.inertia_: inertia 是 K-Means 模型的一個屬性,它代表了「群內點到其中心點的距離平方和」。這個值越小,代表分群效果越緊密。也稱為WCSS(within-cluster sum of squares)組內評分和。
  • wcss.append(kmeans.inertia_): 在迴圈中,將每種 k 值算出來的 inertia_ 存入一個名為 wcss 的列表中,以便後續繪製「手肘圖」。
  • 以下是一段程式碼範例:
# 假設 X_scaled 是已經標準化後的資料
# X_scaled = scaler.fit_transform(df[['Annual Income (k$)', 'Spending Score (1-100)']])

wcss = [] # Within-Cluster Sum of Squares, 用來存放每個 k 值的 inertia_

# 測試 k 從 1 到 10 的情況
for k in range(1, 11):
    kmeans = KMeans(n_clusters=k, init='k-means++', random_state=42)
    kmeans.fit(X_scaled)
    wcss.append(kmeans.inertia_)

# 繪製手肘圖
plt.figure(figsize=(10, 6))
plt.plot(range(1, 11), wcss, marker='o', linestyle='--')
plt.title('手肘法 (The Elbow Method)')
plt.xlabel('分群數量 (k)')
plt.ylabel('WCSS (群內平方和)')
plt.xticks(range(1, 11))
plt.grid(True)
plt.show()

總結來說,這個案例的學習路徑是:

資料標準化 -> 直接指定K值,或用手肘法找出最佳 K 值 -> 訓練 K-Means 模型 -> 視覺化分群結果

「客戶流失預測模型」詳解

本案例將帶領我們進入「分類 (Classification)」的世界,這是機器學習中另一大核心任務。我們將學習如何建立一個模型,來預測一個類別型結果——顧客「是」或「否」會流失。課程的重點在於分類模型獨有的資料前處理技巧,以及如何評估模型的預測成效。

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 – 分類模型的預處理 (Preprocessing)

核心概念: 機器學習模型只能理解數字,無法直接處理文字類型的類別資料(例如 Gender 欄位的 ‘Male’/’Female’)。因此,在訓練模型前,我們必須將這些文字轉換為數值格式。

本案例應用重點:

  • le.fit_transform(df_processed['Churn']) :將文字類型的目標變數轉換為數值
    • LabelEncoder: 這是 scikit-learn 函式庫中的一個工具,中文稱為「標籤編碼器」。它的唯一功能,就是將文字標籤(例如 ‘Yes’, ‘No’ 或 ‘蘋果’, ‘香蕉’)轉換成數字編碼(例如 0, 1, 2)。
    • le = ...: 這行程式碼的作用是建立一個 LabelEncoder 的實例,您可以想像成我們準備好了一台「標籤編碼機」,並將它命名為 le
    • 整個轉換的核心做了兩件事情:fit (學習) 和 transform (轉換)。
    • fit (學習):
      • fit_transform 會先掃描 df_processed['Churn'] 這個欄位,找出裡面所有不重複的文字標籤。在這個案例中,它會找到 'No''Yes' 這兩種。
      • 接著,它會在內部建立一個對應的規則,通常是按照字母順序來編碼,例如:‘No’ -> 0, ‘Yes’ -> 1。這個過程就是 fit,代表編碼機已經「學會」了轉換的規則。
    • transform (轉換):
      • 學會規則後,編碼機會再次遍歷 Churn 欄位中的每一個值,並根據剛剛學會的規則,將所有的 'No' 都換成 0,所有的 'Yes' 都換成 1
  • pd.get_dummies(): 這是本案例最關鍵的資料前處理步驟,稱為 One-Hot Encoding。它會自動將所有文字類型的欄位(如 Gender, Contract, HasSupportTicket)轉換成多個 0 和 1 的新欄位,讓機器學習模型能夠理解這些類別資訊。
    • drop_first=Truepd.get_dummies() 函式中一個非常重要的參數,它的主要目的是為了避免「多重共線性」(Multicollinearity),也常被稱為虛擬變數陷阱 (Dummy Variable Trap)。用一個簡單的例子來解釋:假設我們有一個 Gender 欄位,裡面只有 ‘Male’ 和 ‘Female’ 兩種值。
    • 如果「不使用」drop_first=True
      • pd.get_dummies() 會產生兩個新的欄位:Gender_MaleGender_Female
      • 如果某位客戶是男性,那 Gender_Male 會是 1,Gender_Female 會是 0。
      • 如果某位客戶是女性,那 Gender_Male 會是 0,Gender_Female 會是 1。
      • 問題:這兩個新欄位是完全相關的。只要我們知道 Gender_Male 的值,就能 100% 推斷出 Gender_Female 的值(例如 Gender_Male 是 0,Gender_Female 必定是 1)。這種完美的線性關係會對某些機器學習模型(特別是線性迴歸)造成干擾,讓模型難以穩定地估計出各個特徵的影響力。
    • 如果「使用」了 drop_first=True
      • pd.get_dummies() 會先產生 Gender_FemaleGender_Male 兩個欄位,然後丟棄第一個(在此例中是 Gender_Female),只留下 Gender_Male 這一個欄位。
      • 現在,模型的解讀方式變成:
        • 如果 Gender_Male 是 1,代表該客戶是男性。
        • 如果 Gender_Male 是 0,代表該客戶不是男性,也就是女性(這就是被丟棄的那個基準類別)。
      • 好處:我們只用一個欄位,就完整地保留了原始的性別資訊,同時完全避免了欄位間的完美相關性,讓模型能更穩定地運作。
    • 總結來說,drop_first=True 的目的就是在進行 One-Hot Encoding 時,自動捨棄掉一個多餘的參考欄位,以避免多重共線性的問題,讓後續的機器學習模型更穩健。
  • pd.to_numeric(errors='coerce'): 在資料清理階段,確保費用相關的欄位都是數值型態。errors='coerce' 是一個重要的參數,它會自動將任何無法轉換為數字的值變為 NaN (缺失值),方便我們後續統一處理。
  • 用中位數填補空值:
    • df_processed['TotalCharges']:
    • 首先,程式碼選定了我們正在處理的 DataFrame df_processed 中,名為 TotalCharges (總消費金額) 的這個欄位。
    • .median():
    • 接著,它計算了 TotalCharges 這個欄位中所有現存數值的中位數。中位數是指將所有數值由小到大排序後,位於最中間的那個數。使用中位數來填補空值,是一種比平均數更穩健的方法,因為它不容易受到極端值(非常高或非常低的消費金額)的影響。
    • .fillna(...):
    • 這個函式的名字是 “fill na” 的縮寫,也就是「填補空值 (NA/NaN)」。它的作用是找到 TotalCharges 欄位中所有空白或無效的儲存格。
    • inplace=True:
    • 這是一個非常重要的參數。inplace=True 的意思是:「請直接在原始的 df_processed 資料表上進行修改」。如果沒有這個參數(或設為 False),fillna 會回傳一個修改過後的新資料表,但原始的 df_processed 不會改變。
機器學習模型(如決策樹、迴歸模型等)的運算基礎是數學,它們只能理解數字,無法直接處理 'Yes','No','Male' 或 'Female' 這樣的文字。因此,在訓練模型之前,我們必須將這些文字標籤轉換成模型可以理解的數值格式。這個過程就是「標籤編碼」(Labe Encodidng)。

4. Scikit-learn – 建立決策樹分類模型

核心概念: 我們將使用 scikit-learn 來建立一個決策樹 (Decision Tree) 分類器,這是一種直觀且易於理解的分類演算法。

本案例應用重點:

  • 定義特徵 (X) 與目標 (y): 我們需要明確地將資料集分為兩部分:X 是用來預測的特徵(例如客戶合約類型、月費等),而 y 則是我們要預測的目標——Churn 欄位。
  • train_test_split(): 與迴歸模型相同,我們將資料切分為訓練集與測試集,以客觀地評估模型成效。
  • DecisionTreeClassifier(): 從 scikit-learn 中選擇並初始化一個決策樹分類模型。
  • .fit().predict(): 同樣使用 .fit() 進行訓練,並用 .predict() 來對測試集進行流失預測。

5. Scikit-learn – 分類模型的成效評估

核心概念: 分類模型的評估指標比迴歸模型更豐富,我們不只關心「答對率」,更關心「模型錯在哪裡」。

本案例應用重點:

  • confusion_matrix (混淆矩陣): 這是評估分類模型最重要的工具。它能清楚地顯示出模型在「預測流失,且實際也流失 (True Positive)」和「預測未流失,但實際已流失 (False Negative)」等四種情況下的表現,幫助我們了解模型的具體錯誤類型。
  • classification_report: 這個函式會一次性回報多個關鍵指標,包含準確率 (Precision)召回率 (Recall)F1-score,讓我們能更全面地評估模型的好壞。
  • accuracy_score: 整體預測的正確率,也就是「答對的題數 / 總題數」。

6. Matplotlib & Seaborn – 分類結果的視覺化

核心概念: 我們將評估指標與模型洞察,透過視覺化圖表呈現出來。

本案例應用重點:

  • seaborn.heatmap(): 我們使用熱力圖來視覺化「混淆矩陣」,透過顏色的深淺,讓模型的預測結果一目了然。
  • model.feature_importances_: 這是決策樹模型的一個重要屬性,它儲存了每一個特徵對於預測結果的「重要性分數」。
  • sns.barplot(x='重要性', y='特徵', data=feature_importance_df, palette='viridis') 這行程式碼是使用 seaborn 函式庫來繪製一個水平長條圖,目的是將「特徵重要性」這個分析結果視覺化。。

總結來說,這個案例的學習路徑是:

資料清理 -> One-Hot Encoding -> 切分資料集 -> 訓練分類模型 -> 評估分類模型 -> 視覺化”特徵重要性”

「顧客終身價值 (LTV) 預測」詳解

本案例將帶領我們進入「預測性分析」的領域。我們將學習如何使用機器學習中的迴歸 (Regression) 演算法,來預測一個連續的數值——顧客未來的消費總額。課程的重點不僅在於訓練模型,更在於如何從原始數據中提煉出有意義的特徵 (Feature Engineering)。

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 – 進階資料處理與特徵工程

核心概念: 特徵工程是將原始數據轉換為能更好地代表問題潛在規律的特徵,以供機器學習模型使用的過程。在本案例中,我們將從交易記錄中建構出經典的 RFM 模型指標。

本案例應用重點:

  • pd.to_datetime(): 將文字格式的日期轉換為 Python 的時間物件,這是進行時間相關計算的基礎。
  • pd.Timedelta(): 用於進行日期的加減運算,例如在本案例中,我們用它來定義分析的基準日。
  • df.groupby('...'): 再次運用分組功能,這次是根據 CustomerID 將所有交易記錄歸戶到每一位顧客身上。
  • .agg()lambda 函式: 這是本案例的特徵工程核心。我們使用 .agg() 對分組後的資料進行多重彙總計算,並在其中巧妙地運用 lambda 匿名函式,來快速定義「計算最近一次消費天數」這樣客製化的計算邏輯。

4. Scikit-learn – 建立你的第一個機器學習模型

核心概念: scikit-learn 是 Python 最主流的機器學習函式庫。我們將學習一套標準的模型建立流程:切分資料 -> 初始化模型 -> 訓練模型 -> 進行預測。

本案例應用重點:

  • 資料切分 train_test_split(): 這是機器學習的關鍵步驟。我們將資料集分為「訓練集」(用來訓練模型) 和「測試集」(用來評估模型成效)。test_size=0.2 代表我們保留 20% 的資料作為從未見過的考試題目,以檢驗模型的真實預測能力。
  • 模型初始化 LinearRegression(): 從 scikit-learn 中選擇並建立一個線性迴歸模型的「空白模具」。
  • 模型訓練 .fit(): 這是機器「學習」的過程。我們將訓練集的特徵 (X_train) 與答案 (y_train) 交給模型,.fit() 方法會自動找出特徵與答案之間的數學關係。
  • 模型預測 .predict(): 使用訓練完成的模型,對測試集的特徵 (X_test) 進行預測,得出模型的預測結果。

5. Scikit-learn – 模型的成效評估

核心概念: 模型的好壞不能憑感覺,必須要有客觀的評估指標。

本案例應用重點:

  • from sklearn.metrics import ...: 從 metrics 模組中,我們匯入了兩個常用的迴歸模型評估工具。
  • mean_squared_error (MSE): 均方誤差,用來衡量模型預測值與真實值之間的平均誤差程度,數值越小代表模型越準確。
  • r2_score (R²): R-squared 值,代表模型對資料變異的解釋能力,其值越接近 1,表示模型的解釋力越強。

6. Matplotlib – 迴歸結果的視覺化

核心概念: 對於迴歸模型,最直觀的評估方式就是比較「預測值」與「真實值」的差異。

本案例應用重點:

  • plt.scatter(): 我們使用散點圖,將 X 軸設為「真實值」,Y 軸設為「模型預測值」。
  • 繪製對角線 plt.plot(): 我們額外繪製一條 y=x 的虛線。如果模型預測完美,所有的點都會落在這條線上。因此,我們可以透過觀察散點的分佈與這條線的貼近程度,來直觀判斷模型的預測效果。

總結來說,這個案例的學習路徑是:

資料前處理 -> 特徵工程 (計算 RFM) -> 切分資料集 -> 訓練迴歸模型 -> 評估模型成效 -> 視覺化預測結果

「AI廣告成效分析與視覺化」詳解

本案例將帶我們進入一個更進階的應用:如何讓 AI 扮演「數據分析師」的角色,對整個結構化資料集進行宏觀分析,並將其洞察與傳統的資料視覺化圖表相結合。

1. 環境設定:中文字型

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

本案例應用重點:

  • !wget ...: 我們在 Colab 中使用 wget 這個指令,從網路上下載一個開源的思源黑體字型檔 (.otf 檔),並將其存放在系統的字型路徑中。
  • import matplotlib.font_manager as fm: 引入字型管理器,用來讀取我們剛下載的字型檔。
  • plt.rcParams['font.family'] = ...: 這是最關鍵的一步,透過 rcParams (runtime configuration parameters) 這個設定,我們明確地告知 matplotlib:「接下來所有的圖表,請一律使用我們剛剛指定的那個中文字型來繪製。」

2. 取得 Gemini API Key

核心概念: 安全地使用 Gemini API Key

本案例應用重點:

  • userdata: 這是 Google Colab 內建的一個特殊功能,您可以將它想像成一個安全的密碼保險箱。使用者可以預先在 Colab 介面左側的「金鑰」(鑰匙圖示) 中,新增並儲存敏感資訊(例如 API 金鑰),並為它取一個名字。
  • .get('GEMINI_API_KEY'): 這行程式碼的動作就是,去那個 userdata 保險箱裡,找出一個名叫 'GEMINI_API_KEY' 的密鑰,然後把它的值(也就是那一長串的 API 金鑰字串)拿出來。
  • api_key = ...: 最後,將從保險箱中取出的金鑰字串,存放到一個名為 api_key 的變數中,以供後續使用。

3. 載入數據

  • 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環境時。

4. Pandas – 資料的載入與格式轉換

核心概念: 使用 pandas 來讀取資料。並將表格轉換成字串,「整個」傳到AI進行分析

本案例應用重點:

  • pd.read_csv(): 從上傳的 CSV 檔案中讀取資料,並將其載入為一個 DataFrame。
  • df.head() / display(df): 快速預覽資料表的前幾筆內容,檢查資料是否正確讀取。
  • df.to_string() : 這是 DataFrame 物件內建的一個方法。它的主要功能是將整個表格——包含索引 (index)、欄位名稱 (columns) 和所有儲存格的內容——完整地轉換成一個單一的、格式化好的文字字串。轉換後的結果,會非常類似於您在程式碼中直接 print(df) 所看到的排版樣式。

5. Google Gemini API – 分析整個 DataFrame

核心概念: 與先前逐筆分析不同,這次我們將整個 DataFrame(經過df.to_string() 轉換過) 的內容一次性傳送給 AI,要求它提供全面的商業洞察與建議。

本案例應用重點:

  • f-string: 我們再次使用 f-string (f"..."),將我們的分析指令 (prompt) 與前面產生的 data_string 字串結合,構成一個完整的請求。
  • GenerationConfig: 同樣地,我們透過 response_mime_type="application/json" 來強制要求 AI 回傳結構化的 JSON 結果,確保回傳的內容(如預算分配比例)可以被程式直接使用。
  • model.generate_content(): 呼叫此函式,將包含整個表格數據的長提示詞(prompt)發送給 Gemini 模型。

6. JSON 與字典 – 解析 AI 的結構化洞察

核心概念: AI 回傳的分析結果是一個包含多層資訊的 JSON。我們需要學會如何從中提取出我們需要的特定數據。

本案例應用重點:

  • json.loads(): 將 AI 回傳的 JSON 文字字串,轉換為 Python 的字典物件。
  • 巢狀存取: 學習如何從多層的字典中,依序取出需要的資訊。例如,透過 analysis_result['insights'] 來取得 AI 建議的數據洞察,為後續的列印做準備。或是透過 analysis_result['budget_allocation'] 來取得預算分配,為後的續繪圖做準備,‘

7. Matplotlib – 建立多圖表儀表板

核心概念: 為了呈現豐富的分析結果,我們經常需要在同一張畫布上並列多張不同的圖表,形成一個小型儀表板。

本案例應用重點:

  • plt.figure(figsize=(12, 5)): 這行指令就像是在說:「請幫我準備一張全新的、空白的大畫布」,寬度為 12 英吋,高度為 5 英吋
  • plt.subplot(1,2,1): 這個函式的作用是在剛剛建立的大畫布上,建立並選定一個子區域(子圖) 來進行繪圖。它接收三個數字作為參數:
    • 第一個數字 (1): 代表要將畫布垂直切成 1 列。
    • 第二個數字 (2): 代表要將畫布水平切成 2 欄。
    • 第三個數字 (1): 代表現在要啟用第 1 個子區域。編號順序是由左至右,再由上至下。
  • 在指定子圖上繪圖: 我們在左邊的子圖上繪製長條圖,並在右邊的子圖上繪製圓餅圖。
    • conversion_by_channel: 這是一個 pandas 的資料結構(通常是 Series),裡面已經計算好了各個管道(如 Facebook, Google, Instagram)的總轉換數。
      • .plot(): 這是 pandas DataFrame 或 Series 物件內建的繪圖方法。kind='bar': 指定要繪製的圖表種類為「長條圖」(bar chart)。
      • color=[...]: 設定每一根長條的顏色。這裡的三個色碼分別對應了 Facebook 的藍色、Google 的紅色以及 Instagram 的紫紅色,讓圖表更具品牌識別度。
    • plt.pie(): 這是 matplotlib 中用來繪製圓餅圖的專用函式。
      • percentages: 這是主要的資料,一個包含各管道百分比的列表(例如 [40, 35, 25])。圓餅圖會根據這些數值的比例來決定每個扇形的大小。
      • labels=channels: 為每一個扇形加上標籤,channels 是一個包含各管道名稱的列表(例如 ['Facebook', 'Google', 'Instagram'])。
      • autopct='%1.1f%%': auto percent 的縮寫,這是用來設定顯示在扇形上的百分比格式。%1.1f%% 的意思是「顯示到小數點後一位的浮點數,並在後面加上 % 符號」。
      • startangle=90: 設定圓餅圖的起始角度。預設是從 0 度(水平向右)開始畫第一個扇形,設定為 90 度則會讓它從 90 度(垂直向上)的位置開始,視覺上更整齊。
      • colors=[...]: 同樣地,為每一個扇形設定指定的顏色。
    • plt.tight_layout(): 在繪製完所有子圖後,呼叫此函式可以自動調整間距,避免圖表標題或標籤互相重疊。

總結來說,這個案例的學習路徑是:

讀取資料 -> 傳送給 AI 分析 -> 解析回傳的 JSON 洞察 -> 使用 subplots 建立畫布 -> 分別繪製長條圖與圓餅圖 -> 呈現整合報告

「社群貼文探索性分析(EDA)」詳解

本案例的核心是「探索性資料分析 (Exploratory Data Analysis, EDA)」,目標是從原始數據中找出規律與洞察。我們將大量運用 pandas 進行資料處理,並結合 matplotlibseaborn 進行視覺化。

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 DataFrame – 資料的載入與檢視

核心概念: pandas 的 DataFrame 是我們進行資料分析的基礎結構,就像一張功能強大的電子表格。

本案例應用重點:

  • pd.read_csv(): 從 Colab 環境中讀取上傳的 CSV 檔案,並將其轉換成一個 DataFrame。
  • df.info()df.head(): 這是資料分析的第一步。.info() 用來快速檢視資料的整體狀況(欄位名稱、資料型態、是否有缺失值),.head() 則是用來預覽資料的前幾行,確保資料載入正確。

4. Pandas – 時間序列資料處理

核心概念: 在分析社群貼文這類具有時間性的資料時,正確地處理時間欄位至關重要。

本案例應用重點:

  • pd.to_datetime(): Colab 讀取 CSV 時,日期時間會被當作一般的文字字串。我們必須使用 pd.to_datetime() 這個函式,將其轉換為 Python 認得的「時間物件」,這樣才能進行後續的時間排序或分析。

5. Pandas – 資料的計算、篩選與轉換

核心概念: 我們需要對原始資料進行加工,才能得到我們想分析的指標。

本案例應用重點:

  • df['New Column'] = ...: 建立一個新的欄位。例如,我們將多個互動指標相加,建立了一個 Total Interactions 欄位。
  • .sum(): axis=0(預設) 代表「沿著橫向 (列)」進行計算。它會沿著的方向進行加總,也就是將每個的數值加起來。你可以想像成把表格「垂直」地加起來,得到每一欄的總和。我們用這個方法來計算每一篇貼文(每一列)的總’瀏覽次數’和總’觸及人數’,和每一篇貼文的各種互動指標的總數(‘按讚數’、’分享’、’留言數’、’珍藏次數’)
  • df[...]: 使用方括號來選取特定的欄位(例如 df['Likes'])或多個欄位(例如 df[['Likes', 'Shares']])進行後續計算。
.sum(axis=1): 它會沿著的方向進行加總,也就是將每個的數值加起來。你可以想像成把表格「水平」地加起來,得到每一列的總和。

6. Pandas – GroupBy 資料分組與彙總

核心概念: groupbypandas 中最強大、最核心的功能之一,它能將資料根據指定的欄位進行「分組」,然後對各組分別進行計算。

本案例應用重點:

  • df.groupby('貼文類型'): 這是本案例的分析關鍵。我們根據「貼文類型 」這一欄將所有資料分成數個群組(例如 IG 圖像、IG 輪播等)。

7. Matplotlib & Seaborn – 資料視覺化

核心概念: 將分析完的數字轉換成圖表,才能讓人一目了然地看出結論。

本案例應用重點:

  • plt.figure(figsize=(10, 6)) 整句話的意思就是:「請幫我準備一張新的畫布,設定它的寬度為 10 英寸,高度為 6 英寸,接下來我要在這上面畫圖。」
  • sns.barplot() : 我們主要使用 seaborn 這個基於 matplotlib 的進階繪圖函式庫。barplot 用於繪製長條圖,並且可以透過 hue 參數,輕鬆繪製出比較不同類別的「分組長條圖」。
  • plt.title() / plt.xlabel() / plt.ylabel(): 這些 matplotlib 的基本函式,用來為我們的圖表加上標題與 X/Y 軸的說明,讓圖表更具可讀性。
  • plt.xticks(rotation=45): 當 X 軸的標籤文字過長時,可能會互相重疊而難以閱讀。這個函式可以將 X 軸的標籤旋轉 45 度,讓它們錯開顯示。
  • plt.tight_layout(): 自動調整圖表的邊距,確保圖表上的所有元素(如標題、標籤)都能完整顯示,不會被裁切掉。
  • plt.grid(True, axis='y'): 為圖表加上格線,axis='y' 代表只顯示水平格線,這有助於讀者更精確地對照 Y 軸的數值。
  • plt.legend(title='...'): 在使用 hue 參數繪製分組圖表時,這個函式會顯示圖例來說明不同顏色代表的類別,並可以為圖例設定一個標題。
  • plt.show(): 這是顯示圖表的最後一個指令。前面所有的 pltsns 函式都只是在「畫布」上設定與繪製圖形,直到呼叫 plt.show(),圖表才會被真正地渲染並顯示出來。
  • fig, axs = plt.subplots(...): 當需要在一張大畫布上同時呈現多張圖表時,這個函式非常有用。plt.subplots(1, 2, ...) 代表建立一個包含「1 列、2 欄」的子圖網格。它會回傳兩個物件:fig 代表整個大畫布,而 axs 則是一個包含各個子圖(可以透過 axs[0], axs[1] 來存取)的陣列,讓我們可以在指定的位置上分別繪圖。

總結來說,這個案例的學習路徑是:

讀取資料 -> 時間格式轉換 -> 計算新指標 -> groupby 分組計算 -> matplotlib/seaborn 繪製圖表

「AI 智慧客服回饋分析」詳解

這個案例的重點,在於如何將 AI 模型應用於批次處理結構化資料集。我們將學習讀取外部 CSV 檔案,並透過迴圈逐一將每一筆資料交由 AI 進行分析。這份清單整理了該 Colab 筆記本中最核心的 Python 元件。

1. 載入數據

  • 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環境時。

2. Pandas DataFrame 的核心操作

核心概念: Pandas 是 Python 進行資料分析的基石。在這個案例中,DataFrame (資料表) 是我們處理所有資料的主要結構。

本案例應用重點:

  • pd.read_csv(): 從上傳的 CSV 檔案中讀取資料,並將其載入為一個 DataFrame。
  • df.iterrows(): 這是遍歷 (loop through) DataFrame 每一列 (row) 的標準方法,讓我們可以逐一取得每一筆顧客的回饋文字。
  • df['new_column'] = '': 學習如何新增一個空的欄位,用來準備存放 AI 分析完的結果。
  • df.at[index, 'column'] = value: 在迴圈中,使用 .at[] 精準地將 AI 的分析結果(例如 ‘產品品質’)填入到特定儲存格中。
  • df.head() / display(df): 快速預覽資料表的前幾筆內容,檢查資料是否正確讀取。
  • df['topic'].value_counts() : 是 pandas 中的語法,通常用來統計某個 DataFrame 列(在這裡是 topic 這個欄位)中每個獨特值(unique value)的頻率,也就是計算每個類別在該行中出現的次數。

3. 自訂函式 (def) 與 try/except 錯誤處理

核心概念: 我們將呼叫 AI 的重複性工作,封裝成一個名為 analyze_feedback 的函式。同時,在函式內部使用 try/except 來確保程式的穩健性。

本案例應用重點:

  • 模組化: 將 AI 分析的邏輯寫在函式裡,讓主程式的 for 迴圈看起來更簡潔,且易於維護。
  • 錯誤捕捉: 網路連線或 API 呼叫隨時可能失敗。try/except 確保即使某一筆資料分析失敗,程式也能繼續執行下一筆,而不是直接中斷,這在處理大量資料時至關重要。

4. for 迴圈與 Pandas 的整合應用

核心概念: for 迴圈是本案例實現「自動化」分析的關鍵。它讓我們能夠對 DataFrame 中的每一筆資料,重複執行相同的 AI 分析流程。

本案例應用重點:

if 'df' in locals(): 是 Python 中用來檢查變數 df 是否已經在當前的局部變數範圍中定義過的一條語句。

# for 迴圈遍歷 DataFrame 的每一列
# index 是每一列的索引,row 則是包含該列所有資料的物件
for index, row in df.iterrows():
    # 從 row 中取出 'customer_feedback' 欄位的文字
    feedback = row['customer_feedback']
    
    # 呼叫 AI 分析函式 (見上一點)
    analysis_result = analyze_feedback(feedback)
    
    # 將分析結果存回 DataFrame
    df.at[index, 'topic'] = analysis_result.get('topic')

5. Google Gemini API 與 JSON 解析

核心概念: 這是將原始文字轉化為結構化數據的核心步驟。

本案例應用重點:

  • generation_config: 在初始化模型時,我們透過 generation_config=...response_mime_type="application/json",明確要求 Gemini 模型必須回傳 JSON 格式,確保了輸出的穩定性。
  • json.loads(): 由於 AI 回傳的是 JSON 格式的「字串」,我們需要使用 json.loads() 這個標準函式庫,將其轉換為 Python 中可以操作的字典 (dict)。
  • 列表 (list) 檢查: 程式碼中包含了 isinstance(result, list) 的判斷,用來處理 AI 可能回傳 [{...}] (列表包字典) 的情況,這是確保程式穩健性的細節。

6. Google data_table

not df['topic'].empty:檢查 dftopic 這一列是否為空(即檢查 topic 列是否包含任何資料)。

from google.colab import data_table

  • 這行代碼從 google.colab 模組中導入 data_table 模組。
  • google.colab 是 Google Colab 提供的一個 Python 庫,允許你在 Colab 筆記本環境中使用不同的功能和工具。
  • data_table 是 Google Colab 提供的一個工具,專門用來改進在 Colab 中顯示 pandas DataFrame 的外觀和交互性。

    data_table.enable_dataframe_formatter()

    • 這行代碼啟用了 data_table 中的 DataFrame 格式化功能。
    • 一旦啟用,DataFrame 會以更美觀和交互式的方式顯示,通常會包括以下功能:
      • 支援排序:你可以點擊表頭來根據列排序數據。
      • 支援篩選:可以快速篩選表格中的數據。
      • 更清晰的視覺效果:比 pandas 的基本顯示方式更具可讀性。

    7. time 模組與 API 存取頻率控制

    核心概念: time 模組提供了與時間相關的功能。

    本案例應用重點:

    • time.sleep(1): 在 for 迴圈的每一次迭代結束時,讓程式暫停 1 秒。這是為了避免在極短時間內對 AI API 發動過於頻繁的請求,許多 API 都有速率限制 (Rate Limiting),適當的延遲是撰寫爬蟲或自動化腳本的良好習慣。

    「AI 競品分析爬蟲」詳解

    這個案例將帶領我們模擬真實的網路爬蟲情境,其複雜度比單純的 API 呼叫更高。我們不僅要向外部伺服器請求資料,還要處理其回傳的複雜結構。這份清單聚焦於本案例 Colab 筆記本中實際運用的核心 Python 元件,請各位務必掌握「請求」的標準函式庫,我們將模擬瀏覽器向伺服器發送一個 POST 請求來獲取「動態載入」的資料。

    1. requests 函式庫與 HTTP POST 請求

    核心概念: requests 是 Python 中用來發送網路請求的關鍵函式庫。在這個案例中,我們使用 requests.post() 來獲取目標網站的留言資料,這是一種常見的動態資料載入方式。

    重點說明:

    • requests.post(): 許多網頁的內容(例如留言、評論)並不是一開始就寫在 HTML 裡,而是需要透過 POST 請求,主動向伺服器索取。學會 POST 是爬取這類動態網站的關鍵第一步。
    • url: (關鍵參數),這是想要請求數據的網址,通常使用 API 交換數據的網站,網址通常不是你在瀏覽器看到的,網址經常是需要使用 「開發者工具」來找到。這個案例中是一個電商的網址,也是透過開發者工具->Network功能找到的。
    • headers: 在發送請求時,我們通常需要附上 headers(標頭),用來模擬一個真實的瀏覽器,告知伺服器我們的身份。缺少正確的 headers 可能會導致請求失敗。
    • payload: POST 請求通常會伴隨著一個 payload(負載),也就是我們要傳送給伺服器的資料,用來告訴它我們想要哪一部分的數據(例如:第幾頁的留言)。

    2. 字典 (dict) 與巢狀字典解析(nested dict parsing)

    核心概念: 字典是本案例中處理資料的核心結構。從發送請求的 payload 到解析回傳的 response,都圍繞著字典的操作。

    重點說明:

    • 建構請求 payload: 我們將 page 參數包裝在一個字典中,作為請求的 payload,精確地告訴伺服器我們需要第幾頁的資料。
    • 解析多層巢狀字典: 伺服器回傳的資料是多層嵌套的。我們需要學會如何依序存取字典的 key,例如 data['goodsCommentList']['comments'],才能從複雜的結構中,層層深入,最終定位到包含所有留言的那個列表 (list)。

    3. for 迴圈與列表 (list) 操作

    核心概念: 在成功從 JSON 中提取出包含所有留言的列表後,我們利用 for 迴圈來遍歷(iterate)這個列表,逐一處理每一則留言。

    重點說明:

    列表生成式」(List Comprehension): 這段程式碼的功能是:從一個比較複雜的資料結構中,快速地建立一個只包含留言文字的、乾淨的新列表。您可以把它想像成一個加工流水線,分成三個步驟來理解:

    1. for comment in data["goodsCommentList"] (原料來源):這部分是流水線的起點。它會先找到一個名為 data 的字典,然後從中取出鍵值為 goodsCommentList 的那個項目,這個項目本身是一個列表 (list),裡面裝了許多則留言。
    2. comment["comment"] (加工動作):從上一步取出的每一則 comment,它本身可能也是一個字典,裡面包含了留言者、時間、按讚數等多種資訊。這一步的動作是,只從這個 comment 字典中,挑出鍵值為 comment 的那一部分,也就是我們真正想要的「留言文字內容」。
    3. comments = [...] (成品裝箱):最外層的方括號 [] 代表「請幫我建立一個新的列表」。流水線會將每一步加工完成的「留言文字內容」,全部收集起來,放進這個新的列表中。

    list.extend(): 我們建立一個名為 all_comments 的空列表,然後在迴圈中,將每一則留言的文字內容 ,逐一加入到這個新列表中,完成資料的萃取與整理。

    "".join(): 最後再將這個新列表中的所有字串合併在一起,形成一個長字串。

    4. if else 流程控制

    核心概念: 檢查伺服器端的回應是否OK,如果OK代表請求成功,接著就開始處理接收到的資料,如過不成功就發出錯誤訊息。

    重點說明:

    if response.status_code == 200: (Note: Python 作為比較 “相等” 的運算子為 ==)

    • 這一行檢查 HTTP 回應的狀態碼是否等於 200。
    • status_code 是 HTTP 回應中的一個重要屬性,表示伺服器回應的結果狀態碼。
    • 狀態碼 200 代表 “OK”,表示請求成功並且伺服器成功處理了請求。

    data = response.json()

    • 當狀態碼為 200 時,表示請求成功,因此接下來使用 response.json() 方法將伺服器返回的 JSON 格式數據轉換為 Python 字典並賦值給變數 data
    • 這一步是用來處理成功的回應,將 JSON 數據轉換為易於處理的 Python 字典(dict)數據結構。

    else:

    • 如果回應的狀態碼不是 200(即請求失敗),則執行 else 區塊中的代碼,亦即列印一條錯誤信息,告訴你是哪一頁的請求失敗,並顯示該頁的狀態碼(例如 404 表示找不到頁面,500 表示伺服器錯誤等。

    5. Google Gemini API 的應用

    核心概念: 在我們成功爬取並整理好大量的留言文字後,下一步就是從這些非結構化資料中萃取有價值的資訊。這正是 Google Gemini API 發揮作用的地方。我們將整理好的留言列表傳送給 AI,讓它執行複雜的文本分析任務。你要學習如何在colab中儲存 (如果你使用其他AI模型,例如ChatGPT,也是一樣的方法),然後透過 Gemini 提供的函式來存取金鑰 (userdata.get()),和設定Gemini (config())。

    重點說明:

    • 化繁為簡: AI 能夠快速閱讀數百則留言,並提煉出「摘要」、「關鍵主題」或「情緒傾向」。這將行銷人員從繁瑣的人工閱讀中解放出來,專注於策略層面。
    • 洞察發掘: 透過 AI 分析,我們可以量化消費者的情緒,或發現意想不到的討論熱點,這些都是寶貴的市場洞察。
    • 模組化呼叫: 與第一個案例相似,呼叫 AI 的程式碼通常會被封裝在一個獨立的函式中,讓主程式的邏輯更清晰:爬取資料 -> 呼叫AI分析 -> 呈現結果。

    總結來說,這個案例的學習路徑是:

    requests.post() 發送請求 -> response.json() 解析回傳資料 -> for 迴圈遍歷與萃取 -> 存入 list 整理 -> 轉換成長字串 ->呼叫 AI 分析

    「AI 文案草稿生成」詳解

    「AI 文案草稿生成」詳解

    在學習「AI 文案草稿生成」這個案例時,除了理解整體的行銷應用邏輯外,掌握背後 Python 程式碼的基礎元件也至關重要。這份清單整理了該 Colab 筆記本中最核心的 Python 語法與概念,請確保自己能理解每一個項目的用途。

    1. 函式庫匯入與 Colab userdata

    核心概念: 程式的第一步,永遠是匯入我們需要用到的工具箱 (函式庫)。

    重點說明:

    • import json : 引入 json 函式庫來處理 JSON 格式。
    • import google.generativeai : 引入 google.generativeai 函式庫來與 Gemini API 互動。
    • from google.colab import userdata: 這是 Colab 的一個特有功能,讓我們可以安全地讀取預先儲存的密鑰 (API Key),避免將敏感資訊直接寫在程式碼中,是程式安全性的重要一環。

    2. 錯誤處理 (try / except)

    核心概念: try 區塊中的程式碼是我們預期可能發生錯誤的部分。如果 try 區塊真的出錯了,程式不會直接崩潰,而是會跳至 except 區塊執行對應的處理方式。

    Python 的 try 可以有多個 except 區塊,這是完全合法且常見的寫法。這樣可以根據不同的例外(Exception)類型採取不同的處理方式。(例如步驟3-5就有兩個except)

    重點說明: 網路請求(如呼叫 API)或檔案讀取都可能因為各種原因失敗。使用 try/except 可以優雅地處理這些預期外的狀況(例如 API 金鑰錯誤、網路連線中斷),並給予使用者明確的提示,這是撰寫穩健程式的必備技能。

    範例程式碼:

    try:
        # 嘗試從 Colab 密鑰管理器中讀取 API 金鑰
        api_key = userdata.get('GEMINI_API_KEY')
        genai.configure(api_key=api_key)
        print("🔑 Gemini API 金鑰已成功設定。")
    except Exception as e:
        # 如果發生任何錯誤(例如找不到金鑰),則執行這裡的程式碼
        print(f"🚨 設定 API 金鑰時發生錯誤:{e}")
    

    3. f-String (格式化字串)

    核心概念: 一種方便地將變數嵌入字串中的方法(method)。在字串前加上 f,並用大括號 {} 包住變數名稱即可。學習如何動態地組合出最終要傳送給 AI 的指令。

    重點說明:

    {params.get('axis', '未提供')} 是一個 Python 的 f-string (格式化字串) 語法,裡面嵌入了一個字典(dict)的操作。params 是一個字典 (在這裡是我們在步驟一所定義的變數: marketing_parameters)。

    .get('axis', '未提供') 是字典的一個方法,它的作用是:

    1. 嘗試從 params 字典中取出鍵 'axis' 所對應的值。
    2. 如果找到了 'axis' 這個鍵,就回傳它對應的值 (例如在這個例子中是 “夏日控油大作戰”)。
    3. 如果沒有找到 'axis' 這個鍵,就回傳 .get() 方法的第二個參數所指定的值,也就是字串 '未提供'

    將這部分放在 f-string 中,程式執行時就會將這個方法回傳的結果替換掉 {...} 的位置,進而動態地生成包含行銷主軸的提示文字。這樣做的好處是,即使 marketing_parameters 字典中缺少了 'axis' 這個鍵,程式也不會出錯,而是會顯示預設的 '未提供' 字樣,增加了程式的穩健性。

    範例程式碼:

    def generate_user_prompt(params):
        """根據使用者輸入的參數組合 User Prompt"""
        return f"""
                【品牌與產品核心資訊】
                - 品牌人設:「純淨之鑰 (PureKey)」,專為年輕油性、痘痘肌膚設計的純素保養品牌。
    
                【行銷策略】
                - 行銷主軸:{params.get('axis', '未提供')}
                - 主打產品:{params.get('product', '未提供')}
                - 目標受眾:{params.get('audience', '未提供')}
                - 內容類型:{params.get('type', '未提供')}
                - 溝通語氣:{params.get('tone', '未提供')}
    
                請開始生成文案。
                """

    4. JSON (JavaScript Object Notation)

    核心概念: JSON 是一種輕量級的資料交換格式,因其語法類似 Python 的字典和列表,非常容易閱讀與理解。它由鍵值對(key-value pairs)組成,結構清晰,是現代網路應用中 API 溝通最主流的標準格式。

    重點說明:在這個案例中,我們明確要求 AI 以 JSON 格式回傳結果。這確保了 AI 的輸出是結構化的、可預測的,讓我們的 Python 程式能穩定地解析與使用這些資料,而不是處理一段格式混亂的文字。

    範例格式: 這就是一個 JSON 格式的範例,它是一個列表 ([]),裡面包含了三個字典 ({})。

    [
      {
        "platform": "Instagram",
        "copy": "IG文案...",
        "hashtags": "#..."
      },
      {
        "platform": "Dcard",
        "copy": "Dcard文案...",
        "hashtags": "#..."
      },
      {
        "platform": "Facebook",
        "copy": "FB文案...",
        "hashtags": "#..."
      }
    ]

    5. 變數與資料類型 (Variables & Data Types)

    核心概念: 變數是儲存資料的容器。在這個案例中,我們主要使用了 字串 (string) 來存放提示詞文本,以及 字典 (dictionary) 來結構化地組織行銷參數。

    • 字串 (str): 所有與 AI 溝通的提示詞都是文字,是 NLP 應用的基礎。被 ” ” 或是 ‘ ‘ 符號刮起來的文字就是字串。
    • 多行字串 """...""": 我們使用三個引號來建立包含複雜內容的系統提示詞 (System Prompt) 和用戶提示詞(User Prompt)。

    多行字串範例程式碼:

    SYSTEM_PROMPT = """
    你是一位頂尖的新創美妝品牌社群行銷專家
    你正在為品牌「純淨之鑰」規劃給 Instagram, Dcard, Facebook 的社群內容。
    ...
    
    """
    • 字典 (dict): 使用 key: value 的形式,能讓我們用有意義的名稱(如 "axis")來存取對應的資料 (如 "夏日控油大作戰"),使程式碼更具可讀性,也方便未來擴充。

    字典範例程式碼:

    # 使用字典來組織行銷活動的所有參數
    marketing_parameters = {
        'axis': "夏日控油大作戰",
        'product': "茶樹淨痘精華液",
        'audience': "18-25歲,深受粉刺痘痘困擾的大學生與社會新鮮人",
        'type': "新品上市優惠",
        'tone': "有活力、像學姊一樣親切分享"
    }
    

    6. 自訂函式 (Defining Functions with def)

    核心概念: 使用 def 關鍵字可以將一段特定的程式碼打包成一個可重複使用的功能區塊,稱為函式。我們可以為它命名,並定義它需要接收的輸入(參數)和回傳的輸出。

    重點說明: 將「呼叫 AI 並解析結果」的邏輯封裝成一個函式,可以讓主程式更簡潔。未來若要針對不同目的呼叫 AI,可以直接重複使用此函式,而無需複製貼上相同的程式碼,大大提升了程式的模組化與維護性。

    範例程式碼:

    # 定義一個函式,專門用來呼叫 AI 並回傳結果
    def generate_user_prompt(params):
        """根據使用者輸入的參數組合 User Prompt"""
        return f"""
               ....
               請開始生成文案
               """

    7. Google Gemini API 的應用:生成文案

    核心概念: 這是實際與 AI 互動、執行「根據提示詞生成 JSON 格式文案」任務的關鍵步驟。我們需要初始化模型,並呼叫它的方法來發送組合好的提示詞。

    重點說明:

    • genai.GenerativeModel(...): 使用這段程式碼來初始化我們要使用的 Gemini 模型。
    • model.generate_content(...): 這是執行生成任務的核心函式。我們將組合好的 system_promptuser_prompt 作為參數傳給它,它會將請求發送給 Google 的伺服器,並等待 AI 的回應。真實可以操作的列表與字典物件。

    8. 流程控制 (for 迴圈)

    核心概念: for 迴圈可以讓我們遍歷一個序列(例如一個 list 列表)中的每一個項目,並對其執行相同的操作。

    重點說明: AI 模型一次回傳了三個平台(Instagram, Dcard, Facebook)的文案,這些結果被存放在一個列表中。我們使用 for 迴圈,可以依序取出每一筆平台的資料(一個字典),並將其內容整齊地印出,省去了手動存取三次的麻煩。

    範例程式碼:

    # copy_data 是一個包含多個字典的列表 [{"platform": "Instagram", ...}, {"platform": "Dcard", ...}]
    for item in copy_data:
        print("="*50)
        print(f"平台: {item['platform']}")
        print("="*50)
        print("【文案內容】")
        print(item['copy'])
        ...