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

歡迎訪問 生活随笔!

生活随笔

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

python

Python数据分析与挖掘实战总结

發布時間:2024/8/1 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python数据分析与挖掘实战总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

《Python數據分析與挖掘實戰》

一、書籍及源代碼下載鏈接:

鏈接:https://pan.baidu.com/s/1oTde4_W1-0GcltkcGtG33A? ?提取碼:1234

GitHub - GoAlers/python_data_analysis_and_mining_action: 《python數據分析與挖掘實戰》的代碼筆記

數據挖掘比賽筆記參考這篇

數據挖掘比賽筆記總結_GoAl的博客-CSDN博客

一、Python數據分析工具

二、數據探索

一、對數據的質量分析

異常值的分析:

1. 簡單的統計量分析:查看最大最小值是否在合理范圍

2.3δ原則,在正態分布下異常值被定義為一組定值與平均值的距離超過3倍的標準差。

3.箱形圖分析:

異常值被定義為小于QL-1.5IQR 或大于QR+1.5IQR??

QL是所有數據的下四分位,QR是所有數據的上四分位。IQR是QR-QL

DataFrame中describe()已經給出了基本的統計

二、數據特征分析

1.可以使用pandas、matplotlib繪制統計圖

散點圖矩陣可以分析每兩個變量的關系。

2.計算相關系數

①Pearson相關系數

②Spearman秩相關系數

③判定系數

使用pandas的corr()計算相關系數

繪制條形圖和折線圖

三、數據預處理

缺失

二、Python數據分析入門

Python入門

基本命令:

# for 循環 s = 0 for k in range(101): #1-100s = s + k print s# 函數 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)# 匿名函數 f = lambda x : x+2 #定義函數f(x)= x+2 g = lambda x, y : x+y #定義函數g(x,y)= x+y, g(1,2)結果為3# 數據結構 # a, b是列表 # 列表函數cmp(a, b) len(a) max(a) min(a) sum(a) sorted(a) # 列表對象方法 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[:] #數據復制# 列表解析 a = [1, 2, 3] b = [] for i in a:b.append(i+2) # 等價于 a =[1, 2, 3] b =[i + 2 for i in a]# 集合 d = {'today' : 20, "tomorrow" : 30} #創建 d['today'] #訪問 # 其他創建方法 dict(['today', 20], ['tomorrow', 30]) dict.fromkeys(['today', 'tomorrow'], 20)# 集合 s = {1, 2, 2, 4} s = set([1,2,2,4]) #自動去除多余的值# 函數式編程 lambda, map, reduce, filter b = map(lambda x :x+2, a) b = list(b); #2.x中不需要,3.x中需要,因為map僅僅創建了一個待運行的命令容器,只有其他函數調用時才返回結果 # map命令將函數逐一運用到map列表的每個元素中,,最后返回一個數組,效率比for循環高一點# reduce函數用于遞歸運算 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# 導入庫 import math math.sin(1)import math as m m.sin(1)from math import exp as e e(1) sin(1) #出錯from math import * #直接導入,大量導入會引起命名沖突,不建議 exp(1) sin(1)# 導入future特征(2.x) # 將print變為函數形式,即用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

第三方庫

安裝

Windows中

pip install numpy

或者下載源代碼安裝

python setup.py install

Pandas默認安裝不能讀寫Excel文件,需要安裝xlrd和xlwt庫才能支持excel的讀寫

pip install xlrd pip install xlwt

StatModel可pip可exe安裝,注意,此庫依賴于Pandas和patsy

Scikit-Learn是機器學習相關的庫,但是不包含人工神經網絡

model.fit() #訓練模型,監督模型fit(X,y),非監督模型fit(X)# 監督模型接口model.predict(X_new) #預測新樣本model.predict_proba(X_new) #預測概率model.score() #得分越高,fit越好# 非監督模型接口model.transform() #從數據中學到新的“基空間”model.fit_transform() #從數據中學到新的基,并按照這組基進行轉換

Keras是基于Theano的強化的深度學習庫,可用于搭建普通神經網絡,各種深度學習模型,如自編碼器,循環神經網絡,遞歸神經網絡,卷積神經網絡。Theano也是一個Python庫,能高效實現符號分解,速度快,穩定性好,實現了GPU加速,在密集型數據處理上是CPU的10倍,缺點是門檻太高。Keras的速度在Windows會大打折扣。

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

