iT邦幫忙

2021 iThome 鐵人賽

DAY 3
1
AI & Data

全民瘋AI系列2.0系列 第 3

[Day 3] 你真了解資料嗎?試試看視覺化分析吧!

你真了解資料嗎?試試看視覺化分析吧!

今日學習目標

  • 探索式分析 (EDA)
    • 聊聊何謂 EDA,為何要做數據分析?
  • 撰寫第一支 EDA 程式
    • 透過鳶尾花 (iris) 資料集,來查看資料的分佈狀態

探索式分析 (EDA)

探索式資料分析 (Exploratory Data Analysis, EDA),主要概念是利用數據統計的方式視覺化資料。透過資料的探索式分析可以查看資料集當中每個特徵彼此的重要程度以及其資料分布狀況,有良好的數據分析習慣能夠幫助你更了解資料集的特性。另外做 EDA 的好處是可以從各種面向先了解資料的狀況,以利後續的模型分析。

EDA 必要的套件

  • 資料處理 – Pandas, Numpy
    • Pandas:Python 表格資料處理的重要工具
    • Numpy:針對多維陣列的平行運算進行優化的強大函式庫
  • 繪圖相關 – Matplotlib, Seaborn
    • Matplotlib:Python 最常被使用到的繪圖套件
    • Seaborn:以 matplotlib 為底層的高階繪圖套件

https://ithelp.ithome.com.tw/upload/images/20210921/20107247236rUvmpQD.png

https://ithelp.ithome.com.tw/upload/images/20210915/20107247oCpceXX17n.png

鳶尾花朵資料集一覽

此資料集總共有4個輸入特徵。分別為花萼長度、花萼寬度、花瓣長度與花瓣寬度。輸出特徵為花朵的品種,共有三種類別分別為 0: iris setosa、 1: iris versicolor、 2: iris virginica。

https://ithelp.ithome.com.tw/upload/images/20210921/20107247iLRfe85X1I.png

載入必要套件

首先我們載入資料探索式分析所需的套件。分別有進行數據處理的函式庫的
pandas、高階大量的維度陣列與矩陣運算的 numpy、處理資料視覺化的繪圖庫 matplotlibseaborn。最後一個是資料集來源,此系列範例我們採用 Sklearn 所提供的鳶尾花分類的資料集。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_iris

Sklearn Toy datasets

Sklearn 套件中提供了七個快速入門的 Toy datasets 很推薦初學者可以載入來玩玩看,並且練習做資料探索與建模。每一個資料集呼叫的方法非常簡單。以鳶尾花朵資料集為例,我們可以透過 API 取得輸入與輸出。

from sklearn.datasets import load_iris

iris = load_iris()
# 輸入特徵
X = iris.data
# 輸出特徵
y = iris.target

Sklearn 提供了許多 API 方法可以呼叫:

  • data: 取得輸入特徵
  • target: 取得輸出特徵
  • feature_names: 取得輸入特徵的名稱
  • target_names: 取得輸出的類別標籤(分類資料集)
  • DESCR: 資料集詳細描述

如果想試試其他的資料集可以參考:

參考

載入資料集

首先我們載入鳶尾花朵資料集。為了方便分析我們將 numpy 格式的資料轉換成 DataFrame 的格式進行資料探索。因為透過 Pandas 的 DataFrame 格式我們更能用表格的形式觀察資料。

iris = load_iris()
df_data = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
                     columns= ['SepalLengthCm','SepalWidthCm','PetalLengthCm','PetalWidthCm','Species'])
df_data

https://ithelp.ithome.com.tw/upload/images/20210921/201072473e2MkOaryI.png

直方圖

直方圖是一種對數據分布情況的圖形表示,是一種二維統計圖表。我們可以直接呼叫 Pandas 內建函式 hist() 進行直方圖分析。其中我們可以設定 bins(箱數),預設值為 10。如果設定的輸量越大,其代表需要分割的精度越細。通常取一個適當的箱數即可觀察該特徵在資料集中的分佈情況。藉由直方圖我們可以知道每個值域的分佈大小與數量。我們也能發現輸出項的類別共有三個,並且這三個類別的數量都剛好各有 50 筆資料。我們也能得知這一份資料集的輸出類別是一個非常均勻的資料。

