python数据可视化的特点_Python数据可视化, 看这一篇就够了
開個玩笑了,其實可視化想做深入,只看這一篇,必然是不夠的了~ 入個門估計差不多可以的。
為什么寫這一篇呢?算是繼續上一篇最嗨的歌最快的車:Data Fountain光伏發電量預測 Top1 開源分享?zhuanlan.zhihu.com
寫的,上一篇概括了數據分析比賽的思路和整體流程,從這篇開始寫每個部分如何操作。當然不止適用于比賽,常規的Projec也是可以參考。
一般的數據比賽,時間緊任務重,高效的探索性分析顯得很重要,說白了作圖可視化,必須要做,因為不做不知道數據的規律沒有思路,做可視化又不舍得花太多時間,所以提前準備好大概的框架很有必要。。
第一次接觸比賽的時候為了看個分布圖,拿Python找了半天不知道咋搞,最后開了SPSS搞。。然而SPSS作圖功能又有限,Python相比起來靈活很多。。了解可視化和Python做圖的地方太多了,Kaggle, datacamp, 各種包推出的官方文檔都是好資源,特別是Kaggle最近修改了自己提供的Kernel服務,隨便注冊下就可以免費使用4CPU,17G內存,5G硬盤帶NVIDIA Tesla K80 GPU的機器,還是很慷慨的。畢竟這個配置自己買下來至少要3萬多我估計,可以去試試。
言歸正傳,記錄下學來的各種作圖。
本文所演示的的可視化方法散點圖 (Scatterplot)
直方圖 (Histogram)
小提琴圖 (Violinplot)
特征兩兩對比圖(Pairplot)
安德魯斯曲線 (Andrews curves)
核密度圖 (Kernel density estimation plot)
平行坐標圖 (Parallel coordinates)
Radviz (力矩圖?)
熱力圖 (Heatmap)
氣泡圖 (Bubbleplot)
這里主要使用Python一個流行的作圖工具: Seaborn library,同時Pandas和bubbly輔助。為什么Seaborn比較好?
因為很多時候數據分析,建模前,都要清洗數據,清洗后數據的結果總要有個格式,我知道的最容易使用,最方便輸入模型, 最好畫圖的格式叫做"Tidy Data" (Wickham H. Tidy data[J]. Journal of Statistical Software, 2014, 59(10): 1-23.) 其實很簡單,Tidy Data格式就是:每條觀察(記錄)自己占一行
觀察(記錄)的每個特征自己占一列
舉個例子,我們即將作圖的數據集IRIS就是Tidy Data(IRIS(IRIS數據集)_百度百科):
Iris數據集是常用的分類實驗數據集,由Fisher, 1936收集整理。Iris也稱鳶尾花卉數據集,是一類多重變量分析的數據集。數據集包含150個數據集,分為3類,每類50個數據,每個數據包含4個屬性。可通過花萼長度,花萼寬度,花瓣長度,花瓣寬度4個屬性預測鳶尾花卉屬于(Setosa,Versicolour,Virginica)三個種類中的哪一類。
該數據集包含了5個屬性:
Sepal.Length(花萼長度),單位是cm;
Sepal.Width(花萼寬度),單位是cm;
Petal.Length(花瓣長度),單位是cm;
Petal.Width(花瓣寬度),單位是cm;
種類:Iris Setosa(山鳶尾)、Iris Versicolour(雜色鳶尾),以及Iris Virginica(維吉尼亞鳶尾)。
# 這里引入所用到的包
import pandas as pd
import warnings
warnings.filterwarnings("ignore")
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="white", color_codes=True)
# 讀入數據
iris = pd.read_csv("Iris.csv") # the iris dataset is now a Pandas DataFrame
# 看下數據前5行
iris.head()IRIS數據
可以看到,每條觀察(ID=0,1,2...)自己占一行,每個特征(四個部位長/寬度,種類)自己占一列。Seaborn就是為Tidy Data設計的,所以方便使用。
所以這個數據集有6列,6個特征,很多時候做可視化就是為了更好的了解數據,比如這里就是想看每個種類的花有什么特點,怎么樣根據其他特征把花分為三類。我個人的喜好是首先一張圖盡量多的包含數據點,展示數據信息,從中發現規律。我們可以利用以下代碼完全展示全部維度和數據這里用的bubbly:
from bubbly.bubbly import bubbleplot
from __future__ import division
from plotly.offline import init_notebook_mode, iplot
init_notebook_mode()
#這里設置x,y,z軸,氣泡,氣泡大小,氣泡顏色分別代表6列~在二維平面想展示6個維度,除了x,y,z之外,
#只能用顏色,大小等代表其他維度了,bubbly還可以承受更高維度的數據,可以自己搜索
figure = bubbleplot(dataset=iris, x_column='SepalLengthCm', y_column='PetalLengthCm', z_column='SepalWidthCm',
bubble_column='Id', size_column='PetalWidthCm', color_column='Species',
x_title="SepalLength(Cm)", y_title="PetalLength(Cm)", z_title='SepalWidth(Cm)',
title='IRIS Visualization',
x_logscale=False,scale_bubble=0.1,height=600)
#展示圖片
iplot(figure, config={'scrollzoom': True})三維圖,全局觀察
Python做出來,其實是一張可以拖動角度,放大縮小的圖,拖一拖看各角度視圖會發現三類還是分的挺明顯的。Github上這個bubbly還是很厲害的,方便。
接下來開始做一些基礎的可視化,沒有用任何修飾,代碼只有最關鍵的畫圖部分,可視化作為比賽的一個基礎和開端,個人理解做出的圖能看就行,美不美無所謂,不美也不扣分。因為
散點圖,可以得到相關性等信息,比如基本上SepalLengthCm越大,SepalWidthCm越大
# 普通二維散點圖
sns.FacetGrid(iris, hue="Species", size=5) \
.map(plt.scatter, "SepalLengthCm", "SepalWidthCm") \
.add_legend()散點圖
使用Jointplot, 看兩個變量的分布,KDE圖,同時展示對應的數據點
sns.jointplot(x="SepalLengthCm", y="SepalWidthCm", data=iris,kind="reg")
就像上一篇說的,比賽中的每個環節都至關重要,很有必要看下這些分布直方圖,kde圖,根據這些來處理異常值等,這里請教,為什么畫了直方圖還要畫KDE??我理解說的都是差不多的東西。
關于KDE:"由于核密度估計方法不利用有關數據分布的先驗知識,對數據分布不附加任何假定,是一種從數據樣本本身出發研究數據分布特征的方法,因而,在統計學理論和應用領域均受到高度的重視。"
無論如何,我們先畫直方圖,再畫KDE
# 畫不同Species情況下,SepalWidthCm直方圖
g = sns.FacetGrid(iris, col="Species")
g = g.map(plt.hist, "SepalWidthCm", bins=20)直方圖
# 畫不同Species情況下,PetalLengthCm KDE圖
sns.FacetGrid(iris, hue="Species", size=6) \
.map(sns.kdeplot, "PetalLengthCm") \
.add_legend()KDE 圖
這里通過KDE可以說,由于Setosa的KDE與其他兩種沒有交集,直接可以用Petailength線性區分Setosa與其他兩個物種。
# Pairplot, 看三個品種在不同的兩特征組合中的區分情況,對角線由于X,Y是一個特征,多以畫了KDE
sns.pairplot(iris.drop("Id", axis=1), hue="Species", size=3, diag_kind="kde")Pairplot
箱線圖,顯示一組數據分散情況的統計圖。形狀如箱子。主要用于反映原始數據分布的特征,關鍵的5個黑線是最大值、最小值、中位數和兩個四分位數。在判斷異常值,處理異常值時候有用。
#箱線圖,可以把原始數據點加上,用jitter=True避免點重合
ax = sns.boxplot(x="Species", y="PetalLengthCm", data=iris)
ax = sns.stripplot(x="Species", y="PetalLengthCm", data=iris, jitter=True, edgecolor="gray")BoxPlot
小提琴圖
# 小提琴圖,箱線圖與核密度圖的結合體,能代表的信息和上圖相似
sns.violinplot(x="Species", y="PetalLengthCm", data=iris, size=6)Violinplot
from pandas.tools.plotting import andrews_curves
andrews_curves(iris.drop("Id", axis=1), "Species")
這個Andrews curves很有趣,它是把所有特征組合起來,計算個值,展示該值,可以用來確認這三個物種到底好不好區分,維基百科的說法是“If there is structure in the data, it may be visible in the Andrews' curves of the data.”(Andrews plot - Wikipedia)Andrews' curves
# parallel_coordinates 做法是把每個特征放一列,不同物種用不同顏色連起來看看有沒有規律
from pandas.tools.plotting import parallel_coordinates
parallel_coordinates(iris.drop("Id", axis=1), "Species")
# radviz
from pandas.tools.plotting import radviz
radviz(iris.drop("Id", axis=1), "Species")radviz
Radviz可視化原理是將一系列多維空間的點通過非線性方法映射到二維空間的可視化技術,是基于圓形平行坐標系的設計思想而提出的多維可視化方法。圓形的m條半徑表示m維空間,使用坐標系中的一點代表多為信息對象,其實現原理參照物理學中物體受力平衡定理。 多維空間的點映射到二維可視空間的位置由彈簧引力分析模型確定。 (Radviz可視化原理 - CSDN博客) ,能展示一些數據的可區分規律。
#特征間相關系數熱力圖
f = iris.drop("Id", axis=1).corr()
sns.heatmap(f, annot=True)
數值是皮爾森相關系數,淺顏色表示相關性高,比如Petal.Length(花瓣長度)與 Petal.Width(花瓣寬度)相關性0.96,也就是花瓣長的花,花瓣寬度也大,也就是個大花。
這些是我見過比較常用的,對數據探索有幫助的可視化方法。
實際上現在機器學習的很多方向,包括可視化都在做自動化,也就是把數據一輸入,點點鼠標全搞定,可視化真的需要這種自動化,能提高效率的好東西。
關于機器學習的自動化,嘗試過Auto Sklearn和IBM的Waston Studio, Auto Sklearn可以自動,建模,調參,融合,但是特征得自己搞,參數擬合用的是貝葉斯,效果還不錯,依舊開發中,值得期待,之前比賽中期Auto Sklearn的結果可以拿來當作一個子模型參與融合。后期它精度跟不上了,我猜是調參的方法加上缺少幾個算法造成的。希望它可以加入更多的模型供選擇,應該會強大更多,更多細節可以瀏覽同學寫過得一個詳細教程:http://codewithzhangyi.com/2018/07/26/AutoML/?codewithzhangyi.com
機器學習這些東西,更新太快,必須得緊跟時代,哪天出了什么新的東西,千萬不能守著自己原來做過的東西不放,一直保持開放的學習態度還是重要的。
原來上學時候有個做傳統信號處理的老師說“什么什么神經網絡?都是XXX扯淡。。。”然后第二年,神經網絡大熱,拿下各種冠軍。。可能他對自己的研究投入太多,確實難放下,所以排斥新方法。
總結
以上是生活随笔為你收集整理的python数据可视化的特点_Python数据可视化, 看这一篇就够了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fortran求解雷诺方程_方程的计算机
- 下一篇: python使用redis_python