Python數(shù)據(jù)分析與挖掘?qū)崙?zhàn)--讀書筆記

原來(lái)用markdown寫的纱意,簡(jiǎn)書公式編輯比較麻煩跨算。所以正常公式版本可以戳以下鏈接https://www.zybuluo.com/hainingwyx/note/386105
程序和數(shù)據(jù)的下載地址:http://www.tipdm.org/tj/661.jhtml
歡迎轉(zhuǎn)載叛薯,轉(zhuǎn)載注明出處即可酌予。如有錯(cuò)誤腿倚,請(qǐng)指正昏滴。

Python數(shù)據(jù)分析簡(jiǎn)介

Python入門

運(yùn)行:cmd下"python hello.py"

基本命令:

# for 循環(huán)
s = 0
for k in range(101):    #1-100
    s = s + k
print s

# 函數(shù)
def add2(x):
    return x+2
print add2(1)

def add2(x=0, y=0):
    return [x+2, y+2]   #返回列表

def add3(x, y):
    return x+3, y+3 #雙重返回
a,b = add3(1, 2)

# 匿名函數(shù)
f = lambda x : x+2  #定義函數(shù)f(x)= x+2
g = lambda x, y : x+y   #定義函數(shù)g(x,y)= x+y, g(1,2)結(jié)果為3

# 數(shù)據(jù)結(jié)構(gòu)
# a, b是列表
# 列表函數(shù)cmp(a, b) len(a) max(a) min(a) sum(a) sorted(a)
# 列表對(duì)象方法 a.append(1) a.count(1) a.extend([1,2]) a.index(1) a.insert(2,1) a.pop(1)
b = a       # b是a的別名
b = a[:]    #數(shù)據(jù)復(fù)制

# 列表解析
a = [1, 2, 3]
b = []
for i in a:
    b.append(i+2)
# 等價(jià)于
a =[1, 2, 3]
b =[i + 2 for i in a]

# 集合
d = {'today' : 20, "tomorrow" : 30} #創(chuàng)建
d['today']          #訪問(wèn)
# 其他創(chuàng)建方法
dict(['today', 20], ['tomorrow', 30])
dict.fromkeys(['today', 'tomorrow'], 20)

# 集合
s = {1, 2, 2, 4}
s = set([1,2,2,4])      #自動(dòng)去除多余的值

# 函數(shù)式編程 lambda, map, reduce, filter
b = map(lambda x :x+2, a)
b = list(b);
#2.x中不需要累颂,3.x中需要,因?yàn)閙ap僅僅創(chuàng)建了一個(gè)待運(yùn)行的命令容器,只有其他函數(shù)調(diào)用時(shí)才返回結(jié)果
# map命令將函數(shù)逐一運(yùn)用到map列表的每個(gè)元素中,,最后返回一個(gè)數(shù)組衰琐,效率比f(wàn)or循環(huán)高一點(diǎn)

# reduce函數(shù)用于遞歸運(yùn)算
reduce(lambda x, y: x*y, range(1, n+1))

# filter 用于篩選列表中符合條件的元素
b = filter(lambda x :x > 5 and x <8, range(10))
b = list(b)     # 同map

# 導(dǎo)入庫(kù)
import math
math.sin(1)

import math as m
m.sin(1)

from math import exp as e
e(1)
sin(1)      #出錯(cuò)

from math import *      #直接導(dǎo)入,大量導(dǎo)入會(huì)引起命名沖突慷妙,不建議
exp(1)
sin(1)

# 導(dǎo)入future特征(2.x)
# 將print變?yōu)楹瘮?shù)形式僻焚,即用print(a)格式輸出
from __future__ import print_function
# 3.x中3/2=1.5, 3//2=1;2.x中3/2=1
from __future__ import division

第三方庫(kù)

安裝

Windows中

pip install numpy

或者下載源代碼安裝

python setup.py install

Pandas默認(rèn)安裝不能讀寫Excel文件,需要安裝xlrd和xlwt庫(kù)才能支持excel的讀寫

pip install xlrd
pip install xlwt

StatModel可pip可exe安裝膝擂,注意虑啤,此庫(kù)依賴于Pandas和patsy

Scikit-Learn是機(jī)器學(xué)習(xí)相關(guān)的庫(kù),但是不包含人工神經(jīng)網(wǎng)絡(luò)

model.fit()     #訓(xùn)練模型架馋,監(jiān)督模型fit(X,y),非監(jiān)督模型fit(X)

# 監(jiān)督模型接口
model.predict(X_new)        #預(yù)測(cè)新樣本
model.predict_proba(X_new)  #預(yù)測(cè)概率
model.score()               #得分越高狞山,fit越好

# 非監(jiān)督模型接口
model.transform()           #從數(shù)據(jù)中學(xué)到新的“基空間”
model.fit_transform()       #從數(shù)據(jù)中學(xué)到新的基,并按照這組基進(jìn)行轉(zhuǎn)換

Keras是基于Theano的強(qiáng)化的深度學(xué)習(xí)庫(kù)叉寂,可用于搭建普通神經(jīng)網(wǎng)絡(luò)萍启,各種深度學(xué)習(xí)模型,如自編碼器屏鳍,循環(huán)神經(jīng)網(wǎng)絡(luò)勘纯,遞歸神經(jīng)網(wǎng)絡(luò),卷積神經(jīng)網(wǎng)絡(luò)钓瞭。Theano也是一個(gè)Python庫(kù)驳遵,能高效實(shí)現(xiàn)符號(hào)分解,速度快山涡,穩(wěn)定性好堤结,實(shí)現(xiàn)了GPU加速,在密集型數(shù)據(jù)處理上是CPU的10倍鸭丛,缺點(diǎn)是門檻太高霍殴。Keras的速度在Windows會(huì)大打折扣。

Windows下:安裝MinGWindows--安裝Theano---安裝Keras--安裝配置CUDA

Gensim用來(lái)處理語(yǔ)言方面的任務(wù)系吩,如文本相似度計(jì)算、LDA妒蔚、Word2Vec等穿挨,建議在Windows下運(yùn)行月弛。

Linux中

sudo apt-get install python-numpy
sudo apt-get install python-scipy
sudo apt-get install python-matplotlib

使用

Matplotlib默認(rèn)字體是英文,如果要使用中文標(biāo)簽科盛,

plt.rcParams['font.sans-serif'] = ['SimHei']

保存作圖圖像時(shí)帽衙,負(fù)號(hào)顯示不正常:

plt.rcParams['axes.unicode_minus'] = False

數(shù)據(jù)探索

