《Python數據分析與數據挖掘實戰》學習筆記1(數據挖掘基礎)

前言

數據分析是對已知的數據進行分析,然後提取出一些有價值的信息,數據量不會太大;數據挖掘,是指對大量數據進行分析與挖掘,得到一些未知的,潛在的信息;數據挖掘是數據分析的提升。
數據挖掘是:從歷史保存的大量數據(包括文本)中挖掘出隱含的、未知的、對決策有潛在價值的關係、模式和趨勢,並用這些知識和規則建立用於決策支持的模型,提供預測性決策支持的方法、工具和過程。它利用各種分析工具在大量數據中尋找其規律和發現模型與數據之間關係的過程,是統計學、數據庫技術和人工智能技術的綜合。
數據挖掘的基本任務:利用分類與預測、聚類分析、關聯規則、時序模式、偏差檢測、智能推薦等方法,幫助企業提取數據中的商業價值。
數據挖掘建模過程包括:定義挖掘目標、數據取樣、數據探索、數據預處理、挖掘建模、模型評價六個步驟。

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=xminmaxminx^* = \frac{x-min}{max-min}
標準差標準化(零-均值規範化):經處理的數據均值爲0,標準差爲1。δ{ \delta}爲原始數據的標準差
x=xxmeanδx^* = \frac{x-x{\\mean} }{ \delta}
小數定標規範化

用三種方法進行數據規範:
 #_*_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=1X) p=P(y=1|X) ,取0的概率是1p1- p
ln(p/(1p))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))

4.2、聚類分析

4.3、關聯規則

4.4、時序模式

4.5、離羣點檢測

5、模型評價與分佈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章