數據分析(以kaggle上的加州房價為例)

来源:https://www.cnblogs.com/zh-jp/archive/2023/09/11/17694407.html
-Advertisement-
Play Games

數據來源:House Prices - Advanced Regression Techniques 參考文獻: Comprehensive data exploration with Python 1. 導入數據 import pandas as pd import warnings warnin ...


數據來源:House Prices - Advanced Regression Techniques

參考文獻:

1. 導入數據

import pandas as pd
import warnings
warnings.filterwarnings('ignore') # 忽略警告
df_train = pd.read_csv('./house-prices-advanced-regression-techniques/train.csv')
df_train.columns
Index(['Id', 'MSSubClass', 'MSZoning', 'LotFrontage', 'LotArea', 'Street',
       'Alley', 'LotShape', 'LandContour', 'Utilities', 'LotConfig',
       'LandSlope', 'Neighborhood', 'Condition1', 'Condition2', 'BldgType',
       'HouseStyle', 'OverallQual', 'OverallCond', 'YearBuilt', 'YearRemodAdd',
       'RoofStyle', 'RoofMatl', 'Exterior1st', 'Exterior2nd', 'MasVnrType',
       'MasVnrArea', 'ExterQual', 'ExterCond', 'Foundation', 'BsmtQual',
       'BsmtCond', 'BsmtExposure', 'BsmtFinType1', 'BsmtFinSF1',
       'BsmtFinType2', 'BsmtFinSF2', 'BsmtUnfSF', 'TotalBsmtSF', 'Heating',
       'HeatingQC', 'CentralAir', 'Electrical', '1stFlrSF', '2ndFlrSF',
       'LowQualFinSF', 'GrLivArea', 'BsmtFullBath', 'BsmtHalfBath', 'FullBath',
       'HalfBath', 'BedroomAbvGr', 'KitchenAbvGr', 'KitchenQual',
       'TotRmsAbvGrd', 'Functional', 'Fireplaces', 'FireplaceQu', 'GarageType',
       'GarageYrBlt', 'GarageFinish', 'GarageCars', 'GarageArea', 'GarageQual',
       'GarageCond', 'PavedDrive', 'WoodDeckSF', 'OpenPorchSF',
       'EnclosedPorch', '3SsnPorch', 'ScreenPorch', 'PoolArea', 'PoolQC',
       'Fence', 'MiscFeature', 'MiscVal', 'MoSold', 'YrSold', 'SaleType',
       'SaleCondition', 'SalePrice'],
      dtype='object')
df_train['SalePrice'].describe()
count      1460.000000
mean     180921.195890
std       79442.502883
min       34900.000000
25%      129975.000000
50%      163000.000000
75%      214000.000000
max      755000.000000
Name: SalePrice, dtype: float64

2. 變數分析

import seaborn as sns
# 繪製售價的直方圖
sns.distplot(df_train['SalePrice']);

png

# 輸出偏度和峰度
print("Skewness: %f" % df_train['SalePrice'].skew())
print("Kurtosis: %f" % df_train['SalePrice'].kurt())
Skewness: 1.882876
Kurtosis: 6.536282
  • 偏度(Skewness)是一種衡量隨機變數概率分佈的偏斜方向和程度的度量,是統計數據分佈非對稱程度的數字特征。偏度可以用來反映數據分佈相對於對稱分佈的偏斜程度。偏度的取值範圍為 (−∞,+∞),完全服從正態分佈的數據的偏度值為0,偏度值越大,表示數據分佈的右側尾部較長和較厚,稱為右偏態或正偏態;偏度值越小,表示數據分佈的左側尾部較長和較厚,稱為左偏態或負偏態。
  • 峰度(Kurtosis)是一種衡量隨機變數概率分佈的峰態的指標。峰度高就意味著方差增大是由低頻度的大於或小於平均值的極端差值引起的。峰度可以用來度量數據分佈的平坦度(flatness),即數據取值分佈形態陡緩程度的統計量。
# 繪製GrLivArea(生活面積)的散點圖
var = 'GrLivArea'
data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0, 800000));

png

# 繪製TotalBsmtSF(地下室面積)的散點圖
var = 'TotalBsmtSF'
data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0, 800000));

