日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

《python数据分析与挖掘》-步骤

發布時間:2023/12/15 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《python数据分析与挖掘》-步骤 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

3章數據探索(重要)

數據質量分析

是數據預處理的前提,是數據挖掘分析結論有效性和準確性的基礎,其主要任務是檢查原始數據中是否存在臟數據,臟數據包括:

????缺失值

????異常值

????不一致的值

????重復數據及含有特殊符號(如#、¥、*)的數據

本小節將主要對數據中的缺失值、異常值和一致性進行分析。

缺失值統計分析

統計缺失值的變量個數

統計每個變量的未缺失數

統計變量的缺失數及缺失率

異常值統計分析-箱型圖代碼

異常值分析是檢驗數據是否有錄入錯誤以及含有不合常理的數據

異常值是指樣本中的個別值,其數值明顯偏離其余的觀測值。異常值也稱為離群點,異常值的分析也稱為離群點的分析。

異常值分析方法主要有:簡單統計量分析、3 ???原則、箱型圖分析。


import pandas as pd
data = pd.read_excel('../data/catering_sale.xls', index_col = u'日期') #讀取數據,指定“日期”列為索引列

import matplotlib.pyplot as plt #導入圖像庫
plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標簽
plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號

plt.figure() #建立圖像
p = data.boxplot(return_type='dict')#p['fliers'][0].get不會報錯
#p = data.boxplot() #畫箱線圖,直接使用pd的DataFrame的方法
x = p['fliers'][0].get_xdata() # 'flies'即為異常值的標簽
y = p['fliers'][0].get_ydata()
y.sort() #從小到大排序,該方法直接改變原對象

#用annotate添加注釋
#其中有些相近的點,注解會出現重疊,難以看清,需要一些技巧來控制。
#以下參數都是經過調試的,需要具體問題具體調試。
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() #展示箱線圖

?

一致性分析

數據不一致性是指數據的矛盾性、不相容性。直接對不一致的數據進行挖掘,可能會產生與實際相違背的挖掘結果。

在數據挖掘過程中,不一致數據的產生主要發生在數據集成的過程中,可能是由于被挖掘數據是來自于從不同的數據源、重復存放的數據未能進行一致性地更新造成的,比如兩張表中都存儲了用戶的地址,在用戶的地址發生改變時,如果只更新了一張表中的數據,那么這兩張表中就有了不一致的數據。

數據特征分析

一般可通過繪制圖表、計算某些特征量等手段進行數據的特征分析。

這里主要介紹的特征方法有:

分布分析-統計函數describe

分布分析能揭示數據的分布特征和分布類型,便于發現某些特大或特小的可疑值。

對于定性分類數據,可用餅圖和條形圖直觀地顯示分布情況。

對于定量變量而言,欲了解其分布形式,是對稱的、還是非對稱的,可做出頻率分布表、繪制頻率分布直方圖、繪制莖葉圖進行直觀地分析;

定量變量做頻率分布分析時選擇“組數”和“組寬”是主要的問題,一般按照以下步驟:

求極差2決定組距與組數3決定分點4列出頻率分布表5繪制頻率分布直方圖

1各組之間必須是相互排斥的

2各組必須將所有的數據包含在內

3各組的組寬最好相等
catering_sale = '../data/catering_sale.xls' #餐飲數據
data = pd.read_excel(catering_sale, index_col = u'日期') #讀取數據,指定“日期”列為索引列
data = data[(data[u'銷量'] > 400)&(data[u'銷量'] < 5000)] #過濾異常數據
statistics = data.describe() #保存基本統計量

statistics.loc['range'] = statistics.loc['max']-statistics.loc['min'] #極差
statistics.loc['var'] = statistics.loc['std']/statistics.loc['mean'] #變異系數
statistics.loc['dis'] = statistics.loc['75%']-statistics.loc['25%'] #四分位數間距
print(statistics)

對比分析

對比分析是指把兩個相互聯系的指標數據進行比較,從數量上展示和說明研究對象規模的大小,水平的高低,速度的快慢,以及各種關系是否協調。特別適用于指標間的橫縱向比較、時間序列的比較分析。在對比分析中,選擇合適的對比標準是十分關鍵的步驟,選擇得合適,才能做出客觀的評價,選擇不合適,評價可能得出錯誤的結論。

對比分析主要有以下兩種形式:

第一種:絕對數比較

第二種:相對數比較

???????1)結構相對數 ????????????????????????????????4)強度相對數

???????2)比例相對數 ????????????????????????????????5)計劃完成程度相對數

???????3)比較相對數 ????????????????????????????????6)動態相對數