臟數(shù)據(jù):缺失值、異常值贞绵、不一致的值厉萝、重復(fù)數(shù)據(jù)

異常值分析

  1. 簡(jiǎn)單統(tǒng)計(jì)量分析:超出合理范圍的值
  2. 3sigma原則:若正態(tài)分布,異常值定義為偏差超出平均值的三倍標(biāo)準(zhǔn)差榨崩;否則谴垫,可用遠(yuǎn)離平均值的多少倍來(lái)描述。
  3. 箱型圖分析:異常值定義為小于Q_L-1.5IQR或者大于Q_U +1.5IQR母蛛。Q_L是下四分位數(shù)翩剪,全部數(shù)據(jù)有四分之一比他小。Q_U是上四分位數(shù)彩郊。IQR稱為四分位數(shù)間距前弯,IQR=Q_U-Q_L
#-*- coding: utf-8 -*-
import pandas as pd

catering_sale = '../data/catering_sale.xls' #餐飲數(shù)據(jù)
data = pd.read_excel(catering_sale, 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() #畫箱線圖秫逝,直接使用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)試狈醉。
#xy表示要標(biāo)注的位置坐標(biāo),xytext表示文本所在位置
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ù)的分布分析:求極差(max-min)惠险,決定組距和組數(shù)苗傅,決定分點(diǎn),列出頻率分布表班巩,繪制頻率分布直方圖渣慕。

定性數(shù)據(jù)的分布分析:餅圖或條形圖

對(duì)比分析

統(tǒng)計(jì)量分析

集中趨勢(shì)度量:均值、中位數(shù)抱慌、眾數(shù)

離中趨勢(shì)度量:極差逊桦、標(biāo)準(zhǔn)差、變異系數(shù)抑进、四份位數(shù)間距

變異系數(shù)為:s表示標(biāo)準(zhǔn)差强经,x表示均值

#-*- coding: utf-8 -*-
#餐飲銷量數(shù)據(jù)統(tǒng)計(jì)量分析
from __future__ import print_function
import pandas as pd

catering_sale = '../data/catering_sale.xls' #餐飲數(shù)據(jù),一列為日期寺渗,一列為銷量
data = pd.read_excel(catering_sale, index_col = u'日期') #讀取數(shù)據(jù)匿情,指定“日期”列為索引列
data = data[(data[u'銷量'] > 400)&(data[u'銷量'] < 5000)] #過(guò)濾異常數(shù)據(jù)
statistics = data.describe() #保存基本統(tǒng)計(jì)量
print(statistics)
print("--------------")

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)

周期性分析

貢獻(xiàn)度分析

又稱帕累托分析兰迫,原理是帕累托法則,即20/80定律炬称,同樣的投入放在不同的地方會(huì)產(chǎn)生不同的收益汁果。

#-*- coding: utf-8 -*-
#菜品盈利數(shù)據(jù) 帕累托圖
from __future__ import print_function
import pandas as pd

#初始化參數(shù)
dish_profit = '../data/catering_dish_profit.xls' #餐飲菜品盈利數(shù)據(jù),菜品ID,菜品名 盈利
data = pd.read_excel(dish_profit, index_col = u'菜品名')
data = data[u'盈利'].copy()#保留兩列數(shù)據(jù)
data.sort(ascending = False)

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

相關(guān)性分析

途徑:繪制散點(diǎn)圖、散點(diǎn)圖矩陣跷车、計(jì)算相關(guān)系數(shù)

Pearson相關(guān)系數(shù):要求連續(xù)變量的取值服從正態(tài)分布棘利。


$$
\begin{cases}

{|r|\leq 0.3}&\text{不存在線性相關(guān)}\

0.3 < |r| \leq 0.5&\text{低度線性相關(guān)}\

0.5 < |r| \leq 0.8&\text{顯著線性相關(guān)}\

0.8 < |r| \leq 1&\text{高度線性相關(guān)}\

\end{cases}
$$

相關(guān)系數(shù)r的取值范圍[-1, 1]

Spearman相關(guān)系數(shù):不服從正態(tài)分布的變量、分類或等級(jí)變量之間的關(guān)聯(lián)性可用該系數(shù)姓赤,也稱等級(jí)相關(guān)系數(shù)赡译。

對(duì)兩個(gè)變量分別按照從小到大的順序排序,得到的順序就是秩不铆。R_i表示x_i的秩次蝌焚,Q_i表示y_i的秩次。

判定系數(shù):相關(guān)系數(shù)的平方誓斥,用來(lái)解釋回歸方程對(duì)y的解釋程度只洒。

#-*- coding: utf-8 -*-
#餐飲銷量數(shù)據(jù)相關(guān)性分析
from __future__ import print_function
import pandas as pd

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

數(shù)據(jù)探索函數(shù)

方法名 函數(shù)功能
D.sum() 按列計(jì)算總和
D.mean() 計(jì)算算數(shù)平均
D.var() 方差
D.std() 標(biāo)準(zhǔn)差
D.corr(method = ' pearson') Spearman(Pearson)相關(guān)系數(shù)矩陣
D.cov() 協(xié)方差矩陣
D.skew() 偏度(三階矩)
D.kurt() 峰度(四階距)
D.describe() 給出樣本的基礎(chǔ)描述
D = pd.DataFrame([range(1,8), range(2, 9)])
D.corr(method = 'spearman')     #計(jì)算相關(guān)系數(shù)矩陣
S1 = D.loc[0]   #提取第一行
S2 = D.loc[1]   #提取第二行
S1.corr(S2, method = 'pearson') #計(jì)算S1S2的相關(guān)系數(shù)

D = pd.DataFrame(np.random.randn(6, 5))     #產(chǎn)生6x5的表格
print D.cov()
print D[0].cov(D[1])  #計(jì)算第一列和第二列的方差
    
print D.skew()      #D是DataFrame或者Series
print D.describe()
方法名 函數(shù)功能
cumsum() 依次給出前1-n個(gè)數(shù)的和
cumprod() 依次給出前1-n個(gè)數(shù)的積
cummax() 依次給出前1-n個(gè)數(shù)的最大值
cummin() 依次給出前1-n個(gè)數(shù)的最小值
方法名 函數(shù)功能
rolling_sum() 按列計(jì)算數(shù)據(jù)樣本的總和
rolling_mean() 算數(shù)平均數(shù)
rolling_var() 方差
rolling_std() 標(biāo)準(zhǔn)差
rolling_corr() 相關(guān)系數(shù)矩陣
rolling_cov() 協(xié)方差
rolling_skew() 偏度
rolling_kurt() 峰度
D = pd.Series(range(0,20))
print D.cumsum()