png

import matplotlib.pyplot as plt
# 繪製OverallQual(房屋整體材料和裝修質量)的箱線圖
var = 'OverallQual'
data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1)
f, ax = plt.subplots(figsize=(8, 6))
fig = sns.boxplot(x=var, y='SalePrice', data=data)
fig.axis(ymin=0, ymax=800000);

png

# 繪製YearBuilt(建造年份)的箱線圖
var = 'YearBuilt'
data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1)
f, ax = plt.subplots(figsize=(16, 8))
fig = sns.boxplot(x=var, y='SalePrice', data=data)
fig.axis(ymin=0, ymax=800000)
plt.xticks(rotation=90);    # 旋轉x軸標簽90度

png

  • GrLivAreaTotalBsmtSFSalePrice呈線性關係。TotalBsmtSF的斜率更大,說明地下室面積對售價的影響更大。
  • OverallQualYearBuiltSalePrice呈正相關關係。

3. 更近進一步的變數分析

第二步只是憑著直覺對數據進行了初步的分析,下麵我們將對數據進行更進一步的分析。

# 繪製變數相關矩陣
corrmat = df_train.corr(numeric_only=True) # 僅對數值型變數進行相關分析
f, ax = plt.subplots(figsize=(12, 9))
sns.heatmap(corrmat, vmax=.8, square=True);

png

import numpy as np
# SalePrice與其他變數的相關係數
k = 10
cols = corrmat.nlargest(k, 'SalePrice')['SalePrice'].index # 與SalePrice相關係數最大的10個變數的索引
cm = np.corrcoef(df_train[cols].values.T) # 計算相關係數矩陣
sns.set(font_scale=1.25)
hm = sns.heatmap(cm, annot=True, fmt='.2f', annot_kws={'size': 10},
                 yticklabels=cols.values, xticklabels=cols.values)  # 設置annot=True,顯示相關係數
plt.show()

png

對於GarageCarsGarageArea,兩者有很強的關聯性,因此選擇保留GrageCars,因為它與SalePrice的相關性更高;TotalBsmtSF1stFloor(First Floor square feet)也有很強的關聯性,地下室面積一般情況下不會大於一樓的面積,故選擇保留TotalBsmtSF

因此最終保留了7個與SalePrice關聯最大的7個變數,分別是OverallQualGrLivAreaGarageCarsTotalBsmtSFFullBathYearBuiltYearRemodAdd

# 繪製變數之間的pairplot散點圖
sns.set()
cols = ['SalePrice', 'OverallQual', 'GrLivArea', 'GarageCars', 'TotalBsmtSF',
        'FullBath', 'YearBuilt', 'YearRemodAdd']
sns.pairplot(df_train[cols], size=2.5)
plt.show()

png

觀察成對散點圖:

TotalBsmtSFGrLivArea兩者的圖像上有一條直線,仿佛邊界一般。說明地下室面積和生活面積成正比。就像上面提到的地下室面積和一樓面積的關係一樣。

SalePriceYearBuilt的散點仿佛指數函數一般,說明房價隨著建造年份的增加而增加。

4. 缺失值處理

