1. 程式人生 > >Python資料分析入門(一)——初探資料視覺化

Python資料分析入門(一)——初探資料視覺化

前言

靜下心算算,當程式設計師已經有好幾年了,不過自大學時代開始,學習對我來說就是個被動接受的過程,學校的課程、當時熱門的移動端開發、資料庫的學習、web學習、PHP後端學習……需要做什麼我便去學什麼,到了今天,突然意識到我是不是該給自己一個明確的發展方向了,畢竟歲月不饒人,96年的小朋友都參加工作了,不精通某一領域始終都會覺得渾渾噩噩。因為對大資料比較感興趣,而這方面的知識挖掘空間和發展空間都很大,再加上以前也摸過Python,所以給自己定了個自學計劃,也寫一些筆記類的部落格做個記錄與學習分享。關於Python的基礎語法這類的東西就不在筆記中額外開文章寫了,我會在程式碼示例中穿插著提一些Python的語法,因為這畢竟是一門“指令碼語言”,語法的學習並不困難。這個系列的部落格我會盡量地勤快些,算是對自己的敦促,開始的部分是結合《Python程式設計:從入門到實踐》這本書上的例子做一些理解,下一步是根據《利用Python進行資料分析》這本書做一些學習筆記。

開發環境

《利用Python進行資料分析》中開篇就說到了“你的Python開發環境是什麼”的問題,

作者給出的答案是“IPython外加一個文字編輯器”。這樣的開發環境對於一個經驗老到的工程師來說,無疑是最為簡潔易用的,好比我現在工作中,寫Android程式碼會使用Android Studio,前輩會使用Source Insight;寫PHP會用到PHPStorm,前輩會使用Source Insight;寫web前端會使用VSCode,前輩會使用Source Insight……年輕的程式設計師有個通病就是過分依賴於使用IDE進行開發,我也是個年輕程式設計師,所以在這個部落格系列中我是用的開發工具是PyCharm。在這之前我也分別嘗試了在Ubuntu、Windows下搭建《利用Python進行資料分析》書中所需要的開發環境,過程其實是很繁瑣的,而且使用文字編輯器寫程式碼的效率……反正我水平有限,所以我的看法是,搭建環境這個過程是需要親自動手體驗一下的,而實際的生產中,我更傾向於使用IDE。

至於下載Python、配置環境變數、下載PyCharm,這些都不在這裡多講了。

在這一篇部落格中主要使用的開發包是matplotlib,在PyCharm匯入即可,Download的過程可能會有點慢甚至下載不了,搭個梯子就行了,都很簡單。

言歸正傳,初探門徑

什麼是資料視覺化?

資料視覺化指的是通過視覺化表示來探索資料,它與資料探勘緊密相關,而資料探勘指的是使用程式碼來探索資料集的規律和關聯。資料集可以是用一行程式碼就能表示的小型數字列表,也可以是數以及位元組的資料。

                                                                                                                 ——摘自《Python程式設計:從入門到實踐》

我們可以這樣理解,資料視覺化和資料探勘都是探索資料和分析資料的一種手段,只不過資料探勘是以程式碼為探索途徑,而資料視覺化是將資料轉換為圖形、圖表這樣可視的形式來進行分析。

關於matplotlib

matplotlib是一個Python的2D繪相簿,我們可以通過這個庫將資料繪製成各種2D圖形(直方圖、散點圖、條形圖等)。

小試牛刀

matplotlib是一個功能很強大的繪相簿,其提供的一系列功能完善的api可以幫助我們快速地建立起我們所需的圖形,接下來是幾個簡單的例子,在這些例子中我也會穿插著記錄一下Python的相關語法。

1.先來一個簡單的折線圖

①import matplotlib.pyplot as plt

squares = [1, 4, 9, 16, 25]
②plt.plot(squares, linewidth=5)

③plt.title("Square Numbers", fontsize=24)
④plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)

⑤plt.tick_params(axis='both', labelsize=12)
plt.show()

(程式碼中有些行的開頭有標號作為稍後講解程式碼的標號,要執行這些程式碼的話先把標號刪掉哦)

這段程式碼的執行效果是這樣的:

先來看看程式碼吧:

①匯入matplotlib.pyplot模組並賦予其別名plt,這是Python中常用的小技巧,目的主要是簡化一些名稱,當然我們也可以這樣寫:

from matplotlib import pyplot

