學習筆記(34):matplotlib繪制圖表-房價數據分析與可視化

學習筆記(34):matplotlib繪制圖表-房價數據分析與可視化

分析房價分布情況,通過直方圖、核密度估計和正態分布擬合來直觀展示房價的分布特征,并進行統計檢驗。

一、房價數據分析與可視化,代碼分析

1.1、導入必要的庫

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
from scipy import stats
import os

  • 導入數據處理 (pandas)、繪圖 (matplotlib, seaborn)庫
  • 導入數學計算 (numpy, scipy) 和文件操作 (os) 庫

1.2、設置中文字體和負號顯示

# 設置 Windows 系統的中文字體
plt.rcParams["font.family"] = ["SimHei", "Microsoft YaHei"]
plt.rcParams['axes.unicode_minus'] = False ?# 解決負號顯示問題

  • 設置了適用于 Windows 系統的中文字體,確保圖表中的中文能正常顯示
  • 解決了負號顯示為方塊的問題

1.3、數據加載函數 load_data()

def load_data(file_path):"""加載房價數據"""try:# 嘗試讀取CSV文件data = pd.read_csv(file_path)print(f"數據加載成功,共{data.shape[0]}條記錄,{data.shape[1]}個特征")print(f"數據特征: {', '.join(data.columns.tolist())}")return dataexcept FileNotFoundError:print(f"錯誤: 文件 '{file_path}' 不存在")# 創建示例數據用于演示print("創建示例數據用于演示...")np.random.seed(42)size = 500data = pd.DataFrame({'price': np.random.normal(15000, 3000, size),  # 房價,單位:萬元'area': np.random.normal(100, 20, size),  # 面積,單位:平方米'age': np.random.randint(1, 30, size),  # 房齡,單位:年})# 確保房價與面積正相關,與房齡負相關data['price'] = data['price'] + 50 * data['area'] - 100 * data['age']data['price'] = data['price'].clip(lower=5000)  # 設置價格下限return data
  • 嘗試從指定路徑加載 CSV 文件
  • 如果文件不存在,會生成模擬數據:
    • 使用正態分布生成房價、面積數據
    • 使用均勻分布生成房齡數據
    • 通過公式price = base_price + 50*area - 100*age確保房價與面積正相關,與房齡負相關
    • 設置房價下限為 5000 萬元

數據house_prices.csv

area,price,age,bedrooms
120,15000,10,3
140,18000,5,4
90,12000,15,2
160,20000,8,3
100,13000,12,2
92,12000,15,2
162,20000,8,3
102,13000,12,2
91,12000,15,2
161,20000,8,3
101,12000,12,2
121,13000,10,3
142,16000,5,4
122,13000,10,3
142,15000,5,4
123,17000,10,3
144,17000,5,4
124,17000,10,3
144,17000,5,4
125,18000,10,3
145,18000,5,4

1.4、房價分布可視化函數?plot_price_distribution()

def plot_price_distribution(data, price_col='price'):"""繪制房價分布直方圖"""plt.figure(figsize=(10, 6))# 繪制直方圖和核密度估計sns.histplot(data[price_col], kde=True, bins=30, color='skyblue')# 添加均值和中位數線mean_val = data[price_col].mean()median_val = data[price_col].median()plt.axvline(mean_val, color='red', linestyle='dashed', linewidth=2, label=f'均值: {mean_val:.2f}')plt.axvline(median_val, color='green', linestyle='dashed', linewidth=2, label=f'中位數: {median_val:.2f}')# 添加正態分布擬合曲線mu, sigma = stats.norm.fit(data[price_col])x = np.linspace(data[price_col].min(), data[price_col].max(), 100)plt.plot(x, stats.norm.pdf(x, mu, sigma) * len(data) * (x.max() - x.min()) / 100,'r--', linewidth=2, label=f'正態分布擬合: μ={mu:.2f}, σ={sigma:.2f}')plt.title('房價分布直方圖')plt.xlabel('房價 (萬元)')plt.ylabel('頻數')plt.legend()plt.grid(axis='y', alpha=0.5)plt.tight_layout()# 保存圖像if not os.path.exists('plots'):os.makedirs('plots')plt.savefig('plots/price_distribution.png', dpi=300)plt.show()# 打印統計信息print("\n房價統計信息:")print(data[price_col].describe())# 檢驗正態性stat, p = stats.normaltest(data[price_col])print(f"\n正態性檢驗 (p值): {p:.4f}")if p < 0.05:print("房價分布顯著偏離正態分布")else:print("房價分布近似正態分布")
  • 創建 10x6 英寸的圖表
  • 使用 seaborn 繪制直方圖和核密度估計曲線
  • 添加均值 (紅色虛線) 和中位數 (綠色虛線) 參考線
  • 擬合正態分布曲線并繪制 (紅色虛線)
  • 設置圖表標題、軸標簽,添加圖例和網格線
  • 將圖表保存到 plots 文件夾,并顯示圖表
  • 打印房價的描述性統計信息 (計數、均值、標準差等)
  • 使用stats.normaltest進行正態性檢驗并輸出結果