total = df_train.isnull().sum().sort_values(ascending=False) # 統計每個變數的缺失值個數
percent = (df_train.isnull().sum() / len(df_train)).sort_values(ascending=False) # 統計每個變數的缺失值比例
missing_data = pd.concat([total, percent], axis=1, keys=['Total', 'Percent'])
missing_data.head(20)
Total Percent
PoolQC 1453 0.995205
MiscFeature 1406 0.963014
Alley 1369 0.937671
Fence 1179 0.807534
MasVnrType 872 0.597260
FireplaceQu 690 0.472603
LotFrontage 259 0.177397
GarageYrBlt 81 0.055479
GarageCond 81 0.055479
GarageType 81 0.055479
GarageFinish 81 0.055479
GarageQual 81 0.055479
BsmtFinType2 38 0.026027
BsmtExposure 38 0.026027
BsmtQual 37 0.025342
BsmtCond 37 0.025342
BsmtFinType1 37 0.025342
MasVnrArea 8 0.005479
Electrical 1 0.000685
Id 0 0.000000
df_train = df_train.drop((missing_data[missing_data['Total'] > 1]).index, axis=1) # 將缺失數量大於1的列刪去
df_train = df_train.drop(df_train.loc[df_train['Electrical'].isnull()].index) # 將Electrical缺失的行刪去
df_train.isnull().sum().max() # 檢查是否還有缺失值
0
from sklearn.preprocessing import StandardScaler
saleprice_scaled = StandardScaler().fit_transform(df_train['SalePrice'].to_numpy()[:, np.newaxis])
# 輸出異常值
low_range = saleprice_scaled[saleprice_scaled[:, 0].argsort()][:10]
high_range = saleprice_scaled[saleprice_scaled[:, 0].argsort()][-10:]
print('outer range (low) of the distribution:')
print(low_range)
print('\nouter range (high) of the distribution:')
print(high_range)
outer range (low) of the distribution:
[[-1.83820775]
 [-1.83303414]
 [-1.80044422]
 [-1.78282123]
 [-1.77400974]
 [-1.62295562]
 [-1.6166617 ]
 [-1.58519209]
 [-1.58519209]
 [-1.57269236]]

outer range (high) of the distribution:
[[3.82758058]
 [4.0395221 ]
 [4.49473628]
 [4.70872962]
 [4.728631  ]
 [5.06034585]
 [5.42191907]
 [5.58987866]
 [7.10041987]
 [7.22629831]]
# 重新繪製GrLivArea和SalePrice的散點圖
var = 'GrLivArea'
data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0, 800000));

png

上圖中右下角的兩個點是異常值,因為它們的GrLivArea很大,但是售價很低。因此將它們刪除。

lines = df_train.sort_values(by='GrLivArea', ascending=False)[:2]
df_train = df_train.drop(lines.index)

5. 測試數據

對於結果的計算分析,需要建立在一定的數據假設上。通常,需要考慮這四種情況:

  • 正態性(Normality):許多的統計方法測試都是基於數據是正態分佈的情況,因此,如果數據服從正態分佈能避免很多問題。
  • 同方差性(Homoscedasticity):同方差性是指因變數的方差在自變數的每個水平上都相等。同方差性是許多統計檢驗的一個前提條件,如果數據不符合同方差性,可能會導致結果不准確。
  • 線性性(Linearity):線性模型的一個前提條件是自變數和因變數之間的關係是線性的,如果不是線性的,可能需要對數據進行轉換。
  • 不存在相關錯誤(Absence of correlated errors):相關錯誤是指數據中的一個觀測值的誤差與另一個觀測值的誤差相關。例如,如果兩個觀測值的誤差都是正的,那麼它們之間就存在正相關錯誤。相關錯誤可能會導致結果不准確。
from scipy.stats import norm
from scipy import stats
# 繪製直方圖與正態概率圖
sns.distplot(df_train['SalePrice'], fit=norm)
fig = plt.figure()
res = stats.probplot(df_train['SalePrice'], plot=plt)

png

png

# 對SalePrice進行log轉換使其更接近正態分佈,並重新繪製直方圖與正態概率圖
df_train['SalePrice'] = np.log(df_train['SalePrice'])
sns.distplot(df_train['SalePrice'], fit=norm)
fig = plt.figure()
res = stats.probplot(df_train['SalePrice'], plot=plt)

png

png

# 同理,對GrLivArea繪製直方圖與正態概率圖
sns.distplot(df_train['GrLivArea'], fit=norm)
fig = plt.figure()
res = stats.probplot(df_train['GrLivArea'], plot=plt)

png

png

# 對GrLivArea進行log轉換使其更接近正態分佈,並重新繪製直方圖與正態概率圖
df_train['GrLivArea'] = np.log(df_train['GrLivArea'])
sns.distplot(df_train['GrLivArea'], fit=norm)
fig = plt.figure()
res= stats.probplot(df_train['GrLivArea'], plot=plt)

png

png

# 還有TotalBsmtSF
sns.distplot(df_train['TotalBsmtSF'], fit=norm)
fig = plt.figure()
res = stats.probplot(df_train['TotalBsmtSF'], plot=plt)

png

png