Gensim用來處理語言方面的任務,如文本相似度計算、LDA、Word2Vec等,建議在Windows下運行。

Linux中

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

使用

Matplotlib默認字體是英文,如果要使用中文標簽,

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

保存作圖圖像時,負號顯示不正常:

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

三、數據探索

臟數據:缺失值、異常值、不一致的值、重復數據

異常值分析

  • 簡單統計量分析:超出合理范圍的值
  • 3sigma原則:若正態分布,異常值定義為偏差超出平均值的三倍標準差;否則,可用遠離平均值的多少倍來描述。
  • 箱型圖分析:異常值定義為小于Q_L-1.5IQR或者大于Q_U +1.5IQR。Q_L是下四分位數,全部數據有四分之一比他小。Q_U是上四分位數。IQR稱為四分位數間距,IQR=Q_U-Q_L
  • #-*- coding: utf-8 -*-import pandas as pdcatering_sale = '../data/catering_sale.xls' #餐飲數據data = pd.read_excel(catering_sale, 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() #畫箱線圖,直接使用DataFrame的方法x = p['fliers'][0].get_xdata() # 'flies'即為異常值的標簽y = p['fliers'][0].get_ydata()y.sort() #從小到大排序,該方法直接改變原對象#用annotate添加注釋#其中有些相近的點,注解會出現重疊,難以看清,需要一些技巧來控制。#以下參數都是經過調試的,需要具體問題具體調試。#xy表示要標注的位置坐標,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() #展示箱線圖

    分布分析

    定量數據的分布分析:求極差(max-min),決定組距和組數,決定分點,列出頻率分布表,繪制頻率分布直方圖。

    定性數據的分布分析:餅圖或條形圖

    對比分析

    統計量分析

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

    離中趨勢度量:極差、標準差、變異系數、四份位數間距

    變異系數為:s表示標準差,x表示均值

    #-*- coding: utf-8 -*-#餐飲銷量數據統計量分析from __future__ import print_functionimport pandas as pdcatering_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() #保存基本統計量print(statistics)print("--------------")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)

    周期性分析

    貢獻度分析

    又稱帕累托分析,原理是帕累托法則,即20/80定律,同樣的投入放在不同的地方會產生不同的收益。

    #-*- coding: utf-8 -*-#菜品盈利數據 帕累托圖from __future__ import print_functionimport pandas as pd#初始化參數dish_profit = '../data/catering_dish_profit.xls' #餐飲菜品盈利數據,菜品ID,菜品名 盈利data = pd.read_excel(dish_profit, index_col = u'菜品名')data = data[u'盈利'].copy()#保留兩列數據data.sort(ascending = False)import matplotlib.pyplot as plt #導入圖像庫plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標簽plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號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%處的標記。這里包括了指定箭頭樣式。plt.ylabel(u'盈利(比例)')plt.show()

    相關性分析

    途徑:繪制散點圖、散點圖矩陣、計算相關系數

    Pearson相關系數:要求連續變量的取值服從正態分布。

    相關系數r的取值范圍[-1, 1]

    Spearman相關系數:不服從正態分布的變量、分類或等級變量之間的關聯性可用該系數,也稱等級相關系數。

    對兩個變量分別按照從小到大的順序排序,得到的順序就是秩。R_i表示x_i的秩次,Q_i表示y_i的秩次。

    判定系數:相關系數的平方,用來解釋回歸方程對y的解釋程度。

    #-*- coding: utf-8 -*-#餐飲銷量數據相關性分析 from __future__ import print_function import pandas as pdcatering_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'翡翠蒸香茜餃']) #計算“百合醬蒸鳳爪”與“翡翠蒸香茜餃”的相關系數

    數據探索函數

    方法名函數功能
    D.sum()按列計算總和
    D.mean()計算算數平均
    D.var()方差
    D.std()標準差
    D.corr(method = ' pearson')Spearman(Pearson)相關系數矩陣
    D.cov()協方差矩陣
    D.skew()偏度(三階矩)
    D.kurt()峰度(四階距)
    D.describe()給出樣本的基礎描述

    D = pd.DataFrame([range(1,8), range(2, 9)]) D.corr(method = 'spearman') #計算相關系數矩陣 S1 = D.loc[0] #提取第一行 S2 = D.loc[1] #提取第二行 S1.corr(S2, method = 'pearson') #計算S1S2的相關系數D = pd.DataFrame(np.random.randn(6, 5)) #產生6x5的表格 print D.cov() print D[0].cov(D[1]) #計算第一列和第二列的方差 print D.skew() #D是DataFrame或者Series print D.describe()

    方法名函數功能
    cumsum()依次給出前1-n個數的和
    cumprod()依次給出前1-n個數的積
    cummax()依次給出前1-n個數的最大值
    cummin()依次給出前1-n個數的最小值
    方法名函數功能
    rolling_sum()按列計算數據樣本的總和
    rolling_mean()算數平均數
    rolling_var()方差
    rolling_std()標準差
    rolling_corr()相關系數矩陣
    rolling_cov()協方差
    rolling_skew()偏度
    rolling_kurt()峰度
    D = pd.Series(range(0,20)) print D.cumsum()print pd.rolling_sum(D, 2) #依次對相鄰兩項求和 方法名函數功能
    plot()繪制線性二維圖,折線圖
    pie()繪制餅形圖
    hist()繪制二維條形直方圖,可現實數據的分配情形
    boxplot()繪制箱型圖
    plot(logy = True)繪制y軸的對數圖形
    plot(yerr = error)繪制誤差條形圖

    import matplotlib.pyplot as plt #導入圖像庫plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標簽plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號plt.figure(figsize = (7, 5)) #創建圖像區域,指定比例plt.show() #顯示作圖結果############################################################################################x = np.linspace(0, 2*np.pi, 50)y = np.sin(x)plt.plot(x, y, 'bp--') #藍色帶星虛線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個服從正態分布的隨機數plt.hist(x, 10) #分成10組plt.show()############################################################################################plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標簽plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號x = np.exp(np.arange(20)) #原始數據plt.subplot(121)plt.plot(range(0,20), x, label = u"原始數據圖")plt.legend()plt.subplot(122)plt.semilogy(range(0,20), x, label = u"對數數據圖")plt.legend()plt.show()############################################################################################plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標簽plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號error = np.random.random(10) #定義誤差條例y = pd.Series(np.sin(np.arange(10)))y.plot(yerr = error)plt.show()

    四、數據預處理

    數據清洗

    包括:刪除原始數據中的無關數據、重復數據,平滑噪聲數據,處理缺失值。
    拉格朗日插值法:

    當插值節點增減時,插值多項式就會發生變化,在實際計算中不方便。
    牛頓插值法:P(x)是牛頓插值逼近函數,R(x)是誤差函數

    Python的Scipy庫中只提供了拉格朗日插值法的函數(實現上比較容易)

    #-*- coding: utf-8 -*-# 插值時存在問題,不同的位置選取的數據點不一樣,并且保證最后的數據是正確的# 目前沒有考慮連續臟數據的情況#拉格朗日插值代碼import pandas as pd #導入數據分析庫Pandasfrom 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,插值不要超過20def ployinterp_column(s, n, k=5):y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取數,y是長度為10的列表y = y[y.notnull()] #剔除空值return lagrange(y.index, list(y))(n) #插值并返回插值多項式,代入n得到插值結果#逐個元素判斷是否需要插值k = 2for 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))] #取數,y是長度為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) #插值并返回插值多項式,代入j得到插值結果data.to_excel(outputfile) #

    數據集成

    包括實體識別,冗余屬性識別

    數據變化

    簡單函數變換
    規范化

  • 離差標準化(最小最大規范化)?
  • 標準差標準化
  • 小數定標規范化:屬性值映射在[-1, 1]之間?
  • #-*- coding: utf-8 -*- #數據規范化 import pandas as pd import numpy as npdatafile = '../data/normalization_data.xls' #參數初始化 data = pd.read_excel(datafile, header = None) #讀取數據,矩陣print (data - data.min())/(data.max() - data.min()) #最小-最大規范化,按列出路 print (data - data.mean())/data.std() #零-均值規范化 print data/10**np.ceil(np.log10(data.abs().max())) #小數定標規范化

    連續屬性離散化

    等寬法(至于相同寬度)、等頻法(將相同數量的記錄放進每個區間)、基于聚類分析的方法(K-means)

    import pandas as pdfrom sklearn.cluster import KMeans #引入KMeansimport matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標簽plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號datafile = '../data/discretization_data.xls' #參數初始化data = pd.read_excel(datafile) #讀取數據data = data[u'肝氣郁結證型系數'].copy()k = 4 #分為4類d1 = pd.cut(data, k, labels = range(k)) #等寬離散化,各個類比依次命名為0,1,2,3#等頻率離散化w = [1.0*i/k for i in range(k+1)] #為describe確定分位數0%,25%,50%,75%,100% 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))kmodel = KMeans(n_clusters = k, n_jobs = 1) #建立模型,n_jobs是并行數,一般等于CPU數較好kmodel.fit(data.reshape((len(data), 1))) #訓練模型c = pd.DataFrame(kmodel.cluster_centers_).sort(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): #自定義作圖函數來顯示聚類結果 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 pltcluster_plot(d1, k).show()cluster_plot(d2, k).show()cluster_plot(d3, k).show()

    屬性構造:比如利用供入電量和供出電量計算線損率。

    #-*- coding: utf-8 -*- #線損率屬性構造 import pandas as pd#參數初始化 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) #保存結果

    小波變換

    用于非平穩信號的時頻分析。基于小波變換的主要方法有:多尺度空間能量分布特征提取、多尺度空間的模極大值特征提取、小波包變換的特征提取、適應性小波神經網絡的特征提取。
    小波基函數:Harry小波基,db系列小波基,均值為0。積分為0.
    小波變換:a是伸縮因子,b是平移因子,對小波基函數進行伸縮和平移變換

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

    在約束條件下有逆變換:

    python中scipy本身提供了信號處理函數,更好的信號處理庫是PyWavelets(pywt)。

    #小波特征變換提取代碼 import pywt #導入PyWavelets from scipy.io import loadmat #mat是MATLAB專用格式,需要用loadmat讀取它#參數初始化 inputfile= '../data/leleccum.mat' #提取自Matlab的信號文件mat = loadmat(inputfile) signal = mat['leleccum'][0]coeffs = pywt.wavedec(signal, 'bior3.7', level = 5) #返回結果為level+1個數字,第一個數組為逼近系數數組,后面的依次是細節系數數組

    數據規約

    屬性規約:合并屬性,逐步向前選擇,逐步向后刪除,決策樹歸納,主成分分析。
    主成分分析步驟:

  • 設原始變量X_1,X_2,..., X_p的n次觀測數據矩陣為:
  • 將數據矩陣按列進行中心標準化
  • 求相關系數矩陣R,$$R=(r_{ij})_{p\times p}$$
  • 其中,

  • 求R的特征方程

    的特征根

  • 確定主成分個數m:alpha根據實際問題確定,一般取0.8
  • 計算m個相應的單位特征向量:
  • 計算主成分:
  • import pandas as pdfrom sklearn.decomposition import PCA#參數初始化inputfile = '../data/principal_component.xls'outputfile = '../tmp/dimention_reducted.xls' #降維后的數據data = pd.read_excel(inputfile, header = None) #讀入數據pca = PCA()pca.fit(data)print pca.components_ #返回模型的各個特征向量print pca.explained_variance_ratio_ #返回各個成分各自的方差百分比#由上面可以看出前4個已經占了97%pca = PCA(3)pca.fit(data)low_d = pca.transform(data) #降低唯獨pd.DataFrame(low_d).toexcel(outputfile) #保存結果pca.inverse_transform(low_d) #

    數值規約:通過選擇替代的、較小的數據來減少數據量。

    Python主要數據預處理函數

    函數名函數功能
    interpolate一維、高維數據插值
    unique去除數據終端額重復數據
    isnull判斷是否空值
    notnull判斷是否非空值
    PCA主成分分析
    random生成隨機矩陣

    f = scipy.interpolate.lagrange(x,y) #一維數據的拉格朗日插值 f(2) #計算插值結果 ################################################################### D = pd.Series([1,2,1,3,5]) D.unique() np.uinque(D) #這時候D可以是list,array,Series ################################################################### D.isnull() #D是series對象,返回布爾Series,D[D.isnull()]找到空值 ################################################################### np.random.randn(k,m,n) #標準正態分布

    五、挖掘建模

    分類與預測

    常用算法:回歸分析、決策樹、人工神經網絡、貝葉斯網絡、支持向量機。
    Logistic回歸
    Logistic函數:

    回歸模型:

    #-*- coding: utf-8 -*-#邏輯回歸 自動建模import pandas as pdfrom sklearn.linear_model import LogisticRegression as LRfrom sklearn.linear_model import RandomizedLogisticRegression as RLR #參數初始化filename = '../data/bankloan.xls'data = pd.read_excel(filename)x = data.iloc[:,:8].as_matrix()##變成矩陣y = data.iloc[:,8].as_matrix()rlr = RLR() #建立隨機邏輯回歸模型,篩選變量rlr.fit(x, y) #訓練模型rlr.get_support() #獲取特征篩選結果,也可以通過.scores_方法獲取各個特征的分數print(u'通過隨機邏輯回歸模型篩選特征結束')#join() 表示連接,使用逗號,括號內必須是一個對象。如果有多個就編程元組,或是列表。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提供了REF包可以用于特征消除。還提供了REFCV,可以通過交叉驗證來對特征進行排序。
    決策樹
    ID3、C4.5、CART算法
    ID3:在決策樹的各級節點上都用信息增益作為判斷標準進行屬性的選擇,使得在每個節點上都能獲得最大的類別分類增益,使分類后的額數據集的熵最小,這樣使得樹的平均深度最小,從而有效地提高了分類效率。
    步驟:

  • 對當前樣本集合,計算所有屬性的信息增益
  • 選擇信息增益最大的屬性作為測試屬性,把測試屬性取值相同的樣本劃為同一個子樣本集
  • 若子樣本集的類別只有單個,則分支為葉節點;否則對子樣本集循環調用本算法
  • #-*- coding: utf-8 -*-#使用ID3決策樹算法預測銷量高低import pandas as pdfrom sklearn.tree import export_graphvizfrom sklearn.externals.six import StringIOfrom sklearn.tree import DecisionTreeClassifier as DTC#參數初始化inputfile = '../data/sales_data.xls'data = pd.read_excel(inputfile, index_col = u'序號') #導入數據#數據是類別標簽,要將它轉換為數據#用1來表示“好”、“是”、“高”這三個屬性,用-1來表示“壞”、“否”、“低”data[data == u'好'] = 1data[data == u'是'] = 1data[data == u'高'] = 1data[data != 1] = -1x = data.iloc[:,:3].as_matrix().astype(int)y = data.iloc[:,3].as_matrix().astype(int)dtc = DTC(criterion='entropy') #建立決策樹模型,基于信息熵dtc.fit(x, y) #訓練模型#導入相關函數,可視化決策樹。#導出的結果是一個dot文件,需要安裝Graphviz才能將它轉換為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) #文本打開指定中文字體#edge [fontname = "SimHei"];/*添加,指定中文為黑體*/#node [fontname = "SimHei"];/*添加,指定中文為黑體*/#安裝Graphviz#在命令行中編譯

    人工神經網絡

    #-*- coding: utf-8 -*-#使用神經網絡算法預測銷量高低import pandas as pd#參數初始化inputfile = '../data/sales_data.xls'data = pd.read_excel(inputfile, index_col = u'序號') #導入數據#數據是類別標簽,要將它轉換為數據#用1來表示“好”、“是”、“高”這三個屬性,用0來表示“壞”、“否”、“低”data[data == u'好'] = 1data[data == u'是'] = 1data[data == u'高'] = 1data[data != 1] = 0x = data.iloc[:,:3].as_matrix().astype(int)y = data.iloc[:,3].as_matrix().astype(int)from keras.models import Sequentialfrom keras.layers.core import Dense, Activationmodel = Sequential() #建立模型model.add(Dense(3, 10))model.add(Activation('relu')) #用relu函數作為激活函數,能夠大幅提供準確度model.add(Dense(10, 1))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, nb_epoch = 1000, batch_size = 10) #訓練模型,學習一千次yp = model.predict_classes(x).reshape(len(y)) #分類預測from cm_plot import * #導入自行編寫的混淆矩陣可視化函數cm_plot(y,yp).show() #

    算法評價:相對誤差、均方誤差、識別準確度、識別精確率、ROC曲線

    聚類分析

    K-Means算法

    #-*- coding: utf-8 -*-#使用K-Means算法聚類消費行為特征數據import pandas as pdfrom sklearn.cluster import KMeansimport matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標簽plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號#參數初始化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() #數據標準化model = KMeans(n_clusters = k, n_jobs = 1, max_iter = iteration) #分為k類,并發數4model.fit(data_zs) #開始聚類#簡單打印結果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 pltpic_output = '../tmp/pd_' #概率密度圖文件名前綴for i in range(k):density_plot(data[r[u'聚類類別']==i]).savefig(u'%s%s.png' %(pic_output, i))

    聚類算法評價:purity評價法、RI評價法、F值評價法

    對象名函數功能
    KMeansK均值聚類
    AffinityPropagation吸引力傳播聚類
    SpectralClustering譜聚類,由于KMeans
    AgglomerativeClustering層次聚類
    DBSCAN具有噪聲的基于密度的聚類算法
    MeanShift均值漂移聚類算法
    BIRCH層次聚類算法,可以處理大規模數據

    先用對應的函數建立模型,然后使用fit方法訓練模型,之后用label_方法給出樣本數據的標簽,或者用predict方法預測新的輸入的標簽。

    TENSE:提供一種有效地數據降維的方式,在2維或者3維戰士聚類結果。

    #-*- coding: utf-8 -*-#接k_means.pyfrom sklearn.manifold import TSNEimport matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標簽plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號tsne = TSNE()tsne.fit_transform(data_zs) #進行數據降維tsne = pd.DataFrame(tsne.embedding_, index = data_zs.index) #轉換數據格式#不同類別用不同顏色和樣式繪圖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()

    關聯分析

    常用算法:Apriori、FP-Tree、Eclt算法、灰色關聯法

    Ariori算法

    支持度:?

    ,A、B同時發生的概率

    置信度:

    A發生B發生的概率
    同時滿足最小支持度和最小置信度稱滿足強規則
    算法步驟:

  • 掃描事物集,得到沒個候選項的支持度
  • 比較候選支持度與最小支持度,得到1項頻繁集L_1
  • 由L_1產生候選項集C_2,并計算支持度
  • 比較候選支持度和最小支持度,得到2項頻繁集L_2
  • 類推,直至不能產生新的候選項集
  • #-*- coding: utf-8 -*-from __future__ import print_functionimport pandas as pd#自定義連接函數,用于實現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#尋找關聯規則的函數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 = 0while len(column) > 1:k = k+1print(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]).Tsupport_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.0result[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#######################################################33#-*- coding: utf-8 -*-#使用Apriori算法挖掘菜品訂單關聯規則from __future__ import print_functionimport pandas as pdfrom apriori import * #導入自行編寫的apriori函數inputfile = '../data/menu_orders.xls'outputfile = '../tmp/apriori_rules.xls' #結果文件data = pd.read_excel(inputfile, header = None)print(u'\n轉換原始數據至0-1矩陣...')ct = lambda x : pd.Series(1, index = x[pd.notnull(x)]) #1表示逐行轉換。轉換0-1矩陣的過渡函數b = map(ct, data.as_matrix()) #用map方式執行,b是listdata = pd.DataFrame(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) #保存結果

    時序模式

    非平穩時間序列分析:許多非平穩序列差分后會顯示出平穩序列的性質,這時稱之為差分平穩序列,可以先做差分然后用ARMA模型進行擬合。這種方法稱之為ARIMA模型。

    #-*- coding: utf-8 -*-#arima時序模型import pandas as pdimport matplotlib.pyplot as pltfrom statsmodels.graphics.tsaplots import plot_acffrom statsmodels.tsa.stattools import adfuller as ADFfrom statsmodels.graphics.tsaplots import plot_pacffrom statsmodels.stats.diagnostic import acorr_ljungboxfrom statsmodels.tsa.arima_model import ARIMAplt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標簽plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號#參數初始化discfile = '../data/arima_data.xls'forecastnum = 5#讀取數據,指定日期列為指標,Pandas自動將“日期”列識別為Datetime格式data = pd.read_excel(discfile, index_col = u'日期')#時序圖data.plot()plt.show()plt.title('Time Series')#自相關圖plot_acf(data).show()#平穩性檢測print(u'原始序列的ADF檢驗結果為:', ADF(data[u'銷量']))#返回值依次為adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore#差分后的結果D_data = data.diff().dropna()D_data.columns = [u'銷量差分']D_data.plot() #時序圖plt.show()plot_acf(D_data).show() #自相關圖plot_pacf(D_data).show() #偏自相關圖print(u'差分序列的ADF檢驗結果為:', ADF(D_data[u'銷量差分'])) #平穩性檢測#白噪聲檢驗print(u'差分序列的白噪聲檢驗結果為:', acorr_ljungbox(D_data, lags=1)) #返回統計量和p值data[u'銷量'] = data[u'銷量'].astype(float)#定階pmax = int(len(D_data)/10) #一般階數不超過length/10qmax = int(len(D_data)/10) #一般階數不超過length/10bic_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)) model = ARIMA(data, (p,1,q)).fit() #建立ARIMA(0, 1, 1)模型model.summary2() #給出一份模型報告model.forecast(5) #作為期5天的預測,返回預測結果、標準誤差、置信區間。

    函數名函數功能
    acf計算自相關系數
    plot_acf畫自相關系數圖
    pacf計算偏相關系數
    plot_pacf畫圖
    adfuller單位根檢驗
    diff差分運算
    ARIMA創建模型
    summary給出ARIMA模型的報告
    aic/bic/hqic計算ARIMA模型的指標
    forecast預測
    acorr_ljungboxLjung-Box檢驗,是否白噪聲

    autocorr = acf(data, unbiased = False, nlags = 40, qstat = False, fft = False, alpha = False)# data 為觀測值序列(時間序列),可以是DataFrame或者Seriesh = adfuller(Series, maxlag = None, Regression = 'c', autolog = 'AIC', store = False, regresults =False)D.diff() #D為Pandas的DataFrame或Seriesarima = ARIMA(data, (p, 1, q)).fit() #data為輸入的時間序列,p,q為對應的階amima.summary() #返回一份格式化的模型報告arima.bica,b,c = arima.forecast(num) #num為要預測的天數,a為返回的預測值,b為預測誤差,c為置信區間

    離群點檢測

    方法:基于統計、基于鄰近度、基于密度、基于聚類。
    基于統計:一元正態分布若數據點在3倍標準差之外。
    混合模型的離群點檢測:數據的統計分布未知或者沒有訓練數據可用,很難建立模型。
    基于原型的聚類:聚類所有的對象,然后評估對象屬于簇的程度。如果刪除一個對象導師制該目標顯著改進,則可將該對象視為離群點。離群點可能形成小簇從而逃避檢測。

    #-*- coding: utf-8 -*-#使用K-Means算法聚類消費行為特征數據import numpy as npimport pandas as pdfrom sklearn.cluster import KMeansimport matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標簽plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號#參數初始化inputfile = '../data/consumption_data.xls' #ID 和三個屬性k = 3 #聚類的類別threshold = 2 #離散點閾值iteration = 500 #聚類最大循環次數data = pd.read_excel(inputfile, index_col = 'Id') #讀取數據data_zs = 1.0*(data - data.mean())/data.std() #數據標準化model = KMeans(n_clusters = k, n_jobs = 1, max_iter = iteration) #分為k類,并發數4model.fit(data_zs) #開始聚類#標準化數據及其類別r = pd.concat([data_zs, pd.Series(model.labels_, index = data.index)], axis = 1) #每個樣本對應的類別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) #求出絕對距離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()

    電力竊漏電用戶自動識別

    數據分析:

  • 分布分析:用戶類別竊漏電情況分布發現,非居民類不存在漏電情況。故可清理
  • 周期性分析:找到一個正常的用戶和漏電用戶,分別觀察規律。發現正常用戶有明顯的周期性。
  • 數據預處理

  • 數據清洗:過濾掉非居民類的數據和節假日數據。
  • 缺失值處理:拉格朗日插補法進行插補
  • 數據變換:用電趨勢指標、5天平均線損率、告警指標計數
  • 模型構建

  • 用LM神經網絡和CART決策樹模型建模
  • ROC曲線比較性能
  • 航空公司客戶價值分析

    數據分析:缺失值分析和異常值分析,異常值看最大和最小值

    數據預處理:

  • 數據清洗,丟棄缺失值、票價為0折扣率不為0的數據
  • 屬性規約,刪除不相關或者弱相關屬性
  • 數據變換:計算指標,并對數據進行標準化處理
  • 模型構建

  • K-Means算法對客戶數據進行分群,分為5類。
  • 結合圖表對結果進行分析
  • 中醫證型關聯規則挖掘

    數據預處理

  • 數據清洗:刪除整理無效問卷
  • 屬性規約:將冗余屬性和無關屬性刪除
  • 數據變換:構造屬性,并將屬性離散化
  • 模型構建

    采用Apriori關聯規則算法對模型的樣本數據進行分析,以模型參數設置的最小支持度和最小置信度作為條件,輸出關聯規則結果。

    基于水色圖像的水質評價

    數據預處理

  • 圖像切割:提取水樣圖像中間部分具有代表意義的圖像
  • 特征提取:顏色的一階、二階、三階矩
  • 模型構建

    為提高區分度,將所有特征乘以常數k。然后建立支持向量機模型。

    水質評價

    對新增的水質圖像作評價。

    家用電器用戶行為分析與事件識別

    數據預處理

  • 數據規約:去除無用的屬性和狀態
  • 數據變換:確定用水事件的閾值
  • 數據清洗
  • 模型構建:訓練神經網絡

    模型檢驗:使用測試數據

    應用系統負載分析與磁盤容量預測

    數據分析:通過時序圖觀察數據的平穩性和周期性

    數據預處理

  • 數據清洗:刪除重復值
  • 屬性構造:合并屬性
  • 模型構建

  • 檢驗平穩性,單位根檢驗
  • 白噪聲檢驗
  • 模型識別:采用極大似然比方法進行模型的參數估計,采用BIC信息準則對模型進行定階。ARIMA(0,1,1)
  • 模型檢驗:檢驗模型殘差序列是否為白噪聲如果不是,說明還有未提取的有用信息,需要修改模型。
  • 模型評價:計算平均絕對誤差,均方根誤差

    電子商務網站用戶行為分析及服務推薦

    數據抽取:建立數據庫--導入數據--搭建Python數據庫操作環境

    數據分析

  • 網頁類型分析
  • 點擊次數分析
  • 網頁排名
  • 數據預處理

  • 數據清洗:刪除數據(中間頁面網址、發布成功網址、登錄助手頁面)
  • 數據變化:識別翻頁網址并去重,錯誤分類網址手動分類,并進一步分類
  • 屬性規約:只選擇用戶和用戶選擇的網頁數據
  • 模型構建

    基于物品的協同濾波算法:計算物品之間的相似度,建立相似度矩陣;根據物品的相似度和用戶的歷史行為給用戶生成推薦列表。

    相似度計算方法:夾角余弦、Jaccard系數、相關系數

    財政收入影響因素分析及預測模型

    數據分析

  • 描述性統計分析
  • 相關分析
  • 模型構建

    對于財政收入、增值稅、營業稅、企業所得稅、政府性基金、個人所得稅

  • Adaptive-Lasso變量選擇模型:去除無關變量
  • 分別建立灰色預測模型與神經網絡模型
  • 基于基站定位數據的商圈分析

    數據預處理

  • 屬性規約:刪除冗余屬性,合并時間屬性
  • 數據變換:計算工作日人均停留時間、凌晨、周末、日均等指標,并標準化。
  • 模型構建

  • 構建商圈聚類模型:采用層次聚類算法
  • 模型分析:對聚類結果進行特征觀察
  • 電商產品評論數據情感分析

    文本采集:八爪魚采集器(爬蟲工具)

    文本預處理:

  • 文本去重:自動評價、完全重復評價、復制的評論
  • 機械壓縮去詞:
  • 刪除短句
  • 文本評論分詞:采用Python中文分詞包“Jieba”分詞,精度達97%以上。

    模型構建

  • 情感傾向性模型:生成詞向量;評論集子集的人工標注與映射;訓練棧式自編碼網絡
  • 基于語義網絡的評論分析
  • 基于LDA模型的主題分析
  • 總結

    以上是生活随笔為你收集整理的Python数据分析与挖掘实战总结的全部內容,希望文章能夠幫你解決所遇到的問題。

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