[Python] 跌入數據分析的坑 – 談談起手式 NumPy (一)

人生不時一堆巧合,就當我獲得些許關於「數據分析」的學習資源時,當下只將資源丟著,沒想到過了不久,被指導教授要求要帶學弟們參加數據分析的比賽,身為學長的我數據分析經驗為零要如何帶著他們一同去競賽,因此不得不跳數據分析的坑,今後可能也會像這篇文章一樣,偶爾寫一些跟數據分析有關的紀錄或心得吧。

前言

其實手中的學習資源一直都不少,但真的沒有太多心力花在上面,包含資安、各種程式語言、架構等…,今天要談的主題其實不久前就有打算要接觸,但談數據分析,就得跟他關係要好的數學有一定基礎,對於微積分差點被當四年的我來說,根本是一場惡夢…

本文中不會有任何跟 Python 基礎有關說明或講解,並且簡單說明在數居分析領域常用的函數及使用方法,多半是以自己的角度記錄下來的筆記。

筆記進度到第四週。

第五週比較可以參考: [Python] 跌入數據分析的坑 – 談談起手式 Pandas (二)

資源

本文以蔡炎龍老師的「成為python數據分析達人的第一課(自學課程)」為主,課程是政大磨課師線上課程,內容由淺入深,很適合跟我一樣跳坑的人一同學習, 即使對 Python 不熟,也不用害怕,課程會帶入 Python 基礎,接著引領到數據分析領域。
成為python數據分析達人的第一課(自學課程): 傳送門

數據分析起手式

在政大磨課師課程中,炎龍老師不斷強調的起手式就當筆記開頭了,如下。

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

此環境需要在 IPython 中執行,其中%matplotlib inline為 ipython 中的 Miagic Function,可以讓程式碼省略掉 plt.show() 的部分,並且直接圖示輸出。

但經過測試後,現在 IPython 在沒有加上%matplotlib inline的情況下好像沒有影響,下圖為筆者版本,所以%matplotlib inline 應該是要加不加皆可。

pandas 為第五週的課程,會在下一個章節中說明,import 故為起手式的一部份,先行加上了,但此章節不會說明任何有關 pandas 的內容。

matplotlib

matplotlib 是 Python 中的 Library,可用於將 NumPy 數值視覺化。

plot

畫圖透過 matplotlib.pyplot 的套件作用,其 import 方法在上述起手式已經談過,複製貼上即可(?

使用方法淺顯易懂,透過 plt.plot() 來畫圖,plot可以接受兩個 list,分別是 x, y 軸,如果僅有一個 list 當輸入,數值就會被當作 y 軸,如下圖。

有 x, y 兩個 list 如下。

NumPy

炎龍老師有提到,在做數據分析的話,盡可能不要使用到 for loop,原因在於數據量巨大,應該採用更有效率的方式進行分析、運算,其中 NumPy 是 python 中的 Library,用於計算陣列(Array)、矩陣的好幫手。

在此需要注意的是 NumPy 的 Array 與 Python 的 List 資料型態並不相同,並無法直接使用 Python 的 List 來直接進行運算,所以須透過 NumPy 來處理。

安裝指令如下:

python -m pip install numpy

補充說明: 為何不直接使用 pip install,因為我在 Windows CLI 的環境下使用 pip install \<package> 會發生錯誤,錯誤訊息如下。

PS C:\Users\MksYi> pythom -m pip install pandas
Fatal error in launcher: Unable to create process using '"'

import 指令:

import numpy as np

To np.Array

np.Array 接受 Python 的 List、Tuple 兩種資料型態,直接轉為 np.Array,以下範例為三個成績分別為807082,分別的成績權重為0.30.40.3,透過 NumPy 計算權重。

如果沒有做 np.Array 的資料轉型,要做到 List 或 Tuple 的數學運算會變得相當複雜,透過 NumPy 就變得相當容易。

sum

透過 sum() 可以直接將 np.Array 中的數值做內積。

作用原理如下

g.sum() = g[0] + g[1] + ... g[n]

dot

假設資料便得多筆,現在班上多了幾位同學,數據從一維陣列變成二維陣列,如果還要個別取出來成上權重會變得相當麻煩,藉此透過 dot 來簡化運算。

作用原理如下:

g[0] = grades[0][0] * weights[0] + grades[0][1] * weights[1] + grades[0][2] * weights[2]  
g[1] = grades[1][0] * weights[0] + grades[1][1] * weights[1] + grades[1][2] * weights[2]  
g[2] = grades[2][0] * weights[0] + grades[2][1] * weights[1] + grades[2][2] * weights[2]  
...
g[n] = grades[n][0] * weights[0] + grades[n][1] * weights[1] + grades[n][2] * weights[2] 

Random

Python 的 Library 中的 random 與 NumPy 的 random 並不相同,在此需要特別注意,
NumPy 的 random 提供了三種方法。

  1. np.random.rand()
    rand(n) 來產生 n 個 0 到 1 區間的亂數。
  2. np.random.randn()
    randn(n) 來產生 n 個平均值為 0 標準差為 1 的亂數
  3. np.random.randint()
    randint(x, y, size=n) 與 Python 原生 Random 雷同,產生 n 個 x 到 y 的亂數,但資料型態為np.Array
    此外還有亂數取值的部分也稍有不同,下列例圖中,上方為 np.random,下方 For loop 為使用原生 random 方法。

    得到以下結論: np.random[1-9] ; random:[1-10]

linspace

np.linspace(Stert, End, Size) 這個函數相當方便,可以自動產生 Stert 到 End 的點,如下圖就是產生linspace函數產生 100 個從 10 到 1000 的點。

三角函數

NumPy 也提供 Trigonometric Functions 方法,可以直接做使用。

  1. np.sin()
  2. np.cos()
  3. np.tan()
  4. np.sinc()

以 sin、cose 做為範例,首先透過 np.linspace(0, 10, 1000) 產生 1000 個從 0 到 10 之間的點,並透過plot()劃出 sin 與 cos 曲線,其中不同的 plot() 會自動標出不同顏色。

數據分析曲線

Array 篩選法

np.Array 提供了很多對於陣列的處理方法,這邊介紹的篩選法,可以幫助我們快速整理資料,例如要挑選出陣列中小於 0 的資料,可以參考下圖。

同時我們也可以用來話圖,標出點的數值大於或小於多少的點。

假如要找出所有 y 大於 0 的點,則使用 y[y>0],至於為什麼連 x 都要需要補上 [y>0],原因在於使用 plot() 函數,如果同時使用 x 與 y,點的位置必須相等,若 x 沒有加上,便會造成 x 有 500 個點; y 則從 500 個點中刪去小於 0 的點,造成不對等。

plot()函數額外補充:

  1. 參數的最後 'o' 表示劃出的點以字串 'o' 來呈現,也可以取代成 'x'
  2. 也可以使用 lw=size 來調整話線的寬度 (lw = line weight)。

scatter

scatter 與 plot 雷同,但劃的不是線,而是個別的點。

額外補充:

  1. s = size 可以控制點的大小。
  2. c = color 可以控制點的顏色。


發佈留言

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料