Python 數據分析與可視化 Day 9 - 缺失值與異常值處理技巧

? 今日目標

  • 熟練處理數據中的缺失值(NaN、None)
  • 學會識別和處理異常值(outliers)
  • 掌握常用的處理方法:填充、刪除、替換、標準差法、箱型圖法等
  • 為后續機器學習建模打好數據清洗基礎

📚 一、缺失值處理(Missing Data)

1. 檢查缺失值

df.isnull().sum()  # 每列缺失值數量
df.info()          # 查看字段類型和非空計數

2. 刪除缺失值

df.dropna()              # 刪除包含缺失值的行
df.dropna(axis=1)        # 刪除包含缺失值的列
df.dropna(how="all")     # 刪除整行全為空

3. 填充缺失值(推薦)

df["成績"].fillna(df["成績"].mean(), inplace=True)      # 均值填充
df["成績"].fillna(method="ffill", inplace=True)          # 前向填充
df["成績"].fillna(method="bfill", inplace=True)          # 后向填充

4. 替換無效數據為 NaN

import numpy as np
df["成績"].replace("缺考", np.nan, inplace=True)

?? 二、異常值檢測與處理

1. 基于統計分布檢測異常值(Z-Score)

score_mean = df["成績"].mean()
score_std = df["成績"].std()df["Z值"] = (df["成績"] - score_mean) / score_std# 篩選 Z 分數絕對值大于 3 的異常點
outliers = df[abs(df["Z值"]) > 3]
print(outliers)

2. 使用箱型圖(IQR)識別異常值

Q1 = df["成績"].quantile(0.25)
Q3 = df["成績"].quantile(0.75)
IQR = Q3 - Q1lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR# 判斷異常值
outliers_iqr = df[(df["成績"] < lower_bound) | (df["成績"] > upper_bound)]
print(outliers_iqr)

3. 替換或刪除異常值

# 方法一:直接刪除
df_cleaned = df[(df["成績"] >= lower_bound) & (df["成績"] <= upper_bound)]# 方法二:用邊界值替代異常值
df["成績"] = df["成績"].clip(lower_bound, upper_bound)

🧪 今日練習建議

  1. 對學生數據進行缺失值統計

  2. 使用多種方法填充缺失成績

  3. 使用標準差(Z-Score)和 IQR 方法檢測異常值

  4. 對異常值進行合理處理(刪除 / 替換)

  5. 輸出處理前后的對比數據統計信息

    import pandas as pd
    import numpy as np
    import seaborn as sns
    import matplotlib.pyplot as plt
    import os# 設置中文支持(根據系統配置選擇)
    plt.rcParams['font.family'] = 'Arial Unicode MS'  # macOS
    # plt.rcParams['font.sans-serif'] = ['SimHei']     # Windows
    plt.rcParams['axes.unicode_minus'] = False# 加載數據
    data_path = "data/students_dirty.csv"
    if not os.path.exists(data_path):raise FileNotFoundError("? 缺少數據文件:students_dirty.csv,請確保數據文件存在于 data 目錄下。")df = pd.read_csv(data_path, encoding="utf-8", header=0)
    print("? 原始數據預覽:")
    print(df)# ------------------ 一、缺失值處理 ------------------print("\n🔍 缺失值統計:")
    print(df.isnull().sum())# 示例:將“缺考”字符串替換為 NaN
    df.replace({"缺考": np.nan}, inplace=True)
    df["成績"] = pd.to_numeric(df["成績"], errors="coerce")# 填充缺失值(用平均數填充)
    mean_score = df["成績"].mean()
    df.fillna({"成績": mean_score}, inplace=True)
    print(f"\n? 缺失值已填充為平均數:{mean_score:.2f}")# ------------------ 二、異常值檢測(Z-Score) ------------------mean = df["成績"].mean()
    std = df["成績"].std()
    df["Z值"] = (df["成績"] - mean) / std# 絕對值大于 3 視為異常
    outliers_z = df[abs(df["Z值"]) > 3]
    print(f"\n📈 Z-Score 異常值數量:{len(outliers_z)}")
    print(outliers_z)# ------------------ 三、異常值檢測(IQR) ------------------Q1 = df["成績"].quantile(0.25)
    Q3 = df["成績"].quantile(0.75)
    IQR = Q3 - Q1
    lower = Q1 - 1.5 * IQR
    upper = Q3 + 1.5 * IQRoutliers_iqr = df[(df["成績"] < lower) | (df["成績"] > upper)]
    print(f"\n📊 IQR 異常值數量:{len(outliers_iqr)}")
    print(outliers_iqr)# ------------------ 四、異常值處理 ------------------# 方式一:刪除異常值
    df_filtered = df[(df["成績"] >= lower) & (df["成績"] <= upper)]# 方式二:clip 限制在邊界范圍內
    df_clipped = df.copy()
    df_clipped["成績"] = df_clipped["成績"].clip(lower, upper)# ------------------ 五、可視化箱型圖 ------------------sns.boxplot(df["成績"])
    plt.title("成績箱型圖")
    plt.tight_layout()
    os.makedirs("charts", exist_ok=True)
    plt.savefig("charts/成績箱型圖_異常值檢測.png")
    plt.close()
    print("📊 箱型圖已保存至 charts/成績箱型圖_異常值檢測.png")# ------------------ 六、保存結果 ------------------df_filtered.to_csv("data/students_no_outliers.csv", index=False)
    df_clipped.to_csv("data/students_clipped.csv", index=False)print("\n? 異常值處理后的數據已保存:")
    print("?? 刪除異常值版本:data/students_no_outliers.csv")
    print("?? 邊界裁剪版本:data/students_clipped.csv")
    

    成績箱型圖_異常值檢測:
    在這里插入圖片描述

    將異常值裁剪為上下限后的數據:
    在這里插入圖片描述

    刪除異常值后的數據:
    在這里插入圖片描述