print pd.rolling_sum(D, 2)    #依次對(duì)相鄰兩項(xiàng)求和
方法名 函數(shù)功能
plot() 繪制線性二維圖,折線圖
pie() 繪制餅形圖
hist() 繪制二維條形直方圖距芬,可現(xiàn)實(shí)數(shù)據(jù)的分配情形
boxplot() 繪制箱型圖
plot(logy = True) 繪制y軸的對(duì)數(shù)圖形
plot(yerr = error) 繪制誤差條形圖
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(figsize = (7, 5))        #創(chuàng)建圖像區(qū)域涝开,指定比例
plt.show()                  #顯示作圖結(jié)果
############################################################################################
x = np.linspace(0, 2*np.pi, 50)
y = np.sin(x)
plt.plot(x, y, 'bp--')       #藍(lán)色帶星虛線plt.show()
############################################################################################
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]     #每一塊的比例
colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral']
explode = (0, 0.1, 0, 0)

plt.pie(sizes, explode = explode, labels = labels, colors = colors, autopct =
'%1.1f%%', shadow = True, startangle = 90)
plt.axis('equal')   #顯示為圓
plt.show()
############################################################################################
x = np.random.randn(1000)       #1000個(gè)服從正態(tài)分布的隨機(jī)數(shù)
plt.hist(x, 10)                 #分成10組
plt.show()
############################################################################################
plt.rcParams['font.sans-serif'] = ['SimHei'] #用來(lái)正常顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus'] = False #用來(lái)正常顯示負(fù)號(hào)

x = np.exp(np.arange(20))       #原始數(shù)據(jù)

plt.subplot(121)
plt.plot(range(0,20), x, label = u"原始數(shù)據(jù)圖")
plt.legend()

plt.subplot(122)
plt.semilogy(range(0,20), x, label = u"對(duì)數(shù)數(shù)據(jù)圖")
plt.legend()

plt.show()
############################################################################################
plt.rcParams['font.sans-serif'] = ['SimHei'] #用來(lái)正常顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus'] = False #用來(lái)正常顯示負(fù)號(hào)

error = np.random.random(10)        #定義誤差條例
y = pd.Series(np.sin(np.arange(10)))
y.plot(yerr = error)
plt.show()

數(shù)據(jù)預(yù)處理

數(shù)據(jù)清洗

包括:刪除原始數(shù)據(jù)中的無(wú)關(guān)數(shù)據(jù)、重復(fù)數(shù)據(jù)框仔,平滑噪聲數(shù)據(jù)舀武,處理缺失值。
拉格朗日插值法:

當(dāng)插值節(jié)點(diǎn)增減時(shí)离斩,插值多項(xiàng)式就會(huì)發(fā)生變化银舱,在實(shí)際計(jì)算中不方便。
牛頓插值法:P(x)是牛頓插值逼近函數(shù)跛梗,R(x)是誤差函數(shù)

Python的Scipy庫(kù)中只提供了拉格朗日插值法的函數(shù)(實(shí)現(xiàn)上比較容易)

#-*- coding: utf-8 -*-
# 插值時(shí)存在問(wèn)題寻馏,不同的位置選取的數(shù)據(jù)點(diǎn)不一樣,并且保證最后的數(shù)據(jù)是正確的
# 目前沒(méi)有考慮連續(xù)臟數(shù)據(jù)的情況
#拉格朗日插值代碼
import pandas as pd #導(dǎo)入數(shù)據(jù)分析庫(kù)Pandas
from scipy.interpolate import lagrange #導(dǎo)入拉格朗日插值函數(shù)

inputfile = '../data/catering_sale.xls' #銷量數(shù)據(jù)路徑
outputfile = '../tmp/sales.xls' #輸出數(shù)據(jù)路徑


data = pd.read_excel(inputfile) #讀入數(shù)據(jù)
data[u'銷量'][(data[u'銷量'] < 400) | (data[u'銷量'] > 5000)] = None #過(guò)濾異常值核偿,將其變?yōu)榭罩?
#自定義列向量插值函數(shù)
#s為列向量诚欠,n為被插值的位置,k為取前后的數(shù)據(jù)個(gè)數(shù),默認(rèn)為5,插值不要超過(guò)20
def ployinterp_column(s, n, k=5):
  y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取數(shù),y是長(zhǎng)度為10的列表
  y = y[y.notnull()] #剔除空值
  return lagrange(y.index, list(y))(n) #插值并返回插值多項(xiàng)式轰绵,代入n得到插值結(jié)果

#逐個(gè)元素判斷是否需要插值
k = 2
for i in data.columns:
  for j in range(len(data)):
    if (data[i].isnull())[j]: #如果為空即插值家乘。
        if (j >= k) and (j < len(data) - k):
            y = data[i][list(range(j-k, j)) + list(range(j+1, j+1+k))] #取數(shù),y是長(zhǎng)度為10的列表
        elif j < k :
            y = data[i][list(range(0, j)) + list(range(j+1, 2 * k + 1))]
        elif j >= len(data) - k:
            y = data[i][list(range(len(data) - 1 - 2 * k, j)) + list(range(j+1, len(data)))]
        y = y[y.notnull()] #剔除空值
        data[i][j] = lagrange(y.index, list(y))(j) #插值并返回插值多項(xiàng)式,代入j得到插值結(jié)果

data.to_excel(outputfile) #輸出結(jié)果藏澳,寫入文件

數(shù)據(jù)集成

包括實(shí)體識(shí)別,冗余屬性識(shí)別

數(shù)據(jù)變化

簡(jiǎn)單函數(shù)變換
規(guī)范化

  1. 離差標(biāo)準(zhǔn)化(最小最大規(guī)范化)
  1. 標(biāo)準(zhǔn)差標(biāo)準(zhǔn)化
  1. 小數(shù)定標(biāo)規(guī)范化:屬性值映射在[-1, 1]之間
#-*- coding: utf-8 -*-
#數(shù)據(jù)規(guī)范化
import pandas as pd
import numpy as np

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

print (data - data.min())/(data.max() - data.min()) #最小-最大規(guī)范化耀找,按列出路
print (data - data.mean())/data.std() #零-均值規(guī)范化
print data/10**np.ceil(np.log10(data.abs().max())) #小數(shù)定標(biāo)規(guī)范化

連續(xù)屬性離散化

等寬法(至于相同寬度)翔悠、等頻法(將相同數(shù)量的記錄放進(jìn)每個(gè)區(qū)間)、基于聚類分析的方法(K-means)

