Python數據分析與挖掘實戰學習筆記

Chapter2 Python數據分析工具

序言

 Python本身的數據分析功能不強,需要安裝一些第三方擴展庫來增強它的能力。
 如果安裝了Anaconda發行版,那麼它自帶了以下庫:Numpu、Scipy、Matplotlib、Pandas、Scikit-Learn。
 本章主要簡單介紹這些庫,在後面的章節中,會通過各種案例對這些庫的使用進行更深入的說明。廢話不多說,開始我的表演了!

1. Numpy

 Python並沒有提供數組功能。雖然列表可以完成基本的數組功能,但它不是真正的數組,而在數據量較大時,使用列表的速度就會慢得讓人難以接受。爲此,Numpy提供了真正的數組功能,以及對數據進行快速處理的函數。Numpy還是很多高級的擴展庫的依賴庫,後面章節介紹的Scipy、Matplotlib、Pandas都依賴於它。值得強調的是,Numpy內置函數處理數據的速度是C語言級別的,因此在編寫程序的時候,應當儘量使用它的內置函數,避免出現效率瓶頸的現象。
 在Windows中,Numpy的安裝跟普通的第三方庫安裝一樣:

pip install numpy

也可自行下載源代碼,然後用:

python setup.py install  # 安裝

 在Linux下上述方面也是可行的。此外,很多Linux發行版的軟件源中都有Python常見的庫,因此還可以通過Linux自帶的軟件管理器進行安裝,如在Ubuntu下可以用:

sudo apt-get install python-numpy

安裝。安裝完成以後,就可以進行Numpy的基本操作了。

#  Numpy-----提供數組支持,以及對數據進行快速處理的函數
import numpy as np
a = np.array([2, 0, 2, 0])  # 創建數組
print(a)  # 輸出數組
print(a[:3])  # 引用前三個數字(切片)
print(a.min())  # 輸出a的最小值
a.sort()  # 將a的元素從小到大排序,此操作直接修改a, 因此這時候a爲[0, 0, 2, 2]
print(a)
b = np.array([[1, 2, 3], [4, 5, 6]])  # 創建二維數組
print(b*b)  # 輸出數組的平方陣,即[[1, 4, 9],[16, 25, 36]]

[2 0 2 0] # 輸出數組
[2 0 2] # 引用前三個數字(切片)
0 # 輸出a的最小值
[0 0 2 2] # 將a的元素從小到大排序
[[ 1 4 9]
[16 25 36]] # 輸出數組的平方陣

2.Scipy

 如果說Numpy讓Python有了Matlab的味道,那麼Scipy就讓Python真正地成爲了半個Matlab了。Numpy提供了多維數組的功能,但它只是一般的數組,並不是矩陣。例如,當兩個數組相乘時,只是對應的元素相乘,而不是矩陣乘法。Scipy提供了真正的矩陣,以及大量基於矩陣運算的對象和函數。
 Scipy包含的功能有最優化、線性代數、積分、插值、擬合、特殊函數、快速傅里葉變換、信號處理和圖像處理、常微分方程求解和其他科學於工程中常用的計算,顯然,這些功能都是挖掘於建模必備的。
 同樣,安裝Scipy。安裝好以後,進行簡單的適用。

# 求解非線性方程組 2x1 - x2^2 = 1, x1^2 - x2 = 2
from scipy.optimize import fsolve  # 導入求解方程組的函數
def f(x):  # 定義要求解的方程組
    x1 = x[0]
    x2 = x[1]
    return [2*x1 - x2**2 - 1, x1**2 - x2 - 2]
result = fsolve(f, [1, 1])  # 輸入初值[1, 1]並求解
print(result)  # 輸出結果,爲array([1.91963957, 1.68501606])
 # 數值積分
from scipy import integrate  # 導入積分函數
def g(x):  # 定義被積函數
    return (1-x**2) ** 0.5
pi_2, err = integrate.quad(g, -1, 1)  # 積分結果和誤差
print(pi_2 * 2)  # 由微積分知識知道積分結果爲圓周率的一半

[1.91963957 1.68501606]
3.1415926535897967

