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()
2.2 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()形式。