數據分析之---Python可視化工具


1. 數據分析基本流程

作為非專業的數據分析人員,在平時的工作中也會遇到一些任務:需要對大量進行分析,然后得出結果,解決問題。

所以了解基本的數據分析流程,數據分析手段對於提高工作效率還是非常有幫助的。

首先都是存在一個要解決的問題,主要問題和預期分析目標,簡單來講就是對問題進行定義。

然后才是開始收集數據、數據清洗、數據建模、數據展現、優化和重復,最后是報告撰寫。

1. 明確分析目的和思路:在進行數據分析之前,首先考慮的應該是“為什么要展開數據分析?我要解決什么問題?從哪些角度分析數據才系統?用哪個分析方法最有效?”,而不是“這此分析需要出多少頁報告?打算用高級分析算法試試…”這樣的思維方式。只有明確了分析目的和思路,數據分析的方向才不會跑偏,才能得出有意義的結論。
2. 數據收集:明確了分析目的,接下來就是開工收集數據了。數據來源有很多,但是確保數據可信度等很重要。
3. 數據處理:包括數據清洗、轉換、分組等處理方法。我們拿到的數據,通常情況下是不可直接使用的,比如數據有丟失、重復、有錄入錯誤或存在多余維度等情況。只有經過處理后的數據才可以使用。提高數據質量,定義分析需要的數據結構。
4.數據分析:在明確分析思路的前提下,選用適合的分析方法對處理后的數據進行分析。創建不同數據模型,然后不停的優化和重復。
5.數據展現:將分析結果用圖表來展現。所以數據展現階段,你需要思考“采用這個圖表,能否清晰的表達出分析結果?我想表達的觀點是否完全展示出來了?這是本文重點關注的點。
6.報告撰寫:將數據分析的整個過程和結果,以書面的形式向他人說明。需要將分析目的、數據來源、分析過程、分析結論和建議等內容展現在報告中。

1.1 常用統計方法

 除了可視化展示數據分析結果,一些統計描述也很有必要。因此,羅列一些簡單的統計性描述概念。

使用Numpy

平均值、最大值、最小值、求和

標准誤差:表示樣本平均數和總體平均數的變異程度,可以用來反映結果精密度。

標准差(均方差):計算一組數據偏離均值的平均幅度,不管這組數據是樣本數據還是總體數據

方差:在概率論和統計方差衡量隨機變量或一組數據時離散程度的度量

中位數:對於有限的數集,可以通過把所有觀察值高低排序后找出正中間的一個作為中位數。

眾數:在統計分布上具有明顯集中趨勢點的數值,代表數據的一般水平(眾數可以不存在或多於一個)

import numpy as np
from scipy.stats import mode

array = np.array([1, 3, 4, 23, 565, 1, -8, 123, 111, 54, 45.0, 3, 3])

print '求和:', array.sum()
print '最大值:', array.max()
print '最小值:', array.min()
print '條數:', array.size
print '標准差:', array.std()---------------偏離平均值的幅度
print '平均值:', array.mean()
print '中位數:', np.median(array)
print '方差:', np.var(array)---------------這組數據離散程度
print '眾數:', mode(array).mode, mode(array).count

 

結果如下:

求和: 928.0
最大值: 565.0
最小值: -8.0
條數: 13
標准差: 148.326323439
平均值: 71.3846153846
中位數: 4.0
方差: 22000.6982249
眾數: [ 3.] [3]

 

 

關於NumPy和SciPy常用統計方法,參考《使用Python進行描述性統計》。

1.2 常用圖表

題外話《如何快速成為數據分析師?》,是一個不錯的科普。包括數據可視化、分析思維訓練、數據庫學習、統計知識、數據分析常用語言Python/R,以及業務也即需要分析的對象學習。

 

數據可視化是分析數據的優秀工具,好的可視化是會講故事的。

下面這張圖來源於:《數據可視化:你想知道的經典圖表全在這》。他根據你想要展示的內容進行划分,只要對你的展示內容分門別類就可以找到合適的圖表。

維度:數據分析本質是各種維度的組合,維度可以用時間、數值、文本等表示。

數據通常包含五種關系:構成、比較、趨勢、分布及聯系。

參照:《如何選擇正確的圖表類型

構成:關注每個部分所占整體的百分比,適用餅圖。

比較:展示事物的排列順序,首選條圖。

趨勢:常見的時間序列關系,適用線圖能更好的展示變化。

分布:關心各數值范圍包含多少項目,適用柱圖。

聯系:查看兩個變量之間關系,適用氣泡圖。

2. Python可視化

Python可視化工具繁多,但沒有一個能覆蓋所有需求。所以需要針對需求,決定使用那些工具更合適。

Overview of Python Visualization Tools》對Python下的可視化工具進行了介紹和對比,包括matplotlib、Pandas、Seaborn、ggplot、Bokeh、pygal、Plotly。