import pandas as pd
from sklearn.cluster import KMeans #引入KMeans
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)

datafile = '../data/discretization_data.xls'    #參數(shù)初始化
data = pd.read_excel(datafile) #讀取數(shù)據(jù)
data = data[u'肝氣郁結(jié)證型系數(shù)'].copy()
k = 4       #分為4類
    
d1 = pd.cut(data, k, labels = range(k))     #等寬離散化野芒,各個(gè)類比依次命名為0,1,2,3

#等頻率離散化
w = [1.0*i/k for i in range(k+1)]           #為describe確定分位數(shù)0%,25%,50%,75%,100%           
w = data.describe(percentiles = w)[4:4+k+1] #使用describe函數(shù)自動(dòng)計(jì)算分位數(shù)并取出分位數(shù)
w[0] = w[0]*(1-1e-10)       #確保比最小值小
d2 = pd.cut(data, w, labels = range(k))


kmodel = KMeans(n_clusters = k, n_jobs = 1) #建立模型蓄愁,n_jobs是并行數(shù),一般等于CPU數(shù)較好
kmodel.fit(data.reshape((len(data), 1)))    #訓(xùn)練模型
c = pd.DataFrame(kmodel.cluster_centers_).sort(0) #輸出聚類中心狞悲,并且排序(默認(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)顯示聚類結(jié)果   
  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()

屬性構(gòu)造:比如利用供入電量和供出電量計(jì)算線損率。

#-*- coding: utf-8 -*-
#線損率屬性構(gòu)造
import pandas as pd

#參數(shù)初始化
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é)果

小波變換

用于非平穩(wěn)信號(hào)的時(shí)頻分析摇锋〉ふ基于小波變換的主要方法有:多尺度空間能量分布特征提取、多尺度空間的模極大值特征提取荸恕、小波包變換的特征提取乖酬、適應(yīng)性小波神經(jīng)網(wǎng)絡(luò)的特征提取。
小波基函數(shù):Harry小波基融求,db系列小波基咬像,均值為0。積分為0.
小波變換:a是伸縮因子生宛,b是平移因子县昂,對(duì)小波基函數(shù)進(jìn)行伸縮和平移變換

任意函數(shù)f(t)的連續(xù)小波變換(CWT)為:

在約束條件下有逆變換:

python中scipy本身提供了信號(hào)處理函數(shù),更好的信號(hào)處理庫(kù)是PyWavelets(pywt)陷舅。

#小波特征變換提取代碼
import pywt #導(dǎo)入PyWavelets
from scipy.io import loadmat #mat是MATLAB專用格式倒彰,需要用loadmat讀取它

#參數(shù)初始化
inputfile= '../data/leleccum.mat' #提取自Matlab的信號(hào)文件

mat = loadmat(inputfile)
signal = mat['leleccum'][0]

coeffs = pywt.wavedec(signal, 'bior3.7', level = 5)
#返回結(jié)果為level+1個(gè)數(shù)字,第一個(gè)數(shù)組為逼近系數(shù)數(shù)組蔑赘,后面的依次是細(xì)節(jié)系數(shù)數(shù)組

數(shù)據(jù)規(guī)約

屬性規(guī)約:合并屬性狸驳,逐步向前選擇,逐步向后刪除缩赛,決策樹(shù)歸納耙箍,主成分分析。
主成分分析步驟:

  1. 設(shè)原始變量X_1,X_2,..., X_p的n次觀測(cè)數(shù)據(jù)矩陣為:
  1. 將數(shù)據(jù)矩陣按列進(jìn)行中心標(biāo)準(zhǔn)化
  2. 求相關(guān)系數(shù)矩陣R酥馍,$$R=(r_{ij})_{p\times p}$$

其中辩昆,


  1. 求R的特征方程



    的特征根


  1. 確定主成分個(gè)數(shù)m:alpha根據(jù)實(shí)際問(wèn)題確定,一般取0.8
  1. 計(jì)算m個(gè)相應(yīng)的單位特征向量:
  1. 計(jì)算主成分:
import pandas as pd
from sklearn.decomposition import PCA

#參數(shù)初始化
inputfile = '../data/principal_component.xls'
outputfile = '../tmp/dimention_reducted.xls' #降維后的數(shù)據(jù)

data = pd.read_excel(inputfile, header = None) #讀入數(shù)據(jù)

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

#由上面可以看出前4個(gè)已經(jīng)占了97%
pca = PCA(3)
pca.fit(data)
low_d = pca.transform(data)                 #降低唯獨(dú)

pd.DataFrame(low_d).toexcel(outputfile)     #保存結(jié)果
pca.inverse_transform(low_d)        #復(fù)原數(shù)據(jù)

數(shù)值規(guī)約:通過(guò)選擇替代的旨袒、較小的數(shù)據(jù)來(lái)減少數(shù)據(jù)量汁针。

Python主要數(shù)據(jù)預(yù)處理函數(shù)

函數(shù)名 函數(shù)功能
interpolate 一維术辐、高維數(shù)據(jù)插值
unique 去除數(shù)據(jù)終端額重復(fù)數(shù)據(jù)
isnull 判斷是否空值
notnull 判斷是否非空值
PCA 主成分分析
random 生成隨機(jī)矩陣
f = scipy.interpolate.lagrange(x,y) #一維數(shù)據(jù)的拉格朗日插值
f(2)            #計(jì)算插值結(jié)果
###################################################################
D = pd.Series([1,2,1,3,5])      
D.unique()
np.uinque(D)        #這時(shí)候D可以是list,array,Series
###################################################################
D.isnull()      #D是series對(duì)象,返回布爾Series施无,D[D.isnull()]找到空值
###################################################################
np.random.rand(k,m,n)   #0-1均勻分布
np.random.randn(k,m,n)  #標(biāo)準(zhǔn)正態(tài)分布

挖掘建模

分類與預(yù)測(cè)

常用算法:回歸分析辉词、決策樹(shù)、人工神經(jīng)網(wǎng)絡(luò)猾骡、貝葉斯網(wǎng)絡(luò)瑞躺、支持向量機(jī)。
Logistic回歸
Logistic函數(shù):

回歸模型:


#-*- coding: utf-8 -*-
#邏輯回歸 自動(dòng)建模
import pandas as pd
from sklearn.linear_model import LogisticRegression as LR
from sklearn.linear_model import RandomizedLogisticRegression as RLR 

#參數(shù)初始化
filename = '../data/bankloan.xls'
data = pd.read_excel(filename)
x = data.iloc[:,:8].as_matrix()##變成矩陣
y = data.iloc[:,8].as_matrix()