由於一些房子沒有地下室,導致有很多0值,因此不能對TotalBsmtSF進行log轉換。

這裡創建一個新的變數,如果TotalBsmtSF>0,則為1,否則為0。

df_train['HasBsmt'] = pd.Series(len(df_train['TotalBsmtSF']), index=df_train.index)
df_train['HasBsmt'] = 0
df_train.loc[df_train['TotalBsmtSF'] > 0, 'HasBsmt'] = 1
# 對HasBsmt為1的數據進行log轉換
df_train.loc[df_train['HasBsmt'] == 1, 'TotalBsmtSF'] = np.log(df_train['TotalBsmtSF'])
sns.distplot(df_train[df_train['TotalBsmtSF'] > 0]['TotalBsmtSF'], fit=norm)
fig = plt.figure()
res = stats.probplot(df_train[df_train['TotalBsmtSF'] > 0]['TotalBsmtSF'], plot=plt)

png

png

對於同方差的檢驗,可以繪製散點圖。如果散點呈現錐形(就像之前畫的),這意味著數據的方差隨著自變數的增加而增加,通常被稱為異方差;變數是同方差,散點的數據應該分佈在一條直線附近。

現在我們來看一下經過log運算後的SalePriceGrLivArea還有TotalBsmtSF的散點圖。

plt.scatter(df_train['GrLivArea'], df_train['SalePrice']);

png

plt.scatter(df_train[df_train['TotalBsmtSF'] > 0]['TotalBsmtSF'], df_train[df_train['TotalBsmtSF'] > 0]['SalePrice']);

png

6. 啞變數

# 將類別變數轉換為啞變數
df_train = pd.get_dummies(df_train)

總結

本次使用了pandas庫和seaborn庫對數據進行了初步的分析,對數據的缺失值進行了處理,對數據進行了轉換,最後將類別變數轉換為啞變數。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 安裝 vue-i18n npm i vue-i18n -S 2. 創建一個i8n的配置文件 如:i18nConfig.js // 配置 vue-i18n 實現國際化語言設置 import { createI19n } from 'vue-i18n' import zh_cn from '../ ...
  • 最近系統學習了vue.js 的官方腳手架create-vue的源碼,深入分析了裡面的技術實現細節,本文是我整理的源碼學習文章。 ...
  • 很早之前,就寫過一篇與原生嵌套相關的文章 -- CSS 即將支持嵌套,SASS/LESS 等預處理器已無用武之地?,彼時 CSS 原生嵌套還處於工作草案 Working Draft (WD) 階段,而今天(2023-09-02),CSS 原生嵌套 Nesting 終於成為了既定的規範! CSS 原生 ...
  • 淺拷貝 當我們想要複製一段數據的時候嗎,我們就會用到拷貝;拷貝數據又分為了淺拷貝和深拷貝,淺拷貝指複製對象或數組的頂層結構,如果對象或數組中有引用類型的屬性值,複製的是引用(地址)而非值;而深拷貝則是遞歸複製完整的對象或數組,包括嵌套的子對象或子數組,生成一個全新的對象,新對象和原對象的引用地址不同 ...
  • 前言 大家好,我是 god23bin,今天我們來聊一聊 Spring 框架中的 Bean 作用域(Scope)。 什麼是 Bean 的作用域? 我們在以 XML 作為配置元數據的情況下,進行 Bean 的定義,是這樣的: <bean id="vehicle" class="cn.god23bin.d ...
  • 1 ★★★ 例1 : 判斷集合是否為空: 2 CollectionUtils.isEmpty(null); //控制台列印:true 3 CollectionUtils.isEmpty(new ArrayList());//控制台列印:true 4 CollectionUtils.isEmpty({ ...
  • 使用<property>標簽的value屬性配置原始數據類型和ref屬性配置對象引用的方式來定義Bean配置文件。這兩種情況都涉及將單一值傳遞給Bean。那麼如果您想傳遞多個值,例如Java集合類型,如List、Set、Map和Properties怎麼辦?為了處理這種情況,Spring提供了四種類型 ...
  • 裝飾器 裝飾器的簡易版本 import time def index(): time.sleep(3) print('from index') def home(): print('from home') def func(): print('from func') def outer(func_n ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...