下面重點了解一下matplotlib、Pandas和Bokeh。

2.1 matplotlib

根據上圖《如何選擇圖表的類型?》,將各種圖表在matplotlib中對應函數列出。

2.1.1 趨勢

線圖(很多日期) & 多線圖(多種分類)

#API: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot
import matplotlib.pyplot as plt import numpy as np import pandas as pd fig, ax = plt.subplots() plt.subplot(4, 1, 1) data = pd.DataFrame(np.random.randn(1000, 4), columns=['x', 'y', 'z', 't']) index = range(len(data)) plt.plot(index, data['x'].cumsum(), label='xxx') plt.subplot(4, 1, 2) plt.plot(index, data.loc[:, ['x', 'y']].cumsum()) plt.subplot(4, 1, 3) plt.plot(index, data.loc[:, ['x', 'y', 'z']].cumsum()) plt.subplot(4, 1, 4) plt.plot(index, data.cumsum()) fig.set_size_inches(40, 32) plt.show()

 

 

柱圖(少數分類)

#API: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.bar
import matplotlib.pyplot as plt import pandas as pd import numpy as np opacity = 0.8 data = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd']) fig, ax = plt.subplots() index = range(len(data)) plt.subplot(4, 1, 1) plt.bar(index, data['a']) plt.subplot(4, 1, 2) plt.bar(index, data['a'], alpha=opacity, width=0.2) plt.bar([i+0.2 for i in index], data['b'], alpha=opacity, width=0.2) plt.bar([i+0.4 for i in index], data['c'], alpha=opacity, width=0.2) plt.bar([i+0.6 for i in index], data['d'], alpha=opacity, width=0.2) fig.set_size_inches(40, 32) plt.xticks(index, list('thisisabar')) plt.show()

 

 

 

2.1.2 比較

表格(許多項目)

import matplotlib.pyplot as plt
import numpy as np

col_labels = ['col1', 'col2', 'col3']
row_labels = ['row1', 'row2', 'row3']
row_colors = ['red', 'gold', 'green']

table_vals = np.random.randn(3, 3)


fig, ax = plt.subplots()
my_table = ax.table(cellText = table_vals,
                    colWidths = [0.5]*3,
                    rowLabels=row_labels,
                    colLabels=col_labels,
                    rowColours=row_colors,
                    colColours=row_colors,
                    loc='center',
                    animated = True)
#ax.xaxis.set_visible(False)
#ax.yaxis.set_visible(False)
ax.axis('off')
fig.set_size_inches(10, 10)
plt.show()

 

條圖(一種分類)

堆疊條圖(2種以上分類)

2.1.3 聯系

散點圖(2維) & 氣泡圖(3維)

散點圖和氣泡圖的區別就在於氣泡圖多了一維數據,是散點具備了不同的半徑。

#API: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.scatter

import matplotlib.pyplot as plt import numpy as np import pandas as pd N = 100 fig, ax = plt.subplots() data = pd.DataFrame(np.random.rand(N, 3)*100, columns=['x', 'y', 'r']) data['r'] = np.pi*(np.pi*data['r']/20)**2 #s is area colors = 2*np.pi*data['x'] #colors is value of circumference plt.subplot(3, 1, 1) plt.scatter(data['x'], data['y'], c=colors, s=np.pi*5**2) plt.subplot(3, 1, 2) plt.scatter(data['x'], data['y'], c=colors, s=data['r']) fig.set_size_inches(10, 30) plt.show()

 

 

雷達圖(多維)

2.1.4 構成

100%堆積柱圖(相對差異)

堆疊柱圖(絕對差異)

堆積百分比面積圖(相對差異)

堆積面積圖(相對絕對差異)

餅圖(占整體比例)

#API Introduction: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.pie

import matplotlib.pyplot as plt

labels = 'A', 'B', 'C', 'D', 'E', 'F', 'G'
sizes = [20, 45, 68, 98, 60, 28, 99]
explode = (0, 0.1, 0, 0, 0, 0, 0)

fig, ax = plt.subplots()
ax.pie(sizes, explode=explode, labels=labels, autopct='%.2f%%', shadow=True, startangle=90)
fig.set_size_inches(8, 8)
plt.show()

 

 

漏斗圖(次序部分與整體)

金字塔圖(次序部分與整體)

2.1.5 分布/地理

地圖(地理分布)

柱圖(1維)

散點圖(2維)

氣泡圖(3維)

曲面圖(3維)

 

2.1.6 其他

極坐標圖

有三種:線狀極坐標圖/柱狀極坐標圖/氣泡極坐標。

import matplotlib.pyplot as plt
import matplotlib
import numpy as np
import pandas as pd

fig, ax = plt.subplots()

ax = plt.subplot(111, projection='polar')

r = np.arange(0, 2, 0.01)
theta = 2*np.pi*r
plt.plot(theta, r)
ax.set_rmax(2)
ax.set_rticks(np.arange(0, 2, 0.5))
ax.set_rlabel_position(-22.5)
ax.grid(True)