不過這樣一來,在後面呼叫到pyplot的方法時需要把之前的plt改為全稱pyplot,執行結果不會有任何差別。

②plot()方法:這裡將存放了一組平方數的列表傳入plot(),它將會嘗試根據這些資料繪製出有意義的圖形。再呼叫show()即可將圖形顯示出來。實參linewidth=5指定了折線的寬度。

③title()方法:使用此方法為圖示新增標題,實參fontsize=24指定了文字尺寸,後面的方法中該引數含義相同。

④xlabel()和ylabel()方法:為x軸和y軸命名。

⑤tick_params()方法:設定座標軸刻度的樣式,實參axis='both'表示同時設定兩條軸,也可以指定為x或y單獨設定。

相信大家發現了一個問題,我們傳入的資料是一組平方值,而我們起始的資料是1的平方,但是x軸的起點卻是0——事實上當你向plot()提供一系列數字時,它會預設x軸的0作為資料的起點,要改變這種預設配置,只需要對程式碼稍作修改,再提供一組x軸的值與平方數一一對應:

import matplotlib.pyplot as plt

input_values = [1, 2, 3, 4, 5]
squares = [1, 4, 9, 16, 25]
plt.plot(input_values, squares, linewidth=5)

plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)

plt.tick_params(axis='both', labelsize=12)
plt.show()

來看看執行結果:

這樣就好多了對吧?

2.再試試散點圖吧

在繪製折線圖的時候,我們使用了plot()方法來接收資料,而對於散點圖,則需要使用scatter()方法。我們直接來看看程式碼:

import matplotlib.pyplot as plt

①x_values = list(range(1, 101))  # 區分list()和range()
y_values = [x ** 2 for x in x_values]

②plt.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues, edgecolors='none', s=40)
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
plt.tick_params(axis="both", labelsize=14)
③plt.axis([0, 110, 0, 11000])
# plt.show()
④plt.savefig('squares_plot.png', bbox_inches='tight')

依然根據標號來看看程式碼:

①x_values和y_values,定義了資料來源,分別對應x軸的輸入值和y軸的輸出值,相互間的關係為y軸的輸出值為x軸值的平方。在Python中,range()方法的含義是產生一個可迭代的物件,它的很多行為都與list相似,比如在遍歷range(1, 101)並列印將會得到1至100的值,但是它與list是有本質區別的,即它在迭代的情況下返回的是一個索引值而非在記憶體中真正生成一個列表物件,所以在Python3中執行print(range(1, 101)),你將會得到的列印結果是range(1, 101)而非一個從1到100的列表。所以想要得到一個真正的列表則需要跟list()方法結合使用。對於這一句[x ** 2 for x in x_values],可能看著有些奇怪,但並不難理解,我們可以將它看成遍歷列表x_values,每次遍歷時將取出一個x值將它做平方放入y_values中生成一個列表。

②scatter()方法:和上一個例子中的plot()方法類似,都是負責接收資料繪製圖形,我們可以通過傳入實參c、edgecolors、s來分別指定散點顏色、散點邊緣顏色和散點大小,對於顏色可以直接傳“red”、“blue”這種簡單的顏色,也可以傳入rgb色值。在本段程式碼中,則是利用顏色對映(colormap)來設定顏色,即程式碼中的實參cmap,結合c=y_values,繪製出的散點將根據y軸值由小到大顏色逐漸加深,基本顏色為藍色。

③axis()方法:指定每個座標軸的取值範圍,[x_min, x_max, y_min, y_max]。

④savefig()方法:可以注意到,在這個例子中,我將show()方法註釋掉了,改為savefig()方法,這個方法將把繪製結果儲存在專案目錄下,第一個引數指定了圖形檔名稱,第二個引數表示將圖表多餘的空白區域裁掉。

執行結果當然是在專案目錄下生成了一個圖表,內容如下:

結語

這是這個系列的第一篇文章,算是簡單的起個頭,內容不復雜,註解也很詳細。之前說過這一系列的部落格我會寫得頻繁些,所以每一篇文章的內容不會太多,但求理解細緻,希望在這個過程中自己的學習能夠更紮實些,讀者們也能學到些東西。最後作為讀書筆記,還是把書上這一節的小練習貼出來,大家可以試試自己敲敲:

    1.數字的三次方被稱為其立方。請繪製一個圖形,顯示前5 個整數的立方值,再繪製一個圖形,顯示前5000 個整數的立方值。

    2.給你前面繪製的立方圖指定顏色對映。