統計量分析

用統計指標對定量數據進行統計描述,常從集中趨勢和離中趨勢兩個方面進行分析。

平均水平的指標是對個體集中趨勢的度量,使用最廣泛的是均值和中位數;反映變異程度的指標則是對個體離開平均水平的度量,使用較廣泛的是標準差(方差)、四分位間距。

集中趨勢度量主要有:均值、中位數、眾數

離中趨勢度量主要有:極差、標準差、變異系數

周期性分析

周期性分析是探索某個變量是否隨著時間變化而呈現出某種周期變化趨勢。周期性趨勢相對較長的有年度周期性趨勢、季節性周期趨勢,相對較短的一般有月度周期性趨勢、周度周期性趨勢,甚至更短的天、小時周期性趨勢。

如在做某用電單位用電量趨勢預測過程中,可以先分析該用電單位日用電量的時序圖,來直觀地估計其用電量變化趨勢。

貢獻度分析-帕累托分析

貢獻度分析又稱帕累托分析,帕累托法則又稱20/80定律。同樣的投入放在不同的地方會產生不同的效益。比如對一個公司來講,80%的利潤常常來自于20%最暢銷的產品;而其他80%的產品只產生了20%的利潤。貢獻度分析要求我們抓住問題的重點,找到那最有效的20%的熱銷產品、渠道或者銷售人員,在最有效的20%上投入更多資源,盡量減少浪費在80%低效的地方。

菜品盈利數據 帕累托圖


#初始化參數
dish_profit = '../data/catering_dish_profit.xls' #餐飲菜品盈利數據
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數軸說明在右邊
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%處的標記。這里包括了指定箭頭樣式。
plt.ylabel(u'盈利(比例)')
plt.show()

#小知識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 行

就餐飲企業來講,可以重點改善盈利最高的80%的菜品,或者重點發展綜合影響最高的80%的部門。這種結果可以通過帕累托分析直觀的呈現出來,如下圖:

相關性分析代碼corr

分析連續變量之間線性的相關程度的強弱,并用適當的統計指標表示出來的過程稱為相關分析。

相關性分析方法主要有:

直接繪制散點圖2繪制散點圖矩陣3計算相關系數(比較常用的如Pearson相關系數、Spearman秩相關系數和判定系數。)


catering_sale = '../data/catering_sale_all.xls' #餐飲數據,含有其他屬性
data?= pd.read_excel(catering_sale, index_col = u'日期') #讀取數據,指定“日期”列為索引列
data.corr() #相關系數矩陣,即給出了任意兩款菜式之間的相關系數
data.corr()[u'百合醬蒸鳳爪'] #只顯示“百合醬蒸鳳爪”與其他菜式的相關系數
data[u'百合醬蒸鳳爪'].corr(data[u'翡翠蒸香茜餃']) #計算“鳳爪”與“翡翠蒸香茜餃”的相關系數

統計特征函數

Mean()Geomean()幾何平均數,VarstdcorrcovMoment中心距

第4章-數據預處理

一、數據清洗

數據清洗主要是刪除原始數據集中的無關數據、重復數據,平滑噪聲數據,處理缺失值、異常值等。

1刪除無關重復值
2平滑噪聲
3異常值處理


(1)刪除有異常值的記錄 (2)視為缺失值 (3)平均值修正 (4)不處理
要分析異常值的原因,再決定取舍。

4缺失值處理

方法可分為三類:刪除記錄、數據插補和不處理。

常用的數據插補方法:均值/中位數/眾數,固定值,最近鄰插補,回歸方法,插值

插值方法:有Hermite插值、分段插值、樣條插值法,而最主要的有拉格朗日插值法和牛頓插值法。

拉格朗日插值法代碼?ployinterp_column

拉格朗日插值法可以找到一個多項式,其恰好在各個觀測的點取到觀測到的值。這樣的多項式稱為拉格朗日(插值)多項式
from scipy.interpolate import lagrange #導入拉格朗日插值函數
inputfile = '../data/catering_sale.xls' #銷量數據路徑
outputfile = '../tmp/sales.xls' #輸出數據路徑
data = pd.read_excel(inputfile) #讀入數據
data[u'銷量'][(data[u'銷量'] < 400) | (data[u'銷量'] > 5000)] = None #過濾異常值,將其變為空值

#自定義列向量插值函數
#s為列向量,n為被插值的位置,k為取前后的數據個數,默認為5
def ployinterp_column(s, n, k=5):
??y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取數
??y = y[y.notnull()] #剔除空值
??return lagrange(y.index, list(y))(n) #插值并返回插值結果
#逐個元素判斷是否需要插值
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) #輸出結果,寫入文件