1.5、主函數 main()

def main():"""主函數:執行數據加載和價格分布分析"""file_path = '../../data/house_prices.csv'  # 替換為實際文件路徑# 1. 加載數據data = load_data(file_path)# 2. 繪制房價分布直方圖plot_price_distribution(data)print("\n數據分析完成!圖表已保存到 'plots' 文件夾")
  • 設置數據文件路徑
  • 調用load_data()加載數據
  • 調用plot_price_distribution()分析并可視化房價分布
  • 打印分析完成信息

1.6、程序入口

if __name__ == "__main__":
main()

  • 確保程序作為腳本直接運行時才執行main()函數
  • 如果作為模塊導入,則不會執行

代碼優化建議

  1. 添加更多錯誤處理,如處理空數據的情況
  2. 可以將圖表保存路徑作為參數傳入
  3. 正態分布曲線的高度計算可以更精確
  4. 可以添加更多的房價分析維度,如不同房齡、面積段的價格分布

二、代碼和執行結果

2.1、代碼

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
from scipy import stats
import os# 設置 Windows 系統的中文字體
plt.rcParams["font.family"] = ["SimHei", "Microsoft YaHei"]
plt.rcParams['axes.unicode_minus'] = False  # 解決負號顯示問題def load_data(file_path):"""加載房價數據"""try:# 嘗試讀取CSV文件data = pd.read_csv(file_path)print(f"數據加載成功,共{data.shape[0]}條記錄,{data.shape[1]}個特征")print(f"數據特征: {', '.join(data.columns.tolist())}")return dataexcept FileNotFoundError:print(f"錯誤: 文件 '{file_path}' 不存在")# 創建示例數據用于演示print("創建示例數據用于演示...")np.random.seed(42)size = 500data = pd.DataFrame({'price': np.random.normal(15000, 3000, size),  # 房價,單位:萬元'area': np.random.normal(100, 20, size),  # 面積,單位:平方米'age': np.random.randint(1, 30, size),  # 房齡,單位:年})# 確保房價與面積正相關,與房齡負相關data['price'] = data['price'] + 50 * data['area'] - 100 * data['age']data['price'] = data['price'].clip(lower=5000)  # 設置價格下限return datadef plot_price_distribution(data, price_col='price'):"""繪制房價分布直方圖"""plt.figure(figsize=(10, 6))# 繪制直方圖和核密度估計sns.histplot(data[price_col], kde=True, bins=30, color='skyblue')# 添加均值和中位數線mean_val = data[price_col].mean()median_val = data[price_col].median()plt.axvline(mean_val, color='red', linestyle='dashed', linewidth=2, label=f'均值: {mean_val:.2f}')plt.axvline(median_val, color='green', linestyle='dashed', linewidth=2, label=f'中位數: {median_val:.2f}')# 添加正態分布擬合曲線mu, sigma = stats.norm.fit(data[price_col])x = np.linspace(data[price_col].min(), data[price_col].max(), 100)plt.plot(x, stats.norm.pdf(x, mu, sigma) * len(data) * (x.max() - x.min()) / 100,'r--', linewidth=2, label=f'正態分布擬合: μ={mu:.2f}, σ={sigma:.2f}')plt.title('房價分布直方圖')plt.xlabel('房價 (萬元)')plt.ylabel('頻數')plt.legend()plt.grid(axis='y', alpha=0.5)plt.tight_layout()# 保存圖像if not os.path.exists('plots'):os.makedirs('plots')plt.savefig('plots/price_distribution.png', dpi=300)plt.show()# 打印統計信息print("\n房價統計信息:")print(data[price_col].describe())# 檢驗正態性stat, p = stats.normaltest(data[price_col])print(f"\n正態性檢驗 (p值): {p:.4f}")if p < 0.05:print("房價分布顯著偏離正態分布")else:print("房價分布近似正態分布")def main():"""主函數:執行數據加載和價格分布分析"""file_path = '../../data/house_prices.csv'  # 替換為實際文件路徑# 1. 加載數據data = load_data(file_path)# 2. 繪制房價分布直方圖plot_price_distribution(data)print("\n數據分析完成!圖表已保存到 'plots' 文件夾")if __name__ == "__main__":main()

