原來(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ù)
異常值分析
- 簡(jiǎn)單統(tǒng)計(jì)量分析:超出合理范圍的值
- 3sigma原則:若正態(tài)分布,異常值定義為偏差超出平均值的三倍標(biāo)準(zhǔn)差榨崩;否則谴垫,可用遠(yuǎn)離平均值的多少倍來(lái)描述。
- 箱型圖分析:異常值定義為小于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ī)范化
- 離差標(biāo)準(zhǔn)化(最小最大規(guī)范化)
- 標(biāo)準(zhǔn)差標(biāo)準(zhǔn)化
- 小數(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ù)歸納耙箍,主成分分析。
主成分分析步驟:
- 設(shè)原始變量X_1,X_2,..., X_p的n次觀測(cè)數(shù)據(jù)矩陣為:
- 將數(shù)據(jù)矩陣按列進(jìn)行中心標(biāo)準(zhǔn)化
- 求相關(guān)系數(shù)矩陣R酥馍,$$R=(r_{ij})_{p\times p}$$
其中辩昆,
-
求R的特征方程
的特征根
- 確定主成分個(gè)數(shù)m:alpha根據(jù)實(shí)際問(wèn)題確定,一般取0.8
- 計(jì)算m個(gè)相應(yīng)的單位特征向量:
- 計(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ù)的平均深度最小,從而有效地提高了分類效率脐瑰。
步驟:
- 對(duì)當(dāng)前樣本集合妖枚,計(jì)算所有屬性的信息增益
- 選擇信息增益最大的屬性作為測(cè)試屬性,把測(cè)試屬性取值相同的樣本劃為同一個(gè)子樣本集
- 若子樣本集的類別只有單個(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ī)則
算法步驟:
- 掃描事物集姨蝴,得到?jīng)]個(gè)候選項(xiàng)的支持度
- 比較候選支持度與最小支持度俊啼,得到1項(xiàng)頻繁集L_1
- 由L_1產(chǎn)生候選項(xiàng)集C_2,并計(jì)算支持度
- 比較候選支持度和最小支持度左医,得到2項(xiàng)頻繁集L_2
- 類推授帕,直至不能產(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ù)分析:
- 分布分析:用戶類別竊漏電情況分布發(fā)現(xiàn)鞋屈,非居民類不存在漏電情況。故可清理
- 周期性分析:找到一個(gè)正常的用戶和漏電用戶故觅,分別觀察規(guī)律厂庇。發(fā)現(xiàn)正常用戶有明顯的周期性。
數(shù)據(jù)預(yù)處理
- 數(shù)據(jù)清洗:過(guò)濾掉非居民類的數(shù)據(jù)和節(jié)假日數(shù)據(jù)输吏。
- 缺失值處理:拉格朗日插補(bǔ)法進(jìn)行插補(bǔ)
- 數(shù)據(jù)變換:用電趨勢(shì)指標(biāo)权旷、5天平均線損率、告警指標(biāo)計(jì)數(shù)
模型構(gòu)建
- 用LM神經(jīng)網(wǎng)絡(luò)和CART決策樹(shù)模型建模
- ROC曲線比較性能
航空公司客戶價(jià)值分析
數(shù)據(jù)分析:缺失值分析和異常值分析贯溅,異常值看最大和最小值
數(shù)據(jù)預(yù)處理:
- 數(shù)據(jù)清洗拄氯,丟棄缺失值、票價(jià)為0折扣率不為0的數(shù)據(jù)
- 屬性規(guī)約它浅,刪除不相關(guān)或者弱相關(guān)屬性
- 數(shù)據(jù)變換:計(jì)算指標(biāo)译柏,并對(duì)數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理
模型構(gòu)建
- K-Means算法對(duì)客戶數(shù)據(jù)進(jìn)行分群,分為5類姐霍。
- 結(jié)合圖表對(duì)結(jié)果進(jìn)行分析
中醫(yī)證型關(guān)聯(lián)規(guī)則挖掘
數(shù)據(jù)預(yù)處理
- 數(shù)據(jù)清洗:刪除整理無(wú)效問(wèn)卷
- 屬性規(guī)約:將冗余屬性和無(wú)關(guān)屬性刪除
- 數(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ù)處理
- 圖像切割:提取水樣圖像中間部分具有代表意義的圖像
- 特征提冉橄巍:顏色的一階、二階盟劫、三階矩
模型構(gòu)建
為提高區(qū)分度夜牡,將所有特征乘以常數(shù)k。然后建立支持向量機(jī)模型侣签。
水質(zhì)評(píng)價(jià)
對(duì)新增的水質(zhì)圖像作評(píng)價(jià)塘装。
家用電器用戶行為分析與事件識(shí)別
數(shù)據(jù)預(yù)處理
- 數(shù)據(jù)規(guī)約:去除無(wú)用的屬性和狀態(tài)
- 數(shù)據(jù)變換:確定用水事件的閾值
- 數(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ù)處理
- 數(shù)據(jù)清洗:刪除重復(fù)值
- 屬性構(gòu)造:合并屬性
模型構(gòu)建
- 檢驗(yàn)平穩(wěn)性,單位根檢驗(yàn)
- 白噪聲檢驗(yàn)
- 模型識(shí)別:采用極大似然比方法進(jìn)行模型的參數(shù)估計(jì)影所,采用BIC信息準(zhǔn)則對(duì)模型進(jìn)行定階蹦肴。ARIMA(0,1,1)
- 模型檢驗(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ù)分析
- 網(wǎng)頁(yè)類型分析
- 點(diǎn)擊次數(shù)分析
- 網(wǎng)頁(yè)排名
數(shù)據(jù)預(yù)處理
- 數(shù)據(jù)清洗:刪除數(shù)據(jù)(中間頁(yè)面網(wǎng)址卷中、發(fā)布成功網(wǎng)址矛双、登錄助手頁(yè)面)
- 數(shù)據(jù)變化:識(shí)別翻頁(yè)網(wǎng)址并去重,錯(cuò)誤分類網(wǎng)址手動(dòng)分類蟆豫,并進(jìn)一步分類
- 屬性規(guī)約:只選擇用戶和用戶選擇的網(wǎng)頁(yè)數(shù)據(jù)
模型構(gòu)建
基于物品的協(xié)同濾波算法:計(jì)算物品之間的相似度议忽,建立相似度矩陣;根據(jù)物品的相似度和用戶的歷史行為給用戶生成推薦列表十减。
相似度計(jì)算方法:夾角余弦栈幸、Jaccard系數(shù)、相關(guān)系數(shù)
財(cái)政收入影響因素分析及預(yù)測(cè)模型
數(shù)據(jù)分析
- 描述性統(tǒng)計(jì)分析
- 相關(guān)分析
模型構(gòu)建
對(duì)于財(cái)政收入帮辟、增值稅速址、營(yíng)業(yè)稅、企業(yè)所得稅由驹、政府性基金芍锚、個(gè)人所得稅
- Adaptive-Lasso變量選擇模型:去除無(wú)關(guān)變量
- 分別建立灰色預(yù)測(cè)模型與神經(jīng)網(wǎng)絡(luò)模型
基于基站定位數(shù)據(jù)的商圈分析
數(shù)據(jù)預(yù)處理
- 屬性規(guī)約:刪除冗余屬性,合并時(shí)間屬性
- 數(shù)據(jù)變換:計(jì)算工作日人均停留時(shí)間蔓榄、凌晨闹炉、周末、日均等指標(biāo)润樱,并標(biāo)準(zhǔn)化渣触。
模型構(gòu)建
- 構(gòu)建商圈聚類模型:采用層次聚類算法
- 模型分析:對(duì)聚類結(jié)果進(jìn)行特征觀察
電商產(chǎn)品評(píng)論數(shù)據(jù)情感分析
文本采集:八爪魚(yú)采集器(爬蟲(chóng)工具)
文本預(yù)處理:
- 文本去重:自動(dòng)評(píng)價(jià)、完全重復(fù)評(píng)價(jià)壹若、復(fù)制的評(píng)論
- 機(jī)械壓縮去詞:
- 刪除短句
文本評(píng)論分詞:采用Python中文分詞包“Jieba”分詞嗅钻,精度達(dá)97%以上皂冰。
模型構(gòu)建
- 情感傾向性模型:生成詞向量;評(píng)論集子集的人工標(biāo)注與映射养篓;訓(xùn)練棧式自編碼網(wǎng)絡(luò)
- 基于語(yǔ)義網(wǎng)絡(luò)的評(píng)論分析
- 基于LDA模型的主題分析