rlr = RLR() #建立隨機(jī)邏輯回歸模型兴想,篩選變量
rlr.fit(x, y) #訓(xùn)練模型
rlr.get_support() #獲取特征篩選結(jié)果幢哨,也可以通過(guò).scores_方法獲取各個(gè)特征的分?jǐn)?shù)
print(u'通過(guò)隨機(jī)邏輯回歸模型篩選特征結(jié)束')
#join() 表示連接,使用逗號(hào)嫂便,括號(hào)內(nèi)必須是一個(gè)對(duì)象捞镰。如果有多個(gè)就編程元組,或是列表毙替。
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提供了REF包可以用于特征消除蔚龙。還提供了REFCV冰评,可以通過(guò)交叉驗(yàn)證來(lái)對(duì)特征進(jìn)行排序。
決策樹(shù)
ID3木羹、C4.5甲雅、CART算法
ID3:在決策樹(shù)的各級(jí)節(jié)點(diǎn)上都用信息增益作為判斷標(biāo)準(zhǔn)進(jìn)行屬性的選擇,使得在每個(gè)節(jié)點(diǎn)上都能獲得最大的類別分類增益坑填,使分類后的額數(shù)據(jù)集的熵最小抛人,這樣使得樹(shù)的平均深度最小,從而有效地提高了分類效率脐瑰。
步驟:

  1. 對(duì)當(dāng)前樣本集合妖枚,計(jì)算所有屬性的信息增益
  2. 選擇信息增益最大的屬性作為測(cè)試屬性,把測(cè)試屬性取值相同的樣本劃為同一個(gè)子樣本集
  3. 若子樣本集的類別只有單個(gè)苍在,則分支為葉節(jié)點(diǎn)绝页;否則對(duì)子樣本集循環(huán)調(diào)用本算法
#-*- coding: utf-8 -*-
#使用ID3決策樹(shù)算法預(yù)測(cè)銷量高低
import pandas as pd
from sklearn.tree import export_graphviz
from sklearn.externals.six import StringIO
from sklearn.tree import DecisionTreeClassifier as DTC

#參數(shù)初始化
inputfile = '../data/sales_data.xls'
data = pd.read_excel(inputfile, index_col = u'序號(hào)') #導(dǎo)入數(shù)據(jù)

#數(shù)據(jù)是類別標(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)


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等格式。
with open("tree.dot", 'w') as f:
  f = export_graphviz(dtc, feature_names = ['tianqi', 'zhoumo', 'cuxiao'], out_file = f)
  #f = export_graphviz(dtc, feature_names = [u'天氣', u'周末', u'促銷'], out_file = f)  
  
#文本打開(kāi)指定中文字體
#edge [fontname = "SimHei"];/*添加摔握,指定中文為黑體*/
#node [fontname = "SimHei"];/*添加寄狼,指定中文為黑體*/
#安裝Graphviz
#在命令行中編譯

人工神經(jīng)網(wǎng)絡(luò)

#-*- coding: utf-8 -*-
#使用神經(jīng)網(wǎng)絡(luò)算法預(yù)測(cè)銷量高低

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ù)是類別標(biāo)簽,要將它轉(zhuǎn)換為數(shù)據(jù)
#用1來(lái)表示“好”氨淌、“是”例嘱、“高”這三個(gè)屬性,用0來(lái)表示“壞”宁舰、“否”、“低”
data[data == u'好'] = 1
data[data == u'是'] = 1
data[data == u'高'] = 1
data[data != 1] = 0
x = data.iloc[:,:3].as_matrix().astype(int)
y = data.iloc[:,3].as_matrix().astype(int)

from keras.models import Sequential
from keras.layers.core import Dense, Activation

model = Sequential() #建立模型
model.add(Dense(3, 10))
model.add(Activation('relu')) #用relu函數(shù)作為激活函數(shù)奢浑,能夠大幅提供準(zhǔn)確度
model.add(Dense(10, 1))
model.add(Activation('sigmoid')) #由于是0-1輸出蛮艰,用sigmoid函數(shù)作為激活函數(shù)

model.compile(loss = 'binary_crossentropy', optimizer = 'adam', class_mode = 'binary')
#編譯模型。由于我們做的是二元分類雀彼,所以我們指定損失函數(shù)為binary_crossentropy壤蚜,以及模式為binary
#另外常見(jiàn)的損失函數(shù)還有mean_squared_error、categorical_crossentropy等徊哑,請(qǐng)閱讀幫助文件袜刷。
#求解方法我們指定用adam,還有sgd莺丑、rmsprop等可選

model.fit(x, y, nb_epoch = 1000, batch_size = 10) #訓(xùn)練模型著蟹,學(xué)習(xí)一千次
yp = model.predict_classes(x).reshape(len(y)) #分類預(yù)測(cè)

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

算法評(píng)價(jià):相對(duì)誤差、均方誤差梢莽、識(shí)別準(zhǔn)確度萧豆、識(shí)別精確率、ROC曲線

聚類分析

K-Means算法

#-*- coding: utf-8 -*-
#使用K-Means算法聚類消費(fèi)行為特征數(shù)據(jù)

import pandas as pd
from sklearn.cluster import KMeans
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)

#參數(shù)初始化
inputfile = '../data/consumption_data.xls' #銷量及其他屬性數(shù)據(jù)
outputfile = '../tmp/data_type.xls' #保存結(jié)果的文件名
k = 3 #聚類的類別
iteration = 500 #聚類最大循環(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)化

model = KMeans(n_clusters = k, n_jobs = 1, max_iter = iteration) #分為k類昏名,并發(fā)數(shù)4
model.fit(data_zs) #開(kāi)始聚類

#簡(jiǎn)單打印結(jié)果
r1 = pd.Series(model.labels_).value_counts() #統(tǒng)計(jì)各個(gè)類別的數(shù)目
r2 = pd.DataFrame(model.cluster_centers_) #找出聚類中心
r = pd.concat([r2, r1], axis = 1) #橫向連接(0是縱向)涮雷,得到聚類中心對(duì)應(yīng)的類別下的數(shù)目
r.columns = list(data.columns) + [u'類別數(shù)目'] #重命名表頭
print(r)        #打印分類中心和分類數(shù)量

#詳細(xì)輸出原始數(shù)據(jù)及其類別
r = pd.concat([data, pd.Series(model.labels_, index = data.index)], axis = 1)  #詳細(xì)輸出每個(gè)樣本對(duì)應(yīng)的類別
r.columns = list(data.columns) + [u'聚類類別'] #重命名表頭
r.to_excel(outputfile) #保存分類結(jié)果

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'聚類類別']==i]).savefig(u'%s%s.png' %(pic_output, i))

