EDA 是機器學習專案中不可或缺的環節,其目標在於深入理解資料特性,發掘潛在模式與關聯性,為後續模型訓練和評估奠定基礎。本篇涵蓋了 EDA 的完整流程,從資料收集、清理、轉換到探索和視覺化,並佐以 Python 程式碼和圖表說明,讓讀者能快速上手並應用於實際專案。同時,文章也闡述了機器學習專案生命週期中各個階段的關聯性,強調 EDA 的重要性,並提供一些常用的 Python 函式庫和工具,例如 Pandas、NumPy、Matplotlib 和 Seaborn,以協助讀者更有效率地進行資料分析和視覺化。

EDA 的步驟

EDA 的步驟包括:

  1. 資料發現:找出相關的資料來源並評估其質量和相關性。
  2. 資料收集:從各個來源收集資料並將其儲存在一個統一的位置。
  3. 資料清理:清理和轉換資料以使其適合進行分析。
  4. 資料探索:使用統計方法和視覺化工具來瞭解資料、找出模式和關聯。

資料探索工具

常用的資料探索工具包括:

  • Pandas:一個 Python 庫,提供了高效的資料結構和資料分析工具。
  • NumPy:一個 Python 庫,提供了高效的數值計算工具。
  • Matplotlib 和 Seaborn:兩個 Python 庫,提供了高質量的視覺化工具。

資料探索的目標

資料探索的目標是對資料有更深入的瞭解,找出模式和關聯,並評估資料質量。透過資料探索,我們可以:

  • 對資料有更深入的瞭解
  • 找出資料中的模式和關聯
  • 評估資料質量
  • 確定資料是否適合進行機器學習

機器學習專案生命週期

機器學習專案生命週期包括以下幾個步驟:

  1. 定義商業問題:定義專案的目標和需求。
  2. 資料發現和收集:找出相關的資料來源並收集資料。
  3. 資料探索:使用統計方法和視覺化工具來瞭解資料、找出模式和關聯。
  4. 資料標籤:為資料新增標籤以便於進行機器學習。
  5. 模型訓練:使用標籤的資料訓練機器學習模型。
  6. 模型評估:評估模型的效能和準確性。
  7. 模型部署:部署模型到生產環境。

資料標籤

資料標籤是機器學習專案的重要步驟。它涉及為資料新增標籤以便於進行機器學習。常用的資料標籤方法包括:

  • 手動標籤:人工為資料新增標籤。
  • 自動標籤:使用演算法為資料新增標籤。

資料標籤的重要性

資料標籤是機器學習專案的關鍵步驟,因為它可以幫助模型學習和提高準確性。透過資料標籤,我們可以:

  • 提高模型的準確性
  • 減少模型的誤差
  • 提高模型的泛化能力

Pandas 和 NumPy

Pandas 和 NumPy 是兩個常用的 Python 庫,提供了高效的資料結構和數值計算工具。

Pandas

Pandas 提供了高效的資料結構,包括 Series 和 DataFrame。它還提供了多種方法來操作和分析資料,包括篩選、分組和合併。

NumPy

NumPy 提供了高效的數值計算工具,包括陣列和矩陣運算。它還提供了多種方法來操作和分析數值資料,包括統計和線性代數運算。

Matplotlib 和 Seaborn

Matplotlib 和 Seaborn 是兩個常用的 Python 庫,提供了高質量的視覺化工具。

Matplotlib

Matplotlib 提供了多種視覺化工具,包括折線圖、條形圖和散點圖。它還提供了多種方法來自訂視覺化,包括顏色、字型和標題。

Seaborn

Seaborn 提供了高階別的視覺化工具,包括熱力圖、 violin 圖和 jointplot。它還提供了多種方法來自訂視覺化,包括顏色、字型和標題。

內容解密:

在這個章節中,我們介紹了 EDA 的概念、步驟和工具。同時,我們還介紹了機器學習專案生命週期、資料標籤、Pandas、NumPy、Matplotlib 和 Seaborn 等相關知識。這些知識是進行機器學習專案的基礎,對於理解和應用機器學習演算法至關重要。