2.2、執行結果

數據加載成功,共21條記錄,4個特征
數據特征: area, price, age, bedrooms

房價統計信息:
count ? ? ? 21.000000
mean ? ? 15619.047619
std ? ? ? 2854.403449
min ? ? ?12000.000000
25% ? ? ?13000.000000
50% ? ? ?16000.000000
75% ? ? ?18000.000000
max ? ? ?20000.000000
Name: price, dtype: float64

正態性檢驗 (p值): 0.0725
房價分布近似正態分布

數據分析完成!圖表已保存到 'plots' 文件夾

三、1.4中的部分詳解

1.4.1、正態分布擬合曲線繪制代碼詳解

mu, sigma = stats.norm.fit(data[price_col])
x = np.linspace(data[price_col].min(), data[price_col].max(), 100)
plt.plot(x, stats.norm.pdf(x, mu, sigma) * len(data) * (x.max() - x.min()) / 100,
'r--', linewidth=2, label=f'正態分布擬合: μ={mu:.2f}, σ={sigma:.2f}')

1. 計算正態分布參數

mu, sigma = stats.norm.fit(data[price_col])

  • stats.norm.fit()?是 SciPy 庫中用于擬合正態分布的函數
  • 它使用最大似然估計方法,根據輸入數據計算最匹配的正態分布參數
  • 返回兩個值:
    • mu:正態分布的均值(位置參數)
    • sigma:正態分布的標準差(尺度參數)
2. 生成曲線繪制的 x 坐標

x = np.linspace(data[price_col].min(), data[price_col].max(), 100)

  • np.linspace()?在房價數據的最小值和最大值之間生成 100 個均勻分布的點
  • 這 100 個點將作為曲線的 x 坐標,確保曲線覆蓋整個數據范圍
  • 例如,如果房價最小值是 5000,最大值是 25000,則會生成從 5000 到 25000 的 100 個點
3. 計算正態分布曲線的 y 坐標(核心難點)

stats.norm.pdf(x, mu, sigma) * len(data) * (x.max() - x.min()) / 100

這部分代碼可以分解為三個關鍵部分:

3.1 計算理論概率密度值

stats.norm.pdf(x, mu, sigma)

  • stats.norm.pdf()?計算正態分布的概率密度函數 (Probability Density Function, PDF)
  • 輸入參數:
    • x:前面生成的 100 個房價坐標點
    • mu?和?sigma:前面擬合得到的正態分布參數
  • 輸出:每個 x 點對應的正態分布概率密度值
3.2 縮放因子 - 樣本量調整

* len(data)

  • 乘以樣本數量(數據行數)
  • 這一步將概率密度轉換為理論頻數
  • 例如,如果某個房價區間的理論概率是 0.05,樣本量是 500,則理論頻數是 0.05 * 500 = 25
3.3 縮放因子 - 區間寬度調整

* (x.max() - x.min()) / 100

  • (x.max() - x.min()) / 100?計算每個區間的寬度
  • 這一步調整曲線高度以匹配直方圖的區間寬度
  • 例如,如果房價范圍是 20000(25000-5000),分成 100 個區間,則每個區間寬度是 200
4. 繪制正態分布曲線

plt.plot(x, y, 'r--', linewidth=2, label=f'正態分布擬合: μ={mu:.2f}, σ={sigma:.2f}')

  • 使用 matplotlib 的 plot 函數繪制曲線
  • 參數說明:
    • x:橫坐標(房價值)
    • y:縱坐標(調整后的理論頻數)
    • 'r--':紅色虛線
    • linewidth=2:線寬 2
    • label:圖例標簽,顯示擬合的正態分布參數(保留兩位小數)

為什么需要這些縮放因子?

正態分布的概率密度函數 (PDF) 返回的是概率密度值,范圍通常很小(例如 0-0.0001),直接繪制會與直方圖的高度不匹配。通過乘以樣本量和區間寬度,可以將理論概率密度轉換為與直方圖可比的理論頻數,使曲線與直方圖在同一尺度上顯示,便于直觀比較數據分布與正態分布的擬合程度。

示例說明

假設:

  • 房價數據范圍:5000-25000 萬元
  • 樣本量:500 條
  • 擬合的正態分布參數:μ=15000, σ=3000
  • 某點 x=15000 處的概率密度值:stats.norm.pdf (15000, 15000, 3000) ≈ 0.000133

經過縮放計算:

0.000133 * 500 * (25000-5000)/100 ≈ 0.000133 * 500 * 200 ≈ 13.3

