在這篇文章中,我將分享我在進行 Kaggle ML & DS Survey 資料分析專案時所採用的探索性資料分析(EDA, Exploratory Data Analysis)流程。
剛開始自主分析時的確相當混亂,幾乎沒有任何進展。後來開始釐清問題,並參考他人是如何分析的,意外接觸到「探索性資料分析」這個概念,便以此作為切入點展開分析。
本篇前半段主要介紹 EDA 的基本概念,後半段則紀錄實際的分析過程。我重新整理並撰寫分析的每個步驟,除了幫助自己釐清邏輯,也強化記憶。畢竟從完成專案到回頭重寫這篇文章,時間其實並不長,才過不久卻發現思緒已經模糊,因此特別想記錄下來。
在重新整理筆記的過程中,我發現不少邏輯錯誤,透過釐清原意與修正問題,補足了許多原本遺漏或模糊的觀念。對我來說,這是一個非常有幫助的反思與學習過程。因此,本篇某種程度上是寫給自己看的筆記,可能顯得有些冗長、不夠精煉,但若你對分析的邏輯與思考方式有興趣,也歡迎參考。
本篇將依照「資料處理 → 探索分析 → 目標釐清 → 主題洞察 → 策略反思與視覺化」的邏輯來呈現整體成果。
由於我是自行學習的初學者,內容中可能仍有錯誤。我已盡力查證與修正,但無法保證所有觀念都完全正確,若有不妥之處,也請不吝指正,感謝。
EDA 分析流程
.head()
、.info()
初步了解欄位與型態從這裡開始將進入整個分析流程,若對細節不感興趣,可直接跳轉至 下一篇。
使用 .head()
、.info()
、.describe()
、.isnull()
等方法確認資料的基本結構,了解資料欄位、檢查缺失值與異常值。這裡使用的是課程中第一次清洗後的資料。
df.head():快速預覽前幾筆資料。
>>> df.head()
ividuals are respons... 0 2291
surveyed_in question_index question_type question_description response response_count
0 2020 Q21 Single Choice Approximately how many individuals are respons... 0 2291
1 2020 Q21 Single Choice Approximately how many individuals are respons... 1-2 2645
2 2020 Q21 Single Choice Approximately how many individuals are respons... 10-14 692
3 2020 Q21 Single Choice Approximately how many individuals are respons... 15-19 300
4 2020 Q21 Single Choice Approximately how many individuals are respons... 20+ 2247
df.info():快速檢視資料。
顯示整個 DataFrame 的結構、欄位名稱、資料型別(dtype)、非空值數量(Non-Null Count)與記憶體使用情況。
為什麼這樣做:
>>> df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 13725 entries, 0 to 13724
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 surveyed_in 13725 non-null int64
1 question_index 13725 non-null object
2 question_type 13725 non-null object
3 question_description 13725 non-null object
4 response 13725 non-null object
5 response_count 13725 non-null int64
dtypes: int64(2), object(4)
memory usage: 643.5+ KB
欄位 | 資料型別 | 說明 |
---|---|---|
surveyed_in | int64 | ✅ 沒問題,年份是整數。 |
question_index | object | ✅ 題號,文字型態合理。 |
question_description | object | ✅ 題目,文字型態合理。 |
response | object | ✅ 回覆,文字型態合理。 |
response_count | int64 | ✅ 出現次數是整數。 |
✅ 所有欄位皆無缺值
df.isnull():再次檢查是否有遺漏值
>>> df.isnull().sum()
surveyed_in 0
question_index 0
question_type 0
question_description 0
response 0
response_count 0
dtype: int64
df.describe():簡單的描述統計
對數值欄位(如 int、float)產出統計摘要,包括:總數、平均值、標準差、最小值、四分位數與最大值。
>>> df_describe
2020 2021 2022
count 4723.000000 5004.000000 3998.000000 # count(總數):每個欄位中非缺失值(非 NaN)的數量。
mean 177.742748 238.049361 206.326413 # mean(平均值):每個欄位的平均值。
std 886.520151 1200.215385 1098.017375 # std(標準差):用來衡量數據的分散程度(標準差越小,表示資料值越接近樣本平均數。標準差越大,表示資料值分佈越廣,某些值離樣本平均數越遠。)。
min 1.000000 1.000000 1.000000 # min(最小值):每個欄位的最小值。
25% 1.000000 1.000000 1.000000 # 25%(第一四分位數):數據中的 25% 分位值。
50% 1.000000 2.000000 1.000000 # 50%(中位數或第二四分位數):數據的中位數,也稱作 50% 分位值。
75% 12.000000 15.000000 14.000000 # 75%(第三四分位數):數據中的 75% 分位值。
max 15789.000000 21860.000000 18653.000000 # max(最大值):欄位的最大值。
如何判斷 標準差: 標準差 / 平均值 = 變異係數 CV < 0.1(10%):變異小(資料穩定) CV ≈ 0.2~0.3:中等變異 CV > 0.5:變異很大(高度不穩定)
建立跨年度題目對照表:kaggle_question_reference_table
不同年度的題號不一致(如 Q6 在 2020 是「年資」,在 2022 則是「程式經驗」),需對應。
surveyed_in(年份):
question_index(題目代號):看哪些題目最常出現
question_type(題目類型):類別型變數,單選 vs 多選 數量
response(選項內容):類別型變數,出現頻率最高的選項(限制特定題目)
檢視過基礎資料後,我發現幾個待解決的問題:
釐清目標
了解資料分析師的實際樣貌與技能需求,進而修正錯誤認知、規劃學習方向。
目的:讓資料背後的故事更具體、直觀易懂。
資料清理是整個分析中最耗時的部分,包含命名標準化、資料驗證、型別轉換與欄位分群。有些資料表(如 country_area
、salary_order
、prog_lang_skill_group
等)是分析需求建立的,接下來會一一說明這些表的設計原因與用處。
目的:瞭解整體樣貌與背景
發現問題。
資料中 0 佔比高達 28%,0–999 佔比約 13%。
salary_order
資料表
country_area
資料表,加入 GDP 和 最低薪資,驗證 年薪 資料的正確性。
資料來源:Gapminder 中的 Fast Track、檔案名稱:ddf–datapoints–gdp_pcap–by–country–time.csv
匯率標準:2022 年最後一週
資料來源:ILO(國際勞工組織)、檔案名稱:EAR_4MMN_CUR_NB_A-20250529T0752.csv
視覺化。
本圖表為清理後的資料分布,排除了低於法定最低薪資、極端高薪但無經驗等明顯異常樣本。
年薪區間以中位數換算為美金,並以 ILO 公布的最低工資與 Gapminder 的 GDP 分組做為清理標準,確保樣本具備一定信度。
目的:觀察產業中最常見的工具與技術,作為學習參考
視覺化。
使用 IDE (ide_tool)
經常使用的程式語言 (prog_lang)
經常使用的資料庫 (databases)
經常使用的視覺化工具 (visualization)
ML 框架 (ml_framework)
建議:初學者可從 Scikit-learn 開始,若對深度學習或 NLP 有興趣,再深入 TensorFlow/Keras 或 HuggingFace。
常見演算法 (ml_algo)
技術類別 | 解釋 | 初學者是否常用 |
---|---|---|
Linear/Logistic Regression | 預測數值或分類(例如房價預測、是否購買),經典入門模型。 | ✅ 非常常見 |
Decision Trees / Random Forests | 用「一連串條件判斷」來分類或預測,易解釋、入門必學。 | ✅ 非常常見 |
Gradient Boosting Machines (xgboost, lightgbm) | 目前很多競賽冠軍都愛用的強大預測模型。 | ✅ 常見(尤其在實務) |
Dense Neural Networks (MLPs) | 基本的深度學習神經網路,處理結構化數據的基本神經網路。 | ✅ 常見 |
Convolutional Neural Networks (CNN) | 常用於影像處理的神經網路。 | ✅ 影像任務常見 |
Recurrent Neural Networks (RNN) | 處理時間序列或文字,已較少使用。 | ❌ 現在用 transformers 替代多 |
Transformer Networks (BERT, GPT) | 處理 NLP、也有用於 CV 等任務,現今主流架構。 | ✅ 越來越普遍 |
常用 CV (cv_tech):常用的圖片處理
NLP 技術 (nlp_tech):自然語言:神經網絡
總結與思考。
目的:了解職責與產業狀況
發現什麼?
job_title
欄位的空值比例高達近 50%。後來發現「學生」被拆分為獨立題目,可能是為了區分是否為在職進修。如何處理。
學生資料
與 job_title
合併。job_title_group
,將職稱進行分類以聚焦分析目標,篩選後剩餘樣本數為 22,616 筆。
視覺化。
職稱
常見職稱與工作職責(多選題長表)
公司規模
DS 團隊規模
公司是否使用 ML
所在行業 (目標行業)
總結與思考。
目的:找到主流學習管道
視覺化。
入門學習資源分析:
學習來源:
學習課程平台:
總結與思考。
目的:了解入門門檻與上升空間
發現什麼?
如何處理。
prog_lang_skill_group
:由於技能是以文字紀錄,所以將 prog_lang 轉換成 One-hot 編碼,方便檢查必要技能、統計技能數。
id | Python | R | SQL | … | skill_count | Python_SQL_group |
---|---|---|---|---|---|---|
0 | 1 | 0 | 1 | … | 2 | 1 |
coding_exp_years_order
: 將經驗區間轉為中位數(例如:1-3 years → 4),利於數值計算與排序。視覺化。
總結與思考。