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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【datawhale-gitmodel】以波士顿房价数据进行数据分析和数据可视化

發布時間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【datawhale-gitmodel】以波士顿房价数据进行数据分析和数据可视化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以波士頓房價數據進行數據分析

文章目錄

  • 以波士頓房價數據進行數據分析
  • 1 總體分析步驟
  • 2 數據加載
  • 3 數據處理
    • 3.1 缺失值處理
    • 3.2 變量分析
      • 3.2.1 單變量分析
        • 3.2.1.1 分析標簽
        • 3.2.1.2 離散型變量
        • 3.2.1.3 連續型變量
      • 3.2.2 多變量分析
        • 3.2.2.1 數據圖描述相關性
        • 3.2.2.2 數據描述相關性

1 總體分析步驟

  • 加載數據
  • 概覽數據
  • 缺失值處理
  • 變量分析
    • 單一變量
    • 多變量關系

    2 數據加載

  • 載入數據 house = pd.read.csv("./data/boston.csv").head()
  • 數據的規模 house.shape
  • 數據集的每一列的列名 house.columns
  • 基本統計描述 house.describe() / house.info()
    • 查看是否有缺失值
    • 查看數據是否正常,例如A是一個處于[0,1]之間的比值,但在展示中A>1,說明數據不正常,需要修正
    • 查看統計數據是否正常,例如方差特別大,在后續的處理中,可以采用一些降維的手段如:主成分分析(PCA)等

    3 數據處理

    3.1 缺失值處理

  • 總體查看: null.info()
    • 查看樣本總數為506,非空值不等于506的即為含有缺失值的特征
  • 缺失值計算:null.isnull().sum()
  • 缺失值可視化
    • 柱狀圖
    missing = null.isnull().sum() missing = missing[missing > 0] # 篩選出有缺失值(大于0)的特征 missing.sort_values(inplace = True) # 排序 missing.plot.bar() # 調用pandas內置的條形圖繪制

    • 熱力圖 sns.heatmap(null.isnull())

    • 熱力圖可以幫助看出缺失值的位置,如果有些樣本出現大量特征缺失的情況,在樣本足夠大的情況下也可以考慮刪除

  • 統計缺失比例
  • A = [] for col in null.columns:A.append((col,null[col].isnull().sum() * 100 / null.shape[0])) pd.DataFrame(A, columns=['Features', 'missing rate'])

    • 缺失值超過95%的特征,會考慮刪除,因為意義不大
    • 方差特別小的特征也考慮刪除,或者說取值唯一的特征是沒有意義的;舉例,如果在一次考試中,大家的數學成績都是100分,那么是沒有辦法通過數學成績來區分每位同學的能力的,也就是說數學這門課沒有區分性,不具有分析的意義,可以刪掉
  • 統計每個特征會有多少不同取值 df.nunique()
    • 為了更好的呈現,將特征的唯一值個數加入到上面的統計表中,并封裝成函數,便于之后使用
    def df_stats(df):'''統計該df的缺失值,比例以及唯一值個數.'''L = []for col in df.columns:L.append((col, df[col].isnull().sum(),df[col].isnull().sum() * 100 / df.shape[0],df[col].nunique()))res = pd.DataFrame(L, columns = ['Feature', 'missing num','missing rate','unique num']) return res
  • 缺失值填充 null = null.fillna(null.mean()) # 用均值填充
    • 這是比較簡單粗暴的方式,之后會細講缺失值處理方式

    • 可視化查看 sns.heatmap(null.isnull()) 此時已沒有缺失值

    3.2 變量分析

    • 研究思路:首先研究單變量的數據類型、分布情況、是否有離群值等情況,再研究變量之間的關系:相關性分析、分組統計等

    3.2.1 單變量分析

    3.2.1.1 分析標簽

  • 標簽類型
    • 首先是分析數據標簽,要明白任務的需求。數據挖掘任務主要分為兩類:回歸分類
    • 回歸指標簽值是連續值的任務,例如用到的數據集,要求預測房價信息,房價是一個連續的變量,因此這樣的任務屬于回歸問題(Regression)
    • 分類指標簽值離散的任務,例如鳶尾花(Iris)數據集,收集三種鳶尾花的萼片長度,寬度等信息,要求根據這些信息預測鳶尾花屬于哪種類別,因此標簽就是1,2,3,代表三類鳶尾花。這種任務屬于分類任務
  • house["MEDV"].nunique() 查看標簽的取值:因為取值個數比較多,可以大致判斷本次任務屬于回歸型任務。 但這并非判斷標準,只是一個判斷的參考,主要還是分析題目的任務需求

  • house["MEDV"].describe() 打印標簽的統計信息:

    • 從統計信息可以大致看出,分布還算正常,沒有太大的方差(方差太大說明數據不太可能是正態的,因為不夠集中)。對于是否有離群值后面我們需要通過箱線圖或者散點圖等可視化分析后才能得知
  • 畫密度分布圖,看標簽取值的總體分布情況
  • plt.figure() sns.distplot(house["MEDV"],bins=100,#柱子的個數hist=True,#是否繪制直方圖kde=True,#是否繪制密度圖rug=True,#數據分布標尺color='r',#顏色 # vertical=False,#是否水平繪制 # norm_hist=False,#標準化,kde為True時自動標準化axlabel=None,#x軸標注label=None,#圖例標簽,通過plt.legend()顯示ax=None,)
    • 如圖
    • 看到整個分布稍微有一點左偏,因此在實戰中,我們可以采用對數化的方法,讓標簽分布接近正態
    plt.figure() sns.distplot(np.log(house["MEDV"]),bins=100,#柱子的個數hist=True,#是否繪制直方圖kde=True,#是否繪制密度圖rug=True,#數據分布標尺color='r',#顏色 # vertical=False,#是否水平繪制 # norm_hist=False,#標準化,kde為True時自動標準化axlabel=None,#x軸標注label=None,#圖例標簽,通過plt.legend()顯示ax=None,)

    • 變換之后,可以將取值小于1.5的取值視為異常值,將其舍棄
    • 對于分類任務而言,可以采用此法畫出它的頻率分布直方圖,或者更直接的畫條形統計圖,如果分類的標簽分布是相似的,那么我們可以直接建模;如果標簽出現很明顯的一高一低的情況,說明標簽的分布不均衡,在建模前需要做一些操作(例如:欠采樣、調整損失函數),再進行建模。否則會出現一個問題,模型對出現頻率低的樣本非常不敏感。好比數學考試前的復習題,大多數都是數列題,只有一個是立體幾何題目,大家花了很多精力研究數列,結果一到考試,出現了很多立體幾何的題目,這時候我們復習的效果其實會顯得很差。模型訓練的過程就類似考前復習的過程,所以我們在建模前要盡量保證標簽的均衡性。

    3.2.1.2 離散型變量

  • 查看數據 df_stats(null)
    • 對于類別型變量而言,一般采用柱狀圖的方式觀察其分布
    • 從這個表的最后一列可以看出CHAS,RAD這樣的變量的取值比較符合分類變量的特征
  • 繪制柱狀圖 house[['CHAS', 'RAD']].hist()
  • 類別型變量更大的作用是后續在特征工程中,用于進行特征交叉,繼續特征的增強,挖掘更深層次的潛在信息
  • 3.2.1.3 連續型變量

  • 先繪制連續型變量的分布情況 house[['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'TAX', 'PTRATIO', 'B', 'LSTAT']].hist(figsize = (10, 15), bins = 100)
    • 從上面的圖像可以看出,有些變量實際上是有相似(A高B高)的分布情況的,或者相反的分布情況的(A高B低),這樣的性質稱為變量之間的相關性
  • 相關性一般有兩種情況:
    • 正相關:如果特征A的增加(減少)會導致特征B增加(減少),即特征A與特征B變化趨勢相同
    • 負相關:如果特征A的增加(減少)會導致特征B減少(增加),即特征A與特征B變化趨勢相反
  • 注意
    • 當兩個變量呈正相關或者負相關時,我們稱兩個變量是相關的。如果兩個變量有較強的相關性時,將這些變量一起用,會有很多是冗余的
    • 因為變量之間有較強的相關性,那么變量與變量之間是可以相互表示的,所以在建模時,需要盡可能消除特征之間的共線性,也就是盡量使用相關性比較小的特征,這樣可以減少訓練時間,使得模型的學習效果更好

    3.2.2 多變量分析

    3.2.2.1 數據圖描述相關性

  • 從可視化的角度來研究變量之間的相關性
    • 對于可視化而言,最簡單的方式就是將兩個特征對應的坐標點在坐標系下描出來,研究他們的變化趨勢
    • 每一個點的坐標試一個二元組(xA(i),yB(i))\left(x_{A}^{(i)}, y_{B}^{(i)}\right)(xA(i)?,yB(i)?),其中 xA(i)x_{A}^{(i)}xA(i)? 表示第 iii 個樣本,特征 AAA 的取值; yB(i)y_{B}^{(i)}yB(i)? 表示第 iii 個樣本,特征 BBB 的取值
    • 用seaborn庫可以很直觀的任意兩個特征之間的散點圖
    # 任意兩個變量間的相關性散點圖 sns.set() cols = house.columns # 羅列出數據集的所有列 sns.pairplot(house[cols], size = 2.5) # 成對畫出任意兩列的散點圖 plt.show() # 顯示函數

  • 首先,我們先看圖像呈“對角線分布的”,即/或者\這兩種類型分布的圖像,這樣的圖像說明這兩個變量間有較強的相關性,是可以被消除共線性的“嫌疑對象”。如圖中的DIS和AGE,盡管他不是嚴格的直線分布,但至少其分布呈現帶狀
    • 成對畫出任意兩列的散點圖 sns.pairplot(house[["AGE", "DIS"]], size = 3) #size是子圖的大小
    • 如圖
  • 其次,可以看那些趨勢明顯比較單調,但是不太像直線,而是類似“對數函數”的圖像,例如圖中的DIS和NOX,因為這類圖像,只要對數化,就可以得到類似直線的效果,那么也可以被處理
    • 成對畫出任意兩列的散點圖(帶對數處理) sns.pairplot(np.log(house[["NOX", "DIS"]]), size = 3) #size是子圖的大小
    • 如圖
  • 還需關注最后一行(列)與其他行(列)的關系,也就是特征與標簽的關系,如果這兩者出現較強相關性,那么我們需要留意這些特征,因為這些特征對標簽有著比較直接的關系,例如RM和LSTAT
    • 成對畫出任意兩列的散點圖(帶對數處理)sns.pairplot(np.log(house[["RM", "LSTAT", "MEDV"]]), size = 3 #size是子圖的大小

    3.2.2.2 數據描述相關性

  • 協方差
    • 公式: σij=cov?(Xi,Xj)=E[(Xi?μi)(Xj?μj)]\sigma_{i j}=\operatorname{cov}\left(X_{i}, X_{j}\right)=E\left[\left(X_{i}-\mu_{i}\right)\left(X_{j}-\mu_{j}\right)\right]σij?=cov(Xi?,Xj?)=E[(Xi??μi?)(Xj??μj?)]
      其中, Xi,XjX_{i}, X_{j}Xi?,Xj? 是第 i,ji, ji,j 個隨機變量,因此我們可以誘導出協方差矩陣:Σ=(σij)\Sigma=\left(\sigma_{i j}\right)Σ=(σij?)

    • 若變量 XiX_{i}Xi? 的較大值主要與另一個變量 XjX_{j}Xj? 的較大值相對應,而兩者的較小值也相對應,則可稱兩變量傾向于表現出相似的行為,協方差為正;當一個變量的較大值主要對應于另一個變量的較小值時,則可稱兩變量傾向于表現出相反的行為,協方差為負

      協方差的正負號顯示變量的相關性

    • 當有了一系列數據后,我們可以認為這一系列數據是從對應的分布里面采樣得到的,可以當成隨機變量的觀測值,因此可以直接代入算期望

  • 計算協方差 house.cov() #只有數值型變量才能算,類別或文本需要編碼后才能計算
    • 但是協方差只能看出正相關和負相關,其大小并沒有意義,這是因為每個特征的量綱不同,直接乘積后求期望,所得到的量綱又是不盡相同,因此我們需要對其做“無量綱化”處理
  • 相關系數
    • 公式:r(X,Y)=Cov?(X,Y)Var?[X]Var?[Y]r(X, Y)=\frac{\operatorname{Cov}(X, Y)}{\sqrt{\operatorname{Var}[X] \operatorname{Var}[Y]}}r(X,Y)=Var[X]Var[Y]?Cov(X,Y)?
      其中, Cov?(X,Y)\operatorname{Cov}(X, Y)Cov(X,Y)XXXYYY 的協方差, Var?[X]\operatorname{Var}[X]Var[X]XXX 的方差, Var?[Y]\operatorname{Var}[Y]Var[Y]YYY 的方差

      ∣r(X,Y)∣≤1|r(X, Y)| \leq 1r(X,Y)1

      ∣r(X,Y)∣=1|r(X, Y)|=1r(X,Y)=1 的充要條件是, 存在常數 a,ba, ba,b, 使得 P{Y=a+bX}=1P\{Y=a+b X\}=1P{Y=a+bX}=1

    • 相關系數定量地刻畫了 XXXYYY 的相關程度,范圍是[?1,1][-1,1][?1,1]。絕對值越靠近0,表示不相關,絕對值越靠近1,表示相關性越強

      小于 0 表示負相關;大于 0 表示正相關

    • XXXYYY 完全相關的含義是在概率為 1 的意義下存在線性關系,于是 ∣r(X,Y)∣|r(X, Y)|r(X,Y) 是一個可以表征 XXXYYY 之間線性關系緊密程度量

      ∣r(X,Y)∣|r(X, Y)|r(X,Y) 較大時,通常說 XXXYYY 相關程度較好;當 ∣r(X,Y)∣|r(X, Y)|r(X,Y) 較小時,通常說 XXXYYY 相 關程度較差; 當 XXXYYY 不相關,通常認為 XXXYYY 之間不存在線性關系,但并不能排除 XXXYYY 之間可能存在其他關系。

  • 計算相關系數
    • 單項相關系數的計算
    # 請你嘗試實現相關系數的計算 def Corr(X, Y):'''計算隨機變量X,Y的相關系數.X: np.array or pd.Series.Y: np.array or pd.Series.'''COV_XY = np.cov(X, Y) #協方差矩陣std_X = np.std(X) #X的標準差std_Y = np.std(Y) #Y的標準差Corr_Matrix = COV_XY / (std_X * std_Y)return Corr_Matrix # (np.cov(house['AGE'], house['DIS'])/ ((np.std(house['AGE']) * np.std(house['DIS']))))[0,1] # 利用自己實現的函數進行單項相關系數的計算 Corr(house['AGE'], house['DIS'])
    • 全表相關系數的計算
    # 直接計算相關性系數 Corr_Matrix = house.corr() Corr_Matrix
  • 熱力圖展示相關性系數
  • #correlation matrix f, ax = plt.subplots(figsize=(12, 9)) # 設置畫布 sns.heatmap(Corr_Matrix, vmax=.8, square=True # 畫熱力圖 # , annot=True # s是否顯示數值)

    注:本文整理內容來自datawhale社區(《Joyful Pandas》)和gitmodel開源課程,并補充查找的其他資料。

    總結

    以上是生活随笔為你收集整理的【datawhale-gitmodel】以波士顿房价数据进行数据分析和数据可视化的全部內容,希望文章能夠幫你解決所遇到的問題。

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