圖表翻譯:

  graph LR
    A[EDA] --> B[機器學習專案生命週期]
    B --> C[資料標籤]
    C --> D[模型訓練]
    D --> E[模型評估]
    E --> F[模型部署]
    F --> G[監控和維護]

這個流程圖展示了機器學習專案生命週期的各個步驟,從 EDA 到模型部署和監控。每個步驟都與下一個步驟緊密相連,形成了一個完整的迴圈。

資料前處理與探索

首先,我們需要載入必要的庫並設定環境。這包括忽略警告和設定matplotlib的風格。

import warnings
warnings.filterwarnings('ignore')
import matplotlib.pyplot as plt
plt.style.use('dark_background')

接下來,我們載入adult_income.csv檔案到DataFrame(df)中。

import pandas as pd
df = pd.read_csv("adult_income.csv", encoding='latin-1')

載入資料後,我們可以檢視DataFrame的大小,包括觀察數(rows)和特徵數(columns)。

print(df.shape)

這將顯示出我們的資料集有32,561個觀察值和15個特徵。

然後,我們可以列印出這15個欄位的名稱。

print(df.columns)

檢視資料的前五行和最後五行,可以幫助我們瞭解資料的結構和內容。

print(df.head())
print(df.tail())

觀察到education和education.num這兩個欄位是冗餘的,因為education.num只是education的序數表示。因此,我們可以移除education.num欄位。

df.drop(['education.num'], axis=1, inplace=True)

另外,由於我們不需要race欄位,所以也將其移除。

df.drop(['race'], axis=1, inplace=True)

確認移除欄位後的DataFrame結構。

print(df.info())

現在,我們的DataFrame中只剩下13個欄位。

資料摘要統計

在這一節中,我們將為重要特徵生成摘要統計。首先,需要區分類別欄位和數值欄位。

categorical_cols = df.select_dtypes(include=['object']).columns
numerical_cols = df.select_dtypes(exclude=['object']).columns

然後,計算所有數值欄位的摘要統計。

summary_stats = df[numerical_cols].describe()
print(summary_stats)

這將給出每個數值欄位的均值、標準差、最小值、最大值等資訊。

最後,計算每個數值欄位在目標類別下的均值。

target_mean = df.groupby('target')[numerical_cols].mean()
print(target_mean)

這些摘要統計有助於我們瞭解每個特徵的平均值及其對目標類別的影響。

圖表翻譯:

  flowchart TD
    A[資料載入] --> B[資料探索]
    B --> C[移除冗餘欄位]
    C --> D[計算摘要統計]
    D --> E[計算目標類別均值]

內容解密:

以上步驟展示瞭如何載入資料、探索資料結構、移除冗餘欄位、計算數值欄位的摘要統計以及目標類別下的均值。這些步驟對於瞭解資料分佈和特徵重要性具有重要意義。

探索性資料分析

在進行資料探索時,我們需要對資料有更深入的瞭解,包括瞭解資料的分佈、相關性和模式。以下是使用 Python 和相關庫(如 Pandas、NumPy 和 Matplotlib)進行探索性資料分析的步驟。

步驟 1:載入必要的庫

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

步驟 2:載入資料

# 載入資料
df = pd.read_csv('your_data.csv')

步驟 3:檢視資料結構

# 檢視資料結構
print(df.head())
print(df.info())
print(df.describe())

步驟 4:分類欄位和數值欄位

# 分類欄位
categorical_column = df.select_dtypes(include=['object']).columns
print(categorical_column)

# 數值欄位
numerical_column = df.select_dtypes(include=['int64', 'float64']).columns
print(numerical_column)

步驟 5:摘要統計

# 摘要統計
summary_stats = df.describe().T
print(summary_stats)

步驟 6:資料聚合

# 資料聚合
average_age = df.groupby("income")["age"].mean()
print(average_age)

average_hours_per_week = df.groupby("income")["hours.per.week"].mean()
print(average_hours_per_week)

步驟 7:建立 reusable 函式

def get_groupby_stats(categorical, numerical):
    groupby_df = df[[categorical, numerical]].groupby(categorical).mean().dropna()
    return groupby_df

# 測試函式
print(get_groupby_stats("income", "age"))

步驟 8:多欄位聚合