fig.set_size_inches(10, 10)
plt.show()
import numpy as np
import matplotlib.pyplot as plt

# Compute pie slices
N = 20
fig, ax = plt.subplots()
theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False)
radii = 10 * np.random.rand(N)
width = np.pi / 4 * np.random.rand(N)

ax = plt.subplot(111, projection='polar')
bars = ax.bar(theta, radii, width=width, bottom=0.0)

# Use custom colors and opacity
for r, bar in zip(radii, bars):
    bar.set_facecolor(plt.cm.viridis(r / 10.))
    bar.set_alpha(0.5)

fig.set_size_inches(10 , 10)
plt.show()

 

import matplotlib.pyplot as plt
import numpy as np


# Compute areas and colors
N = 150

fig, ax = plt.subplots()
r = 2 * np.random.rand(N)
theta = 2 * np.pi * np.random.rand(N)
area = 200 * r**2
colors = theta

ax = plt.subplot(111, projection='polar')
c = ax.scatter(theta, r, c=colors, s=area, cmap='hsv', alpha=0.75)

fig.set_size_inches(10, 10)
plt.show()

 

 

 

2.2 Bokeh

Bokeh的官方文檔Bokeh源碼

2.3 Pandas

 pandas基於NumPy的一種Python工具包,主要是為了解決數據分析任務而創建。

Pandas提供了大量庫和標准數據模型,高效地操作大型數據集所需的工具。Pandas主要包括三種數據結構:

Series,一維數組,與NumPy中的一維array類似。TimeSeries,以時間為索引的Series。

DataFrame,二維表格型數據結構,可以將DataFrame理解為Series的容器。

Panel,三維數組,可以理解為DataFrame的容器。

關於Pandas有一個簡要的入門《10 Minutes to pandas》,主要包括創建pandas數據,查看數據,對數據操作(統計等),Merge/Grouping/Reshaping/Time Series/Categoricals/Plotting,以及數據的I/O接口。

更詳細的入門在《Tutorials》。

可視化相關內容在《Virtualization》,pandas的可視化基於matplotlib,包括基本plot/Bar/Histograms/Box/Area/Scatter/Hexagonal Bin/Pie。

API Reference》提供了所有pandas的objects/functions/methods的介紹,在這里可以獲取每個函數的使用方法。

還有很多對plot設置的Plot Formatting以及附加的Plotting工具。

pandas_test中對pandas基本數據處理和可視化進行了簡單測試。

2.3.1 pandas數據構造

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt


s = pd.Series([1, 3, 5, np.nan, 6, 8]) #一維數據構造
s_list = s.tolist() #從series到list
s_series = pd.Series(s_list) #從list到series

print '\nSeries:\n', s
print '\nSeries item:\n', s[2]
print '\nSeries to list:\n', s_list
print '\nList to series:\n', s_series

dates = pd.date_range('20171001', periods=7)

#二維數據構造
df = pd.DataFrame(np.random.randn(7, 4)*100, index=dates, columns=list('ABCD'), dtype='uint32')
df_list = np.array(df).tolist()
df_dataframe = pd.DataFrame(df_list, columns=['a', 'b', 'c', 'd'])
df_list.extend
print '\nDataFrame:\n', df
print '\nDataFrame to list:\n', df_list
print '\nList to DataFrame:\n',df_dataframe
print '\nDataFrame row:\n', df_dataframe.iloc[3]
print '\nDataFrame column:\n', df_dataframe['d']

print '\nHex format:'
for i in range(len(df_dataframe)):
    print '0x%0.8x, 0x%0.8x, 0x%0.8x, 0x%0.8x' % (df_dataframe.iloc[i]['a'],
                 df_dataframe.iloc[i]['b'],
                 df_dataframe.iloc[i]['c'],
                 df_dataframe.iloc[i]['d'])


'''
print 'head\n', df.head(3)
print 'tail\n', df.tail(3)
print 'index\n', df.index
print 'columns\n', df.columns
print 'values\n', df.values
print 'sort_index\n', df.sort_index(axis=1, ascending=False)
print 'sort_values\n', df.sort_values(by='B', ascending=False)
print df['C']
print df[0:3]
'''
#二維數據構造
df2 = pd.DataFrame({'A':1.,
                   'B':pd.Timestamp('20130102'),
                   'C':pd.Series(1, index=list(range(4)), dtype='float32'),
                   'D':np.array([3]*4, dtype='int32'),
                   'E':pd.Categorical(['test', 'train', 'test', 'train']),
                   'F':'foo'})

 

2.3.2 pandas可視化圖表

可視化圖表主要有基本plot/bar/histograms/box/area/scatter/hexagonal/pie。

准備好數據,使用起來都非常簡單,xxx.plot()/xxx.plot.bar()/xxx.plot.pie()形式。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM