回覆列表
  • 1 # AI大時代

    探索性資料分析(EDA)是一種分析機器學習資料集以總結其主要特徵的方法。它用於理解資料,獲取有關它的一些上下文,理解變數和它們之間的關係,並制定在構建機器學習預測模型時可能有用的假設。

    所有資料分析必須以一些關鍵問題或目標為指導。在開始任何資料分析任務之前,您應該有一個明確的目標。當您的目標允許您瞭解您的資料和問題時,您將能夠從分析中獲得有意義的結果!

    在本教程中,我們將學習如何使用資料視覺化來執行EDA。具體來說,我們將重點介紹seaborn,這是一個構建在matplotlib之上的Python庫,支援NumPy和panda。

    seaborn使我們能夠製作出具有吸引力和資訊豐富的統計圖形。儘管matplotlib使得視覺化任何東西都成為可能,但是要使圖形具有視覺吸引力通常是困難和乏味的。seaborn通常用於使預設的matplotlib圖看起來更好,並引入了一些額外的圖型別。

    我們將介紹如何進行視覺分析:

    直方圖的數值變數,

    帶有計數圖的分類變數,

    數值變數與散點圖,joint plots和pair plots之間的關係

    數值和分類變數與盒須圖和複雜條件圖之間的關係

    透過有效地視覺化機器學習資料集的變數及其關係,資料分析師或資料科學家能夠快速瞭解​​趨勢,異常值和模式。然後,可以使用這種理解來決策並建立機器學習預測模型。

    資料準備

    資料準備是任何資料分析的第一步,以確保以可分析的形式清理和轉換資料。

    我們將在Ames Housing資料集上執行EDA(

    http://www.kankanyun.com/data/house.xls) 。這個資料集在那些開始學習資料科學和機器學習的人群中很受歡迎,因為它包含了愛荷華州艾姆斯出售的不同房屋幾乎所有特徵的資料。然後可以使用該資料來嘗試預測銷售價格。

    請先進行資料集清理然後進行分析。我們要做的就是過濾一些變數來簡化我們的任務。首先,讓我們將資料讀取為panda DataFrame:這個資料集在那些開始學習資料科學和機器學習的人群中很受歡迎,因為它包含了愛荷華州艾姆斯出售的不同房屋幾乎所有特徵的資料。然後可以使用該資料來嘗試預測銷售價格。

    此資料集已經過清理並可以進行分析。我們要做的就是過濾一些變數來簡化我們的任務。首先,讓我們將資料讀取為panda DataFrame:

    import pandas as pd

    import matplotlib as plt

    housing = pd.read_csv("house.csv")

    housing.info()

    此影象僅顯示資料集中前五列的資訊

    如果您在Jupyter notebook中執行此Python程式碼,則可以看到有1,460個觀察值和81列。每列代表DataFrame中的變數。我們可以從每列的資料型別中看到它是什麼型別的變數。

    我們將只處理其中的一些變數——讓我們將它們的名稱過濾並存儲在兩個名為numerical和categorical的列表中,然後重新定義我們的housing DataFrame,使其只包含這些變數:

    numerical = [

    "SalePrice", "LotArea", "OverallQual", "OverallCond", "1stFlrSF", "2ndFlrSF", "BedroomAbvGr"

    ]

    categorical = [

    "MSZoning", "LotShape", "Neighborhood", "CentralAir", "SaleCondition", "MoSold", "YrSold"

    ]

    housing = housing[numerical + categorical]

    housing.shape

    Out: (1460, 14)

    從housing.shape中,我們可以看到DataFrame現在只有14列。讓我們來分析一下!

    分析數值變數

    我們的EDA目標是瞭解此資料集中的變數如何與房屋的銷售價格相關。

    在我們做到這一點之前,我們需要先了解變數。讓我們從數值變數開始,特別是我們的目標變數SalePrice。

    數值變數就是那些數值為數字的變數。當我們有數值變數時,我們要做的第一件事是瞭解變數可以取什麼值,以及分佈和離散度。這可以透過直方圖來實現:

    import seaborn as sns

    sns.set(style="whitegrid", palette="deep", font_scale=1.1, rc={"figure.figsize": [8, 5]})

    sns.distplot(

    housing["SalePrice"], norm_hist=False, kde=False, bins=20, hist_kws={"alpha": 1}

    ).set(xlabel="Sale Price", ylabel="Count");

    SalePrice變數的分佈

    請注意,seaborn庫被匯入為sns。

    只需一種方法sns.set(),我們就可以設計圖形樣式,更改顏色,增加字型大小以提高可讀性,並更改圖形大小。

    我們使用distplot來繪製seaborn中的直方圖。預設情況下,這會繪製帶有核密度估計(KDE)的直方圖。您可以嘗試更改引數kde=True,看看它是什麼樣子的。

    看一下直方圖,我們可以看到,很少有房子的價格低於10萬,大多數房子的價格在10萬到20萬之間,很少有房子的價格高於40萬。

    如果我們想為所有數值變數建立直方圖,pandas提供最簡單的解決方案:

    housing[numerical].hist(bins=15, figsize=(15, 6), layout=(2, 4));

    每個數值變數的分佈

    從這個視覺化中,我們獲得了大量資訊。我們可以看到1stFlrSF(一樓面積)嚴重偏態,大多數房屋沒有二樓,並且有3個BedroomAbvGr(地上臥室)。大多數房屋的售價分別OverallCond of 5和OverallQual of 5或更高。LotArea視覺化更難理解——但是我們可以看出,在建模之前可能需要刪除一個或多個異常值。

    請注意,該圖保留了我們之前使用seaborn設定的樣式。

    分析分類變數

    分類變數是指其值被標註類別的變數。分類變數的值、分佈和離散度最好透過條形圖來理解。讓我們分析一下SaleCondition變數。seaborn為我們提供了一種非常簡單的方法來顯示每個類的觀測計數:countplot。

    sns.countplot(housing["SaleCondition"]);

    該圖中的條形表示每種銷售條件下的房屋數量

    從視覺化的角度,我們可以很容易地看到,大多數房屋是在Normal情況下出售的,而在AjdLand(毗連土地購買)、Alloca(分配:兩個有獨立契約的相互關聯的房產)和Family 家庭成員之間的銷售)條件下出售的很少。

    為了視覺化資料集中的所有分類變數,就像我們對數值變數所做的那樣,我們可以迴圈遍歷pandas序列來建立子圖。

    使用plt.subplots,我們可以建立一個包含2行和4列網格的圖形。然後我們遍歷每個分類變數,使用seaborn建立countplot:

    fig, ax = plt.subplots(2, 4, figsize=(20, 10))

    for variable, subplot in zip(categorical, ax.flatten()):

    sns.countplot(housing[variable], ax=subplot)

    for label in subplot.get_xticklabels():

    label.set_rotation(90)

    每個分類變數的Countplots

    與我們的數值變數直方圖一樣,我們可以從這個視覺中收集大量資訊 - 大多數房屋都有RL(住宅低密度)分割槽分類,有Regular地段形狀,並且有CentralAir。我們還可以看到,在夏季,房屋銷售頻繁,大多數房屋在NAmes(北艾姆斯)社群出售,2010年銷售有所下降。

    但是,如果我們YrSold進一步檢查變數,我們可以看到這種“下降”實際上是由於只收集了截至7月的資料。

    housing[housing["YrSold"] == 2010].groupby("MoSold")["YrSold"].count()

    正如您所看到的,徹底探索變數及其價值非常重要 - 如果我們在假設2010年銷售額下降的情況下建立了預測銷售價格的模型,那麼這種模型可能會非常不準確。

    既然我們已經探索了數值和分類變數,那麼讓我們來看看這些變數之間的關係 - 更重要的是,這些變數如何影響我們的目標變數SalePrice!

    分析數值變數之間的關係

    繪製變數之間的關係使我們能夠輕鬆地瞭解模式和相關性。

    該散點圖通常用於視覺化兩個數值型變數之間的關係。seaborn建立散點圖的方法非常簡單:

    sns.scatterplot(x=housing["1stFlrSF"], y=housing["SalePrice"]);

    1stFlrSF與SalePrice之間的關係

    從散點圖中,我們可以看到房子的1stFlrSF和房子的SalePrice之間存在正相關關係。換句話說,房子的一樓越大,可能的售價就越高。

    您還可以看到,axis標籤在預設情況下是為我們新增的,並且標記是自動列出的,以使它們更加清晰——這與matplotlib相反,在matplotlib中這些不是預設的。

    seaborn還為我們提供了一個很好的函式jointplot,它將為您提供一個散點圖,顯示兩個變數之間的關係以及邊距中每個變數的直方圖 - 也稱為邊際圖。

    sns.jointplot(x=housing["1stFlrSF"], y=housing["SalePrice"]);

    顯示1stFlrSF與SalePrice及其各自分佈關係的聯合圖

    您不僅可以看到這兩個變數之間的關係,而且還可以看到它們是如何單獨分佈的。

    分析數值和類別變數之間的關係

    盒須圖通常用於視覺化數值變數和分類變數之間的關係,複雜條件圖用於視覺化條件關係。

    讓我們先用seaborn的boxplot方法建立盒須圖:

    fig, ax = plt.subplots(3, 3, figsize=(15, 10))

    for var, subplot in zip(categorical, ax.flatten()):

    sns.boxplot(x=var, y="SalePrice", data=housing, ax=subplot)

    每個分類變數及其與SalePrice的關係的盒須圖

    在這裡,我們遍歷了每個子圖,以生成所有類別變數和SalePrice之間的視覺化。

    我們可以看到具有FV(Floating Village Residential)zoning 分類的房屋的平均SalePrice高於其他zoning 分類,有CentralAir的房屋和部分(上次評估時未完成的房屋)銷售合同的房屋的平均售價也高於其他zoning分類。我們還可以看到,不同lotshape的房子之間,MoSold和yrsell之間的平均售價差異很小。

    讓我們仔細看看Neighborhood變數。我們看到,對於不同的neighborhood,肯定有不同的分佈,但是視覺化有點難以理解。讓我們使用額外的引數順序,按照最便宜的neighborhood到最昂貴的(按照中間價格)對box plot進行排序。

    sorted_nb = housing.groupby(["Neighborhood"])["SalePrice"].median().sort_values()

    sns.boxplot(x=housing["Neighborhood"], y=housing["SalePrice"], order=list(sorted_nb.index))

    分類盒須圖顯示Neighborhood與SalePrice的關係

    在上面的Python程式碼片段中,我們按照median 價格對neighborhood進行了排序,並將其儲存在sorted_nb中。然後,我們將這個neighborhood名稱列表傳遞到order引數中,以建立一個排序的箱形圖。

    這個數字給了我們很多資訊。我們可以看到,在最便宜的街區,房屋的售價median價格約為10萬美元,在最昂貴的社群,房屋售價約為30萬美元。我們還可以看到,對於一些neighborhoods而言,價格之間的差異非常小,這意味著所有價格都相互接近。然而,在最昂貴的街區,我們看到一個大盒子——價格分佈有很大的分散性。

    最後,seaborn還允許我們建立顯示條件關係的圖。例如,如果我們正在調整Neighborhood,使用該FacetGrid函式我們可以看到變數OverallQual和SalePrice變數之間的散點圖:

    cond_plot = sns.FacetGrid(data=housing, col="Neighborhood", hue="CentralAir", col_wrap=4)

    cond_plot.map(sns.scatterplot, "OverallQual", "SalePrice");

    此影象僅顯示前12個圖。實際上有25個圖 - 每個neighborhood一個

    對於每個單獨的neighborhood ,我們可以看到OverallQual和SalePrice之間的關係。

    我們還在hue引數(可選)中添加了另一個categorical變數CentralAir——橙色的點對應於沒有CentralAir的房屋。如你所見,這些房子的售價往往較低。

    FacetGrid方法使生成複雜的視覺化和獲取有價值的資訊變得非常容易。生成這些視覺化來快速瞭解變數關係是一個很好的實踐。

    最後

    在我們的探索過程中,我們發現了個別變數中的異常值和趨勢,以及變數之間的關係。這些知識可以用來建立一個模型來預測艾姆斯的房價。例如,由於我們發現SalePrice與CentralAir、1stFlrSf、SaleCondition和Neighborhood變數之間存在相關性,我們可以從使用這些變數的簡單機器學習模型開始。

  • 中秋節和大豐收的關聯?
  • 破月女人的忌諱?