columns_to_show = ["age", "hours.per.week"]
aggregations = df.groupby(["income"])[columns_to_show].agg(['mean', 'std', 'max', 'min'])
print(aggregations)

步驟 9:視覺化

# 視覺化
sns.set()
plt.figure(figsize=(10, 6))
sns.scatterplot(x="age", y="hours.per.week", hue="income", data=df)
plt.title("Age vs Hours Per Week")
plt.show()

這些步驟可以幫助您對資料有更深入的瞭解,並找出有趣的模式和相關性。接下來,您可以根據您的需求和目標,選擇適合的視覺化工具和方法來呈現您的發現。

個人資料分析與視覺化

在這個章節中,我們將對每個變數進行個別的探索。首先,我們會對每個特徵進行摘要統計,並分析其模式。接著,我們將進行單變數分析和雙變數分析,以更深入地瞭解資料的結構。

單變數分析

單變數分析是指對個別特徵進行分析。首先,我們來看看年齡、教育程度、工作類別、每週工作小時數和職業等特徵的唯一值數量:

import pandas as pd

# 載入資料
df = pd.read_csv('your_data.csv')

# 獲取每個欄位的唯一值數量
unique_counts = df.nunique()
print(unique_counts)

結果顯示,年齡有 73 個唯一值,工作類別有 9 個唯一值,教育程度有 16 個唯一值,職業有 15 個唯一值,等等。

接下來,我們來看看年齡的唯一值數量:

age_counts = df['age'].value_counts()
print(age_counts)

結果顯示,有 898 個觀察值(列)具有 36 歲的年齡。同樣地,有 6 個觀察值具有 83 歲的年齡。

年齡直方圖

直方圖用於視覺化連續資料的分佈。連續資料是可以在某個範圍內取任意值的資料(例如:年齡、身高、體重、溫度等)。讓我們使用 Seaborn 繪製一個直方圖,以檢視年齡在資料集中的分佈:

import seaborn as sns
import matplotlib.pyplot as plt

# 繪製年齡直方圖
sns.histplot(data=df['age'], kde=True)
plt.show()

結果顯示,在給定的觀察值中,大多數人都在 23 到 45 歲之間。

教育程度長條圖

現在,讓我們檢視教育程度在給定的資料集中的分佈:

education_counts = df['education'].value_counts()
print(education_counts)

接下來,我們來繪製教育程度的長條圖:

# 繪製教育程度長條圖
plt.bar(education_counts.index, education_counts.values)
plt.xlabel('教育程度')
plt.ylabel('數量')
plt.title('教育程度分佈')
plt.show()

結果顯示,高中畢業生的人數比學士學位持有者多。同樣地,碩士學位持有者的數量比學士學位持有者少。

工作類別長條圖

現在,讓我們檢視工作類別在資料集中的分佈:

workclass_counts = df['workclass'].value_counts()
print(workclass_counts)

接下來,我們來繪製工作類別的長條圖:

# 繪製工作類別長條圖
plt.bar(workclass_counts.index, workclass_counts.values)
plt.xlabel('工作類別')
plt.ylabel('數量')
plt.title('工作類別分佈')
plt.show()

結果顯示,私人企業員工的人數比其他型別的員工多。

收入長條圖

讓我們檢視收入目標變數的唯一值,並檢視收入的分佈:

income_counts = df['income'].value_counts()
print(income_counts)

結果顯示,有 24,720 個觀察值的收入大於 50K 美元,有 7,841 個觀察值的收入小於 50K 美元。在現實世界中,大多數人都有大於 50K 美元的收入,小部分人有小於 50K 美元的收入,假設收入是以美元計算且為一年。由於這個比例接近現實世界的情況,因此我們不需要使用合成資料來平衡少數類別的資料集。

雙變數分析

現在,讓我們進行年齡和收入的雙變數分析,以瞭解它們之間的關係。雙變數分析是指分析兩個變數以瞭解它們之間的關係。讓我們使用 Python 的 Seaborn 函式庫繪製一個直方圖,以視覺化年齡和收入之間的關係:

# 繪製年齡和收入的直方圖
sns.histplot(data=df['age'], hue=df['income'], kde=True)
plt.show()

這個直方圖可以幫助我們瞭解年齡和收入之間的關係。

雙變數分析:年齡與收入

