1. 程式人生 > >python 資料分析 之 用pandas和seaborn繪圖

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

df
df.plot()

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

這裡寫圖片描述

二維碼在此,觀眾老爺們請掃

在這裡插入圖片描述