「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'])
        ...