?

二、數據集成實體識別,冗余屬性識別

將多個數據源放在一個統一的數據倉庫中。

要考慮實體識別問題和屬性冗余問題,從而把源數據在最低層上加以轉換、提煉和集成。


1.實體識別

實體識別的任務是檢測和解決同名異義、異名同義、單位不統一的沖突。如:

同名異義:數據源A中的屬性ID和數據源B中的屬性ID分別描述的是菜品編號和訂單編號,即描述的是不同的實體。

異名同義:數據源A中的sales_dt和數據源B中的sales_date都是是描述銷售日期的,即A. sales_dt= B. sales_date

單位不統一:描述同一個實體分別用的是國際單位和中國傳統的計量單位。


2.冗余屬性識別

?

數據集成往往導致數據冗余,如:同一屬性多次出現\同一屬性命名不一致導致重復

不同源數據的仔細整合能減少甚至避免數據冗余與不一致,以提高數據挖掘的速度和質量。對于冗余屬性要先分析檢測到后再將其刪除。

有些冗余屬性可以用相關分析檢測到。給定兩個數值型的屬性AB,根據其屬性值,可以用相關系數度量一個屬性在多大程度上蘊含另一個屬性。

?

一、數據變換:簡單函數變換 規范化,離散化

主要是對數據進行規范化的操作,將數據轉換成“適當的”格式,以適用于挖掘任務及算法的需要。

1.簡單函數變換


簡單函數變換就是對原始數據進行某些數學函數變換,常用的函數變換包括平方、開方、對數、差分運算等

用來將不具有正太分布的數據變換成具有正太性的數據。
時間序列分析中,對數變換或者差分運算可以將非平穩序列轉換為平穩序列


2.規范化?

數據標準化(歸一化)處理是數據挖掘的一項基礎工作,不同評價指標往往具有不同的量綱和量綱單位,數值間的差別可能很大
消除指標間量綱影響

最小-最大規范化:也稱為離差標準化是對原始數據的線性變換,使結果值映射到[0,1]之間

-均值規范化:也叫標準差標準化,經過處理的數據的平均數為0標準差為1

小數定標規范化:通過移動屬性值的小數位數,將屬性值映射到[-11]之間,移動的小數位數取決于屬性值絕對值的最大值。

?

datafile?= '../data/normalization_data.xls' #參數初始化
data = pd.read_excel(datafile, header = None) #讀取數據

(data - data.min())/(data.max() - data.min()) #最小-最大規范化
(data - data.mean())/data.std() #零-均值規范化data.mean(axis = 0)按照列


data/10**np.ceil(np.log10(data.abs().max())) #小數定標規范化

?

1.?連續屬性離散化?

一些數據挖掘算法,特別是某些分類算法,要求數據是分類屬性形式,如ID3算法、Apriori算法等。這樣,常常需要將連續屬性變換成分類屬性,即連續屬性離散化。

離散化性涉及兩個子任務1需要多少個分類變量2確定如何將連續屬性值映射到這些分類值。

常用的離散化方法?
(1)等寬法
(2)等頻法
(3)基于聚類分析的方法

#數據規范化:離散化cut,KMeans
datafile = '../data/discretization_data.xls' #參數初始化
data = pd.read_excel(datafile) #讀取數據
data = data[u'肝氣郁結證型系數'].copy()
k = 4
# 等寬離散化,各個類比依次命名為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函數自動計算分位數
w[0] = w[0]*(1-1e-10)
d2 = pd.cut(data, w, labels = range(k))
#聚類分類
from sklearn.cluster import KMeans #引入KMeans
kmodel = KMeans(n_clusters = k, n_jobs = 4) #建立模型,n_jobs是并行數,一般等于CPU數較好
kmodel.fit(data.reshape((len(data), 1))) #訓練模型
c = pd.DataFrame(kmodel.cluster_centers_).sort_values(by=[0]) #.sort()#輸出聚類中心,并且排序(默認是隨機序的)
w = pd.rolling_mean(c, 2).iloc[1:] #相鄰兩項求中點,作為邊界點
w = [0] + list(w[0]) + [data.max()] #把首末邊界點加上
d3 = pd.cut(data, w, labels = range(k))

def cluster_plot(d, k): #自定義作圖函數來顯示聚類結果
??import matplotlib.pyplot as plt
??plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標簽
??plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號
??
??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.?屬性構造 -構造新的屬性