這意味著在 x=15000 處,理論上該區間的頻數約為 13.3,這個值與直方圖在該區間的高度可比。

常見問題與優化

  1. 如果直方圖的 bins 數量不是 100,需要相應調整縮放因子中的分母
  2. 對于偏態分布,正態擬合可能不佳,可以考慮使用其他分布(如對數正態、伽馬分布等)
  3. 可以添加判斷邏輯,根據 bins 數量自動計算縮放因子,提高代碼通用性

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89134.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89134.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89134.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端三劍客之CSS

1. CSS 簡介1) CSS 簡述CSS&#xff0c;即層疊樣式表&#xff08;英文全稱&#xff1a;Cascading Style Sheets&#xff09;&#xff0c;是一種專門用于修飾 HTML 文檔呈現樣式的計算機語言。它的功能不僅限于靜態美化網頁&#xff0c;還能與各類腳本語言配合&#xff0c;實現對…

力扣25.7.11每日一題——無需開會的工作日

Description 這題類似合并區間&#xff0c;題意你們都能看懂吧…… Solution 這道題就需要用到合并區間的方法。 答案等于 daysdaysdays 減「有會議安排的天數」。 對左端點進行排序&#xff0c;計算有會議安排的天數&#xff0c;累加每個區間的長度&#xff0c;即為有會議…

每日一SQL 【銷售分析 III】

文章目錄問題案例執行順序使用分組解決問題 案例 執行順序 SQL 語句的執行順序&#xff08;核心步驟&#xff09; 同一層級的select查詢內部, 別名在整個 SELECT 計算完成前不生效 使用分組解決 select distinct s.product_id, Product.product_name from Sales sleft join …

輕輕松松帶你進行-負載均衡LVS實戰

8. LVS部署命令介紹 8.1 LVS軟件相關信息 1.程序包&#xff1a;ipvsadm 2.Unit File: ipvsadm.service 3.主程序&#xff1a;/usr/sbin/ipvsadm 4.規則保存工具&#xff1a;/usr/sbin/ipvsadm-save 5.規則重載工具&#xff1a;/usr/sbin/ipvsadm-restore 6.配置文件&#xff1a…

C#.NET 集合框架詳解

簡介 C# 集合框架是處理數據集合的核心組件&#xff0c;位于 System.Collections 和 System.Collections.Generic 命名空間。它提供了多種數據結構來高效存儲和操作數據。 集合框架概覽 System.Collections (非泛型老版) └─ System.Collections.Generic (泛…

網絡劫持對用戶隱私安全的影響:一場無形的數據竊取危機

在互聯網時代&#xff0c;網絡劫持如同一把“隱形鐮刀”&#xff0c;悄然威脅著用戶的隱私安全。當我們在瀏覽網頁、使用社交媒體或進行在線交易時&#xff0c;看似正常的網絡連接背后&#xff0c;可能正暗藏著數據被竊取的風險。網絡劫持通過多種技術手段干預用戶與服務器的正…

使用 Helm 下載 Milvus 安裝包(Chart)指南

目錄 &#x1f4e6; 使用 Helm 下載 Milvus 安裝包&#xff08;Chart&#xff09;指南 &#x1f6e0; 環境準備 &#x1f680; 第一步&#xff1a;添加 Milvus Helm 倉庫 &#x1f50d; 第二步&#xff1a;查看可用版本 &#x1f4e5; 第三步&#xff1a;下載指定版本的 C…

EXTI 外部中斷

目錄 STM32中斷 NVIC 中斷控制器 NVIC優先級分組 EXTI 外部中斷 AFIO 復用IO口 外部中斷/事件控制器&#xff08;EXTI&#xff09;框圖 STM32中斷 在STM32微控制器中&#xff0c;共有68個可屏蔽中斷通道&#xff0c;涵蓋了多個外設&#xff0c;如外部中斷&#xff08;EXT…

WebApplicationType.REACTIVE 的webSocket