3.Matplotlib

 不論是數據挖掘還是數學建模,都免不了數據可視化的問題。對於Python來說,Matplotlib時最著名的繪圖庫,它主要用於二維繪圖,當然它也可以進行簡單的三維繪圖。它不但提供了一整套和Matlab相似但更爲豐富的命令,讓我們可以非常快捷地使用Python可視化數據,而且允許輸出達到出版質量的多種圖像格式。
 Matplotlib的安裝並沒有什麼特別之處,可以通過pip install matplotlib安裝或者自行下載源代碼安裝,在Ubuntu下也可以用類似的。

sudo apt-get install python-matplotlib

安裝。Matplotlib的上級依賴庫相對較多,手動安裝的時候,需要逐一把這些依賴庫都安裝好。安裝完成以後就可以牛刀小試了,下面師益簡單的作圖的例子,它基本包含了Matplotlib作圖的關鍵要素。

import numpy as np
import matplotlib.pyplot as plt  # 導入Matplotlib
x = np.linspace(0, 10, 1000)  # 作圖的變量自變量,生成0到10以內的1000個數字。
y = np.sin(x) + 1  # 因變量y
z = np.cos(x**2) + 1  # 因變量z
plt.figure(figsize=(8, 4))   # 設置圖像大小
plt.plot(x, y, label= '$\sin x+1$', color='red', linewidth=2)  # 作圖,設置標籤、線條顏色、線條大小
plt.plot(x, z, 'b--', label='$\cos x^2+1$')  # 作圖,設置標籤、線條類型
plt.xlabel('Time(s) ')  # x軸名稱
plt.ylabel('Volt')  # y軸名稱
plt.title('A Simple Example')  # 標題
plt.ylim(0, 2.2)  # 顯示的y軸範圍
plt.legend()  # 顯示圖例
plt.show()  # 顯示作圖結果

結果:
Matplotlib基本作圖例子

4. Pandas

 終於談到數據挖掘的主力工具-------Pandas了。Pandas時Python下最強大的數據分析和探索工具。它包含高級的數據結構和精巧的工具,使得在Python中處理數據非常快速和簡單。Pandas構建在Numpy之上,它使得以Numpy爲中心的應用很容易使用。Pandas的名稱來自於面板數據(Panel Data)和Python數據分析(Data Analysis),它最初被作爲金融數據分析工具而開發出來的。
 Pandas的數據結構時Series和DataFrame。顧名思義,Series就是序列,類似一維數組;DataFrame則是相當於一張二維的表格,類似於二維數組,它的每一列都是一個Series。爲了定位Series中的元素,Pandas提供了Index對象,每個Series都會帶有一個對應的Index,用來標記不同的元素,Index的內容不一定是數字,也可以是字母、中文等,它類似於SQL中的主鍵。

# Pandas支持類似於SQL的數據增、刪、查、改,並且帶有豐富的數據處理函數;
# 支持時間序列分析功能;支持靈活處理缺失數據等。
import pandas as pd
s = pd.Series([1, 2, 3], index=['a', 'b', 'c'])  # 創建一個序列s
d = pd.DataFrame([[1, 2, 3], [4, 5, 6]], columns=['a', 'b', 'c'])  # 創建一個表
d2 = pd.DataFrame(s)  # 也可以用已有的序列來創建表格
print(d2)
print(d.head())  # 預覽前五行數據
print(d.describe())

0
a 1
b 2
c 3

a b c
0 1 2 3
1 4 5 6

    a      b      c
count 2.00000 2.00000 2.00000
mean 2.50000 3.50000 4.50000
std 2.12132 2.12132 2.12132
min 1.00000 2.00000 3.00000
25% 1.75000 2.75000 3.75000
50% 2.50000 3.50000 4.50000
75% 3.25000 4.25000 5.25000
max 4.00000 5.00000 6.00000

Pandas還可以讀取文件,注意文件的存儲路徑不能帶有中文,否則可能出錯。

import pandas as pd
data = pd.read_excel('data.xlsx', encoding='utf-8')  # 讀取Excel文件,否則可能出錯
print(data.head())

  名字\成績 數學  英語   物理   化學
 0 小明    80   80    99  97
 1 小剛    70  55   100  98
 2 小紅    90  40    89   93
 3 小美    60   77    90   96
 4 小麗    75   66   93   97

