python 資料分析 之 用pandas和seaborn繪圖
matplotlib是一個相對底層的工具。pandas自身有內建的視覺化工具。另一個庫seaborn則是用來做一些統計圖形。
匯入seaborn會改變matlotlib預設的顏色和繪圖樣式,提高可讀性和美感。即使不適用seaborn的API,也可以利用seaborn來提高視覺化的效果。
%matplotlib inline# 如果不新增這句,是無法直接在jupyter裡看到圖的
##1 Line Plots(線圖)
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randn(10, 4).cumsum(0), columns=['A', 'B', 'C', 'D'], index=np.arange(0, 100, 10)) df
2 Bar Plots(條形圖)
plot.bar()和plot.barh()分別繪製垂直和水平的條形圖。這種情況下,series或DataFrame的index會被用來作為x(bar)或y(barh)的ticks(標記):
e. g.
import matplotlib.pyplot as plt fig, axes = plt.subplots(2, 1) data = pd.Series(np.random.rand(16), index=list('abcdefghijklmnop')) data.plot.bar(ax=axes[0], color='k', alpha=0.7) data.plot.barh(ax=axes[1], color='k', alpha=0.7)
color='k’設定顏色為黑,而alpha=0.7則設定區域性透明度(靠近1越明顯,靠近0則虛化)。
對於DataFrame,條形圖繪圖會把每一行作為一個組畫出來
e. g.
import seaborn df = pd.DataFrame(np.random.rand(6, 4), index=['one', 'two', 'three', 'four', 'five','six'], columns=pd.Index(['A', 'B', 'C', 'D'],name='Genus')) df df.plot.bar()
注意這裡DataFrame列名的"Genus",被作為圖例。
我們可以設定stacked=True,令條形圖堆疊起來,能讓每一行的所有值都被堆起來:
df.plot.barh(stacked=True, alpha=1)
e. g.
seaborn的繪圖函式中有一個data引數,這裡可以匯入pandas的DataFrame。其他引數指的是列名。因為每一天(比如一個固定的週六)可能會有多個不同的值,所以條形圖表示的是tip_pct的平均值。條形圖上的黑線表示95%的置信區間(confidence interval)(這個可以通過可選引數進行更改)。
import seaborn as sns
tips = pd.read_csv('../examples/tips.csv')
tips['tip_pct'] = tips['tip'] / (tips['total_bill'] - tips['tip'])
sns.barplot(x='tip_pct', y='day', data=tips, orient='h')
e. g.
seaborn.barplot有一個hue選項,這個能讓我們通過一個額外的類別值把資料分開
sns.set_style("ticks") # 我們可以換一個樣式,預設樣式有darkgrid , whitegrid , dark , white ,和 ticks
sns.barplot(x='tip_pct', y='day', hue='time', data=tips, orient='h')
3 Histograms and Density Plots(柱狀圖和密度圖)
e.g.
柱狀圖是一種條形圖,不過值的頻率是分割式的。資料點被分割為,離散的甚至是隔開的bin(BIN是儲存箱、存放箱、垃圾箱的意思,中文實在是不好翻譯,我把它理解為一個小柱子,之後就直接用bin了),而且每個bin中的資料點的數量會被畫出來。用上面的tipping資料集,我們可以用plot.hist做一個柱狀圖來表示小費(tip)佔總費用(total bill)的比例:
tips['tip_pct'].plot.hist(bins=50)
e.g.
seaborn能更方便地繪製柱狀圖和概率圖,通過distplot方法,這個方法可以同時繪製一個柱狀圖和a continuous density estimate(一個連續密度估計)。舉個例子,考慮一個bimodal distribution(雙峰分佈,二項分佈),它由兩個不同的標準正態分佈組成:
comp1 = np.random.normal(0, 1, size=200)
comp2 = np.random.normal(10, 2, size=200)
values = pd.Series(np.concatenate([comp1, comp2]))
sns.distplot(values, bins=100, color='k')
4 Scatter or Point Plots(散點圖或點圖)
e.g.
macro = pd.read_csv('../examples/macrodata.csv')
data = macro[['cpi', 'm1', 'tbilrate', 'unemp']]
trans_data = np.log(data).diff().dropna()
sns.set_style("whitegrid")
sns.regplot('m1', 'unemp', data=trans_data)
關於對數差分譯者找到的一些資料:
1、取對數(log):縮小差距,減少異方差性
2、差分:非平緩資料變平穩的技能
3、是原始序列的對數增長率,而且這麼處理後序列會更平穩
對於不平穩的時間序列,我們可以通過差分的方法使它平穩,但是差分之後的問題是有的經濟意義就無法直觀解釋了,所以我們又有了構建協整關係這一方法。
然後我們可以利用seaborn的regplot方法,它可以產生一個散點圖並擬合一條迴歸線:
e.g.
在資料探索階段,散點圖能把一組變數之間所有的散點圖都畫出來,這種圖被稱之為pairs plot(多變數圖)或scatter plot matrix(散點圖矩陣)。畫這樣的圖很麻煩,所以seaborn有一個非常方便的pairplot函式,這個函式可以把每一個引數的柱狀圖或密度估計畫在對角線上:
sns.pairplot(trans_data, diag_kind='kde', plot_kws={'alpha': 0.2})
5 Facet Grids and Categorical Data(多面網格和類別資料)
如果遇到一些資料集,需要額外分組的維度,該怎麼辦?一個方法是使用類別變數來把資料視覺化,利用facet grid(多面網格)。seaborn有一個有用的內建函式factorplot,能簡化製作各種多面圖的過程:
e.g.
sns.factorplot(x='day', y='tip_pct', row='time',
col='smoker', kind='bar', data=tips[tips.tip_pct<1])
e.g.
factorplot支援其他一些繪圖型別,是否有用取決於我們想要如何展示。例如,box plots(箱線圖,可以展示中位數,分位數和利群店)可能是一種有效的視覺型別:
箱型圖的解釋如下圖
sns.factorplot(x='tip_pct', y='day', kind='box',
data=tips[tips.tip_pct < 0.5])