#新屬性構造-輸出到excel
inputfile= '../data/electricity_data.xls' #供入供出電量數據
outputfile = '../tmp/electricity_data.xls' #屬性構造后數據文件
data = pd.read_excel(inputfile) #讀入數據
data[u'線損率'] = (data[u'供入電量'] - data[u'供出電量'])/data[u'供入電量']
data.to_excel(outputfile, index = False) #保存結果

?

5.?小波變換代碼

?


非平穩序列的分析手段。
基于小波變換的特征提取方法:
(1)基于小波變換的多尺度空間能量分布特征提取法
(2)基于小波變換的多尺度空間的模極大特征值提取法
(3)基于小波變換的特征提取方法
(4)基于適應性小波神經網絡的特征提取方法

inputfile= '../data/leleccum.mat' #提取自Matlab的信號文件
from scipy.io import loadmat #mat是MATLAB專用格式,需要用loadmat讀取它
mat = loadmat(inputfile)
signal = mat['leleccum'][0]

import pywt #導入PyWavelets
coeffs = pywt.wavedec(signal, 'bior3.7', level = 5)
#返回結果為level+1個數字,第一個數組為逼近系數數組,后面的依次是細節系數數組

二、數據規約

數據規約是將海量數據進行規約,規約之后的數據仍接近于保持原數據的完整性,但數據量小得多。

通過數據規約,可以達到:

降低無效、錯誤數據對建模的影響,提高建模的準確性

少量且具代表性的數據將大幅縮減數據挖掘所需的時間

降低儲存數據的成本


1.屬性規約常用方法
1.合并屬性2逐步向前選擇3逐步向后刪除4決策樹規約
5主成分分析降維代碼

1數據矩陣2將數據矩陣中心標準化3求相關系數矩陣4R的特征方程5確定主成分個數

6計算m個相應的單位特征向量7計算主成分

?

inputfile = '../data/principal_component.xls'
outputfile = '../tmp/dimention_reducted.xls' #降維后的數據
data = pd.read_excel(inputfile, header = None) #讀入數據

from sklearn.decomposition import PCA
pca = PCA()
pca.fit(data)
pca.components_ #返回模型的各個特征向量
pca.explained_variance_ratio_ #返回各個成分各自的方差百分比

三維

pca=PCA(3)

pca.fit(data)

low_d=pca.transform(data)#降維

pd.DataFrame(low_d).to_excel(outputfile)

pca.inverse_transform(low_d)

?

2數值規約 分箱,回歸,聚類,卡方檢驗,決策樹


通過選擇替代的、較小的數據來減少數據量,包含有參數方法和無參數方法兩類;有參數方法使用模型評估數據,不需要存放真實數據,只需要存放參數,例如回歸、對數線性模型。

無參數需要數據,例如直方圖、聚類、抽樣。

五、常用數據預處理函數

1.interpolate:一維,高維數據插值
f.scipy.interpolate.lagrange(x,y)
2.unique:去除重復元素
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:生成隨機矩陣
k x m x n維0-1之間;
np.random.rand(k,m,n…)
k x m x n維,正態分布;
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 ?# 導入混淆矩陣函數
??cm = confusion_matrix(y, yp) ?# 混淆矩陣


??import matplotlib.pyplot as plt ?# 導入作圖庫
??plt.matshow(cm, cmap=plt.cm.Greens) ?# 畫混淆矩陣圖,配色風格使用cm.Greens,更多風格請參考官網。
??plt.colorbar() ?# 顏色標簽

??for x in range(len(cm)): ?# 數據標簽
????for y in range(len(cm)):
??????plt.annotate(cm[x, y], xy=(x, y), horizontalalignment='center', verticalalignment='center')

??plt.ylabel('True label') ?# 坐標軸標簽
??plt.xlabel('Predicted label') ?# 坐標軸標簽
??return plt

?

1分類與預測

算法與模型

算法:回歸分析(logisticsLDA),決策樹,神經網絡,貝葉斯,svm,隨機森林

常用回歸模型:邏輯回歸,(非)線性回歸,嶺回歸,主成分回歸, logistics回歸

1、邏輯回歸

#-*- coding: utf-8 -*-
#邏輯回歸 自動建模
import pandas as pd

#參數初始化
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() #建立隨機邏輯回歸模型,篩選變量
rlr.fit(x, y) #訓練模型
rlr.get_support() #獲取特征篩選結果,也可以通過.scores_方法獲取各個特征的分數
print(u'通過隨機邏輯回歸模型篩選特征結束。')
print(u'有效特征為:%s' % ','.join(data.columns[rlr.get_support()]))
x = data[data.columns[rlr.get_support()]].as_matrix() #篩選好特征