使用 seaborn 進行年齡與收入的雙變數分析,可以得出以下結論:收入超過 50K 美元的年齡群主要集中在 30 至 60 歲之間。相反,年齡小於 30 歲的個體,其收入多低於 50K 美元。

import seaborn as sns
import matplotlib.pyplot as plt

# 載入資料
df = pd.read_csv('adult.csv', na_values=-999)

# 年齡與收入的雙變數分析
sns.histplot(data=df, kde=True, x='age', hue='income')
plt.show()

雙變數分析:教育程度與收入

對教育程度與收入進行雙變數分析,發現收入超過 50K 美元的個體主要具有碩士學位。另一方面,收入低於 50K 美元的個體多具有高中畢業證書。

# 教育程度與收入的雙變數分析
sns.histplot(data=df, y='education', hue='income', multiple="dodge")
plt.show()

雙變數分析:工作類別與收入

對工作類別與收入進行分析,發現收入超過 50K 美元的個體主要是自僱人士。另一方面,收入低於 50K 美元的個體多為私人企業或非自僱人士。

# 工作類別與收入的雙變數分析
sns.histplot(data=df, y='workclass', hue='income', multiple="dodge")
plt.show()

雙變數分析:性別與收入

對性別與收入進行分析,發現收入超過 50K 美元的個體主要是男性。另一方面,收入低於 50K 美元的個體多為女性。

# 性別與收入的雙變數分析
sns.histplot(data=df, y='sex', hue='income', multiple="dodge")
plt.show()

使用 ydata-profiling 進行資料探索

ydata-profiling 是一個 Python 庫,提供了一種簡單的方式進行資料探索和報表生成。以下是使用 ydata-profiling 進行資料探索的步驟:

  1. 安裝 ydata-profiling 庫:pip install ydata-profiling
  2. 載入 ydata-profiling 庫:from ydata_profiling import ProfileReport
  3. 載入資料:df = pd.read_csv('adult.csv', na_values=-999)
  4. 生成報表:report = ProfileReport(df)
  5. 顯示報表:report

報表包含了以下幾個部分:

  • Overview:資料概覽
  • Variables:變數描述
from ydata_profiling import ProfileReport

# 載入資料
df = pd.read_csv('adult.csv', na_values=-999)

# 生成報表
report = ProfileReport(df)

# 顯示報表
report

資料集概覽

在資料探索報告中,概覽部分包含三個標籤:概覽、警報和重現。這些標籤提供了有關資料集的統計資訊、相關警報和分析生成時間等詳細內容。

資料集統計資訊

概覽標籤顯示了資料集的基本統計資訊,包括:

  • 資料集中的變數數量(欄位數)
  • 資料集中的觀察數量(列數)
  • 資料集中重複列的數量
  • 資料集中缺失值的數量
  • 數值變數和類別變數的數量

警報

警報標籤顯示了資料集中高相關的變數以及具有零值的單元格數量。這有助於快速識別資料集中可能存在的問題或關聯。

重現

重現標籤顯示了生成報告所需的時間,為使用者提供了分析效率的參考。

變數部分

在變數部分,使用者可以從下拉選單中選擇任何變數,並檢視該變數的統計資訊,例如唯一值的數量、缺失值的數量、變數的大小等。

本文涵蓋了資料探索分析(EDA)的流程、工具以及在機器學習專案生命週期中的重要性。藉由 Pandas、NumPy、Matplotlib 和 Seaborn 等 Python 庫的應用,我們深入剖析了資料清理、探索、視覺化等關鍵步驟,並以實際案例展示瞭如何理解資料分佈、特徵關聯和模式識別。技術限制深析部分指出,資料品質、標籤策略和特徵工程的選擇會顯著影響模型效能,需要根據實際業務情境調整策略。此外,ydata-profiling 等自動化工具雖可提升效率,但仍需人工介入以確保分析的準確性和深度。展望未來,隨著資料量的爆炸式增長和機器學習技術的持續發展,自動化 EDA 工具和更進階的視覺化技術將扮演更重要的角色。玄貓認為,熟練掌握 EDA 技術並結合領域知識,才能真正將資料轉化為有價值的商業洞察,並在競爭激烈的市場中取得優勢。