#直方圖 histograms
df_data.hist(alpha=0.6,layout=(3,3), figsize=(12, 8), bins=10) 
plt.tight_layout()
plt.show()

https://ithelp.ithome.com.tw/upload/images/20210921/20107247XZ1bwza53a.png

我們也可以透過 Seaborn 的 histplot 做出更詳細的直方圖分析。並利用和密度估計 kde=True 來查看每個特徵的分佈狀況。

fig, axes = plt.subplots(nrows=1,ncols=4)
fig.set_size_inches(15, 4)
sns.histplot(df_data["SepalLengthCm"][:],ax=axes[0], kde=True)
sns.histplot(df_data["SepalWidthCm"][:],ax=axes[1], kde=True)
sns.histplot(df_data["PetalLengthCm"][:],ax=axes[2], kde=True)
sns.histplot(df_data["PetalWidthCm"][:],ax=axes[3], kde=True)

https://ithelp.ithome.com.tw/upload/images/20210921/20107247JzMbSlQZKk.png

核密度估計

核密度估計分爲兩部分,分別有對角線部分和非對角線部分。在對角線部分是以核密度估計圖(Kernel Density Estimation)的方式呈現,也就是用來看某一個特徵的分佈情況,x軸對應著該特徵的數值,y軸對應著該特徵的密度也就是特徵出現的頻率。在非對角線的部分為兩個特徵之間分佈的關聯散點圖。將任意兩個特徵進行配對,以其中一個爲橫座標,另一個爲縱座標,將所有的數據點繪製在圖上,用來衡量兩個變量的關聯程度。

使用 Pandas 繪製:

from pandas.plotting import scatter_matrix
scatter_matrix( df_data,figsize=(10, 10),color='b',diagonal='kde')

https://ithelp.ithome.com.tw/upload/images/20210921/20107247mbBZLPPUCQ.png

使用 Seaborn 繪製:

sns.pairplot(df_data, hue="Species", height=2, diag_kind="kde")

https://ithelp.ithome.com.tw/upload/images/20210921/20107247wGY0L1Dw63.png

關聯分析

透過 pandas 的 corr() 函式可以快速的計算每個特徵間的彼此關聯程度。其區間值為-1~1之間,數字越大代表關聯程度正相關越高。相反的當負的程度很高我們可以解釋這兩個特徵之間是有很高的負
關聯性。

# correlation 計算
corr = df_data[['SepalLengthCm','SepalWidthCm','PetalLengthCm','PetalWidthCm','Species']].corr()
plt.figure(figsize=(8,8))
sns.heatmap(corr, square=True, annot=True, cmap="RdBu_r")

https://ithelp.ithome.com.tw/upload/images/20210921/20107247JQ2qsxxhtX.png

散佈圖

透過散佈圖我們可以從二維的平面上觀察兩兩特徵間彼此的分佈狀況。如果該特徵重要程度越高,群聚的效果會更加顯著。

sns.lmplot("SepalLengthCm", "SepalWidthCm", hue='Species', data=df_data, fit_reg=False, legend=False)
plt.legend(title='Species', loc='upper right', labels=['Iris-Setosa', 'Iris-Versicolour', 'Iris-Virginica'])

https://ithelp.ithome.com.tw/upload/images/20210921/20107247g6oQLsQfZ9.png

箱形圖

透過箱形圖可以分析每個特徵的分布狀況以及是否有離群值。我們利用箱形圖來表示四分位數來觀察數據分散情況。箱形的兩端為第一個四分位數涵蓋25%之資料(Q1)與第三個四分位數涵蓋75%之資料(Q3),而箱形圖的中間線為中位數顯示涵蓋前50%資料之位置。箱形上虛線的端點為極大值,箱型下虛線的點為極小值。

https://ithelp.ithome.com.tw/upload/images/20210921/201072479jhmpqaso1.png

今天所介紹的資料視覺化都是很基礎的資料探索方式。只要簡單的幾個步驟就能幫助你了解收集的資料,並利於後面資料處理及建模。未來我再帶給各位一些不錯的資料視覺套件,幫助你對資料逕行更多的視覺分析。

本系列教學內容及範例程式都可以從我的 GitHub 取得!


上一篇
[Day 2] 快來探索AI的世界
下一篇
[Day 4] 咱們一起做資料清理和前處理
系列文
全民瘋AI系列2.031

尚未有邦友留言

立即登入留言