lr = LR() #建立邏輯貨柜模型
lr.fit(x, y) #用篩選后的特征數據來訓練模型
print(u'邏輯回歸模型訓練結束。')
print(u'模型的平均正確率為:%s' % lr.score(x, y)) #給出模型的平均正確率,本例為81.4%

?

Scikit-learn提供了RFE包,用于特征消除,還提供了RFECV通過交叉驗證進行特征排序

2、決策樹ID3,C4.5CART

ID3決策樹

ID3算法是一種基于信息熵的決策樹分類算法,它選擇當前樣本集中具有最大信息增益值的屬性作為測試屬性選擇增益最大

?

#-*- coding: utf-8 -*-
#使用ID3決策樹算法預測銷量高低
import pandas as pd

#參數初始化
inputfile = '../data/sales_data.xls'
data = pd.read_excel(inputfile, index_col = u'序號') #導入數據

#數據是類別標簽,要將它轉換為數據
#用1來表示“好”、“是”、“高”這三個屬性,用-1來表示“壞”、“否”、“低”
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') #建立決策樹模型,基于信息熵
dtc.fit(x, y) #訓練模型

#導入相關函數,可視化決策樹。
#導出的結果是一個dot文件,需要安裝Graphviz才能將它轉換為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決策樹模型

#-*- coding: utf-8 -*-
#構建并測試CART決策樹模型

import pandas as pd #導入數據分析庫
from random import shuffle #導入隨機函數shuffle,用來打算數據

datafile = '../data/model.xls' #數據名
data = pd.read_excel(datafile) #讀取數據,數據的前三列是特征,第四列是標簽
data = data.as_matrix() #將表格轉換為矩陣
shuffle(data) #隨機打亂數據

p = 0.8 #設置訓練數據比例
train = data[:int(len(data)*p),:] #前80%為訓練集
test = data[int(len(data)*p):,:] #后20%為測試集

#構建CART決策樹模型
from sklearn.tree import DecisionTreeClassifier #導入決策樹模型

treefile = '../tmp/tree.pkl' #模型輸出名字
tree = DecisionTreeClassifier() #建立決策樹模型
tree.fit(train[:,:3], train[:,3]) #訓練

#保存模型
from sklearn.externals import joblib
joblib.dump(tree, treefile)

from cm_plot import * #導入自行編寫的混淆矩陣可視化函數
cm_plot(train[:,3], tree.predict(train[:,:3])).show() #顯示混淆矩陣可視化結果
#注意到Scikit-Learn使用predict方法直接給出預測結果。

from sklearn.metrics import roc_curve #導入ROC曲線函數

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') #坐標軸標簽
plt.ylabel('True Positive Rate') #坐標軸標簽
plt.ylim(0,1.05) #邊界范圍
plt.xlim(0,1.05) #邊界范圍
plt.legend(loc=4) #圖例
plt.show() #顯示作圖結果

?

3、人工神經網絡BP\LM\RBF\FNN\GMDH\ANFIS

#-*- coding: utf-8 -*-
#使用神經網絡算法預測銷量高低,用sales_data.xls
from keras.models import Sequential
from keras.layers.core import Dense, Activation


model = Sequential() #建立模型
model.add(Dense(10,input_dim=3)) ?#三個輸入,10個隱藏,1一個輸出
model.add(Activation('relu')) #用relu函數作為激活函數,能夠大幅提供準確度
model.add(Dense(1,input_dim=10))
model.add(Activation('sigmoid')) #由于是0-1輸出,用sigmoid函數作為激活函數

model.compile(loss = 'binary_crossentropy', optimizer = 'adam')#?class_mode = 'binary'
#編譯模型。由于我們做的是二元分類,所以我們指定損失函數為binary_crossentropy,以及模式為binary
#另外常見的損失函數還有mean_squared_error、categorical_crossentropy等,請閱讀幫助文件。
#求解方法我們指定用adam,還有sgd、rmsprop等可選

model.fit(x, y, epochs = 1000, batch_size = 10) #訓練模型,學習一千次,x訓練失敗?
yp = model.predict_classes(x).reshape(len(y)) #分類預測

from cm_plot import * #導入自行編寫的混淆矩陣可視化函數
cm_plot(y,yp).show() #顯示混淆矩陣可視化結果

?

2聚類分析:

劃分方法(常用:kmean算法 ,k中心點),系統聚類,層次聚類,譜聚類,基于密度/網格/模型的聚類,均值漂移聚類:用scikit-learnspicy.cluster也有很多

kmeans聚類算法過程:

1)從N個樣本數據中隨機選取K個對象作為初始的聚類中心;

2)分別計算每個樣本到各個聚類中心的距離,將對象分配到距離最近的聚類中;