聚類算法評(píng)價(jià):purity評(píng)價(jià)法、RI評(píng)價(jià)法轻局、F值評(píng)價(jià)法

對(duì)象名 函數(shù)功能
KMeans K均值聚類
AffinityPropagation 吸引力傳播聚類
SpectralClustering 譜聚類洪鸭,由于KMeans
AgglomerativeClustering 層次聚類
DBSCAN 具有噪聲的基于密度的聚類算法
MeanShift 均值漂移聚類算法
BIRCH 層次聚類算法,可以處理大規(guī)模數(shù)據(jù)

先用對(duì)應(yīng)的函數(shù)建立模型仑扑,然后使用fit方法訓(xùn)練模型览爵,之后用label_方法給出樣本數(shù)據(jù)的標(biāo)簽,或者用predict方法預(yù)測(cè)新的輸入的標(biāo)簽夫壁。

TENSE:提供一種有效地?cái)?shù)據(jù)降維的方式拾枣,在2維或者3維戰(zhàn)士聚類結(jié)果。

#-*- coding: utf-8 -*-
#接k_means.py
from sklearn.manifold import TSNE
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)

tsne = TSNE()
tsne.fit_transform(data_zs) #進(jìn)行數(shù)據(jù)降維
tsne = pd.DataFrame(tsne.embedding_, index = data_zs.index) #轉(zhuǎn)換數(shù)據(jù)格式

#不同類別用不同顏色和樣式繪圖
d = tsne[r[u'聚類類別'] == 0]
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()

關(guān)聯(lián)分析

常用算法:Apriori、FP-Tree梅肤、Eclt算法司蔬、灰色關(guān)聯(lián)法

Ariori算法

支持度:



,A、B同時(shí)發(fā)生的概率

置信度:



A發(fā)生B發(fā)生的概率
同時(shí)滿足最小支持度和最小置信度稱滿足強(qiáng)規(guī)則
算法步驟:

  1. 掃描事物集姨蝴,得到?jīng)]個(gè)候選項(xiàng)的支持度
  2. 比較候選支持度與最小支持度俊啼,得到1項(xiàng)頻繁集L_1
  3. 由L_1產(chǎn)生候選項(xiàng)集C_2,并計(jì)算支持度
  4. 比較候選支持度和最小支持度左医,得到2項(xiàng)頻繁集L_2
  5. 類推授帕,直至不能產(chǎn)生新的候選項(xiàng)集
#-*- coding: utf-8 -*-
from __future__ import print_function
import pandas as pd

#自定義連接函數(shù),用于實(shí)現(xiàn)L_{k-1}到C_k的連接
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
#######################################################33
#-*- coding: utf-8 -*-
#使用Apriori算法挖掘菜品訂單關(guān)聯(lián)規(guī)則
from __future__ import print_function
import pandas as pd
from apriori import * #導(dǎo)入自行編寫的apriori函數(shù)

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

print(u'\n轉(zhuǎn)換原始數(shù)據(jù)至0-1矩陣...')
ct = lambda x : pd.Series(1, index = x[pd.notnull(x)]) #1表示逐行轉(zhuǎn)換麻献。轉(zhuǎn)換0-1矩陣的過(guò)渡函數(shù)
b = map(ct, data.as_matrix()) #用map方式執(zhí)行,b是list
data = pd.DataFrame(b).fillna(0) #空值用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é)果

時(shí)序模式

非平穩(wěn)時(shí)間序列分析:許多非平穩(wěn)序列差分后會(huì)顯示出平穩(wěn)序列的性質(zhì),這時(shí)稱之為差分平穩(wěn)序列继准,可以先做差分然后用ARMA模型進(jìn)行擬合厘擂。這種方法稱之為ARIMA模型。

#-*- coding: utf-8 -*-
#arima時(shí)序模型

import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.tsa.stattools import adfuller as ADF
from statsmodels.graphics.tsaplots import plot_pacf
from statsmodels.stats.diagnostic import acorr_ljungbox
from statsmodels.tsa.arima_model import ARIMA
plt.rcParams['font.sans-serif'] = ['SimHei'] #用來(lái)正常顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus'] = False #用來(lái)正常顯示負(fù)號(hào)

#參數(shù)初始化
discfile = '../data/arima_data.xls'
forecastnum = 5

#讀取數(shù)據(jù)锰瘸,指定日期列為指標(biāo)刽严,Pandas自動(dòng)將“日期”列識(shí)別為Datetime格式
data = pd.read_excel(discfile, index_col = u'日期')

#時(shí)序圖
data.plot()
plt.show()
plt.title('Time Series')

#自相關(guān)圖
plot_acf(data).show()

#平穩(wěn)性檢測(cè)
print(u'原始序列的ADF檢驗(yàn)結(jié)果為:', ADF(data[u'銷量']))
#返回值依次為adf、pvalue避凝、usedlag舞萄、nobs、critical values管削、icbest倒脓、regresults、resstore

#差分后的結(jié)果
D_data = data.diff().dropna()
D_data.columns = [u'銷量差分']
D_data.plot() #時(shí)序圖
plt.show()
plot_acf(D_data).show() #自相關(guān)圖
plot_pacf(D_data).show() #偏自相關(guān)圖
print(u'差分序列的ADF檢驗(yàn)結(jié)果為:', ADF(D_data[u'銷量差分'])) #平穩(wěn)性檢測(cè)

#白噪聲檢驗(yàn)
print(u'差分序列的白噪聲檢驗(yàn)結(jié)果為:', acorr_ljungbox(D_data, lags=1)) #返回統(tǒng)計(jì)量和p值

data[u'銷量'] = data[u'銷量'].astype(float)
#定階
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)) 
model = ARIMA(data, (p,1,q)).fit() #建立ARIMA(0, 1, 1)模型
model.summary2() #給出一份模型報(bào)告
model.forecast(5) #作為期5天的預(yù)測(cè)线婚,返回預(yù)測(cè)結(jié)果、標(biāo)準(zhǔn)誤差盆均、置信區(qū)間塞弊。
函數(shù)名 函數(shù)功能
acf 計(jì)算自相關(guān)系數(shù)
plot_acf 畫自相關(guān)系數(shù)圖
pacf 計(jì)算偏相關(guān)系數(shù)
plot_pacf 畫圖
adfuller 單位根檢驗(yàn)
diff 差分運(yùn)算
ARIMA 創(chuàng)建模型
summary 給出ARIMA模型的報(bào)告
aic/bic/hqic 計(jì)算ARIMA模型的指標(biāo)
forecast 預(yù)測(cè)
acorr_ljungbox Ljung-Box檢驗(yàn),是否白噪聲
autocorr = acf(data, unbiased = False, nlags = 40, qstat = False, fft = False, alpha = False)
# data 為觀測(cè)值序列(時(shí)間序列)泪姨,可以是DataFrame或者Series