🧾 今日總結

  • 缺失值和異常值是數據清洗中的核心問題
  • 多種處理方法需視場景選擇,避免信息損失或過度擬合
  • 數據分布圖與 Z 分數 / IQR 輔助判斷效果最佳
  • 清洗結果直接影響后續的建模質量

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

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

相關文章

概述-1-數據庫的相關概念

數據庫的相關概念 用戶通過SQL操作數據庫管理系統&#xff0c;再通過數據庫管理系統操作數據庫以及數據庫中的數據。 數據庫 數據庫是存儲數據的倉庫, 數據是有組織的進行存儲, DataBase簡稱&#xff08;DB&#xff09; 數據庫管理系統 操縱和管理數據庫的大型軟件, DataB…

可視化大屏展示

可視化大屏是一種將大量數據進行整合、分析&#xff0c;并以直觀、形象的可視化方式展示在大屏幕上的信息展示系統。主要組成部分分為2個&#xff1a;硬件設備、軟件系統。 一、大屏價值 1、數據可視化&#xff1a;將復雜的數據轉化為直觀的圖形、圖表和地圖等&#xff0c;使數…

服務器被入侵的常見跡象有哪些?

&#x1f6a8; 服務器被入侵的常見跡象 &#x1f7e2; 一、系統和資源異常 CPU、內存或網絡流量異常飆高 即使沒有業務負載&#xff0c;資源長期占滿。 磁盤空間突然被寫滿 可疑大文件或日志暴漲。 系統負載顯著升高 uptime、top 顯示 load average 異常。 &#x1f7e1;…

日本生活:日語語言學校-日語作文-溝通無國界(5)-題目:我的一天

日本生活&#xff1a;日語語言學校-日語作文-溝通無國界&#xff08;5&#xff09;-題目&#xff1a;我的一天 1-前言2-作文原稿3-作文日語和譯本&#xff08;1&#xff09;日文原文&#xff08;2&#xff09;對應中文&#xff08;3&#xff09;對應英文 4-老師評語5-自我感想&…

前端領域的技術熱點與深度解析

&#x1f525; 一、框架革新&#xff1a;React、Vue、Svelte 的進化方向 React 19 實驗版 Server Components 深化&#xff1a;支持流式渲染與異步狀態管理&#xff0c;SSR 性能提升40%。 并發模式優化&#xff1a;減少渲染阻塞&#xff0c;復雜交互場景延遲降低35%。 Vue 3…

【unity游戲開發——網絡】網絡游戲通信方案——強聯網游戲(Socket長連接)、 弱聯網游戲(HTTP短連接)

注意&#xff1a;考慮到熱更新的內容比較多&#xff0c;我將熱更新的內容分開&#xff0c;并全部整合放在【unity游戲開發——網絡】專欄里&#xff0c;感興趣的小伙伴可以前往逐一查看學習。 文章目錄 一、聯網游戲類型劃分二、核心通信協議對比三、開發選擇指南專欄推薦完結 …

Java-60 深入淺出 分布式服務Paxos 算法優化 如何保證Paxos算法的活性

點一下關注吧&#xff01;&#xff01;&#xff01;非常感謝&#xff01;&#xff01;持續更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持續更新中&#xff01;&#xff08;長期更新&#xff09; 目前2025年06月16日更新到&#xff1a; AI煉丹日志-29 - 字節…

一階線性雙曲型偏微分方程組的特征值與通解分析