3)所有對象分配完成后,重新計算K個聚類的中心;

4)與前一次計算得到的K個聚類中心比較,如果聚類中心發生變化,轉2),否則轉5)

5)當質心不發生變化時停止并輸出聚類結果。

連續屬性:度量樣本之間的相似性最常用的是歐幾里得距離、曼哈頓距離和閔可夫斯基距離, 文檔數據:使用余弦相似性度量,先將文檔數據整理成文檔—詞矩陣格式)

誤差平方和SSE

???????????

import pandas as pd

#參數初始化
inputfile = '../data/consumption_data.xls' #銷量及其他屬性數據
outputfile = '../tmp/data_type.xls' #保存結果的文件名
k = 3 #聚類的類別
iteration = 500 #聚類最大循環次數
data = pd.read_excel(inputfile, index_col = 'Id') #讀取數據
data_zs = 1.0*(data - data.mean())/data.std() #數據標準化


from sklearn.cluster import KMeans
if __name__=='__main__':#加入此行代碼即可
????model = KMeans(n_clusters = k, n_jobs = 4, max_iter = iteration) #分為k類,并發數4
????model.fit(data_zs) #開始聚類, you must protect your main loop using "if __name__ == '__main__'".

#簡單打印結果
r1 = pd.Series(model.labels_).value_counts() #統計各個類別的數目
r2 = pd.DataFrame(model.cluster_centers_) #找出聚類中心
r = pd.concat([r2, r1], axis = 1) #橫向連接(0是縱向),得到聚類中心對應的類別下的數目
r.columns = list(data.columns) + [u'類別數目'] #重命名表頭
print(r)

#詳細輸出原始數據及其類別
r = pd.concat([data, pd.Series(model.labels_, index = data.index)], axis = 1) ?#詳細輸出每個樣本對應的類別
r.columns = list(data.columns) + [u'聚類類別'] #重命名表頭
r.to_excel(outputfile) #保存結果

繪制聚類后的概率密度圖


def density_plot(data): #自定義作圖函數
??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'聚類類別']==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])

聚類后算法評價

Purity評價法:正確聚類占總數比例

RI評價

F值評價

聚類可視化TSNE

#kmeans.py

from sklearn.manifold import TSNE
import matplotlib.pyplot as plt

tsne = TSNE()
tsne.fit_transform(data_zs) #進行數據降維
tsne = pd.DataFrame(tsne.embedding_, index = data_zs.index) #轉換數據格式

#不同類別用不同顏色和樣式繪圖
d = tsne[r[u'聚類類別'] == 0] ?#a=r[u'聚類類別'] == 0,dtype('bool'),r:oject,r.columns:Index([u'R', u'F', u'M', u'聚類類別'], dtype='object')
plt.plot(d[0], d[1], 'r.')
d = tsne[r[u'聚類類別'] == 1]
plt.plot(d[0], d[1], 'go')
d = tsne[r[u'聚類類別'] == 2]
plt.plot(d[0], d[1], 'b*')
plt.show()

?

3關聯規則aprior,FP-TREE

1)關聯規則的一般形式

支持度:項集AB同時發生的概率

置信度:項集A發生,則項集B也同時發生的概率

2)最小支持度和最小置信度

最小支持度:一個閾值,表示項目集在統計意義上的最低重要性;

最小置信度:一個閾值表示關聯規則的最低可靠性。

同時滿足最小支持度閾值和最小置信度閾值的規則稱作強規則。

?

函數文件apirior.py

過程一:找出所有的頻繁項集。

過程二:由頻繁項集產生強關聯規則
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


# 尋找關聯規則的函數
def find_rule(d, support, confidence, ms=u'--'):
????result?= pd.DataFrame(index=['support', 'confidence']) ?# 定義輸出結果

????support_series = 1.0 * d.sum() / len(d) ?# 支持度序列
????column = list(support_series[support_series > support].index) ?# 初步根據支持度篩選
????k = 0

????while len(column) > 1:
????????k = k + 1
????????print(u'\n正在進行第%s次搜索...' % k)
????????column = connect_string(column, ms)
????????print(u'數目:%s...' % len(column))
????????sf = lambda i: d[i].prod(axis=1, numeric_only=True) ?# 新一批支持度的計算函數

????????# 創建連接數據,這一步耗時、耗內存最嚴重。當數據集較大時,可以考慮并行運算優化。
????????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) ?# 計算連接后的支持度
????????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: ?# 計算置信度序列
????????????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) ?# 結果整理,輸出
????print(u'\n結果為:')
????print(result)

????return result