通用請求體類 Data ApiModel("websocket請求消息") public class WebSocketRequest<T> implements Serializable {private static final long serialVersionUID 1L;/*** 參考&#xff1a;com.mcmcnet.gacne.basic.service.common.pojo.enumeration.screen.AiB…

降本增效!自動化UI測試平臺TestComplete并行測試亮點

在跨平臺自動化測試中&#xff0c;企業常面臨設備投入高、串行測試耗時長、測試覆蓋率難以兼顧的困境。自動化UI測試平臺TestComplete的并行測試引擎提供了有效的解決方案&#xff1a;通過云端海量設備池與CI/CD深度集成&#xff0c;實現多平臺、多瀏覽器并行測試&#xff0c;顯…

云、實時、時序數據庫混合應用:醫療數據管理的革新與展望(上)

云、實時、時序數據庫混合應用:醫療數據管理的革新與展望 1、引言 1.1 研究背景與意義 在信息技術飛速發展的當下,醫療行業正經歷著深刻的數字化轉型。這一轉型不僅是技術層面的革新,更是關乎醫療體系未來發展方向的深刻變革。從醫療服務的提供方式,到醫療管理的模式,再…

代碼隨想錄算法訓練營十六天|二叉樹part06

LeetCode 530 二叉搜索樹的最小絕對差 題目鏈接&#xff1a;530. 二叉搜索樹的最小絕對差 - 力扣&#xff08;LeetCode&#xff09; 給你一個二叉搜索樹的根節點 root &#xff0c;返回 樹中任意兩不同節點值之間的最小差值 。 差值是一個正數&#xff0c;其數值等于兩值之差…

自增主鍵為什么不是連續的?

前言 如果一個線程回滾&#xff0c;例如唯一鍵沖突的情況回滾時&#xff0c;回滾了sql語句&#xff0c;但是并沒有把自增的值也-1。那么就會導致下一條插入的數據自增id出現了跳躍。 自增主鍵為什么不是連續的&#xff1f;前言執行時機為什么自增主鍵不是連續的為什么不回滾自…

OpenCV圖像基本操作:讀取、顯示與保存

在圖像處理項目中&#xff0c;圖像的 讀取&#xff08;imread&#xff09;、顯示&#xff08;imshow&#xff09; 和 保存&#xff08;imwrite&#xff09; 是最基礎也是最常用的三個操作。本文將詳細介紹這三個函數的功能、用法和注意事項&#xff0c;并提供一個完整示例供讀者…

.NET控制臺應用程序中防止程序立即退出

在VB.NET控制臺應用程序中防止程序立即退出&#xff0c;主要有以下幾種常用方法&#xff0c;根據需求選擇適合的方案&#xff1a; 方法1&#xff1a;等待用戶輸入&#xff08;推薦&#xff09; Module Module1Sub Main()Console.WriteLine("程序開始運行...") 這里是…

Vue3 + Three.js 極速入門:打造你的第一個3D可視化項目

文章目錄前言一、環境準備1.1 創建Vue3項目1.2 安裝Three.js二、Three.js核心概念速覽三、實戰&#xff1a;創建旋轉立方體3.1 組件化初始化四、核心代碼解析4.1 Vue3響應式整合技巧4.2 性能優化要點五、進階功能擴展5.1 數據驅動控制5.2 加載3D模型六、常見問題解決七、資源推…

【設計模式】享元模式(輕量級模式) 單純享元模式和復合享元模式

享元模式&#xff08;Flyweight Pattern&#xff09;詳解一、享元模式簡介 享元模式&#xff08;Flyweight Pattern&#xff09; 是一種 結構型設計模式&#xff08;對象結構型模式&#xff09;&#xff0c;它通過共享技術實現相同或相似對象的重用&#xff0c;以減少內存占用和…

驅動開發_2.字符設備驅動

目錄1. 什么是字符設備2. 設備號2.1 設備號概念2.2 通過設備號dev分別獲取主、次設備號的宏函數2.3 主設備號的申請靜態申請動態分配2.4 注銷設備號3. 字符設備3.1 注冊字符設備3.2 注銷字符設備3.3 應用程序和驅動程序的關系3.4 file_opertaions結構體3.5 class_create3.6 創建…

直播推流技術底層邏輯詳解與私有化實現方案-以rmtp rtc hls為例-優雅草卓伊凡

直播推流技術底層邏輯詳解與私有化實現方案-以rmtp rtc hls為例-優雅草卓伊凡由于我們的甲方客戶要開始為我們項目產品上加入私有化的直播&#xff0c;這塊不得不又撿起來曾經我們做直播推流的事情了&#xff0c;其實私有化直播一直并不是一件容易的事情&#xff0c;現在大部分…

一文讀懂現代卷積神經網絡—深度卷積神經網絡(AlexNet)

目錄 深度卷積神經網絡&#xff08;AlexNet&#xff09;是什么&#xff1f; 一、AlexNet 的核心創新 1. 深度架構 2. ReLU 激活函數 3. 數據增強 4. Dropout 正則化 5. GPU 并行計算 6. 局部響應歸一化&#xff08;LRN&#xff09; 二、AlexNet 的網絡結構 三、AlexN…