Data Mining inhtml
Python: A Guidepython
轉載原文:https://www.springboard.com/blog/data-mining-python-tutorial/(全英)git
譯文:github
一、數據挖掘和算法web
數據挖掘是從大型數據庫的分析中發現預測信息的過程。對於數據科學家來講,數據挖掘多是一項模糊而艱鉅的任務 - 它須要多種技能和許多數據挖掘技術知識來獲取原始數據併成功獲取數據。您須要瞭解統計學的基礎,以及能夠幫助您大規模進行數據挖掘的不一樣編程語言。 算法
本指南將提供一個示例填充的使用Python的數據挖掘簡介,Python是最普遍使用的數據挖掘工具之一 - 從清理和數據組織到應用機器學習算法。首先,讓咱們更好地理解數據挖掘及其完成方式。spring
1.一、數據挖掘定義 數據庫
數據挖掘的指望結果是從給定數據集建立模型,該模型能夠將其洞察力推廣到相似數據集。從銀行和信貸機構的自動欺詐檢測中能夠看到成功的數據挖掘應用程序的真實示例。編程
若是您的銀行檢測到您的賬戶存在任何可疑活動,您的銀行可能會制定一項提醒您的政策 - 例如在您註冊的住因此外的州內重複提取ATM或大量購物。這與數據挖掘有何關係?數據科學家經過應用算法來建立該系統,經過將交易與欺詐性和非欺詐性收費的歷史模式進行比較,對交易是否具備欺詐性進行分類和預測。該模型「知道」若是你住在加利福尼亞州聖地亞哥,那麼向俄羅斯人口稀少的省份收取的數千美圓購買的可能性很大。api
這只是數據挖掘的衆多強大應用之一。數據挖掘的其餘應用包括基因組測序,社交網絡分析或犯罪成像 - 但最多見的用例是分析消費者生命週期的各個方面。公司使用數據挖掘來發現消費者的偏好,根據他們的購買活動對不一樣的消費者進行分類,並肯定對付高薪客戶的要求 - 這些信息能夠對改善收入流和下降成本產生深遠影響。
若是您正在努力得到良好的數據集以開始分析,咱們爲您的第一個數據科學項目編譯了19個免費數據集。
什麼是數據挖掘技術?
有多種方法能夠從數據集構建預測模型,數據科學家應該瞭解這些技術背後的概念,以及如何使用代碼生成相似的模型和可視化。這些技術包括:
迴歸 - 經過優化偏差減小來估計變量之間的關係。
具備擬合線性迴歸模型的散點圖的示例
分類 - 識別對象所屬的類別。一個例子是將電子郵件分類爲垃圾郵件或合法郵件,或者查看某人的信用評分並批准或拒絕貸款請求。
聚類分析 - 根據數據的已知特徵查找數據對象的天然分組。在營銷中能夠看到一個例子,其中分析能夠揭示具備獨特行爲的客戶分組 - 這能夠應用於業務戰略決策中。
散點圖的示例,其中數據按羣集分段和着色
關聯和相關分析 - 尋找不明顯的變量之間是否存在惟一關係。一個例子就是着名的啤酒和尿布案例:在本週末購買紙尿褲的男性更有可能購買啤酒,所以商店將它們放在一塊兒以增長銷量。
異常值分析 - 檢查異常值以檢查所述異常值的潛在緣由和緣由。其中一個例子是在欺詐檢測中使用離羣值分析,並試圖肯定規範以外的行爲模式是不是欺詐。
業務數據挖掘一般使用事務和實時數據庫執行,該數據庫容許輕鬆使用數據挖掘工具進行分析。其中一個例子是在線分析處理服務器或OLAP,它容許用戶在數據服務器內進行多維分析。OLAP容許企業查詢和分析數據,而無需下載靜態數據文件,這在數據庫平常增加的狀況下頗有用。可是,對於那些但願學習數據挖掘和本身練習的人來講,iPython筆記本 很是適合處理大多數數據挖掘任務。
讓咱們來看看如何使用Python來使用上述兩種數據挖掘算法執行數據挖掘:迴歸和 聚類。
二、在Python中建立迴歸模型
咱們想解決的問題是什麼?
咱們想要創建變量之間線性關係的估計,打印相關係數,並繪製最佳擬合線。對於這個分析,我將使用來自Kaggle的King's County數據集中的House Sales的數據。若是您對Kaggle不熟悉,那麼它是查找適合數據科學實踐的數據集的絕佳資源。King's County的數據包含有關房價和房屋特徵的信息 - 讓咱們看看咱們是否能夠估算房價與房屋面積之間的關係。
第一步:爲工做提供合適的數據挖掘工具 - 安裝Jupyter,熟悉一些模塊。
首先,若是您想要跟隨,請在桌面上安裝Jupyter。它是一個免費的平臺,爲iPython筆記本(.ipynb文件)提供了一個很是直觀的處理器。請按照如下說明進行安裝。我在這裏所作的一切都將在Jupyter的「Python [Root]」文件中完成。
咱們將使用Python 的Pandas mo dule來清理和重構咱們的數據。Pandas是一個開源模塊,用於處理數據結構和分析,這對於使用Python的數據科學家來講無處不在。它容許數據科學家以任何格式上傳數據,並提供一個簡單的平臺來組織,排序和操做該數據。若是這是您第一次使用Pandas,請查看有關基本功能的精彩教程!
在[1]中:
導入 pandas as pd
In [1]:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats
import seaborn as sns
from matplotlib import rcParams
%matplotlib inline
%pylab inline
從numpy和matplotlib填充交互式命名空間
在上面的代碼中,我導入了一些模塊,這裏是他們所作的細分:
Numpy - 科學計算的必要包。它包含一個很是通用的結構,用於處理數組,這是scikit-learn用於輸入數據的主要數據格式。
Matplotlib - Python中數據可視化的基礎包。該模塊容許建立從簡單的散點圖到三維等高線圖的全部內容。請注意,從matplotlib咱們安裝pyplot,這是模塊層次結構中最高級的狀態機環境(若是這對你沒有任何意義,請不要擔憂它,只需確保將它導入到你的筆記本中)。使用'%matplotlib inline'對於確保全部圖表都顯示在筆記本中相當重要。
Scipy - python中統計工具的集合。Stats是導入迴歸分析函數的scipy模塊。
讓咱們分解如何應用數據挖掘來逐步解決迴歸問題!在現實生活中,您極可能不會當即準備好應用機器學習技術的數據集,所以您須要首先清理和組織數據。
In [2]:
df = pd.read_csv('/Users/michaelrundell/Desktop/kc_house_data.csv')
df.head()
OUT [2]:
使用pandas(pd.read_csv)從Kaggle讀取csv文件。
In [3]:
df.isnull().any()
Out[3]:
id False
date False
price False
bedrooms False
bathrooms False
sqft_living False
sqft_lot False
...
dtype: bool
Checking to see if any of our data has null values. If there were any, we’d drop or filter the null values out.
In [4]:
df.dtypes
Out[4]:
id int64
date object
price float64
bedrooms int64
bathrooms float64
sqft_living int64
sqft_lot int64
...
dtype: object
檢查每一個變量的數據類型。咱們想要了解數據是不是數字(int64,float64)或不是(對象)。
我使用Pandas從csv文件導入了數據框,我作的第一件事是確保它正確讀取。我還使用了「isnull()」函數來確保個人數據都不能用於迴歸。在現實生活中,單個列可能具備整數,字符串或NaN形式的數據,全部這些都在一個地方 - 這意味着您須要檢查以確保類型匹配而且適合迴歸。這個數據集剛好已經很是嚴格地準備好了,你不會常常在本身的數據庫中看到這些數據集。
下一篇:簡單的探索性分析和迴歸結果。
讓咱們在進一步瞭解以前瞭解數據,重要的是要查看數據的形狀 - 並仔細檢查數據是否合理。損壞的數據並不罕見,所以最好始終運行兩項檢查:首先,使用df.describe()查看分析中的全部變量。其次,使用plt.pyplot.hist()繪製分析所針對的變量的直方圖。
In [5]:
df.describe()
out[5]:
價錢 |
臥室 |
浴室 |
sqft_living |
|
計數 |
21613 |
21613 |
21613 |
21613 |
意思 |
540088.10 |
3.37 |
2.11 |
2079.90 |
STD |
367127.20 |
0.93 |
0.77 |
918.44 |
分 |
75000.00 |
0.00 |
0.00 |
290.00 |
25% |
321950.00 |
3.00 |
1.75 |
1427.00 |
50% |
450000.00 |
3.00 |
2.25 |
1910.00 |
75% |
645000.00 |
4.00 |
2.50 |
2550.00 |
最大 |
7700000.00 |
33.00 |
8.00 |
13540.00 |
快速消息:咱們正在處理包含21,613個觀測資料的數據集,平均價格約爲$ 540k,中位數價格約爲$ 450k,並且平均房屋面積爲2080 ft 2
In [19]:
fig = plt.figure(figsize=(12, 6))
sqft = fig.add_subplot(121)
cost = fig.add_subplot(122)
sqft.hist(df.sqft_living, bins=80)
sqft.set_xlabel('Ft^2')
sqft.set_title("Histogram of House Square Footage")
cost.hist(df.price, bins=80)
cost.set_xlabel('Price ($)')
cost.set_title("Histogram of Housing Prices")
plt.show()
使用matplotlib(plt),咱們打印了兩個直方圖,以觀察房價和平方英尺的分佈狀況。咱們發現兩個變量的分佈都是右傾的。
如今咱們已經很好地瞭解了咱們的數據集,而且知道了咱們試圖測量的變量的分佈,讓咱們作一些迴歸分析。首先,咱們導入statsmodels以得到最小二乘迴歸估計函數。在「普通最小二乘法」模塊會作大量的工做,當涉及到搗弄數字在Python中迴歸。
In [15]:
import statsmodels.api as sm
from statsmodels.formula.api import ols
當您使用只有兩個變量的OLS編碼生成線性迴歸摘要時,這將是您使用的公式:
Reg = ols('因變量〜自變量,數據幀).fit()
打印(Reg.summary())
當咱們查看King's縣的房屋價格和房屋面積時,咱們打印出如下摘要報告:
In [16]:
m = ols('price ~ sqft_living',df).fit()
print (m.summary())
警告:
[1]標準錯誤假設正確指定了錯誤的協方差矩陣。
[2]條件數很大,5.63e + 03。這可能代表存在
強多重共線性或其餘數值問題。
簡單線性迴歸模型摘要輸出的示例。
當您打印OLS迴歸的摘要時,能夠輕鬆找到全部相關信息,包括R平方,t統計量,標準偏差和相關係數。從產量來看,很明顯平方英尺和房價之間存在極其顯着的關係,由於存在極高的t值144.920,而且 P> | t | 0% - 這實際上意味着這種關係因爲統計變異或機會而幾乎爲零。
這種關係也有一個不錯的規模 - 每增長100平方英尺的房子,咱們能夠預測房子平均價格會高出28,000美圓。能夠很容易地調整此公式以包含多個自變量,只需遵循如下公式:
Reg = ols(‘Dependent variable ~ivar1 + ivar2 + ivar3… + ivarN, dataframe).fit()
print(Reg.summary())
In [26]:
m = ols('price ~ sqft_living + bedrooms + grade + condition',df).fit()
print (m.summary())
警告:
[1]標準錯誤假設正確指定了錯誤的協方差矩陣。
[2]條件數很大,2.5e + 04。這可能代表存在
強多重共線性或其餘數值問題。
多元線性迴歸的一個例子。
在咱們上面的多元迴歸輸出中,咱們瞭解到經過使用額外的自變量,例如臥室的數量,咱們能夠提供更好地擬合數據的模型,由於此迴歸的R平方已增長到0.555。這意味着咱們可以經過添加更多的自變量來解釋模型中49.3%的變異到55.5%。
可視化迴歸結果:
使用迴歸彙總輸出對於檢查迴歸模型的準確性以及用於估計和預測的數據很是重要 - 可是可視化迴歸是以更易消化的格式傳達迴歸結果的重要步驟。
本節將徹底依賴於Seaborn(sns),它具備很是簡單和直觀的功能,可使用散點圖繪製迴歸線。我選擇爲平方英尺和價格建立一個聯合圖,顯示迴歸線以及每一個變量的分佈圖。
In [24]:
sns.jointplot(x="sqft_living", y="price", data=df, kind = 'reg',fit_reg= True, size = 7)
plt.show()
/Users/michaelrundell/anaconda/lib/python3.5/site-packages/statsmodels/nonparametric/kdetools.py:20:VisibleDeprecationWarning:使用非整數而不是整數將致使未來出錯
y = X [:m / 2 + 1] + np.r_ [0,X [m / 2 + 1:],0] * 1j
這包含了個人迴歸示例,可是在python中還有許多其餘方法能夠執行迴歸分析,尤爲是在使用某些技術時。有關回歸模型的更多信息,請參閱如下資源。接下來咱們將介紹集羣分析。
使用Seaborn可視化線性關係 - 本文檔提供了具體示例,說明如何修改迴歸圖,並顯示您可能不知道如何自行編碼的新功能。它還教你如何適應不一樣類型的模型,如二次或邏輯模型。
Python中的統計信息 - 本教程介紹了在python中執行迴歸的不一樣技術,還將教您如何進行假設測試和交互測試。
若是您想了解更多可幫助您可視化結果的數據挖掘軟件,您應該查看 咱們編譯的這31個免費數據可視化工具。
三、在Python中建立聚類模型
咱們但願爲一組數據對象建立天然分組,這些數據對象可能未在數據自己中明確說明。咱們的分析將使用黃石公園着名間歇泉Old Faithful噴發的數據。Barney Govan 從這個Github存儲庫中找到了這些數據。它只包含兩個屬性,即噴發(分鐘)和噴發長度(分鐘)之間的等待時間。只有兩個屬性能夠很容易地建立一個簡單的k-means集羣模型。
什麼是k-means集羣模型?
K-Means Cluster模型如下列方式工做 - 全部這些博客都歸功於此:
(1)、從一組隨機選擇的k個質心(k個簇的假定中心)開始
(2)、根據最接近的質心肯定哪一個觀測點在哪一個羣集中(使用平方歐幾里德距離:Σpj= 1(xij-xi'j)2其中p是維數。
(3)、經過最小化與羣集中每一個觀察的平方歐幾里德距離來從新計算每一個羣集的質心
(4)、重複2.和3.直到簇的成員(以及所以質心的位置)再也不改變。
(5)、若是這仍然使人困惑,請查看Jigsaw Academy的這段有用的視頻。如今,讓咱們繼續將此技術應用於咱們的Old Faithful數據集。
第一步:探索性數據分析
您須要安裝一些模塊,包括一個名爲Sci-kit Learn的新模塊- 用於Python中機器學習和數據挖掘的工具集(閱讀咱們使用Sci-kit進行神經網絡模型的教程)。Cluster是sci-kit模塊,它使用聚類算法導入函數,所以從sci-kit導入它。
首先,讓咱們將全部必要的模塊導入咱們的iPython Notebook並進行一些探索性數據分析。
In [18]:
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import sklearn
from sklearn import cluster
%matplotlib inline
faithful = pd.read_csv('/Users/michaelrundell/Desktop/faithful.csv')
faithful.head()
out[18]:
爆發 |
等候 |
|
0 |
3.600 |
79 |
1 |
1.800 |
54 |
2 |
3.333 |
74 |
3 |
2.283 |
62 |
4 |
4.533 |
85 |
閱讀舊的忠實csv並導入全部必要的值
我所作的就是從本地目錄中讀取csv,這剛好是我計算機的桌面,並顯示了數據的前5個條目。幸運的是,我知道這個數據集沒有缺乏或NaN值的列,所以咱們能夠跳過此示例中的數據清理部分。咱們來看一下數據的基本散點圖。
In [19]:
faithful.columns = ['eruptions', 'waiting']
plt.scatter(faithful.eruptions, faithful.waiting)
plt.title('Old Faithful Data Scatterplot')
plt.xlabel('Length of eruption (minutes)')
plt.ylabel('Time between eruptions (minutes)')
Out[19]:
<matplotlib.text.Text at 0x12a29bba8>
重命名列並使用matplotlib建立一個簡單的散點圖
關於個人過程的一些快速說明:我從新命名了列 - 它們與肉眼看起來沒什麼不一樣,可是「等待」列在單詞以前有一個額外的空間,而且爲了防止與進一步分析混淆我更改了它確保我不會忘記或在路上犯任何錯誤。
第二步:構建集羣模型
咱們看到的是散點圖,其中有兩個很容易明顯的聚類,但數據集並未將任何觀察標記爲屬於任何一個組。接下來的幾個步驟將涵蓋視覺上區分兩組的過程。在下面的代碼中,我創建了一些重要的變量並改變了數據的格式。
In [20]:
faith = np.array(faithful)
k = 2
kmeans = cluster.KMeans(n_clusters=k)
kmeans.fit(faith)
labels = kmeans.labels_
centroids = kmeans.cluster_centers_
格式化和功能建立:
一、我將忠實的數據幀讀做一個numpy數組,以便sci-kit可以讀取數據。
二、選擇K = 2做爲簇的數量,由於咱們正在嘗試建立2個明確的分組。
三、'kmeans'變量由sci-kit中的集羣模塊調用的輸出定義。咱們採用了K個簇,並將數據擬合到數組'faith'中。
如今咱們已經設置了用於建立集羣模型的變量,讓咱們建立一個可視化。下面的代碼將繪製按簇顏色的散點圖,並給出最終的質心位置。具體的代碼行的說明能夠在下面找到。
In [21]:
for i in range(k):
# select only data observations with cluster label == i
ds = faith[np.where(labels==i)]
# plot the data observations
plt.plot(ds[:,0],ds[:,1],'o', markersize=7)
# plot the centroids
lines = plt.plot(centroids[i,0],centroids[i,1],'kx')
# make the centroid x's bigger
plt.setp(lines,ms=15.0)
plt.setp(lines,mew=4.0)
plt.show()
建立羣集模型的可視化
快速細分上面的代碼:
一、將數據分組爲2組的全部工做都在上一段代碼中完成,咱們使用命令kmeans.fit(faith)。代碼的這一部分只是建立了顯示它的圖。
二、ds變量只是原始數據,但從新格式化爲包含基於組數的新顏色標籤 - k中的整數數。
三、plt.plot調用x數據,y數據,對象的形狀和圓的大小。
四、其他代碼顯示k-means聚類過程的最終質心,並控制質心標記的大小和厚度。
在這裏咱們擁有它 - 一個簡單的集羣模型。此代碼適用於包含不一樣數量的羣集,但對於此問題,僅包含2個羣集是有意義的。如今咱們已經將這些聚類看起來很好地定義了,咱們能夠從這兩個聚類中推斷出意義。他們表明什麼?綠色集羣:主要由火山爆發組成,火山爆發之間的短暫等待時間能夠定義爲「弱火或快速射擊」,而藍色火星羣能夠稱爲「火力爆發」。
值得注意的是:這種技術不適用於全部數據集 - 數據科學家David Robinson 在他的文章中完美地解釋了K-means聚類「不是免費的午飯」。若是您的數據具備不均勻的聚類機率,K-means的假設會失敗(它們在每一個簇中沒有大體相同的觀察量),或者具備非球形簇。若是您認爲您的羣集問題不適用於K-means羣集,請查看有關替代羣集建模技術的這些資源:
Sci-kit羣集模塊 - 此文檔有一個漂亮的圖像,能夠直觀地比較scikit-learn中的聚類算法,由於它們會查找不一樣的散點圖。若是您有一個相似於其中一個示例的散點圖,則使用此文檔能夠指向正確的算法。它還爲您提供了有關如何以數學方式評估聚類模型的一些看法。
聚類算法 - 這個來自斯坦福大學CS345課程的Powerpoint演示文稿,數據挖掘,能夠深刻了解不一樣的技術 - 它們如何工做,有效和無效等等。它是理解聚類在理論層面如何工做的一個很好的學習資源。
結論
數據挖掘包含許多預測建模技術,您可使用各類數據挖掘軟件。要學習使用Python來應用這些技術是很困難的 - 將練習和勤奮應用到您本身的數據集上是很困難的。在早期,您將遇到無數的錯誤,錯誤消息和包版廣告。 - 但在數據挖掘嘗試中保持持久和勤奮。我但願經過查看上面的集羣和線性迴歸模型的代碼和建立過程,您已經瞭解到數據挖掘是能夠實現的,而且可使用有效數量的代碼完成。