文章目錄
- 🏳??🌈 1. 導入模塊
- 🏳??🌈 2. Pandas數據處理
- 2.1 讀取數據
- 2.2 查看數據信息
- 2.3 去除重復數據
- 2.4 去除缺失數據
- 2.5 面積、價格、單價、樓層、建筑時間數據提取
- 2.6 朝向數據處理
- 🏳??🌈 3. 特征分析
- 3.1 二手房面積分析
- 3.2 二手房建筑時間分析
- 3.3 二手房樓層分析
- 3.4 二手房價格分析
- 🏳??🌈 4. 模型分析
- 4.1 Lasso回歸
- 4.2 隨機森林
- 4.3 總結
- 🏳??🌈 5. 可視化項目源碼+數據
大家好,我是 👉 【Python當打之年(點擊跳轉)】
本期將利用Lasso回歸和隨機森林模型對上海鏈家二手房數據進行分析與預測 看看哪些特征對上海二手房房價影響比較大、不同算法模型對房價預測準確度如何等,希望對大家有所幫助,如有疑問或者需要改進的地方可以聯系小編。
涉及到的庫:
- Pandas — 數據處理
- Matplotlib/Seaborn — 數據可視化
- Sklearn — 機器學習
🏳??🌈 1. 導入模塊
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.linear_model import Lasso
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
🏳??🌈 2. Pandas數據處理
2.1 讀取數據
df = pd.read_excel('./上海鏈家二手房數據.xlsx')
2.2 查看數據信息
df.info()
一共有 28201 條數據
包含小區名稱、戶型、面積、區域、樓層、朝向、價格、單價、建筑時間等字段
2.3 去除重復數據
df1 = df.drop_duplicates()
2.4 去除缺失數據
df1 = df1.dropna()
2.5 面積、價格、單價、樓層、建筑時間數據提取
df1['面積'] = pd.to_numeric(df1['面積'].str.extract(r'(\d+\.?\d+)', expand=False))
df1['價格'] = pd.to_numeric(df1['價格'].str.extract(r'(\d+)', expand=False))
df1['單價'] = pd.to_numeric(df1['單價'].str.extract(r'(\d+)', expand=False))
df1['樓層'] = pd.to_numeric(df1['樓層'].str.extract(r'(\d+)', expand=False))
df1['建筑時間'] = pd.to_numeric(df1['建筑時間'].str.replace('年建',''))
2.6 朝向數據處理
df1['朝向'] = df1['朝向'].str.replace('朝','')
df1['朝向'] = df1['朝向'].str.replace('(進門) ','')
df1['朝向'] = df1['朝向'].str.replace('(進門)','')
df1 = df1[df1['朝向'] != '']
🏳??🌈 3. 特征分析
3.1 二手房面積分析
def get_area_analyze():plt.figure(figsize=(12, 6), dpi=80)plt.subplot(1, 2, 1)sns.boxplot(df1['面積'],color=range_color[0])plt.title('面積分布箱線圖')plt.xlabel('面積(㎡)')plt.ylabel('數量')plt.grid(True, which='both', linestyle='--', linewidth=0.5)plt.subplot(1, 2, 2)sns.histplot(df1['面積'], kde=True, bins=50,color=range_color[1])plt.title('面積分布直方圖')plt.xlabel('面積(㎡)')plt.ylabel('數量')plt.grid(True, which='both', linestyle='--', linewidth=0.5)
- 根據面積分布可以看出,大部分面積在200㎡以下,少部分在200㎡以上,所以過濾面積200㎡以下的數據。
3.2 二手房建筑時間分析
- 根據建筑時間分布可以看出,大部分二手房建筑時間在1980年以后,所以過濾建筑時間1980年以后的數據。
3.3 二手房樓層分析
def get_floor_analyze():plt.figure(figsize=(12, 6), dpi=80)plt.subplot(1, 2, 1)sns.boxplot(df1['樓層'],color=range_color[2])plt.title('樓層分布箱線圖')plt.xlabel('樓層')plt.ylabel('數量')plt.grid(True, which='both', linestyle='--', linewidth=0.5)plt.subplot(1, 2, 2)sns.histplot(df1['樓層'], kde=True, bins=50,color=range_color[3])plt.title('樓層分布直方圖')plt.xlabel('樓層')plt.ylabel('數量')plt.grid(True, which='both', linestyle='--', linewidth=0.5)
- 根據樓層分布可以看出,大部分二手房樓層在30層以下,所以過濾樓層30層以下的數據。
3.4 二手房價格分析
- 根據二手房價格分布可以看出,大部分二手房價格在1000萬以下,所以過濾價格1000萬以下的數據。
🏳??🌈 4. 模型分析
篩選需要用到的列數據:
df_model = df1[['面積', '區域', '樓層', '朝向', '建筑時間', '室', '廳', '價格']]
各特征相關性:
corrdf = df_model.corr()
plt.figure(figsize=(12, 12), dpi=80)
sns.heatmap(corrdf, annot=True,cmap="rainbow", linewidths=0.05,square=True,annot_kws={"size":8}, cbar_kws={'shrink': 0.8})
plt.title("各特征相關性熱圖",size=16)
4.1 Lasso回歸
# 建立模型
model = Lasso()
# 訓練模型
model.fit(X_train, y_train)
print(f'訓練集得分:{round(model.score(X_train, y_train), 2)}')
print(f'測試集得分:{round(model.score(X_test, y_test), 2)}')
# 預測
y_predict = model.predict(X_test)
# 評估
R_square = model.score(X_test, y_test)
print('模型決定系數: ', round(R_square,2))
訓練集得分:0.77
測試集得分:0.77
模型決定系數:0.77
真實值預測值對比圖
Loss預測:
# 特征參數
mj = 99 # 面積(㎡)
lc = 3 # 樓層
sj = 1999 # 建筑時間
ws = 3 # 臥室數量
kt = 3 # 客廳數量
xzq = '閔行區'# 行政區
cx = '南北' # 朝向
get_price()
閔行區、1999年、南北朝向、3室3廳、3層、99平米二手房預測價格:535萬
4.2 隨機森林
訓練集得分:0.98
測試集得分:0.84
模型決定系數:0.84
真實值預測值對比圖
隨機森林預測:
# 特征參數
mj = 99 # 面積(㎡)
lc = 3 # 樓層
sj = 1999 # 建筑時間
ws = 3 # 臥室數量
kt = 3 # 客廳數量
xzq = '閔行區'# 行政區
cx = '南北' # 朝向
get_price()
閔行區、1999年、南北朝向、3室3廳、3層、99平米二手房預測價格:458萬
4.3 總結
- Loss回歸與隨機森林模型相比,隨機森林在測試集和訓練集上的表現均優于Loss回歸。
- Loss回歸與隨機森林預測的結果相差比較大,可采用多組數據進行預測對比。
🏳??🌈 5. 可視化項目源碼+數據
點擊跳轉:【全部可視化項目源碼+數據】
以上就是本期為大家整理的全部內容了,趕快練習起來吧,原創不易,喜歡的朋友可以點贊、收藏也可以分享(注明出處)讓更多人知道。