「社群貼文探索性分析(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 繪製圖表