使用Apriori算法挖掘菜品訂單關聯規則

#-*- coding: utf-8 -*-
#使用Apriori算法挖掘菜品訂單關聯規則
from __future__ import print_function
import pandas as pd
from apriori import * #導入自行編寫的apriori函數

inputfile = '../data/menu_orders.xls'
outputfile = '../tmp/apriori_rules.xls' #結果文件
data = pd.read_excel(inputfile, header = None)


代碼好-轉換原始數據至0-1矩陣...')有問題


ct = lambda x : pd.Series(1, index = x[pd.notnull(x)]) #轉換0-1矩陣的過渡函數
b = map(ct, data.as_matrix()) #用map方式執行
data = pd.DataFrame(list(b)).fillna(0) #實現矩陣轉換,空值用0填充
print(u'\n轉換完畢。')
del b #刪除中間變量b,節省內存

support = 0.2 #最小支持度
confidence = 0.5 #最小置信度
ms = '---' #連接符,默認'--',用來區分不同元素,如A--B。需要保證原始表格中不含有該字符

find_rule(data, support, confidence, ms).to_excel(outputfile) #保存結果

?

4時序模式:

常見的時間序列模型 平滑,趨勢擬合法,組合(加法,乘法)、ARMA,ARMA,ARIMA,ARCH,GARCH,將重點介紹AR模型、MA模型、ARMA模型和ARIMA模型。

時間序列的預處理(隨機+平穩)

拿到一個觀察值序列后,首先要對它的純隨機性和平穩性進行檢驗,這兩個重要的檢驗稱為序列的預處理。根據檢驗結果可以將序列分為不同的類型,對不同類型的序列會采取不同的分析方法。

對于純隨機序列,又叫白噪聲序列,就意味著序列的各項之間沒有任何相關關系,序列在進行完全無序的隨機波動,可以終止對該序列的分析。

對于平穩非白噪聲序列,它的均值和方差是常數,現已有一套非常成熟的平穩序列的建模方法。通常是建立一個線性模型來擬合該序列的發展,借此提取該序列的有用信息。ARMA模型是最常用的平穩序列擬合模型;

對于非平穩序列,由于它的均值和方差不穩定,處理方法一般是將其轉變為平穩序列,這樣就可以應用有關平穩時間序列的分析方法,如建立ARMA模型來進行相應得研究。如果一個時間序列經差分運算后具有平穩性,成該序列為差分平穩序列,可以使用ARIMA模型進行分析。

1平穩性檢驗

對序列的平穩性的檢驗有兩種檢驗方法,一種是根據時序圖和自相關圖的特征做出判斷的圖檢驗,該方法操作簡單、應用廣泛,缺點是帶有主觀性;另一種是構造檢驗統計量進行的方法,目前最常用的方法是單位根檢驗

1)時序圖檢驗:如果有明顯的趨勢性或者周期性那它通常不是平穩序列。

2)自相關圖檢驗(常用)

??????平穩序列具有短期相關性,隨著延遲期數的增加,平穩序列的自相關系數 會比較快的衰減趨向于零,并在零附近隨機波動,而非平穩序列的自相關系數衰減的速度比較慢

3)單位根檢驗是指檢驗序列中是否存在單位根,因為存在單位根就是非平穩時間序列了。p 值顯著大于0.05===非平穩(不是白噪聲)

?

2純隨機性檢驗

純隨機性檢驗也稱白噪聲檢驗一般是構造檢驗統計量來檢驗序列的純隨機性,常用的檢驗統計量有 Q 統計量、LB 統計量,計算出對應的p 值,如果p值顯著大于顯著性水平,則表示該序列不能拒絕純隨機的原假設,可以停止對該序列的分析。

平穩時間序列分析ARMA

ARMA模型的全稱是自回歸移動平均模型,它是目前最常用的擬合平穩序列的模型。

ARMA模型又可以細分為AR模型、MA模型和ARMA模型三大類。都可以看作是多元線性回歸模型。

下面將分別介紹AR模型、MA模型和ARMA模型三大模型。

平穩時間序列的ARMA模型建模步驟。

某個時間序列經過預處理,被判定為平穩非白噪聲序列,就可以利用ARMA模型進行建模。

AR模型、MA模型和ARMA模型的自相關系數和偏自相關系數的性質,選擇出合適的模型。

ARMAARMA模型自相關系數和偏自相關系數的性質如下:

AR模型:自相關系數拖尾,偏自相關系數截尾;

MA模型:自相關系數截尾,偏自相關函數拖尾;

ARMA模型:自相關函數和偏自相關函數均拖尾。

?

非平穩時間序列分析ARIMA

