本案例將帶我們進入一個更進階的應用:如何讓 AI 扮演「數據分析師」的角色,對整個結構化資料集進行宏觀分析,並將其洞察與傳統的資料視覺化圖表相結合。
1. 環境設定:中文字型
核心概念: matplotlib 或 seaborn 套件預設並未包含中文字型,若直接繪圖,圖表中的中文(如標題、座標軸標籤)將會顯示為無法辨識的方塊亂碼(暱稱為豆腐)。因此,繪製中文圖表前的第一步,就是手動安裝並設定字型。
本案例應用重點:
!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)所看到的排版樣式。
你也可以參考「Python資料處理 (Data Processing)」”pandas篇”
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']來取得預算分配,為後的續繪圖做準備,‘
你也可以參考「Python網路爬蟲 (Web Crawler)」”使用 API (JSON)”
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(): 這是pandasDataFrame 或 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(): 在繪製完所有子圖後,呼叫此函式可以自動調整間距,避免圖表標題或標籤互相重疊。
你也可以參考「Python資料視覺化 (Data Visualization)」”長條圖&圓餅圖”、”matplotlib”
總結來說,這個案例的學習路徑是:
讀取資料 -> 傳送給 AI 分析 -> 解析回傳的 JSON 洞察 -> 使用 subplots 建立畫布 -> 分別繪製長條圖與圓餅圖 -> 呈現整合報告。