「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 建立畫布 -> 分別繪製長條圖與圓餅圖 -> 呈現整合報告