h = adfuller(Series, maxlag = None, Regression = 'c', autolog = 'AIC', store = False, regresults =False)

D.diff()        #D為Pandas的DataFrame或Series

arima = ARIMA(data, (p, 1, q)).fit()        #data為輸入的時(shí)間序列游沿,p,q為對(duì)應(yīng)的階

amima.summary()         #返回一份格式化的模型報(bào)告

arima.bic

a,b,c = arima.forecast(num)     #num為要預(yù)測(cè)的天數(shù),a為返回的預(yù)測(cè)值,b為預(yù)測(cè)誤差,c為置信區(qū)間

離群點(diǎn)檢測(cè)

方法:基于統(tǒng)計(jì)、基于鄰近度肮砾、基于密度诀黍、基于聚類。
基于統(tǒng)計(jì):一元正態(tài)分布若數(shù)據(jù)點(diǎn)在3倍標(biāo)準(zhǔn)差之外仗处。
混合模型的離群點(diǎn)檢測(cè):數(shù)據(jù)的統(tǒng)計(jì)分布未知或者沒(méi)有訓(xùn)練數(shù)據(jù)可用蔗草,很難建立模型。
基于原型的聚類:聚類所有的對(duì)象疆柔,然后評(píng)估對(duì)象屬于簇的程度。如果刪除一個(gè)對(duì)象導(dǎo)師制該目標(biāo)顯著改進(jìn)镶柱,則可將該對(duì)象視為離群點(diǎn)旷档。離群點(diǎn)可能形成小簇從而逃避檢測(cè)。

#-*- coding: utf-8 -*-
#使用K-Means算法聚類消費(fèi)行為特征數(shù)據(jù)
import numpy as np
import pandas as pd
from sklearn.cluster import KMeans
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)

#參數(shù)初始化
inputfile = '../data/consumption_data.xls' #ID 和三個(gè)屬性
k = 3 #聚類的類別
threshold = 2 #離散點(diǎn)閾值
iteration = 500 #聚類最大循環(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)化

model = KMeans(n_clusters = k, n_jobs = 1, max_iter = iteration) #分為k類歇拆,并發(fā)數(shù)4
model.fit(data_zs) #開(kāi)始聚類

#標(biāo)準(zhǔn)化數(shù)據(jù)及其類別
r = pd.concat([data_zs, pd.Series(model.labels_, index = data.index)], axis = 1)  #每個(gè)樣本對(duì)應(yīng)的類別
r.columns = list(data.columns) + [u'聚類類別'] #重命名表頭

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) #求出絕對(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))#有標(biāo)注的點(diǎn)是離群點(diǎn)

plt.xlabel(u'編號(hào)')
plt.ylabel(u'相對(duì)距離')
plt.show()

電力竊漏電用戶自動(dòng)識(shí)別

數(shù)據(jù)分析

  1. 分布分析:用戶類別竊漏電情況分布發(fā)現(xiàn)鞋屈,非居民類不存在漏電情況。故可清理
  2. 周期性分析:找到一個(gè)正常的用戶和漏電用戶故觅,分別觀察規(guī)律厂庇。發(fā)現(xiàn)正常用戶有明顯的周期性。

數(shù)據(jù)預(yù)處理

  1. 數(shù)據(jù)清洗:過(guò)濾掉非居民類的數(shù)據(jù)和節(jié)假日數(shù)據(jù)输吏。
  2. 缺失值處理:拉格朗日插補(bǔ)法進(jìn)行插補(bǔ)
  3. 數(shù)據(jù)變換:用電趨勢(shì)指標(biāo)权旷、5天平均線損率、告警指標(biāo)計(jì)數(shù)

模型構(gòu)建

  1. 用LM神經(jīng)網(wǎng)絡(luò)和CART決策樹(shù)模型建模
  2. ROC曲線比較性能

航空公司客戶價(jià)值分析

數(shù)據(jù)分析:缺失值分析和異常值分析贯溅,異常值看最大和最小值

數(shù)據(jù)預(yù)處理

  1. 數(shù)據(jù)清洗拄氯,丟棄缺失值、票價(jià)為0折扣率不為0的數(shù)據(jù)
  2. 屬性規(guī)約它浅,刪除不相關(guān)或者弱相關(guān)屬性
  3. 數(shù)據(jù)變換:計(jì)算指標(biāo)译柏,并對(duì)數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理

模型構(gòu)建

  1. K-Means算法對(duì)客戶數(shù)據(jù)進(jìn)行分群,分為5類姐霍。
  2. 結(jié)合圖表對(duì)結(jié)果進(jìn)行分析

中醫(yī)證型關(guān)聯(lián)規(guī)則挖掘

數(shù)據(jù)預(yù)處理

  1. 數(shù)據(jù)清洗:刪除整理無(wú)效問(wèn)卷
  2. 屬性規(guī)約:將冗余屬性和無(wú)關(guān)屬性刪除
  3. 數(shù)據(jù)變換:構(gòu)造屬性鄙麦,并將屬性離散化

模型構(gòu)建

采用Apriori關(guān)聯(lián)規(guī)則算法對(duì)模型的樣本數(shù)據(jù)進(jìn)行分析典唇,以模型參數(shù)設(shè)置的最小支持度和最小置信度作為條件,輸出關(guān)聯(lián)規(guī)則結(jié)果胯府。

基于水色圖像的水質(zhì)評(píng)價(jià)

數(shù)據(jù)預(yù)處理

  1. 圖像切割:提取水樣圖像中間部分具有代表意義的圖像
  2. 特征提冉橄巍:顏色的一階、二階盟劫、三階矩

模型構(gòu)建

為提高區(qū)分度夜牡,將所有特征乘以常數(shù)k。然后建立支持向量機(jī)模型侣签。

水質(zhì)評(píng)價(jià)

對(duì)新增的水質(zhì)圖像作評(píng)價(jià)塘装。

家用電器用戶行為分析與事件識(shí)別

數(shù)據(jù)預(yù)處理

  1. 數(shù)據(jù)規(guī)約:去除無(wú)用的屬性和狀態(tài)
  2. 數(shù)據(jù)變換:確定用水事件的閾值
  3. 數(shù)據(jù)清洗

