《python数据分析与挖掘》-步骤
第3章數(shù)據(jù)探索(重要)
數(shù)據(jù)質(zhì)量分析
是數(shù)據(jù)預(yù)處理的前提,是數(shù)據(jù)挖掘分析結(jié)論有效性和準(zhǔn)確性的基礎(chǔ),其主要任務(wù)是檢查原始數(shù)據(jù)中是否存在臟數(shù)據(jù),臟數(shù)據(jù)包括:
????缺失值
????異常值
????不一致的值
????重復(fù)數(shù)據(jù)及含有特殊符號(hào)(如#、¥、*)的數(shù)據(jù)
本小節(jié)將主要對(duì)數(shù)據(jù)中的缺失值、異常值和一致性進(jìn)行分析。
缺失值統(tǒng)計(jì)分析
統(tǒng)計(jì)缺失值的變量個(gè)數(shù)
統(tǒng)計(jì)每個(gè)變量的未缺失數(shù)
統(tǒng)計(jì)變量的缺失數(shù)及缺失率
異常值統(tǒng)計(jì)分析-箱型圖代碼
異常值分析是檢驗(yàn)數(shù)據(jù)是否有錄入錯(cuò)誤以及含有不合常理的數(shù)據(jù)。
異常值是指樣本中的個(gè)別值,其數(shù)值明顯偏離其余的觀測(cè)值。異常值也稱(chēng)為離群點(diǎn),異常值的分析也稱(chēng)為離群點(diǎn)的分析。
異常值分析方法主要有:簡(jiǎn)單統(tǒng)計(jì)量分析、3 ???原則、箱型圖分析。
import pandas as pd
data = pd.read_excel('../data/catering_sale.xls', index_col = u'日期') #讀取數(shù)據(jù),指定“日期”列為索引列
import matplotlib.pyplot as plt #導(dǎo)入圖像庫(kù)
plt.rcParams['font.sans-serif'] = ['SimHei'] #用來(lái)正常顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus'] = False #用來(lái)正常顯示負(fù)號(hào)
plt.figure() #建立圖像
p = data.boxplot(return_type='dict')#p['fliers'][0].get不會(huì)報(bào)錯(cuò)
#p = data.boxplot() #畫(huà)箱線圖,直接使用pd的DataFrame的方法
x = p['fliers'][0].get_xdata() # 'flies'即為異常值的標(biāo)簽
y = p['fliers'][0].get_ydata()
y.sort() #從小到大排序,該方法直接改變?cè)瓕?duì)象
#用annotate添加注釋
#其中有些相近的點(diǎn),注解會(huì)出現(xiàn)重疊,難以看清,需要一些技巧來(lái)控制。
#以下參數(shù)都是經(jīng)過(guò)調(diào)試的,需要具體問(wèn)題具體調(diào)試。
for i in range(len(x)): 
??if i>0:
????plt.annotate(y[i], xy = (x[i],y[i]), xytext=(x[i]+0.05 -0.8/(y[i]-y[i-1]),y[i]))
??else:
????plt.annotate(y[i], xy = (x[i],y[i]), xytext=(x[i]+0.08,y[i]))
plt.show() #展示箱線圖
?
一致性分析
數(shù)據(jù)不一致性是指數(shù)據(jù)的矛盾性、不相容性。直接對(duì)不一致的數(shù)據(jù)進(jìn)行挖掘,可能會(huì)產(chǎn)生與實(shí)際相違背的挖掘結(jié)果。
在數(shù)據(jù)挖掘過(guò)程中,不一致數(shù)據(jù)的產(chǎn)生主要發(fā)生在數(shù)據(jù)集成的過(guò)程中,可能是由于被挖掘數(shù)據(jù)是來(lái)自于從不同的數(shù)據(jù)源、重復(fù)存放的數(shù)據(jù)未能進(jìn)行一致性地更新造成的,比如兩張表中都存儲(chǔ)了用戶的地址,在用戶的地址發(fā)生改變時(shí),如果只更新了一張表中的數(shù)據(jù),那么這兩張表中就有了不一致的數(shù)據(jù)。
數(shù)據(jù)特征分析
一般可通過(guò)繪制圖表、計(jì)算某些特征量等手段進(jìn)行數(shù)據(jù)的特征分析。
這里主要介紹的特征方法有:
分布分析-統(tǒng)計(jì)函數(shù)describe
分布分析能揭示數(shù)據(jù)的分布特征和分布類(lèi)型,便于發(fā)現(xiàn)某些特大或特小的可疑值。
對(duì)于定性分類(lèi)數(shù)據(jù),可用餅圖和條形圖直觀地顯示分布情況。
對(duì)于定量變量而言,欲了解其分布形式,是對(duì)稱(chēng)的、還是非對(duì)稱(chēng)的,可做出頻率分布表、繪制頻率分布直方圖、繪制莖葉圖進(jìn)行直觀地分析;
定量變量做頻率分布分析時(shí)選擇“組數(shù)”和“組寬”是主要的問(wèn)題,一般按照以下步驟:
求極差2決定組距與組數(shù)3決定分點(diǎn)4列出頻率分布表5繪制頻率分布直方圖
1各組之間必須是相互排斥的
2各組必須將所有的數(shù)據(jù)包含在內(nèi)
3各組的組寬最好相等
catering_sale = '../data/catering_sale.xls' #餐飲數(shù)據(jù)
data = pd.read_excel(catering_sale, index_col = u'日期') #讀取數(shù)據(jù),指定“日期”列為索引列
data = data[(data[u'銷(xiāo)量'] > 400)&(data[u'銷(xiāo)量'] < 5000)] #過(guò)濾異常數(shù)據(jù)
statistics = data.describe() #保存基本統(tǒng)計(jì)量
statistics.loc['range'] = statistics.loc['max']-statistics.loc['min'] #極差
statistics.loc['var'] = statistics.loc['std']/statistics.loc['mean'] #變異系數(shù)
statistics.loc['dis'] = statistics.loc['75%']-statistics.loc['25%'] #四分位數(shù)間距
print(statistics)
對(duì)比分析
對(duì)比分析是指把兩個(gè)相互聯(lián)系的指標(biāo)數(shù)據(jù)進(jìn)行比較,從數(shù)量上展示和說(shuō)明研究對(duì)象規(guī)模的大小,水平的高低,速度的快慢,以及各種關(guān)系是否協(xié)調(diào)。特別適用于指標(biāo)間的橫縱向比較、時(shí)間序列的比較分析。在對(duì)比分析中,選擇合適的對(duì)比標(biāo)準(zhǔn)是十分關(guān)鍵的步驟,選擇得合適,才能做出客觀的評(píng)價(jià),選擇不合適,評(píng)價(jià)可能得出錯(cuò)誤的結(jié)論。
對(duì)比分析主要有以下兩種形式:
第一種:絕對(duì)數(shù)比較
第二種:相對(duì)數(shù)比較
???????1)結(jié)構(gòu)相對(duì)數(shù) ????????????????????????????????4)強(qiáng)度相對(duì)數(shù)
???????2)比例相對(duì)數(shù) ????????????????????????????????5)計(jì)劃完成程度相對(duì)數(shù)
???????3)比較相對(duì)數(shù) ????????????????????????????????6)動(dòng)態(tài)相對(duì)數(shù)
統(tǒng)計(jì)量分析
用統(tǒng)計(jì)指標(biāo)對(duì)定量數(shù)據(jù)進(jìn)行統(tǒng)計(jì)描述,常從集中趨勢(shì)和離中趨勢(shì)兩個(gè)方面進(jìn)行分析。
平均水平的指標(biāo)是對(duì)個(gè)體集中趨勢(shì)的度量,使用最廣泛的是均值和中位數(shù);反映變異程度的指標(biāo)則是對(duì)個(gè)體離開(kāi)平均水平的度量,使用較廣泛的是標(biāo)準(zhǔn)差(方差)、四分位間距。
集中趨勢(shì)度量主要有:均值、中位數(shù)、眾數(shù)
離中趨勢(shì)度量主要有:極差、標(biāo)準(zhǔn)差、變異系數(shù)
周期性分析
周期性分析是探索某個(gè)變量是否隨著時(shí)間變化而呈現(xiàn)出某種周期變化趨勢(shì)。周期性趨勢(shì)相對(duì)較長(zhǎng)的有年度周期性趨勢(shì)、季節(jié)性周期趨勢(shì),相對(duì)較短的一般有月度周期性趨勢(shì)、周度周期性趨勢(shì),甚至更短的天、小時(shí)周期性趨勢(shì)。
如在做某用電單位用電量趨勢(shì)預(yù)測(cè)過(guò)程中,可以先分析該用電單位日用電量的時(shí)序圖,來(lái)直觀地估計(jì)其用電量變化趨勢(shì)。
貢獻(xiàn)度分析-帕累托分析
貢獻(xiàn)度分析又稱(chēng)帕累托分析,帕累托法則又稱(chēng)20/80定律。同樣的投入放在不同的地方會(huì)產(chǎn)生不同的效益。比如對(duì)一個(gè)公司來(lái)講,80%的利潤(rùn)常常來(lái)自于20%最暢銷(xiāo)的產(chǎn)品;而其他80%的產(chǎn)品只產(chǎn)生了20%的利潤(rùn)。貢獻(xiàn)度分析要求我們抓住問(wèn)題的重點(diǎn),找到那最有效的20%的熱銷(xiāo)產(chǎn)品、渠道或者銷(xiāo)售人員,在最有效的20%上投入更多資源,盡量減少浪費(fèi)在80%低效的地方。
菜品盈利數(shù)據(jù) 帕累托圖
#初始化參數(shù)
dish_profit = '../data/catering_dish_profit.xls' #餐飲菜品盈利數(shù)據(jù)
data = pd.read_excel(dish_profit, index_col = u'菜品名')
data = data[u'盈利'].copy()
plt.figure()
data.plot(kind='bar')
plt.ylabel(u'盈利(元)')
p = 1.0*data.cumsum()/data.sum()
p.plot(color = 'r', secondary_y = True, style = '-o',linewidth = 2)#secondary_y數(shù)軸說(shuō)明在右邊
plt.annotate(format(p[6], '.4%'), xy = (6, p[6]), xytext=(6*0.9, p[6]*0.9), arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2")) #添加注釋,即85%處的標(biāo)記。這里包括了指定箭頭樣式。
plt.ylabel(u'盈利(比例)')
plt.show()
#小知識(shí)cumsum
a = np.array([[1,2,3], [4,5,6]])
np.cumsum(a,axis=0) ?????# sum over rows for each of the 3 columns
np.cumsum(a,axis=1) ?# sum over rows for each of the 3 行
就餐飲企業(yè)來(lái)講,可以重點(diǎn)改善盈利最高的80%的菜品,或者重點(diǎn)發(fā)展綜合影響最高的80%的部門(mén)。這種結(jié)果可以通過(guò)帕累托分析直觀的呈現(xiàn)出來(lái),如下圖:
相關(guān)性分析代碼corr
分析連續(xù)變量之間線性的相關(guān)程度的強(qiáng)弱,并用適當(dāng)?shù)慕y(tǒng)計(jì)指標(biāo)表示出來(lái)的過(guò)程稱(chēng)為相關(guān)分析。
相關(guān)性分析方法主要有:
直接繪制散點(diǎn)圖2繪制散點(diǎn)圖矩陣3計(jì)算相關(guān)系數(shù)(比較常用的如Pearson相關(guān)系數(shù)、Spearman秩相關(guān)系數(shù)和判定系數(shù)。)
catering_sale = '../data/catering_sale_all.xls' #餐飲數(shù)據(jù),含有其他屬性
data?= pd.read_excel(catering_sale, index_col = u'日期') #讀取數(shù)據(jù),指定“日期”列為索引列
data.corr() #相關(guān)系數(shù)矩陣,即給出了任意兩款菜式之間的相關(guān)系數(shù)
data.corr()[u'百合醬蒸鳳爪'] #只顯示“百合醬蒸鳳爪”與其他菜式的相關(guān)系數(shù)
data[u'百合醬蒸鳳爪'].corr(data[u'翡翠蒸香茜餃']) #計(jì)算“鳳爪”與“翡翠蒸香茜餃”的相關(guān)系數(shù)
統(tǒng)計(jì)特征函數(shù)
Mean()Geomean()幾何平均數(shù),Var,std,corr,cov。Moment中心距
第4章-數(shù)據(jù)預(yù)處理
一、數(shù)據(jù)清洗
數(shù)據(jù)清洗主要是刪除原始數(shù)據(jù)集中的無(wú)關(guān)數(shù)據(jù)、重復(fù)數(shù)據(jù),平滑噪聲數(shù)據(jù),處理缺失值、異常值等。
1刪除無(wú)關(guān)重復(fù)值
2平滑噪聲
3異常值處理
(1)刪除有異常值的記錄 (2)視為缺失值 (3)平均值修正 (4)不處理 
要分析異常值的原因,再?zèng)Q定取舍。
4缺失值處理
方法可分為三類(lèi):刪除記錄、數(shù)據(jù)插補(bǔ)和不處理。
常用的數(shù)據(jù)插補(bǔ)方法:均值/中位數(shù)/眾數(shù),固定值,最近鄰插補(bǔ),回歸方法,插值
插值方法:有Hermite插值、分段插值、樣條插值法,而最主要的有拉格朗日插值法和牛頓插值法。
拉格朗日插值法代碼?ployinterp_column
拉格朗日插值法可以找到一個(gè)多項(xiàng)式,其恰好在各個(gè)觀測(cè)的點(diǎn)取到觀測(cè)到的值。這樣的多項(xiàng)式稱(chēng)為拉格朗日(插值)多項(xiàng)式
from scipy.interpolate import lagrange #導(dǎo)入拉格朗日插值函數(shù)
inputfile = '../data/catering_sale.xls' #銷(xiāo)量數(shù)據(jù)路徑
outputfile = '../tmp/sales.xls' #輸出數(shù)據(jù)路徑
data = pd.read_excel(inputfile) #讀入數(shù)據(jù)
data[u'銷(xiāo)量'][(data[u'銷(xiāo)量'] < 400) | (data[u'銷(xiāo)量'] > 5000)] = None #過(guò)濾異常值,將其變?yōu)榭罩?/span>
#自定義列向量插值函數(shù)
#s為列向量,n為被插值的位置,k為取前后的數(shù)據(jù)個(gè)數(shù),默認(rèn)為5
def ployinterp_column(s, n, k=5):
??y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取數(shù)
??y = y[y.notnull()] #剔除空值
??return lagrange(y.index, list(y))(n) #插值并返回插值結(jié)果
#逐個(gè)元素判斷是否需要插值
for i in data.columns:
??for j in range(len(data)):
????if (data[i].isnull())[j]: #如果為空即插值。
??????data[i][j] = ployinterp_column(data[i], j)
data.to_excel(outputfile) #輸出結(jié)果,寫(xiě)入文件
?
二、數(shù)據(jù)集成:實(shí)體識(shí)別,冗余屬性識(shí)別
將多個(gè)數(shù)據(jù)源放在一個(gè)統(tǒng)一的數(shù)據(jù)倉(cāng)庫(kù)中。
要考慮實(shí)體識(shí)別問(wèn)題和屬性冗余問(wèn)題,從而把源數(shù)據(jù)在最低層上加以轉(zhuǎn)換、提煉和集成。
1.實(shí)體識(shí)別 
實(shí)體識(shí)別的任務(wù)是檢測(cè)和解決同名異義、異名同義、單位不統(tǒng)一的沖突。如:
同名異義:數(shù)據(jù)源A中的屬性ID和數(shù)據(jù)源B中的屬性ID分別描述的是菜品編號(hào)和訂單編號(hào),即描述的是不同的實(shí)體。
異名同義:數(shù)據(jù)源A中的sales_dt和數(shù)據(jù)源B中的sales_date都是是描述銷(xiāo)售日期的,即A. sales_dt= B. sales_date。
單位不統(tǒng)一:描述同一個(gè)實(shí)體分別用的是國(guó)際單位和中國(guó)傳統(tǒng)的計(jì)量單位。
2.冗余屬性識(shí)別 
?
數(shù)據(jù)集成往往導(dǎo)致數(shù)據(jù)冗余,如:同一屬性多次出現(xiàn)\同一屬性命名不一致導(dǎo)致重復(fù)
不同源數(shù)據(jù)的仔細(xì)整合能減少甚至避免數(shù)據(jù)冗余與不一致,以提高數(shù)據(jù)挖掘的速度和質(zhì)量。對(duì)于冗余屬性要先分析檢測(cè)到后再將其刪除。
有些冗余屬性可以用相關(guān)分析檢測(cè)到。給定兩個(gè)數(shù)值型的屬性A和B,根據(jù)其屬性值,可以用相關(guān)系數(shù)度量一個(gè)屬性在多大程度上蘊(yùn)含另一個(gè)屬性。
?
一、數(shù)據(jù)變換:簡(jiǎn)單函數(shù)變換 ,規(guī)范化,離散化
主要是對(duì)數(shù)據(jù)進(jìn)行規(guī)范化的操作,將數(shù)據(jù)轉(zhuǎn)換成“適當(dāng)?shù)摹备袷?#xff0c;以適用于挖掘任務(wù)及算法的需要。
1.簡(jiǎn)單函數(shù)變換
簡(jiǎn)單函數(shù)變換就是對(duì)原始數(shù)據(jù)進(jìn)行某些數(shù)學(xué)函數(shù)變換,常用的函數(shù)變換包括平方、開(kāi)方、對(duì)數(shù)、差分運(yùn)算等
用來(lái)將不具有正太分布的數(shù)據(jù)變換成具有正太性的數(shù)據(jù)。 
時(shí)間序列分析中,對(duì)數(shù)變換或者差分運(yùn)算可以將非平穩(wěn)序列轉(zhuǎn)換為平穩(wěn)序列
2.規(guī)范化?
數(shù)據(jù)標(biāo)準(zhǔn)化(歸一化)處理是數(shù)據(jù)挖掘的一項(xiàng)基礎(chǔ)工作,不同評(píng)價(jià)指標(biāo)往往具有不同的量綱和量綱單位,數(shù)值間的差別可能很大
消除指標(biāo)間量綱影響 
最小-最大規(guī)范化:也稱(chēng)為離差標(biāo)準(zhǔn)化是對(duì)原始數(shù)據(jù)的線性變換,使結(jié)果值映射到[0,1]之間
零-均值規(guī)范化:也叫標(biāo)準(zhǔn)差標(biāo)準(zhǔn)化,經(jīng)過(guò)處理的數(shù)據(jù)的平均數(shù)為0標(biāo)準(zhǔn)差為1
小數(shù)定標(biāo)規(guī)范化:通過(guò)移動(dòng)屬性值的小數(shù)位數(shù),將屬性值映射到[-1,1]之間,移動(dòng)的小數(shù)位數(shù)取決于屬性值絕對(duì)值的最大值。
?
datafile?= '../data/normalization_data.xls' #參數(shù)初始化
data = pd.read_excel(datafile, header = None) #讀取數(shù)據(jù)
(data - data.min())/(data.max() - data.min()) #最小-最大規(guī)范化
(data - data.mean())/data.std() #零-均值規(guī)范化,data.mean(axis = 0)按照列
data/10**np.ceil(np.log10(data.abs().max())) #小數(shù)定標(biāo)規(guī)范化
?
1.?連續(xù)屬性離散化?
一些數(shù)據(jù)挖掘算法,特別是某些分類(lèi)算法,要求數(shù)據(jù)是分類(lèi)屬性形式,如ID3算法、Apriori算法等。這樣,常常需要將連續(xù)屬性變換成分類(lèi)屬性,即連續(xù)屬性離散化。
離散化性涉及兩個(gè)子任務(wù):1需要多少個(gè)分類(lèi)變量2確定如何將連續(xù)屬性值映射到這些分類(lèi)值。
常用的離散化方法?
(1)等寬法 
(2)等頻法 
(3)基于聚類(lèi)分析的方法
#數(shù)據(jù)規(guī)范化:離散化cut,KMeans
datafile = '../data/discretization_data.xls' #參數(shù)初始化
data = pd.read_excel(datafile) #讀取數(shù)據(jù)
data = data[u'肝氣郁結(jié)證型系數(shù)'].copy()
k = 4
# 等寬離散化,各個(gè)類(lèi)比依次命名為0,1,2,3
d1 = pd.cut(data, k, labels = range(k))
#等頻率離散化
w = [1.0*i/k for i in range(k+1)]
w = data.describe(percentiles = w)[4:4+k+1] #使用describe函數(shù)自動(dòng)計(jì)算分位數(shù)
w[0] = w[0]*(1-1e-10)
d2 = pd.cut(data, w, labels = range(k))
#聚類(lèi)分類(lèi)
from sklearn.cluster import KMeans #引入KMeans
kmodel = KMeans(n_clusters = k, n_jobs = 4) #建立模型,n_jobs是并行數(shù),一般等于CPU數(shù)較好
kmodel.fit(data.reshape((len(data), 1))) #訓(xùn)練模型
c = pd.DataFrame(kmodel.cluster_centers_).sort_values(by=[0]) #.sort()#輸出聚類(lèi)中心,并且排序(默認(rèn)是隨機(jī)序的)
w = pd.rolling_mean(c, 2).iloc[1:] #相鄰兩項(xiàng)求中點(diǎn),作為邊界點(diǎn)
w = [0] + list(w[0]) + [data.max()] #把首末邊界點(diǎn)加上
d3 = pd.cut(data, w, labels = range(k))
def cluster_plot(d, k): #自定義作圖函數(shù)來(lái)顯示聚類(lèi)結(jié)果
??import matplotlib.pyplot as plt
??plt.rcParams['font.sans-serif'] = ['SimHei'] #用來(lái)正常顯示中文標(biāo)簽
??plt.rcParams['axes.unicode_minus'] = False #用來(lái)正常顯示負(fù)號(hào)
??
??plt.figure(figsize = (8, 3))
??for j in range(0, k):
????plt.plot(data[d==j], [j for i in d[d==j]], 'o')
??
??plt.ylim(-0.5, k-0.5)
??return plt
cluster_plot(d1, k).show()
cluster_plot(d2, k).show()
cluster_plot(d3, k).show()
4.?屬性構(gòu)造 -構(gòu)造新的屬性
#新屬性構(gòu)造-輸出到excel
inputfile= '../data/electricity_data.xls' #供入供出電量數(shù)據(jù)
outputfile = '../tmp/electricity_data.xls' #屬性構(gòu)造后數(shù)據(jù)文件
data = pd.read_excel(inputfile) #讀入數(shù)據(jù)
data[u'線損率'] = (data[u'供入電量'] - data[u'供出電量'])/data[u'供入電量']
data.to_excel(outputfile, index = False) #保存結(jié)果
?
5.?小波變換代碼
?
非平穩(wěn)序列的分析手段。 
基于小波變換的特征提取方法: 
(1)基于小波變換的多尺度空間能量分布特征提取法 
(2)基于小波變換的多尺度空間的模極大特征值提取法 
(3)基于小波變換的特征提取方法 
(4)基于適應(yīng)性小波神經(jīng)網(wǎng)絡(luò)的特征提取方法
inputfile= '../data/leleccum.mat' #提取自Matlab的信號(hào)文件
from scipy.io import loadmat #mat是MATLAB專(zhuān)用格式,需要用loadmat讀取它
mat = loadmat(inputfile)
signal = mat['leleccum'][0]
import pywt #導(dǎo)入PyWavelets
coeffs = pywt.wavedec(signal, 'bior3.7', level = 5)
#返回結(jié)果為level+1個(gè)數(shù)字,第一個(gè)數(shù)組為逼近系數(shù)數(shù)組,后面的依次是細(xì)節(jié)系數(shù)數(shù)組
二、數(shù)據(jù)規(guī)約
數(shù)據(jù)規(guī)約是將海量數(shù)據(jù)進(jìn)行規(guī)約,規(guī)約之后的數(shù)據(jù)仍接近于保持原數(shù)據(jù)的完整性,但數(shù)據(jù)量小得多。
通過(guò)數(shù)據(jù)規(guī)約,可以達(dá)到:
降低無(wú)效、錯(cuò)誤數(shù)據(jù)對(duì)建模的影響,提高建模的準(zhǔn)確性
少量且具代表性的數(shù)據(jù)將大幅縮減數(shù)據(jù)挖掘所需的時(shí)間
降低儲(chǔ)存數(shù)據(jù)的成本。
1.屬性規(guī)約常用方法:
1.合并屬性2逐步向前選擇3逐步向后刪除4決策樹(shù)規(guī)約
5主成分分析降維代碼
1數(shù)據(jù)矩陣2將數(shù)據(jù)矩陣中心標(biāo)準(zhǔn)化3求相關(guān)系數(shù)矩陣4求R的特征方程5確定主成分個(gè)數(shù)
6計(jì)算m個(gè)相應(yīng)的單位特征向量7計(jì)算主成分
?
inputfile = '../data/principal_component.xls'
outputfile = '../tmp/dimention_reducted.xls' #降維后的數(shù)據(jù)
data = pd.read_excel(inputfile, header = None) #讀入數(shù)據(jù)
from sklearn.decomposition import PCA
pca = PCA()
pca.fit(data)
pca.components_ #返回模型的各個(gè)特征向量
pca.explained_variance_ratio_ #返回各個(gè)成分各自的方差百分比
三維
pca=PCA(3)
pca.fit(data)
low_d=pca.transform(data)#降維
pd.DataFrame(low_d).to_excel(outputfile)
pca.inverse_transform(low_d)
?
2數(shù)值規(guī)約 :分箱,回歸,聚類(lèi),卡方檢驗(yàn),決策樹(shù)
通過(guò)選擇替代的、較小的數(shù)據(jù)來(lái)減少數(shù)據(jù)量,包含有參數(shù)方法和無(wú)參數(shù)方法兩類(lèi);有參數(shù)方法使用模型評(píng)估數(shù)據(jù),不需要存放真實(shí)數(shù)據(jù),只需要存放參數(shù),例如回歸、對(duì)數(shù)線性模型。
無(wú)參數(shù)需要數(shù)據(jù),例如直方圖、聚類(lèi)、抽樣。
五、常用數(shù)據(jù)預(yù)處理函數(shù)
1.interpolate:一維,高維數(shù)據(jù)插值 
f.scipy.interpolate.lagrange(x,y) 
2.unique:去除重復(fù)元素 
np.unique(D) 
D.unique( )
import pandas as pd
import numpy as np
D=pd.Series([1,1,2,3,5])
d1=D.unique()
d2=np.unique(D)
print "d1 is:\n",d1
print "d2 is:\n",d2
3.isnull/notnull:判斷空值/非空值 
4.random:生成隨機(jī)矩陣 
k x m x n維0-1之間; 
np.random.rand(k,m,n…) 
k x m x n維,正態(tài)分布; 
np.random.randn(k,m,n) 
5.PCA:主成分分析
?
第5章:挖掘建模
cmplot混淆矩陣,看spe,
# -*- coding: utf-8 -*-
def cm_plot(y, yp):
??from sklearn.metrics import confusion_matrix ?# 導(dǎo)入混淆矩陣函數(shù)
??cm = confusion_matrix(y, yp) ?# 混淆矩陣
??import matplotlib.pyplot as plt ?# 導(dǎo)入作圖庫(kù)
??plt.matshow(cm, cmap=plt.cm.Greens) ?# 畫(huà)混淆矩陣圖,配色風(fēng)格使用cm.Greens,更多風(fēng)格請(qǐng)參考官網(wǎng)。
??plt.colorbar() ?# 顏色標(biāo)簽
??for x in range(len(cm)): ?# 數(shù)據(jù)標(biāo)簽
????for y in range(len(cm)):
??????plt.annotate(cm[x, y], xy=(x, y), horizontalalignment='center', verticalalignment='center')
??plt.ylabel('True label') ?# 坐標(biāo)軸標(biāo)簽
??plt.xlabel('Predicted label') ?# 坐標(biāo)軸標(biāo)簽
??return plt
?
1分類(lèi)與預(yù)測(cè)
算法與模型
算法:回歸分析(logistics,LDA),決策樹(shù),神經(jīng)網(wǎng)絡(luò),貝葉斯,svm,隨機(jī)森林
常用回歸模型:邏輯回歸,(非)線性回歸,嶺回歸,主成分回歸, logistics回歸
1、邏輯回歸
#-*- coding: utf-8 -*-
#邏輯回歸 自動(dòng)建模
import pandas as pd
#參數(shù)初始化
filename = '../data/bankloan.xls'
data = pd.read_excel(filename)
x = data.iloc[:,:8].as_matrix()
y = data.iloc[:,8].as_matrix()
from sklearn.linear_model import LogisticRegression as LR
from sklearn.linear_model import RandomizedLogisticRegression as RLR 
rlr = RLR() #建立隨機(jī)邏輯回歸模型,篩選變量
rlr.fit(x, y) #訓(xùn)練模型
rlr.get_support() #獲取特征篩選結(jié)果,也可以通過(guò).scores_方法獲取各個(gè)特征的分?jǐn)?shù)
print(u'通過(guò)隨機(jī)邏輯回歸模型篩選特征結(jié)束。')
print(u'有效特征為:%s' % ','.join(data.columns[rlr.get_support()]))
x = data[data.columns[rlr.get_support()]].as_matrix() #篩選好特征
lr = LR() #建立邏輯貨柜模型
lr.fit(x, y) #用篩選后的特征數(shù)據(jù)來(lái)訓(xùn)練模型
print(u'邏輯回歸模型訓(xùn)練結(jié)束。')
print(u'模型的平均正確率為:%s' % lr.score(x, y)) #給出模型的平均正確率,本例為81.4%
?
Scikit-learn提供了RFE包,用于特征消除,還提供了RFECV通過(guò)交叉驗(yàn)證進(jìn)行特征排序
2、決策樹(shù)ID3,C4.5,CART
ID3決策樹(shù)
ID3算法是一種基于信息熵的決策樹(shù)分類(lèi)算法,它選擇當(dāng)前樣本集中具有最大信息增益值的屬性作為測(cè)試屬性選擇增益最大
?
#-*- coding: utf-8 -*-
#使用ID3決策樹(shù)算法預(yù)測(cè)銷(xiāo)量高低
import pandas as pd
#參數(shù)初始化
inputfile = '../data/sales_data.xls'
data = pd.read_excel(inputfile, index_col = u'序號(hào)') #導(dǎo)入數(shù)據(jù)
#數(shù)據(jù)是類(lèi)別標(biāo)簽,要將它轉(zhuǎn)換為數(shù)據(jù)
#用1來(lái)表示“好”、“是”、“高”這三個(gè)屬性,用-1來(lái)表示“壞”、“否”、“低”
data[data == u'好'] = 1
data[data == u'是'] = 1
data[data == u'高'] = 1
data[data != 1] = -1
x = data.iloc[:,:3].as_matrix().astype(int)
y = data.iloc[:,3].as_matrix().astype(int)
from sklearn.tree import DecisionTreeClassifier as DTC
dtc = DTC(criterion='entropy') #建立決策樹(shù)模型,基于信息熵
dtc.fit(x, y) #訓(xùn)練模型
#導(dǎo)入相關(guān)函數(shù),可視化決策樹(shù)。
#導(dǎo)出的結(jié)果是一個(gè)dot文件,需要安裝Graphviz才能將它轉(zhuǎn)換為pdf或png等格式。
from sklearn.tree import export_graphviz
from sklearn.externals.six import StringIO
with open("tree.dot", 'w') as f:
??f = export_graphviz(dtc, feature_names = x.columns, out_file = f)
?
圖2
CART決策樹(shù)模型
#-*- coding: utf-8 -*-
#構(gòu)建并測(cè)試CART決策樹(shù)模型
import pandas as pd #導(dǎo)入數(shù)據(jù)分析庫(kù)
from random import shuffle #導(dǎo)入隨機(jī)函數(shù)shuffle,用來(lái)打算數(shù)據(jù)
datafile = '../data/model.xls' #數(shù)據(jù)名
data = pd.read_excel(datafile) #讀取數(shù)據(jù),數(shù)據(jù)的前三列是特征,第四列是標(biāo)簽
data = data.as_matrix() #將表格轉(zhuǎn)換為矩陣
shuffle(data) #隨機(jī)打亂數(shù)據(jù)
p = 0.8 #設(shè)置訓(xùn)練數(shù)據(jù)比例
train = data[:int(len(data)*p),:] #前80%為訓(xùn)練集
test = data[int(len(data)*p):,:] #后20%為測(cè)試集
#構(gòu)建CART決策樹(shù)模型
from sklearn.tree import DecisionTreeClassifier #導(dǎo)入決策樹(shù)模型
treefile = '../tmp/tree.pkl' #模型輸出名字
tree = DecisionTreeClassifier() #建立決策樹(shù)模型
tree.fit(train[:,:3], train[:,3]) #訓(xùn)練
#保存模型
from sklearn.externals import joblib
joblib.dump(tree, treefile)
from cm_plot import * #導(dǎo)入自行編寫(xiě)的混淆矩陣可視化函數(shù)
cm_plot(train[:,3], tree.predict(train[:,:3])).show() #顯示混淆矩陣可視化結(jié)果
#注意到Scikit-Learn使用predict方法直接給出預(yù)測(cè)結(jié)果。
from sklearn.metrics import roc_curve #導(dǎo)入ROC曲線函數(shù)
fpr, tpr, thresholds = roc_curve(test[:,3], tree.predict_proba(test[:,:3])[:,1], pos_label=1)
plt.plot(fpr, tpr, linewidth=2, label = 'ROC of CART', color = 'green') #作出ROC曲線
plt.xlabel('False Positive Rate') #坐標(biāo)軸標(biāo)簽
plt.ylabel('True Positive Rate') #坐標(biāo)軸標(biāo)簽
plt.ylim(0,1.05) #邊界范圍
plt.xlim(0,1.05) #邊界范圍
plt.legend(loc=4) #圖例
plt.show() #顯示作圖結(jié)果
?
3、人工神經(jīng)網(wǎng)絡(luò)BP\LM\RBF\FNN\GMDH\ANFIS
#-*- coding: utf-8 -*-
#使用神經(jīng)網(wǎng)絡(luò)算法預(yù)測(cè)銷(xiāo)量高低,用sales_data.xls
from keras.models import Sequential
from keras.layers.core import Dense, Activation
model = Sequential() #建立模型
model.add(Dense(10,input_dim=3)) ?#三個(gè)輸入,10個(gè)隱藏,1一個(gè)輸出
model.add(Activation('relu')) #用relu函數(shù)作為激活函數(shù),能夠大幅提供準(zhǔn)確度
model.add(Dense(1,input_dim=10))
model.add(Activation('sigmoid')) #由于是0-1輸出,用sigmoid函數(shù)作為激活函數(shù)
model.compile(loss = 'binary_crossentropy', optimizer = 'adam')#?class_mode = 'binary'
#編譯模型。由于我們做的是二元分類(lèi),所以我們指定損失函數(shù)為binary_crossentropy,以及模式為binary
#另外常見(jiàn)的損失函數(shù)還有mean_squared_error、categorical_crossentropy等,請(qǐng)閱讀幫助文件。
#求解方法我們指定用adam,還有sgd、rmsprop等可選
model.fit(x, y, epochs = 1000, batch_size = 10) #訓(xùn)練模型,學(xué)習(xí)一千次,x訓(xùn)練失敗?
yp = model.predict_classes(x).reshape(len(y)) #分類(lèi)預(yù)測(cè)
from cm_plot import * #導(dǎo)入自行編寫(xiě)的混淆矩陣可視化函數(shù)
cm_plot(y,yp).show() #顯示混淆矩陣可視化結(jié)果
?
2聚類(lèi)分析:
劃分方法(常用:kmean算法 ,k中心點(diǎn)),系統(tǒng)聚類(lèi),層次聚類(lèi),譜聚類(lèi),基于密度/網(wǎng)格/模型的聚類(lèi),均值漂移聚類(lèi):用scikit-learn,spicy.cluster也有很多
kmeans聚類(lèi)算法過(guò)程:
1)從N個(gè)樣本數(shù)據(jù)中隨機(jī)選取K個(gè)對(duì)象作為初始的聚類(lèi)中心;
2)分別計(jì)算每個(gè)樣本到各個(gè)聚類(lèi)中心的距離,將對(duì)象分配到距離最近的聚類(lèi)中;
3)所有對(duì)象分配完成后,重新計(jì)算K個(gè)聚類(lèi)的中心;
4)與前一次計(jì)算得到的K個(gè)聚類(lèi)中心比較,如果聚類(lèi)中心發(fā)生變化,轉(zhuǎn)2),否則轉(zhuǎn)5);
5)當(dāng)質(zhì)心不發(fā)生變化時(shí)停止并輸出聚類(lèi)結(jié)果。
(連續(xù)屬性:度量樣本之間的相似性最常用的是歐幾里得距離、曼哈頓距離和閔可夫斯基距離, 文檔數(shù)據(jù):使用余弦相似性度量,先將文檔數(shù)據(jù)整理成文檔—詞矩陣格式)
誤差平方和SSE
???????????
import pandas as pd
#參數(shù)初始化
inputfile = '../data/consumption_data.xls' #銷(xiāo)量及其他屬性數(shù)據(jù)
outputfile = '../tmp/data_type.xls' #保存結(jié)果的文件名
k = 3 #聚類(lèi)的類(lèi)別
iteration = 500 #聚類(lèi)最大循環(huán)次數(shù)
data = pd.read_excel(inputfile, index_col = 'Id') #讀取數(shù)據(jù)
data_zs = 1.0*(data - data.mean())/data.std() #數(shù)據(jù)標(biāo)準(zhǔn)化
from sklearn.cluster import KMeans
if __name__=='__main__':#加入此行代碼即可
????model = KMeans(n_clusters = k, n_jobs = 4, max_iter = iteration) #分為k類(lèi),并發(fā)數(shù)4
????model.fit(data_zs) #開(kāi)始聚類(lèi), you must protect your main loop using "if __name__ == '__main__'".
#簡(jiǎn)單打印結(jié)果
r1 = pd.Series(model.labels_).value_counts() #統(tǒng)計(jì)各個(gè)類(lèi)別的數(shù)目
r2 = pd.DataFrame(model.cluster_centers_) #找出聚類(lèi)中心
r = pd.concat([r2, r1], axis = 1) #橫向連接(0是縱向),得到聚類(lèi)中心對(duì)應(yīng)的類(lèi)別下的數(shù)目
r.columns = list(data.columns) + [u'類(lèi)別數(shù)目'] #重命名表頭
print(r)
#詳細(xì)輸出原始數(shù)據(jù)及其類(lèi)別
r = pd.concat([data, pd.Series(model.labels_, index = data.index)], axis = 1) ?#詳細(xì)輸出每個(gè)樣本對(duì)應(yīng)的類(lèi)別
r.columns = list(data.columns) + [u'聚類(lèi)類(lèi)別'] #重命名表頭
r.to_excel(outputfile) #保存結(jié)果
繪制聚類(lèi)后的概率密度圖
def density_plot(data): #自定義作圖函數(shù)
??p = data.plot(kind='kde', linewidth = 2, subplots = True, sharex = False)
??[p[i].set_ylabel(u'密度') for i in range(k)]
??plt.legend()
??return plt
pic_output = '../tmp/pd_' #概率密度圖文件名前綴
for i in range(k):
??density_plot(data[r[u'聚類(lèi)類(lèi)別']==i]).savefig(u'%s%s.png' %(pic_output, i))
?
for i in range(len(data.iloc[0])):#逐列作圖
??(data.iloc[:,i]).plot(kind='kde', linewidth=2, label=data.columns[i])
聚類(lèi)后算法評(píng)價(jià)
Purity評(píng)價(jià)法:正確聚類(lèi)占總數(shù)比例
RI評(píng)價(jià)
F值評(píng)價(jià)
聚類(lèi)可視化TSNE
#接kmeans.py
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
tsne = TSNE()
tsne.fit_transform(data_zs) #進(jìn)行數(shù)據(jù)降維
tsne = pd.DataFrame(tsne.embedding_, index = data_zs.index) #轉(zhuǎn)換數(shù)據(jù)格式
#不同類(lèi)別用不同顏色和樣式繪圖
d = tsne[r[u'聚類(lèi)類(lèi)別'] == 0] ?#a=r[u'聚類(lèi)類(lèi)別'] == 0,dtype('bool'),r:oject,r.columns:Index([u'R', u'F', u'M', u'聚類(lèi)類(lèi)別'], dtype='object')
plt.plot(d[0], d[1], 'r.')
d = tsne[r[u'聚類(lèi)類(lèi)別'] == 1]
plt.plot(d[0], d[1], 'go')
d = tsne[r[u'聚類(lèi)類(lèi)別'] == 2]
plt.plot(d[0], d[1], 'b*')
plt.show()
?
3關(guān)聯(lián)規(guī)則aprior,FP-TREE
(1)關(guān)聯(lián)規(guī)則的一般形式
支持度:項(xiàng)集A、B同時(shí)發(fā)生的概率
置信度:項(xiàng)集A發(fā)生,則項(xiàng)集B也同時(shí)發(fā)生的概率
(2)最小支持度和最小置信度
最小支持度:一個(gè)閾值,表示項(xiàng)目集在統(tǒng)計(jì)意義上的最低重要性;
最小置信度:一個(gè)閾值表示關(guān)聯(lián)規(guī)則的最低可靠性。
同時(shí)滿足最小支持度閾值和最小置信度閾值的規(guī)則稱(chēng)作強(qiáng)規(guī)則。
?
函數(shù)文件apirior.py
過(guò)程一:找出所有的頻繁項(xiàng)集。
過(guò)程二:由頻繁項(xiàng)集產(chǎn)生強(qiáng)關(guān)聯(lián)規(guī)則
def connect_string(x, ms):
????x = list(map(lambda i: sorted(i.split(ms)), x))
????l = len(x[0])
????r = []
????for i in range(len(x)):
????????for j in range(i, len(x)):
????????????if x[i][:l - 1] == x[j][:l - 1] and x[i][l - 1] != x[j][l - 1]:
????????????????r.append(x[i][:l - 1] + sorted([x[j][l - 1], x[i][l - 1]]))
????return r
# 尋找關(guān)聯(lián)規(guī)則的函數(shù)
def find_rule(d, support, confidence, ms=u'--'):
????result?= pd.DataFrame(index=['support', 'confidence']) ?# 定義輸出結(jié)果
????support_series = 1.0 * d.sum() / len(d) ?# 支持度序列
????column = list(support_series[support_series > support].index) ?# 初步根據(jù)支持度篩選
????k = 0
????while len(column) > 1:
????????k = k + 1
????????print(u'\n正在進(jìn)行第%s次搜索...' % k)
????????column = connect_string(column, ms)
????????print(u'數(shù)目:%s...' % len(column))
????????sf = lambda i: d[i].prod(axis=1, numeric_only=True) ?# 新一批支持度的計(jì)算函數(shù)
????????# 創(chuàng)建連接數(shù)據(jù),這一步耗時(shí)、耗內(nèi)存最嚴(yán)重。當(dāng)數(shù)據(jù)集較大時(shí),可以考慮并行運(yùn)算優(yōu)化。
????????d_2 = pd.DataFrame(list(map(sf, column)), index=[ms.join(i) for i in column]).T
????????support_series_2 = 1.0 * d_2[[ms.join(i) for i in column]].sum() / len(d) ?# 計(jì)算連接后的支持度
????????column = list(support_series_2[support_series_2 > support].index) ?# 新一輪支持度篩選
????????support_series = support_series.append(support_series_2)
????????column2 = []
????????for i in column: ?# 遍歷可能的推理,如{A,B,C}究竟是A+B-->C還是B+C-->A還是C+A-->B?
????????????i = i.split(ms)
????????????for j in range(len(i)):
????????????????column2.append(i[:j] + i[j + 1:] + i[j:j + 1])
????????cofidence_series = pd.Series(index=[ms.join(i) for i in column2]) ?# 定義置信度序列
????????for i in column2: ?# 計(jì)算置信度序列
????????????cofidence_series[ms.join(i)] = support_series[ms.join(sorted(i))] / support_series[ms.join(i[:len(i) - 1])]
????????for i in cofidence_series[cofidence_series > confidence].index: ?# 置信度篩選
????????????result[i] = 0.0
????????????result[i]['confidence'] = cofidence_series[i]
????????????result[i]['support'] = support_series[ms.join(sorted(i.split(ms)))]
????result?= result.T.sort(['confidence', 'support'], ascending=False) ?# 結(jié)果整理,輸出
????print(u'\n結(jié)果為:')
????print(result)
????return result
使用Apriori算法挖掘菜品訂單關(guān)聯(lián)規(guī)則
#-*- coding: utf-8 -*-
#使用Apriori算法挖掘菜品訂單關(guān)聯(lián)規(guī)則
from __future__ import print_function
import pandas as pd
from apriori import * #導(dǎo)入自行編寫(xiě)的apriori函數(shù)
inputfile = '../data/menu_orders.xls'
outputfile = '../tmp/apriori_rules.xls' #結(jié)果文件
data = pd.read_excel(inputfile, header = None)
代碼好-轉(zhuǎn)換原始數(shù)據(jù)至0-1矩陣...')?有問(wèn)題
ct = lambda x : pd.Series(1, index = x[pd.notnull(x)]) #轉(zhuǎn)換0-1矩陣的過(guò)渡函數(shù)
b = map(ct, data.as_matrix()) #用map方式執(zhí)行
data = pd.DataFrame(list(b)).fillna(0) #實(shí)現(xiàn)矩陣轉(zhuǎn)換,空值用0填充
print(u'\n轉(zhuǎn)換完畢。')
del b #刪除中間變量b,節(jié)省內(nèi)存
support = 0.2 #最小支持度
confidence = 0.5 #最小置信度
ms = '---' #連接符,默認(rèn)'--',用來(lái)區(qū)分不同元素,如A--B。需要保證原始表格中不含有該字符
find_rule(data, support, confidence, ms).to_excel(outputfile) #保存結(jié)果
?
4時(shí)序模式:
常見(jiàn)的時(shí)間序列模型 平滑,趨勢(shì)擬合法,組合(加法,乘法)、AR、MA,ARMA,ARIMA,ARCH,GARCH,將重點(diǎn)介紹AR模型、MA模型、ARMA模型和ARIMA模型。
時(shí)間序列的預(yù)處理(隨機(jī)+平穩(wěn))
拿到一個(gè)觀察值序列后,首先要對(duì)它的純隨機(jī)性和平穩(wěn)性進(jìn)行檢驗(yàn),這兩個(gè)重要的檢驗(yàn)稱(chēng)為序列的預(yù)處理。根據(jù)檢驗(yàn)結(jié)果可以將序列分為不同的類(lèi)型,對(duì)不同類(lèi)型的序列會(huì)采取不同的分析方法。
對(duì)于純隨機(jī)序列,又叫白噪聲序列,就意味著序列的各項(xiàng)之間沒(méi)有任何相關(guān)關(guān)系,序列在進(jìn)行完全無(wú)序的隨機(jī)波動(dòng),可以終止對(duì)該序列的分析。
對(duì)于平穩(wěn)非白噪聲序列,它的均值和方差是常數(shù),現(xiàn)已有一套非常成熟的平穩(wěn)序列的建模方法。通常是建立一個(gè)線性模型來(lái)擬合該序列的發(fā)展,借此提取該序列的有用信息。ARMA模型是最常用的平穩(wěn)序列擬合模型;
對(duì)于非平穩(wěn)序列,由于它的均值和方差不穩(wěn)定,處理方法一般是將其轉(zhuǎn)變?yōu)槠椒€(wěn)序列,這樣就可以應(yīng)用有關(guān)平穩(wěn)時(shí)間序列的分析方法,如建立ARMA模型來(lái)進(jìn)行相應(yīng)得研究。如果一個(gè)時(shí)間序列經(jīng)差分運(yùn)算后具有平穩(wěn)性,成該序列為差分平穩(wěn)序列,可以使用ARIMA模型進(jìn)行分析。
1平穩(wěn)性檢驗(yàn)
對(duì)序列的平穩(wěn)性的檢驗(yàn)有兩種檢驗(yàn)方法,一種是根據(jù)時(shí)序圖和自相關(guān)圖的特征做出判斷的圖檢驗(yàn),該方法操作簡(jiǎn)單、應(yīng)用廣泛,缺點(diǎn)是帶有主觀性;另一種是構(gòu)造檢驗(yàn)統(tǒng)計(jì)量進(jìn)行的方法,目前最常用的方法是單位根檢驗(yàn)
(1)時(shí)序圖檢驗(yàn):如果有明顯的趨勢(shì)性或者周期性那它通常不是平穩(wěn)序列。
(2)自相關(guān)圖檢驗(yàn)(常用)
??????平穩(wěn)序列具有短期相關(guān)性,隨著延遲期數(shù)的增加,平穩(wěn)序列的自相關(guān)系數(shù) 會(huì)比較快的衰減趨向于零,并在零附近隨機(jī)波動(dòng),而非平穩(wěn)序列的自相關(guān)系數(shù)衰減的速度比較慢
(3)單位根檢驗(yàn)是指檢驗(yàn)序列中是否存在單位根,因?yàn)榇嬖趩挝桓褪欠瞧椒€(wěn)時(shí)間序列了。p 值顯著大于0.05===非平穩(wěn)(不是白噪聲)
?
2純隨機(jī)性檢驗(yàn)
純隨機(jī)性檢驗(yàn)也稱(chēng)白噪聲檢驗(yàn),一般是構(gòu)造檢驗(yàn)統(tǒng)計(jì)量來(lái)檢驗(yàn)序列的純隨機(jī)性,常用的檢驗(yàn)統(tǒng)計(jì)量有 Q 統(tǒng)計(jì)量、LB 統(tǒng)計(jì)量,計(jì)算出對(duì)應(yīng)的p 值,如果p值顯著大于顯著性水平,則表示該序列不能拒絕純隨機(jī)的原假設(shè),可以停止對(duì)該序列的分析。
平穩(wěn)時(shí)間序列分析ARMA
ARMA模型的全稱(chēng)是自回歸移動(dòng)平均模型,它是目前最常用的擬合平穩(wěn)序列的模型。
ARMA模型又可以細(xì)分為AR模型、MA模型和ARMA模型三大類(lèi)。都可以看作是多元線性回歸模型。
下面將分別介紹AR模型、MA模型和ARMA模型三大模型。
平穩(wěn)時(shí)間序列的ARMA模型建模步驟。
某個(gè)時(shí)間序列經(jīng)過(guò)預(yù)處理,被判定為平穩(wěn)非白噪聲序列,就可以利用ARMA模型進(jìn)行建模。
由AR模型、MA模型和ARMA模型的自相關(guān)系數(shù)和偏自相關(guān)系數(shù)的性質(zhì),選擇出合適的模型。
AR、MA和ARMA模型自相關(guān)系數(shù)和偏自相關(guān)系數(shù)的性質(zhì)如下:
AR模型:自相關(guān)系數(shù)拖尾,偏自相關(guān)系數(shù)截尾;
MA模型:自相關(guān)系數(shù)截尾,偏自相關(guān)函數(shù)拖尾;
ARMA模型:自相關(guān)函數(shù)和偏自相關(guān)函數(shù)均拖尾。
?
非平穩(wěn)時(shí)間序列分析ARIMA
對(duì)非平穩(wěn)時(shí)間序列的分析方法可以分為確定性因素分解的時(shí)序分析和隨機(jī)時(shí)序分析兩大類(lèi) 。
確定性因素分解的方法把所有序列的變化都?xì)w結(jié)為四個(gè)因素(長(zhǎng)期趨勢(shì)、季節(jié)變動(dòng)、循環(huán)變動(dòng)和隨機(jī)波動(dòng))的綜合影響。可以建立加法模型和乘法模型等。
根據(jù)時(shí)間序列的不同特點(diǎn),隨機(jī)時(shí)序分析可以建立的模型有ARIMA模型、殘差自回歸模型、季節(jié)模型、異方差模型等。
1、p階差分:相距一期的兩個(gè)序 列值之間的減法運(yùn)算稱(chēng)為 1 階差分運(yùn)算;
2、k步差分:相距k期的兩個(gè)序列值之間的減法運(yùn)算稱(chēng)為k步差分運(yùn)算。
3、差分運(yùn)算具有強(qiáng)大的確定性信息提取能力,許多非平穩(wěn)序列差分后會(huì)顯示出平穩(wěn)序列的性質(zhì),這時(shí)稱(chēng)這個(gè)非平穩(wěn)序列為差分平穩(wěn)序列。
4、對(duì)差分平穩(wěn)序列可以使用ARMA模型進(jìn)行擬合。
5、ARIMA模型的實(shí)質(zhì)就是差分運(yùn)算與ARMA模型的組合,掌握了ARMA模型的建模方法和步驟以后,對(duì)序列建立ARIMA模型是比較簡(jiǎn)單的。 ???
建模步驟:(代碼問(wèn)題)
?
建模步驟
計(jì)算ACF和PACF(自相關(guān)圖平穩(wěn)性檢驗(yàn)+白噪聲
?????先計(jì)算非平穩(wěn)白噪聲序列的自相關(guān)系數(shù)(ACF)和偏自相關(guān)系數(shù)(PACF)
不平穩(wěn)差分后再用ARIMA模型
import pandas as pd
#讀取數(shù)據(jù),指定日期列為指標(biāo),Pandas自動(dòng)將“日期”列識(shí)別為Datetime格式
discfile = '../data/arima_data.xls'
forecastnum = 5
data = pd.read_excel(discfile, index_col = u'日期')
import matplotlib.pyplot as plt
data.plot()
plt.show()
#自相關(guān)圖和偏自相關(guān)圖選擇模型
from scipy import stats
import matplotlibt.pyplot as plt
import statsmodels.api as sm
from statsmodels.graphics.api import qqplot
fig=sm.graphic.tsa.plot_acf(dta,lags=40,ax=ax1)
fig = sm.graphics.tsa.plot_pacf(dta, lags=40, ax=ax2)
# 一階差分后的自相關(guān)圖與偏自相關(guān)圖
dta = dta.diff(1).dropna() ?# 注意一定要將查分后的空值去掉再取自相關(guān)系數(shù)
fig = sm.graphics.tsa.plot_acf(dta, lags=40, ax=ax3)
fig = sm.graphics.tsa.plot_pacf(dta, lags=40, ax=ax4)
#平穩(wěn)性檢測(cè)#白噪聲檢驗(yàn)
from statsmodels.tsa.stattools import adfuller as ADF
print(u'原始序列的ADF檢驗(yàn)結(jié)果為:', ADF(data[u'銷(xiāo)量']))
#返回值依次為adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore
D_data=data.diff().dropna()
D_data.columns=[u'銷(xiāo)量差分']
from statsmodels.stats.diagnostic import acorr_ljungbox
print(u'差分序列的白噪聲檢驗(yàn)結(jié)果為:', acorr_ljungbox(D_data, lags=1)) #返回統(tǒng)計(jì)量和p值
from statsmodels.tsa.arima_model import ARIMA
#定階
pmax = int(len(D_data)/10) #一般階數(shù)不超過(guò)length/10
qmax = int(len(D_data)/10) #一般階數(shù)不超過(guò)length/10
bic_matrix = [] #bic矩陣
for p in range(pmax+1):
??tmp = []
??for q in range(qmax+1):
????try: #存在部分報(bào)錯(cuò),所以用try來(lái)跳過(guò)報(bào)錯(cuò)。
??????tmp.append(ARIMA(data, (p,1,q)).fit().bic)
????except:
??????tmp.append(None)
??bic_matrix.append(tmp)
bic_matrix = pd.DataFrame(bic_matrix) #從中可以找出最小值
p,q = bic_matrix.stack().idxmin() #先用stack展平,然后用idxmin找出最小值位置。
print(u'BIC最小的p值和q值為:%s、%s' %(p,q)) 
?
ARMA模型識(shí)別
??????由AR模型、MA模型和ARMA模型的自相關(guān)系數(shù)和偏自相關(guān)系數(shù)的性質(zhì),選擇出合適的模型。
模型定階AIC:確定p和q
(1)人為識(shí)別的方法:用相關(guān)圖像根據(jù)ARMA模型識(shí)別原則進(jìn)行模型定階
(2)第二種方法:相對(duì)最優(yōu)模型識(shí)別。
計(jì)算ARMA(p,q)當(dāng) p 和 q 均小于等于 5 的所有組合的 BIC 信息量,取其中 BIC 信息量達(dá)到最小的模型階數(shù)。ARIMA(P,1,Q)
模型檢驗(yàn)
確定模型后,需要檢驗(yàn)其殘差序列是否是白噪聲,若不是,說(shuō)明,殘差中還存在有用的信息,需要修改模型或者進(jìn)一步提取。若其殘差不是白噪聲,重新更換p,q的值,重新確定
?
?p值為:0.627016 ,大于0.05,殘差為白噪聲序列,模型通過(guò)檢驗(yàn)。
模型預(yù)測(cè)
只能進(jìn)行短期預(yù)測(cè)
model?= ARIMA(data, (p,1,q)).fit() #建立ARIMA(0, 1, 1)模型
model.summary2() #給出一份模型報(bào)告
model.forecast(5)
模型優(yōu)化與應(yīng)用
5離群點(diǎn)檢測(cè)
threshold=2
norm = []
for i in range(k): #逐一處理
??norm_tmp = r[['R', 'F', 'M']][r[u'聚類(lèi)類(lèi)別'] == i]-model.cluster_centers_[i]
??norm_tmp = norm_tmp.apply(np.linalg.norm, axis = 1) #求出絕對(duì)距離
??norm.append(norm_tmp/norm_tmp.median()) #求相對(duì)距離并添加
#norm = pd.concat(norm) #合并
norm[norm <= threshold].plot(style = 'go') #正常點(diǎn)
discrete_points = norm[norm > threshold] #離群點(diǎn)
discrete_points.plot(style = 'ro')
for i in range(len(discrete_points)): #離群點(diǎn)做標(biāo)記
??id = discrete_points.index[i]
??n = discrete_points.iloc[i]
??plt.annotate('(%s, %0.2f)'%(id, n), xy = (id, n), xytext = (id, n))
plt.xlabel(u'編號(hào)')
plt.ylabel(u'相對(duì)距離')
plt.show()
總結(jié)
以上是生活随笔為你收集整理的《python数据分析与挖掘》-步骤的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: bu yong di san fang
- 下一篇: 用VML标记语言画图、动画制作