問題3 求系統 U u + A U x = 0 U_u + A U_x = 0 Uu?+AUx?=0 的特征并寫出通解,其中矩陣 A A A 如下: A 1 = ( 3 2 1 0 2 1 0 0 1 ) , A 2 = ( 3 2 1 0 2 1 0 0 ? 1 ) , A_1 = \begin{pmatrix} 3 & 2 & 1 \\ 0 & 2 & 1 \\ 0 & 0 & 1 \end{pmatr…

解鎖AI無限潛能!景聯文科技數據產品矩陣再升級:多語言題庫、海量語料、垂域代碼庫,全面賦能大模型訓練

景聯文科技持續聚焦AI數據需求前沿&#xff0c;全新發布包含中文題庫數據集、英文題庫數據集、算法代碼數據庫、英文語料、中文語料、垂直領域數據、小語種數據在內的七大高質量數據集產品系列。 此次發布的數據集覆蓋廣泛的應用場景&#xff0c;通過嚴格的清洗與結構化處理&am…

OSPF(開放最短路徑優先)

一、ospf簡介 OSPF是基于鏈路狀態的內部網關協議&#xff0c;與距離矢量協議不同&#xff0c;鏈路狀態協議通告的是鏈路狀態而不是路由表。OSPF是用于自治系統&#xff08;AS&#xff09;內部的路由決策,特點有&#xff0c;收斂速度快&#xff0c;安全性好&#xff0c;避免環路…

全面擁抱vue3

Vue 3 性能全面解析&#xff1a;為何性能飛躍提升 Vue 3 在性能方面實現了質的飛躍&#xff0c;相比 Vue 2 在多個維度都有顯著提升。以下是 Vue 3 性能優化的全面解析&#xff1a; 一、核心架構優化 1. 響應式系統重寫&#xff08;Proxy 替代 defineProperty&#xff09; …

C#最佳實踐:考慮為類重寫ToString()方法

C#最佳實踐:考慮為類重寫ToString()方法 在 C# 編程的日常開發中,ToString()方法是一個既基礎又容易被忽視的重要成員。它是System.Object類的虛方法,所有類都繼承自System.Object,這意味著每個類都擁有ToString()方法。然而,默認的ToString()方法往往無法滿足實際需求,…

從0開始學習計算機視覺--Day05--優化

除了得到最小的W之外&#xff0c;如何節省這個探索最優W的過程&#xff0c;也是很重要的一點。假如把這個過程比作從山上的頂點開始下山&#xff0c;把圖中必定游玩的經典比作最優權重&#xff0c;那么節省的過程&#xff0c;就是找到下山的最短路徑的過程。而在下山的過程中&a…

OpenCV計算機視覺實戰(14)——直方圖均衡化

OpenCV計算機視覺實戰&#xff08;14&#xff09;——直方圖均衡化 0. 前言1. CLAHE 自適應均衡1.1 應用場景1.2 實現過程 2. 直方圖反向投影2.1 應用場景2.2 實現過程 3. 基于顏色的目標追蹤小結系列鏈接 0. 前言 在圖像處理與計算機視覺領域&#xff0c;直方圖技術是最直觀且…

基于uniapp的老年皮膚健康管理微信小程序平臺(源碼+論文+部署+安裝+售后)

感興趣的可以先收藏起來&#xff0c;還有大家在畢設選題&#xff0c;項目以及論文編寫等相關問題都可以給我留言咨詢&#xff0c;我會一一回復&#xff0c;希望幫助更多的人。 系統背景 近年來&#xff0c;我國人口老齡化進程不斷加快&#xff0c;據國家統計局數據顯示&#…

MySQL(106)如何設計分片鍵?

設計分片鍵&#xff08;Sharding Key&#xff09;是數據庫分片的核心&#xff0c;它決定了將數據分配到不同分片的方式。一個好的分片鍵應該能夠均衡地分布數據&#xff0c;避免熱點問題&#xff0c;提高查詢性能。下面將詳細介紹如何設計分片鍵&#xff0c;并結合代碼進行說明…

汽車一鍵啟動升級手機控車

汽車一鍵啟動升級手機控車實現手機遠程啟動&#xff0c;不改變原車任何功能且全部免接線。升級后原車遙控器能在有效范圍內啟動車輛。移動管家手機控車一鍵啟動系統用手機遠程控制&#xff0c;完美兼容原車遙控器。支持長安、別克、寶馬、奧迪等眾多系列車型&#xff0c;市場99…

【開源項目】「安卓原生3D開源渲染引擎」:Sceneform?EQR

「安卓原生3D開源渲染引擎」&#xff1a;Sceneform?EQR 渲染引擎 “那一夜凌晨3點&#xff0c;第一次提交 PR 的手在抖……”——我深刻體會這種忐忑與激動。 倉庫地址&#xff1a;(https://github.com/eqgis/Sceneform-EQR)。 一、前言&#xff1a;開源對我意味著什么 DIY 的…

建造者模式 - Flutter中的樂高大師,優雅組裝復雜UI組件!

痛點場景&#xff1a;復雜的對話框配置 假設你需要創建一個多功能對話框&#xff1a; CustomDialog(title: 警告,content: 確定要刪除嗎&#xff1f;,titleStyle: TextStyle(fontSize: 20, color: Colors.red),contentStyle: TextStyle(fontSize: 16),backgroundColor: Color…

基于Java+Spring Boot的大學校園生活信息平臺

源碼編號&#xff1a;S559 源碼名稱&#xff1a;基于Spring Boot的大學校園生活信息平臺 用戶類型&#xff1a;雙角色&#xff0c;用戶、管理員 數據庫表數量&#xff1a;17 張表 主要技術&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven 運行環境&#xff1a;Wind…