模型構(gòu)建:訓(xùn)練神經(jīng)網(wǎng)絡(luò)

模型檢驗(yàn):使用測(cè)試數(shù)據(jù)

應(yīng)用系統(tǒng)負(fù)載分析與磁盤容量預(yù)測(cè)

數(shù)據(jù)分析:通過(guò)時(shí)序圖觀察數(shù)據(jù)的平穩(wěn)性和周期性

數(shù)據(jù)預(yù)處理

  1. 數(shù)據(jù)清洗:刪除重復(fù)值
  2. 屬性構(gòu)造:合并屬性

模型構(gòu)建

  1. 檢驗(yàn)平穩(wěn)性,單位根檢驗(yàn)
  2. 白噪聲檢驗(yàn)
  3. 模型識(shí)別:采用極大似然比方法進(jìn)行模型的參數(shù)估計(jì)影所,采用BIC信息準(zhǔn)則對(duì)模型進(jìn)行定階蹦肴。ARIMA(0,1,1)
  4. 模型檢驗(yàn):檢驗(yàn)?zāi)P蜌埐钚蛄惺欠駷榘自肼暼绻皇牵f(shuō)明還有未提取的有用信息猴娩,需要修改模型阴幌。

模型評(píng)價(jià):計(jì)算平均絕對(duì)誤差,均方根誤差

電子商務(wù)網(wǎng)站用戶行為分析及服務(wù)推薦

數(shù)據(jù)抽取:建立數(shù)據(jù)庫(kù)--導(dǎo)入數(shù)據(jù)--搭建Python數(shù)據(jù)庫(kù)操作環(huán)境

數(shù)據(jù)分析

  1. 網(wǎng)頁(yè)類型分析
  2. 點(diǎn)擊次數(shù)分析
  3. 網(wǎng)頁(yè)排名

數(shù)據(jù)預(yù)處理

  1. 數(shù)據(jù)清洗:刪除數(shù)據(jù)(中間頁(yè)面網(wǎng)址卷中、發(fā)布成功網(wǎng)址矛双、登錄助手頁(yè)面)
  2. 數(shù)據(jù)變化:識(shí)別翻頁(yè)網(wǎng)址并去重,錯(cuò)誤分類網(wǎng)址手動(dòng)分類蟆豫,并進(jìn)一步分類
  3. 屬性規(guī)約:只選擇用戶和用戶選擇的網(wǎng)頁(yè)數(shù)據(jù)

模型構(gòu)建

基于物品的協(xié)同濾波算法:計(jì)算物品之間的相似度议忽,建立相似度矩陣;根據(jù)物品的相似度和用戶的歷史行為給用戶生成推薦列表十减。

相似度計(jì)算方法:夾角余弦栈幸、Jaccard系數(shù)、相關(guān)系數(shù)

財(cái)政收入影響因素分析及預(yù)測(cè)模型

數(shù)據(jù)分析

  1. 描述性統(tǒng)計(jì)分析
  2. 相關(guān)分析

模型構(gòu)建

對(duì)于財(cái)政收入帮辟、增值稅速址、營(yíng)業(yè)稅、企業(yè)所得稅由驹、政府性基金芍锚、個(gè)人所得稅

  1. Adaptive-Lasso變量選擇模型:去除無(wú)關(guān)變量
  2. 分別建立灰色預(yù)測(cè)模型與神經(jīng)網(wǎng)絡(luò)模型

基于基站定位數(shù)據(jù)的商圈分析

數(shù)據(jù)預(yù)處理

  1. 屬性規(guī)約:刪除冗余屬性,合并時(shí)間屬性
  2. 數(shù)據(jù)變換:計(jì)算工作日人均停留時(shí)間蔓榄、凌晨闹炉、周末、日均等指標(biāo)润樱,并標(biāo)準(zhǔn)化渣触。

模型構(gòu)建

  1. 構(gòu)建商圈聚類模型:采用層次聚類算法
  2. 模型分析:對(duì)聚類結(jié)果進(jìn)行特征觀察

電商產(chǎn)品評(píng)論數(shù)據(jù)情感分析

文本采集:八爪魚(yú)采集器(爬蟲(chóng)工具)

文本預(yù)處理

  1. 文本去重:自動(dòng)評(píng)價(jià)、完全重復(fù)評(píng)價(jià)壹若、復(fù)制的評(píng)論
  2. 機(jī)械壓縮去詞:
  3. 刪除短句

文本評(píng)論分詞:采用Python中文分詞包“Jieba”分詞嗅钻,精度達(dá)97%以上皂冰。

模型構(gòu)建

  1. 情感傾向性模型:生成詞向量;評(píng)論集子集的人工標(biāo)注與映射养篓;訓(xùn)練棧式自編碼網(wǎng)絡(luò)
  2. 基于語(yǔ)義網(wǎng)絡(luò)的評(píng)論分析
  3. 基于LDA模型的主題分析
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末秃流,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子柳弄,更是在濱河造成了極大的恐慌,老刑警劉巖碧注,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嚣伐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡萍丐,警方通過(guò)查閱死者的電腦和手機(jī)轩端,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)逝变,“玉大人基茵,你說(shuō)我怎么就攤上這事】怯埃” “怎么了拱层?”我有些...
    開(kāi)封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宴咧。 經(jīng)常有香客問(wèn)我根灯,道長(zhǎng),這世上最難降的妖魔是什么悠汽? 我笑而不...
    開(kāi)封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮芥驳,結(jié)果婚禮上柿冲,老公的妹妹穿的比我還像新娘。我一直安慰自己兆旬,他們只是感情好假抄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著丽猬,像睡著了一般宿饱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脚祟,一...
    開(kāi)封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天谬以,我揣著相機(jī)與錄音,去河邊找鬼由桌。 笑死为黎,一個(gè)胖子當(dāng)著我的面吹牛邮丰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播铭乾,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼剪廉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了炕檩?” 一聲冷哼從身側(cè)響起斗蒋,我...
    開(kāi)封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎笛质,沒(méi)想到半個(gè)月后泉沾,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡经瓷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年爆哑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舆吮。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡揭朝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出色冀,到底是詐尸還是另有隱情潭袱,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布锋恬,位于F島的核電站屯换,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏与学。R本人自食惡果不足惜彤悔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望索守。 院中可真熱鬧晕窑,春花似錦、人聲如沸卵佛。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)截汪。三九已至疾牲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衙解,已是汗流浹背阳柔。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚓峦,地道東北人盔沫。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓医咨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親架诞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拟淮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容