對非平穩時間序列的分析方法可以分為確定性因素分解的時序分析和隨機時序分析兩大類

確定性因素分解的方法把所有序列的變化都歸結為四個因素(長期趨勢、季節變動、循環變動和隨機波動)的綜合影響。可以建立加法模型和乘法模型等。

根據時間序列的不同特點,隨機時序分析可以建立的模型有ARIMA模型、殘差自回歸模型、季節模型、異方差模型等。

1、p階差分相距一期的兩個序 列值之間的減法運算稱為 1 階差分運算;

2、k步差分相距k期的兩個序列值之間的減法運算稱為k步差分運算。

3、差分運算具有強大的確定性信息提取能力,許多非平穩序列差分后會顯示出平穩序列的性質,這時稱這個非平穩序列為差分平穩序列。

4、對差分平穩序列可以使用ARMA模型進行擬合。

5、ARIMA模型的實質就是差分運算與ARMA模型的組合,掌握了ARMA模型的建模方法和步驟以后,對序列建立ARIMA模型是比較簡單的。 ???

建模步驟:(代碼問題)

?

建模步驟

計算ACFPACF(自相關圖平穩性檢驗+白噪聲

?????先計算非平穩白噪聲序列的自相關系數(ACF)和偏自相關系數(PACF

不平穩差分后再用ARIMA模型

import pandas as pd
#讀取數據,指定日期列為指標,Pandas自動將“日期”列識別為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()


#自相關圖和偏自相關圖選擇模型


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)
# 一階差分后的自相關圖與偏自相關圖
dta = dta.diff(1).dropna() ?# 注意一定要將查分后的空值去掉再取自相關系數
fig = sm.graphics.tsa.plot_acf(dta, lags=40, ax=ax3)
fig = sm.graphics.tsa.plot_pacf(dta, lags=40, ax=ax4)

#平穩性檢測#白噪聲檢驗


from statsmodels.tsa.stattools import adfuller as ADF
print(u'原始序列的ADF檢驗結果為:', ADF(data[u'銷量']))
#返回值依次為adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore
D_data=data.diff().dropna()
D_data.columns=[u'銷量差分']
from statsmodels.stats.diagnostic import acorr_ljungbox
print(u'差分序列的白噪聲檢驗結果為:', acorr_ljungbox(D_data, lags=1)) #返回統計量和p值

from statsmodels.tsa.arima_model import ARIMA

#定階
pmax = int(len(D_data)/10) #一般階數不超過length/10
qmax = int(len(D_data)/10) #一般階數不超過length/10
bic_matrix = [] #bic矩陣
for p in range(pmax+1):
??tmp = []
??for q in range(qmax+1):
????try: #存在部分報錯,所以用try來跳過報錯。
??????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模型識別

??????AR模型、MA模型和ARMA模型的自相關系數和偏自相關系數的性質,選擇出合適的模型。

模型定階AIC:確定pq

(1)人為識別的方法:用相關圖像根據ARMA模型識別原則進行模型定階

(2)第二種方法:相對最優模型識別。

計算ARMA(p,q)當 p 和 q 均小于等于 5 的所有組合的 BIC 信息量,取其中 BIC 信息量達到最小的模型階數。ARIMA(P1,Q

模型檢驗

確定模型后,需要檢驗其殘差序列是否是白噪聲,若不是,說明,殘差中還存在有用的信息,需要修改模型或者進一步提取。若其殘差不是白噪聲,重新更換p,q的值,重新確定

?

?p值為:0.627016 ,大于0.05殘差為白噪聲序列,模型通過檢驗。

模型預測

只能進行短期預測

model?= ARIMA(data, (p,1,q)).fit() #建立ARIMA(0, 1, 1)模型
model.summary2() #給出一份模型報告
model.forecast(5)

模型優化與應用

5離群點檢測

threshold=2
norm = []
for i in range(k): #逐一處理
??norm_tmp = r[['R', 'F', 'M']][r[u'聚類類別'] == i]-model.cluster_centers_[i]
??norm_tmp = norm_tmp.apply(np.linalg.norm, axis = 1) #求出絕對距離
??norm.append(norm_tmp/norm_tmp.median()) #求相對距離并添加

#norm = pd.concat(norm) #合并
norm[norm <= threshold].plot(style = 'go') #正常點
discrete_points = norm[norm > threshold] #離群點
discrete_points.plot(style = 'ro')


for i in range(len(discrete_points)): #離群點做標記
??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'編號')
plt.ylabel(u'相對距離')
plt.show()


總結

以上是生活随笔為你收集整理的《python数据分析与挖掘》-步骤的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。