5. StatsModels

 Pandas着眼於數據的讀取、處理和探索,而StatsModels則更加註重數據的統計建模分析,它使得Python有了R語言的味道。StatsModels支持於Pandas進行數據交互,因此,它於Pandas結合,成爲了Python下強大的數據挖掘組合。
 安裝StatsModels非常簡單,既可以通過pip安裝,又可以通過源碼安裝。對於Windos用戶來說,官網上甚至已經有編譯好的exe文件以供下載。如果需要手動安裝的話,需要自行解決好依賴問題,StatsModel依賴於Pandas,同時還依賴於pasty。
下面是一個用StatsModels進行ADF平穩性檢驗的例子

import numpy as np
from statsmodels.tsa.stattools import adfuller as ADF
print(ADF(np.random.rand(100)))  # 返回的結果由ADF值、p值等

(-5.456165403306984, 2.5788676252169965e-06, 7, 92,
{‘1%’: -3.503514579651927, ‘5%’: -2.893507960466837,
‘10%’: -2.583823615311909}, 37.35645008144752)

6. Scikit-Learn

 從該庫的名字可以看出,這是一個機器學習庫。不錯,Scikit-Learn是Python下強大的機器學習工具包,它提供了完善的機器學習工具箱,包括數據預處理、分類、迴歸、聚類、預測和模型分析等。
 Scikit-Learn依賴於Numpy、Scipy和Matplotlib,因此,只需要提前安裝好前幾個庫,然後安裝Scikit-Learn就基本上沒有什麼問題了,安裝方法和前幾個一樣,要不就是pip install scikit-learn安裝,要不就是下載源碼自己安裝。
創建一個機器學習的模型很簡單

from sklearn.linear_model import LinearRegression # 導入線性迴歸模型
model = LinearRegression() # 建立線性迴歸模型
print(model)

LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None,
normalize=False)

 Scikit-Learn本身提供了一些實例數據,比較常見的有安德森鳶尾花卉數據集、手寫圖像數據集等。
 我們有一百五十個鳶尾花的一些尺寸的觀測值:萼片長度、寬度,花瓣長度和寬度。還有它們的亞屬:山鳶尾(Iris setosa)、變色鳶尾(Iris versicolor)和維吉尼亞鳶尾(Iris virginica)。

from sklearn import datasets
iris = datasets.load_iris()  # 加載數據集
print(iris.data.shape)  # 查看數據集大小
from sklearn import svm  # 導入SVM模型
clf = svm.LinearSVC()  # 建立線性SVM分類器
clf.fit(iris.data, iris.target)  # 用數據訓練模型
clf.predict([[5.0, 3.6, 1.3, 0.25]])  # 訓練好模型之後,輸入新的數據進行預測
print(clf.coef_)  # 查看訓練好模型的參數

[[ 0.18423084 0.45122536 -0.80794064 -0.45071191]
[ 0.05586348 -0.89905693 0.40951571 -0.96194199]
[-0.85050286 -0.98667695 1.38114012 1.86557065]]

7. Keras

 雖然Scikit-Learn足夠強大,但是它並沒有包含一種強大的模型--------人工神經網絡。人工神經網絡是功能相當強大的、但是原理又相當簡單的模型,在語言處理、圖像識別等領域有着重要的作用。近年來逐漸火起來的“深度學習”算法,本質上也是一種神經網絡,可見在Python中實現神經網絡是非常有必要的。
 事實上,Keras並非簡單的神經網絡庫,而是一個基於Threano的強大的深度學習庫,利用它不僅僅可以搭建普通的神經網絡,還可以搭建各種深度網絡模型,如自編碼器、循環神經網絡、遞歸神經網絡、卷積神經網絡等。由於它是基於Threano的,因此速度也相當快。

