人生不時一堆巧合,就當我獲得些許關於「數據分析」的學習資源時,當下只將資源丟著,沒想到過了不久,被指導教授要求要帶學弟們參加數據分析的比賽,身為學長的我數據分析經驗為零要如何帶著他們一同去競賽,因此不得不跳數據分析的坑,今後可能也會像這篇文章一樣,偶爾寫一些跟數據分析有關的紀錄或心得吧。
前言
其實手中的學習資源一直都不少,但真的沒有太多心力花在上面,包含資安、各種程式語言、架構等…,今天要談的主題其實不久前就有打算要接觸,但談數據分析,就得跟他關係要好的數學有一定基礎,對於微積分差點被當四年的我來說,根本是一場惡夢…
本文中不會有任何跟 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,以下範例為三個成績分別為80
、70
、82
,分別的成績權重為0.3
、0.4
、0.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 提供了三種方法。
- np.random.rand()
rand(n)
來產生 n 個 0 到 1 區間的亂數。 - np.random.randn()
randn(n)
來產生 n 個平均值為 0 標準差為 1 的亂數 - 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 方法,可以直接做使用。
- np.sin()
- np.cos()
- np.tan()
- 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()
函數額外補充:
- 參數的最後
'o'
表示劃出的點以字串'o'
來呈現,也可以取代成'x'
。 - 也可以使用
lw=size
來調整話線的寬度 (lw = line weight)。
scatter
scatter 與 plot 雷同,但劃的不是線,而是個別的點。
額外補充:
- s = size 可以控制點的大小。
- c = color 可以控制點的顏色。