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()

(代碼中有些行的開頭有標號作為稍后講解代碼的標號,要運行這些代碼的話先把標號刪掉哦)

這段代碼的執行效果是這樣的:

TIM圖片20180810165530.png

先來看看代碼吧:

①導入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()

來看看運行結果:

TIM圖片20180810162200.png

這樣就好多了對吧?

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()方法,這個方法將把繪制結果儲存在項目目錄下,第一個參數指定了圖形文件名稱,第二個參數表示將圖表多余的空白區域裁掉。

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

squares_plot.png

結語

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

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

2.給你前面繪制的立方圖指定顏色映射。
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容