# 下面的幾十行代碼搭建一個MLP(多層感知機)
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import SGD
model = Sequential()  # 模型初始化
model.add(Dense(20, 64))  # 添加輸入層(20節點)、第一隱藏層(64節點)的連接
model.add(Activation('tanh'))  # 第一隱藏層用tanh作爲激活函數
model.add(Dropout(0.5))  # 使用Dropout防止過擬合
model.add(Dense(64, 64))  # 添加第一隱藏層(64節點)、第二隱藏層(64節點)的連接
model.add(Activation('tanh'))  # 第二隱藏層用tanh作爲激活函數
model.add(Dropout(0.5))  # 使用Dropout防止過擬合
model.add(Dense(64, 1))  # 添加第二隱藏層(64節點)、輸出層(1節點)的連接
model.add(Activation('sigmod'))  # 輸出層用sigmoid作爲激活函數
sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)  # 定義求解算法
model.fit(X_train, y_train, nb_epoch=20, batch_size=16)  # 訓練模型
score = model.evaluate(X_test, y_test, batch_size=16)  # 測試模型

8. Gensim

 在Gensim的官網中,它對自己的簡介只有一句話:topic modelling for humans!
 Genius是用來處理語言方面的內容,如文本相似度計算、LDA、Word2Vec等,這些領域的任務往往需要比較多的背景知識。

下面是一個Gensim使用Word2Vec的簡單例子

import gensim, logging
# logging是用來輸出訓練日誌
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
# 分好詞的句子,每個句子以詞列表的形式輸入
sentences = [['first', 'sentence'], ['second', 'sentence']]
# 用以上句子訓練詞向量模型
model = gensim.models.Word2Vec(sentences, min_count=1)
print(model['sentence']) # 輸出單詞sentence的詞向量

[ 3.3256777e-03 -3.3599234e-04 1.4851474e-04 4.8383819e-03
4.5049251e-03 4.7845901e-03 -1.3239369e-03 -1.8815239e-03
-3.6703956e-03 4.2816866e-03 3.6929923e-03 7.9753104e-04
-4.3348738e-04 -1.4672419e-03 1.4194930e-03 -6.3494581e-04
-8.3871878e-04 -4.6697357e-03 -2.7556117e-03 -8.4222778e-04
2.3534612e-03 2.8722258e-03 1.3527627e-03 -1.0353057e-03
1.1202707e-03 -4.3219463e-03 -4.7520906e-04 -3.7458976e-04
-7.1177131e-04 4.6983436e-03 2.7505222e-03 -3.3290898e-03
-3.4628378e-03 -3.4623581e-03 4.6309875e-03 -3.5190058e-03
3.9474354e-03 -2.0858629e-03 3.8249004e-03 -4.8357458e-03
2.3872401e-03 3.1114693e-03 -2.0685278e-04 1.2549465e-03
-1.4568379e-04 3.3461982e-03 4.3331002e-05 -3.0359076e-03
-3.8067563e-03 -3.8705941e-03 3.9506904e-03 -2.4668993e-03
-7.4716326e-04 -1.0118756e-04 -3.8489939e-03 -2.4964602e-03
-7.9871761e-04 3.8180151e-04 -1.8031960e-03 -3.0534246e-03
-3.1819264e-03 2.5668710e-03 1.2297786e-03 -4.1955332e-03
-4.3339548e-03 1.0493994e-03 2.8359778e-03 -3.9757169e-03
1.4591852e-03 -3.8472496e-03 -3.4582277e-03 1.3717393e-03
-2.4592755e-03 -4.7951629e-03 4.1540037e-03 1.1634901e-03
-1.8982046e-03 -1.4130659e-03 -2.2569399e-03 -3.0905546e-03
-5.2004633e-04 -3.1528575e-03 -3.1999631e-03 3.7971358e-03
-3.0510221e-04 -3.0863653e-03 -3.9570956e-03 -4.3477756e-03
3.9340914e-03 -3.8840056e-03 -6.6936354e-04 -1.8876110e-03
8.1132201e-04 -1.7235996e-03 -8.8019075e-04 -2.7104486e-03
4.6934914e-03 1.3472291e-04 -3.6058761e-03 2.7829179e-04]

總結

 本章只介紹與數據分析與數據挖掘相關的一小部分,這些擴展庫裏面包含的函數在後面會進行實例分析,通過在Python平臺上完成實際案例來掌握數據分析和數據挖掘的原理。

發佈了9 篇原創文章 · 獲贊 67 · 訪問量 5685
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章