(點選上方公眾號,可快速關註)
英文:Manish Saraswat,編譯:伯樂線上 – 鄭芸
導語
學習新技能最好的方法是實踐!
本文是幫助 R 使用者增強技能和為資料科學進階而學習 Python (從零開始)。畢竟,R 和 Python 是資料科學從業者必需掌握的兩門最重要的程式語言。
Python 是一門功能強大和多用途的程式語言,在過去幾年取得驚人發展。它過去用於 Web 開發和遊戲開發,現在資料分析和機器學習也要用到它。資料分析和機器學習是 Python 應用上相對新的分支。
作為初學者,學習 Python 來做資料分析是比較痛苦的。為什麼?
在谷歌上搜索“Learn Python ”,你會搜到海量教程,但內容只是關於學習 Python 做 Web 開發應用。那你如何找到方法?
在本教程,我們將探討 Python 在執行資料操作任務上的基礎知識。同時,我們還將對比在 R 上是如何操作的。這種並行比較有助於你將 R 和 Python 上的任務聯絡起來。最後,我們將採用一個資料集來練習我們新掌握的 Python 技能。
註意:閱讀這篇文章時最好具備一定的 R 基礎知識。
為什麼學習 Python(即使你已經懂R)
毫無疑問,R 在它自身的領域是極其強大的,實際上,它最初是用來做統計計算和操作。強大的社群支援使得初學者可以很快掌握 R .
但是, Python 正迎頭趕上,無論成熟公司還是初創公司對Python 的接受程度要遠遠大於 R 。
根據 indeed.com 提供的資料(2016年1月至2016年12月),“用 Python 做機器學習”的招聘資訊數量要比“用 R 做機器學習” 增長快得多(約 123%)。這是因為:
-
Python 以更好的方式支援機器學習改寫的全部範圍。
-
Python 不僅支援模型構建,而且支援模型部署。
-
相比 R , Python 支援多種強大的諸如 keras、convnet,、theano 和 tensorflow 深度學習庫。
-
Python的庫相對獨立,每個庫都擁有資料科學工作者所需要的所有函式。你不需要像在 R 中一樣在各種包之間來回查詢一個函式。
理解 Python 資料型別和結構(與 R 對比)
程式語言是基於它的變數和資料型別來理解複雜的資料集。是的,假設你有一個 100 萬行,50 列的資料集。程式語言會如何理解這些資料呢?
基本上,R 和 Python 都有未定義資料型別。獨立和非獨立變數都有著不同的資料型別。直譯器根據資料型別分配記憶體。Python 支援的資料型別包括:
-
數值型(Numbers)——儲存數值。這些數值可以儲存為4種型別:整型,長整型,浮點型,複數型。讓我們分別理解。
-
整型(Integer)—— 它指的是整數型別,比如 10 、13 、91、102 等。相當於 R 中的整型(integer)。
-
長整型(Long)——它指的是用八進位制或者十六進製表示的長整數,在 R 中,用 64 位包讀取十六進位制值。
-
浮點型(Float)——指的是小數值,比如 1.23 , 9.89 等, R 中浮點數包含在數值型(numeric)。
-
複數型(Complex)——它指的是複數值,比如 as 2 + 3i, 5i 等。不過這種資料型別在資料中不太常見。
布林型(Boolean)——布林型只儲存兩個值(True 和 False)。在 R 中,它可以儲存為因子(factor)型別或字元(character)型別。R 和 Python 的布林值之間存在著微小的差別。在 R 中,布林型儲存為 TRUE 和 FALSE。在 Python 中,它們儲存為 True 和 False 。字母的情況有差異。
字串(Strings)——它儲存文字(字元)資料,如“elephant,”lotus,”等,相當於R的字元型(character)。
串列——它與 R 的串列資料型別相同。它能夠儲存多種變數型別的值,如字串、整數、布林值等。
元組—— R 中沒有元組型別,把元組看成是 R 中的向量,它的值不能改變。即它是不可變的。
字典—— 它提供支援 key-value 對的二維結構。簡而言之,把鍵(key )看作是列名,對(pair)看作是列值。
因為 R 是統計計算語言,所有運算元據和讀取變數的函式都是固有的。而另一方面,Python 資料的分析、處理、視覺化函式都是從外部庫呼叫。Python 有多個用於資料操作和機器學習的庫。以下列舉最重要的幾個:
-
Numpy——在Python中它用於進行數值計算。它提供了龐大的諸如線性代數、統計等的數學函式庫。它主要用於建立陣列。在 R 中,把陣列看作串列。它包含一個類(數字或字串或布林)或多個類。它可以是一維或多維的。
-
Scipy ——在Python中它用於進行科學計算。
-
Matplotlib——在 Python 中它用於進行資料視覺化。在 R,我們使用著名的 ggplot2 庫。
-
Pandas ——對於資料處理任務它極其強大。在 R 中,我們使用 dplyr,data.table 等包。
-
Scikit Learn—— 它是實現機器學習演演算法的強大工具。實際上,它也是 python 中用來做機器學習的最好工具。它包含建模所需的所有函式。
在某種程度上,對於資料科學工作者來說,最主要的是要掌握上面提到的 Python 庫。但人們正開始使用的高階 Python 庫有太多。因此,為了實際標的,你應該記住以下這些:
-
陣列(Array)——這與 R 的串列類似。它可以是多維的。它可以包含相同或多個類的資料。在多個類的情況下,會發生強制型別轉換。
-
串列(List)—— 相當於 R 中的串列。
-
資料框(Data Frame)——它是一個包含多個串列的二維結構。R中有內建函式 data.frame,Python則從 pandas庫中呼叫 Dataframe 函式。
-
矩陣(Matrix)——它是二維(或多維)結構,包含同一類(或多個類)的所有值。把矩陣看成是向量的二維版。在R中,我們使用 matrix 函式。在Python中,我們使用 numpy.column_stack 函式。
到這裡,我希望你已經明白了R和Python中資料型別和資料結構的基本知識。現在,讓我們開始應用它們。
用Python寫程式碼(對比R)
我們現在來使用在前面部分學到的知識,明白它們實際的含義。但在此之前,你要先透過Anaconda的 jupyter notebook 安裝 Python(之前稱為ipython notebook)。我希望你已經在電腦上安裝了 R Studio 。
1. 建立串列
在 R 中,建立串列使用的是 list 函式
my_list list (‘monday’,‘specter’,24,TRUE)
typeof(my_list)
[1] “list”
在 Python 中,建立串列使用的是方括號 [ ] 。
my_list = [‘monday’,‘specter’,24,True]
type(my_list)
list
在 pandas 庫中也可以得到相同的輸出,在 pandas 中,串列稱為序列。在 Python 中安裝 pandas,寫下:
#importing pandas library as pd notation (you can use any notation) #呼叫 pandas 庫
import pandas as pd
pd_list = pd.Series(my_list)
pd_list
0 monday
1 specter
2 24
3 True
數字(0,1,2,3)表示陣列索引。你註意到什麼了嗎?Python 索引是從 0 開始,而 R 的索引從 1 開始。讓我們繼續瞭解串列子集在 R 和 Python 的區別。
#create a list # 建立一個串列
new_list list(roll_number = 1:10, Start_Name = LETTERS[1:10])
把 new_list 看作一列火車。這列火車有兩個名為 roll_number 和 Start_Name 的車廂 。在每個車廂中,有10人。所以,在串列構建子集中,我們可以提取車廂的值,車廂中的人等,等等。
#extract first coach information #提取第一個車廂資訊
new_list[1] #or
df[‘roll_number’]
$roll_number
[1] 1 2 3 4 5 6 7 8 9 10
#extract only people sitting in first coach #提取坐在第一個車廂中的人
new_list[[1]] #or
df$roll_number
#[1] 1 2 3 4 5 6 7 8 9 10
如果你查詢一下 new_list [ 1 ] 的型別,你會發現它是一個串列,而 new_list [ [ 1 ] ] 型別是一個字元。類似地,在 Python 中,你可以提取串列元件:
#create a new list #建立一個新串列
new_list = pd.Series({‘Roll_number’ : range(1,10),
‘Start_Name’ : map(chr, range(65,70))})
Roll_number [1, 2, 3, 4, 5, 6, 7, 8, 9]
Start_Name [A, B, C, D, E]
dtype: object
#extracting first coach #提取第一個車廂
new_list[[‘Roll_number’]] #or
new_list[[0]]
Roll_number [1, 2, 3, 4, 5, 6, 7, 8, 9]
dtype: object
#extract people sitting in first coach #提取坐在第一個車廂中的人
new_list[‘Roll_number’] #or
new_list.Roll_number
[1, 2, 3, 4, 5, 6, 7, 8, 9]
R 和 Python 的串列索引有一個讓人困惑的區別。如果你註意到在 R 中 [[ ]] 表示獲取車廂的元素, 然而[[ ]] 在 Python 中表示獲取車廂本身。
2. Matrix 矩陣
矩陣是由向量(或陣列)組合而成的二維結構。一般來說,矩陣包含同一類的元素。然而,即使你混合不同的類(字串,布林,數字等)中的元素,它仍會執行。R 和 Python 在矩陣中構建子集的方法很相似,除了索引編號。重申,Python 索引編號從 0 開始,R 索引編號從 1 開始。
在 R 中,矩陣可以這麼建立:
my_mat matrix(1:10,nrow = 5)
my_mat
#to select first row #選取第一行
my_mat[1,]
#to select second column #選取第二列
my_mat[,2]
在Python中,我們會藉助 NumPy 陣列建立一個矩陣。因此,我們先要載入 NumPy 庫。
import numpy as np
a=np.array(range(10,15))
b=np.array(range(20,25))
c=np.array(range(30,35))
my_mat = np.column_stack([a,b,c])
#to select first row #選取第一行
my_mat[0,]
#to select second column #選取第二列
my_mat[:,1]
3. 資料框(Data Frames)
資料框為從多來源收集而來的鬆散的資料提供了一個急需的骨架。它類似電子錶格的結構給資料科學工作者提供了一個很好的圖片來展示資料集是什麼樣子。在R中,我們使用 data.frame() 函式建立一個資料框。
data_set data.frame(Name = c(“Sam”,“Paul”,“Tracy”,“Peter”),
Hair_Colour = c(“Brown”,“White”,“Black”,“Black”),
Score = c(45,89,34,39))
那麼,我們知道一個資料框是由向量(串列)的組合建立的。在 Python 中建立資料框,我們將建立一個字典(陣列的組合),並且在 pandas 庫的 Dataframe()函式中附上字典。
data_set = pd.DataFrame({‘Name’ : [“Sam”,“Paul”,“Tracy”,“Peter”],
‘Hair_Colour’ : [“Brown”,“White”,“Black”,“Black”],
‘Score’ : [45,89,34,39]})
現在,讓我們看下操作 dataframe 最關鍵的部分,構建子集。實際上,大部分資料操作都包含從各個可能的角度切割資料框。讓我們逐個看下任務:
#select first column in R #在 R 中選取第一行
data_set$Name # or
data_set[[“Name]] #or
data_set[1]
#select first column in Python #在 Python 中選取第一列
data_set[‘Name’] #or
data_set.Name #or
data_set[[0]]
#select multiple columns in R # 在 R 中選取多列
data_set[c(‘Name’,‘Hair_Colour’)] #or
data_set[,c(‘Name’,‘Hair_Colour’)]
#select multiple columns in Python #在 Python 中選取多行
data_set[[‘Name’,‘Hair_Colour’]] #or
data_set.loc[:,[‘Name’,‘Hair_Colour’]]
.loc 函式用於基於標簽的索引
到這裡我們大致明白了 R 和 Python 中的資料型別、結構和格式。讓我們用一個資料集來探索 python 中資料的其他面。
用一個資料集實踐 Python
強大的 scikit-learn 庫包含一個內建的資料集庫。為了我們實踐的目的,我們將採用波士頓住房資料集(Boston housing data set)。做資料分析時,它是一個很流行的資料集。
#import libraries #呼叫庫
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
#store in a variable #儲存在一個變數中
boston = load_boston()
變數boston是一個字典。回顧一下,字典是key-value對的組合,讓我看下鍵(key)的資訊:
boston.keys()
[‘data’, ‘feature_names’, ‘DESCR’, ‘target’]
現在我們知道我們需要的資料集駐留在key資料中。我們也看到,對於功能名稱有一個單獨的key。我認為資料集不會分配列名。讓我們來檢查下我們要處理的列名。
print(boston[‘feature_names’])
[‘CRIM’ ‘ZN’ ‘INDUS’ ‘CHAS’ ‘NOX’ ‘RM’ ‘AGE’ ‘DIS’ ‘RAD’ ‘TAX’ ‘PTRATIO’ ‘B’ ‘LSTAT’]
你能明白這些名稱嗎?我也不明白。現在,讓我們檢查下資料描述和理解每個變數的意義。
print(boston[‘DESCR’])
這個資料集有506行,13列。它包含幫助確定波士頓房價的多種特徵。現在,讓我們建立一個資料框:
bos_data = pd.DataFrame(boston[‘data’])
類似於 R , python 也有一個 head()函式讀入資料:
bos_data.head()
輸出顯示資料集沒有列名(如上所述)。將列名分配到資料框中是容易的。
bos_data.columns = boston[‘feature_names’]
bos_data.head()
就像R中的 dim() 函式,Python 有檢查資料集維數的 shape() 函式。為得到資料集的統計彙總,我們寫下:
bos_data.describe()
它顯示了資料中列的統計彙總。讓我們快速探索這個資料的其他方面。
#get first 10 rows #得到第一10行
bos_data.iloc[:10]
#select first 5 columns #選取第一個5列
bos_data.loc[:,‘CRIM’:‘NOX’] #or
bos_data.iloc[:,:5]
#filter columns based on a condition #基於條件篩選列
bos_data.query(“CRIM > 0.05 & CHAS == 0”)
#sample the data set #構建資料集樣本
bos_data.sample(n=10)
#sort values – default is ascending #分類上升的預設值
bos_data.sort_values([‘CRIM’]).head() #or
bos_data.sort_values([‘CRIM’],ascending=False).head()
#rename a column #重新命名一個列
bos_data.rename(columns={‘CRIM’ : ‘CRIM_NEW’})
#find mean of selected columns #查詢選定列的平均值
bos_data[[‘ZN’,‘RM’]].mean()
#transform a numeric data into categorical #將數字資料轉換成分類
bos_data[‘ZN_Cat’] = pd.cut(bos_data[‘ZN’],bins=5,labels=[‘a’,‘b’,‘c’,‘d’,‘e’])
#calculate the mean age for ZN_Cat variable #計算ZN_Cat變數的平均年齡
bos_data.groupby(‘ZN_Cat’)[‘AGE’].sum()
此外,Python 還允許我們建立透視表。是的! 就像 MS Excel 或任何其他電子錶格軟體,你可以建立一個資料透視表,更密切地瞭解資料。不幸的是,在 R 中建立一個資料透視表是一個相當複雜的過程。在 Python 中,一個透視表需要行名、列名和要計算的值。如果我們不透過任何列名稱,得到的結果只會像你使用 groupby 函式得到的。因此,讓我們建立另一個分類變數。
#create a new categorical variable #建立一個新的分類變數
bos_data[‘NEW_AGE’] = pd.cut(bos_data[‘AGE’],bins=3,labels=[‘Young’,‘Old’,‘Very_Old’])
#create a pivot table calculating mean age per ZN_Cat variable #建立一個透視表計算每個 ZN_Cat 變數的年齡
bos_data.pivot_table(values=‘DIS’,index=‘ZN_Cat’,columns= ‘NEW_AGE’,aggfunc=‘mean’)
這隻是冰山一角。下一步怎麼做?就像我們使用波士頓住房資料集,現在你可以試試安德森鳶尾花卉資料集(iris data)。它在sklearn_datasets 庫是可用的。嘗試深入探討。記住,你練習越多,花費的時間越多,你就會變得越好。
總結
總體來說,學習這兩門語言會給你足夠的自信去處理任何型別的資料集。事實上,學習python最好的一面是它有完善的檔案可以用在numpy,pandas,scikit learn 庫,這足夠幫你跨越所有最初的障礙。
I這篇文章,我們主要接觸了 python 的基礎知識。還有很長的路要走。下週,我們將在 Python 中具體學習資料操作。之後,我們將學習資料視覺化和強大的機器學習庫。
在實踐這門教程的時候,請在下方分享你的經歷、建議和問題。
看完本文有收穫?請轉發分享給更多人
關註「資料分析與開發」,提升資料技能