《Python資料分析與資料挖掘實戰》學習筆記(資料挖掘基礎)
-
- 前言
- 1、擷取資料(擷取【爬蟲采集或從一些統計網站下載下傳】--->取樣)
- 2、資料探索
-
- 2.1、缺失、異常值分析
- 2.2、統計量分析
- 3、資料預處理(清洗【去掉髒資料】、內建【集中】、變換【規範化】、規約【精簡】)
-
- 3.1、資料清洗
- 3.2、資料內建
- 3.3、資料變換
- 3.4、資料規約
- 4、挖掘模組化(分類、聚類、關聯、預測)
-
- 4.1、分類與預測
-
- 邏輯回歸
-
- 邏輯回歸模組化步驟:
- 案例:對銀行在降低貨款拖欠率的資料進行邏輯回歸模組化
- 4.2、聚類分析
- 4.3、關聯規則
- 4.4、時序模式
- 4.5、離群點檢測
- 5、模型評價與分布
前言
資料分析是對已知的資料進行分析,然後提取出一些有價值的資訊,資料量不會太大;資料挖掘,是指對大量資料進行分析與挖掘,得到一些未知的,潛在的資訊;資料挖掘是資料分析的提升。
資料挖掘是:從曆史儲存的大量資料(包括文本)中挖掘出隐含的、未知的、對決策有潛在價值的關系、模式和趨勢,并用這些知識和規則建立用于決策支援的模型,提供預測性決策支援的方法、工具和過程。它利用各種分析工具在大量資料中尋找其規律和發現模型與資料之間關系的過程,是統計學、資料庫技術和人工智能技術的綜合。
資料挖掘的基本任務:利用分類與預測、聚類分析、關聯規則、時序模式、偏差檢測、智能推薦等方法,幫助企業提取資料中的商業價值。
資料挖掘模組化過程包括:定義挖掘目标、資料取樣、資料探索、資料預處理、挖掘模組化、模型評價六個步驟。
1、擷取資料(擷取【爬蟲采集或從一些統計網站下載下傳】—>取樣)
資料取樣是在明确了挖掘目标後,從資料倉庫中抽取一個相關的樣本子集。通過對資料樣本的精選,不僅能減少資料處理量,節省系統資源,還能是規律更容易凸顯。
抽取資料的标準,一是相關性,二是可靠性,三是有效性。資料取樣的品質一定要把關,若原始資料有誤,則很難挖掘探索出資料的規律性。
抽樣方法:
1、随機抽樣:資料集中的每組觀測值都有相同的被抽樣的機率;
2、等距抽樣:如100組觀測值按5%的比例等距抽樣,則取第20,40,60,80,100組這5組觀測值;
3、分層抽樣:首先将樣本總體分成若幹層,每層中的觀測值都有相同的被選用的機率,但不同層可設定不同機率;
4、從起始順序抽樣:從輸入資料集的起始處開始抽樣;
5、分類抽樣:依據某種屬性的取值來選擇資料子集。
2、資料探索
資料探索和預處理的目的是為了保證樣本資料的品質。
資料探索主要包括:資料品質分析(異常值、缺失值、一緻性) 和資料特征分析(分布、對比、統計量、相關性、周期性和貢獻度)
2.1、缺失、異常值分析
缺失值的處理分為删除存在缺失記錄、對可能值進行插補、不處理三種情況。
異常值也稱為離群點。指樣本中個别值的數值明顯偏離其餘的觀測值。三種常見的離群點分析方法:
(1)簡單統計量分析 :使用pandas庫中的describe()函數,可以檢視資料基本參數(平均值、标準差、最大最小值、25%50%75%三個分位數)
(2)3 δ { \delta} δ原則
(3)箱型圖分析
餐飲銷售額資料異常值檢測代碼:
import pandas as pd
#定義路徑
catering_sale="E:\\《Python資料分析與挖掘實戰》源資料和代碼\\Python資料分析與挖掘實戰\\chapter3\\demo\\data\\catering_sale.xls"
'''
讀取Excel檔案
catering_sale=r"\catering_sale.xls"
'''
#讀取資料,指定“日期”為索引列
data=pd.read_excel (catering_sale ,index_col=u'日期')
'''
檢視資料基本情況:均值,标準差,最小、最大值,分位值
print(data.describe())
'''
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')#畫箱型圖
x=p['fliers'][0].get_xdata() #fliter為異常值的标簽
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()
p要指定類型,否則報錯不能讀取p。故将原句p=data.boxplot( ) 改為 p=data.boxplot(return_type=‘dict’)
2.2、統計量分析
從集中趨勢(度量參數:均值、中位數、衆數)、離中趨勢(極差、标準差、變異系數、四分位數間距)兩個方面進行分析
均值對極端值很敏感。可以使用截斷均值或中位數來度量資料的集中趨勢。
#銷售數的統計量情況
import pandas as pd
catering_sale="E:\\《Python資料分析與挖掘實戰》源資料和代碼\\Python資料分析與挖掘實戰\\chapter3\\demo\\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)
3、資料預處理(清洗【去掉髒資料】、內建【集中】、變換【規範化】、規約【精簡】)
資料預處理包括:資料清洗(缺失值處理、異常值處理)、資料內建(實體識别、備援屬性識别)、資料變換(簡單函數變換、規範化、連續屬性離散化、屬性構造、小波變換)和資料規約(屬性規約和數值規約)。
3.1、資料清洗
A.缺失值
在資料探索部分提到,缺失值的處理分為删除存在缺失記錄、對可能值進行插補、不處理三種情況。常見的插補方法有:均值/中位數/衆數插補,使用固定值,最近鄰插補,回歸方法,插值法。
插值法是利用已知點建立合适的插值函數,未知值由對應點求出的函數值近似替代。重點學習了拉格朗日插值法和牛頓插值法。
用拉格朗日進行插補:
#自定義列向量插值函數
def ployinterp_column(s,n,k=5):#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)#輸出結果,寫入檔案入檔案
B.異常值
異常值處理方式包括:删除、視為缺失值、平均值修正、不處理
3.2、資料內建
A.實體識别
目的是統一不同資料源的沖突(同名異義,異名同義,機關不統一)。
3.3、資料變換
A.簡單函數變換
簡單函數變換常用來将不具有正态分布的資料變換成具有正态分布的資料,包括平方、開方、取對數、差分運算等
B.規範化
為了消除名額之間的量綱和取值範圍差異的影響,需要進行标準化處理,将資料按比例進行縮放,使之落到特定區域, 便于綜合分析。
離差标準化(最小最大規範化):将資料映射到[0,1]之内,是對原始資料的線性變換。
x ∗ = x − m i n m a x − m i n x^* = \frac{x-min}{max-min} x∗=max−minx−min
标準差标準化(零-均值規範化):經處理的資料均值為0,标準差為1。 δ { \delta} δ為原始資料的标準差
x ∗ = x − x m e a n δ x^* = \frac{x-x{\\mean} }{ \delta} x∗=δx−xmean
小數定标規範化
用三種方法進行資料規範:
#_*_coding:utf-8 _*_
import pandas as pd
import numpy as np
datafile='E:\\《Python資料分析與挖掘實戰》源資料和代碼\\Python資料分析與挖掘實戰\\chapter4\\demo\\data\\normalization_data.xls'
data=pd.read_excel (datafile,header= None )
x1=(data-data.min())/(data.max()-data.min())
x2=(data-data.mean())/data.std()
x3=data/10**np.ceil(np.log10(data.abs().max()))
print(x1,x2,x3)
C.連續屬性離散化
等寬離散化、等頻離散化、基于聚類分析的方法
用三種方法進行資料離散化:
import pandas as pd
datafile='E:\\《Python資料分析與挖掘實戰》源資料和代碼\\Python資料分析與挖掘實戰\\chapter4\\demo\\data\\discretization_data.xls'
data=pd.read_excel (datafile)
data=data[u'肝氣郁結證型系數'].copy()
k=4
#等寬離散化
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]
w[0]=w[0]*(1-1e-10)
d2=pd.cut(data,w,labels=range(k))
#聚類離散化
from sklearn.cluster import KMeans
kmodel=KMeans(n_clusters=k,n_jobs=1)
kmodel.fit(data.reshape((len(data),1)))
c=pd.DataFrame(kmodel.cluster_centers_ ).sort_values(0)
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()
D.屬性構造
利用已有的屬性集構造新的屬性。
線損率屬性構造:
import pandas as pd
inputfile='E:/《Python資料分析與挖掘實戰》源資料和代碼/Python資料分析與挖掘實戰/chapter4/demo/data/electricity_data.xls'
outputfile='E:/代碼/Data_A_M/.idea/tmp/electricity_data.xls'
data=pd.read_excel (inputfile)
data[u'線損率']=(data[u'供入電量']-data[u'供出電量'])/data[u'供入電量']
data.to_excel(outputfile,index=False)
E.小波變換
小波變換是一種信号分析手段,提供了一種非平穩信号的時頻分析手段。
小波變換特征提取代碼:
import pandas as pd
import pywt
inputfile='E:/《Python資料分析與挖掘實戰》源資料和代碼/Python資料分析與挖掘實戰/chapter4/demo/data/leleccum.mat'
from scipy .io import loadmat
mat=loadmat(inputfile)
signal=mat['leleccum'][0]
coeffs=pywt.wavedec(signal,'bior3.7',level=5)
3.4、資料規約
A.屬性規約
屬性規約方法 | 合并屬性 | 逐漸向前選擇 | 逐漸向後删除 | 決策樹歸納 | 主成分分析 |
---|---|---|---|---|---|
方法描述 | 将舊屬性合為新屬性 | 從空屬性集合開始,每次從原來屬性集合選擇一個最優屬性添加到目前子集,直到無法選出最優或達到門檻值為止 | 每次從原來屬性集合選擇一個最差屬性添加到目前子集… | 利用決策樹的歸納方法對初始資料進行分類歸納學習,獲得一個初始決策樹,未出現在該決策樹上的屬性維為無關屬性可删除,便獲得較優子集 | 将相關性很高的變量轉化成彼此獨立不相關的變量 |
方法類别 | 建立新的屬性次元 | 直接删除不相關屬性 | 直接删除不相關屬性 | 直接删除不相關屬性 | 連續屬性的資料降維 |
用主成分分析進行資料降維:
import pandas as pd
inputfile='E:/《Python資料分析與挖掘實戰》源資料和代碼/Python資料分析與挖掘實戰/chapter4/demo/data/principal_component.xls'
outputfile='E:/代碼/Data_A_M/.idea/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)#取前三個主成分,即n_components=3
pca.fit(data)
low_d=pca.transform(data)#用它來降低次元
pd.DataFrame(low_d).to_excel (outputfile)
pca.inverse_transform(low_d)
print(low_d)
B.數值規約
數值規約方法分為有參數方法和無參數方法兩類。
有參數方法 | 無參數方法 |
---|---|
使用一個模型來評估資料,隻需存放參數,不需存放實際資料 | 隻需存放實際資料 |
回歸(線性回歸和多元回歸) | 直方圖、聚類、抽樣 |
4、挖掘模組化(分類、聚類、關聯、預測)
模組化主要考慮兩個問題:第一、本次模組化屬于哪類問題(分類、聚類、關聯規則、時序模式、智能推薦)?第二、選用哪種算法構模組化型?
4.1、分類與預測
邏輯回歸
邏輯回歸模組化步驟:
1)根據分析目标設定名額變量(自變量和因變量),然後收集資料,根據收集的資料,對特征再次進行篩選。
2)y取1的機率是 p = P ( y = 1 ∣ X ) p=P(y=1|X) p=P(y=1∣X) ,取0的機率是 1 − p 1- p 1−p
用 l n ( p / ( 1 − p ) ) ln(p/(1-p)) ln(p/(1−p))和自變量累出線性回歸方程,故居出模型中的回歸系數。
3)進行模型檢驗。模型有效性的檢驗名額包括:最基本的有正确率,其次有混淆矩陣、ROC曲線、KS值等
4)模型的應用:輸入自變量的取值,就可以得到預測變量的值,或者根據預測變量的值去控制自變量的取值
案例:對銀行在降低貨款拖欠率的資料進行邏輯回歸模組化
#邏輯回歸
import pandas as pd
#初始化參數
datafile='E:\\《Python資料分析與挖掘實戰》源資料和代碼\\Python資料分析與挖掘實戰\\chapter5\\demo\\data\\bankloan.xls'
data=pd.read_excel (datafile)
x=data.iloc[:,:8].values
y=data.iloc[:,8].values
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()#獲得特征篩選結果
print(u'通過随機邏輯回歸模型篩選特征結束。')
print(u'有效特征為:%s'%','.join(data.columns[rlr.get_support(indices=True) ]))
x=data[data.columns[rlr.get_support(indices=True) ]].values
lr=LR()
lr.fit(x,y)
print(u'邏輯回歸模型訓練結束。')
print(u'模型的平均正确率為:%s'% lr.score(x,y))