news 2026/4/26 17:58:06

保姆级教程:用Python的Pandas和Seaborn玩转mpg汽车油耗数据集(附完整代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
保姆级教程:用Python的Pandas和Seaborn玩转mpg汽车油耗数据集(附完整代码)

Python数据分析实战:从Pandas基础到Seaborn可视化的完整指南

在数据科学领域,掌握基础工具的使用是每个入门者必须跨越的第一道门槛。Python生态中的Pandas和Seaborn库,就像数据分析师的瑞士军刀——简单却功能强大。本文将带你用这两个工具,从零开始探索经典的mpg汽车油耗数据集,完成一次完整的数据分析流程。

1. 环境准备与数据加载

在开始分析之前,我们需要确保环境配置正确。建议使用Anaconda创建独立的Python环境,避免依赖冲突。以下是所需的库及其版本要求:

# 基础环境配置 import pandas as pd # 版本≥1.0 import seaborn as sns # 版本≥0.11 import matplotlib.pyplot as plt # 版本≥3.0 print(f"Pandas版本: {pd.__version__}") print(f"Seaborn版本: {sns.__version__}")

Seaborn库内置了mpg数据集,我们可以直接加载:

# 加载数据集 mpg = sns.load_dataset('mpg') print(f"数据集形状: {mpg.shape}")

提示:如果网络连接不稳定导致加载失败,可以手动下载数据集并读取:

mpg = pd.read_csv('path_to_your_file/mpg.csv')

初次接触数据时,快速浏览数据结构至关重要:

# 初步查看数据 print(mpg.info()) print(mpg.head(3))

输出结果会显示数据集包含398条记录,每辆车有9个特征:

列名类型描述
mpgfloat64每加仑行驶英里数(油耗)
cylindersint64发动机气缸数
displacementfloat64发动机排量(立方英寸)
horsepowerobject发动机马力(注意类型问题)
weightint64车辆重量(磅)
accelerationfloat640-60mph加速时间(秒)
model_yearint64车型年份(19XX)
originobject生产地区(usa/japan/europe)
nameobject车辆品牌和型号

2. 数据清洗与预处理

原始数据很少完美无缺,清洗是数据分析不可或缺的环节。我们首先处理最明显的问题——horsepower列的数据类型和缺失值。

马力数据的特殊处理

# 检查horsepower列的特殊情况 print(mpg['horsepower'].unique()[-5:]) # 查看最后几个唯一值 # 将无法解析的值设为NaN mpg['horsepower'] = pd.to_numeric(mpg['horsepower'], errors='coerce') # 统计缺失值 print(f"马力缺失值数量: {mpg['horsepower'].isna().sum()}")

处理缺失值的常见策略包括删除、均值填充和中位数填充。对于这个数据集,我们选择中位数填充:

# 计算分组中位数(按气缸数分组) median_hp = mpg.groupby('cylinders')['horsepower'].transform('median') # 填充缺失值 mpg['horsepower'] = mpg['horsepower'].fillna(median_hp)

数据类型的转换与优化

为了后续分析方便,我们可以优化一些列的数据类型:

# 转换数据类型 mpg['model_year'] = mpg['model_year'].astype('int16') mpg['cylinders'] = mpg['cylinders'].astype('category') mpg['origin'] = mpg['origin'].astype('category') # 添加新特征:马力重量比 mpg['power_to_weight'] = mpg['horsepower'] / mpg['weight']

异常值检测

使用描述性统计快速识别潜在异常:

# 数值型变量的描述统计 print(mpg.describe().T) # 可视化箱线图检测异常值 plt.figure(figsize=(10,6)) sns.boxplot(data=mpg[['mpg', 'displacement', 'weight']]) plt.title('关键数值变量的分布情况') plt.show()

3. 探索性数据分析(EDA)

探索性分析是理解数据内在规律的关键步骤。我们从单变量分析开始,逐步深入到多变量关系。

单变量分布分析

# 设置可视化风格 sns.set_style("whitegrid") # 绘制油耗分布 plt.figure(figsize=(12,5)) plt.subplot(1,2,1) sns.histplot(data=mpg, x='mpg', kde=True, bins=30) plt.title('油耗分布直方图') plt.subplot(1,2,2) sns.boxplot(data=mpg, y='mpg', x='origin') plt.title('不同产地的油耗分布') plt.tight_layout() plt.show()

多变量关系探索

油耗与车辆特性的关系是我们关注的重点:

# 关键变量的相关性矩阵 corr_matrix = mpg.select_dtypes(include=['float64','int64']).corr() plt.figure(figsize=(8,6)) sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', center=0) plt.title('数值变量相关性热图') plt.show()

观察发现:

  • 油耗(mpg)与排量(displacement)、重量(weight)呈强负相关
  • 马力(horsepower)与排量高度相关
  • 加速度(acceleration)与马力负相关

分类变量分析

不同产地和气缸数的车辆表现差异:

# 不同产地车辆的平均特性 origin_stats = mpg.groupby('origin').agg({ 'mpg': ['mean', 'std'], 'horsepower': 'median', 'weight': 'mean' }).round(1) print(origin_stats)

输出表格显示:

originmpg_meanmpg_stdhorsepower_medianweight_mean
europe27.96.790.02433.3
japan30.56.380.02221.3
usa20.06.4110.03364.7

4. 高级可视化分析

Seaborn提供了丰富的可视化功能,能帮助我们更直观地发现数据中的模式和趋势。

散点图矩阵

# 选择关键变量绘制散点图矩阵 cols = ['mpg', 'displacement', 'horsepower', 'weight', 'acceleration'] sns.pairplot(mpg[cols], height=1.5, plot_kws={'alpha':0.6}) plt.suptitle('关键变量关系矩阵', y=1.02) plt.show()

分面网格可视化

# 按气缸数分面绘制油耗与排量关系 g = sns.FacetGrid(mpg, col='cylinders', col_wrap=3, height=4) g.map_dataframe(sns.scatterplot, x='displacement', y='mpg', hue='origin', alpha=0.7) g.add_legend() g.set_axis_labels('排量(立方英寸)', '油耗(MPG)') plt.subplots_adjust(top=0.9) g.fig.suptitle('不同气缸数下排量与油耗的关系') plt.show()

时间趋势分析

# 按年份分析油耗变化趋势 plt.figure(figsize=(12,6)) sns.lineplot(data=mpg, x='model_year', y='mpg', hue='origin', estimator='median', err_style='band', linewidth=2.5) plt.title('1970-1982年间不同产地车辆的油耗变化趋势') plt.xlabel('车型年份') plt.ylabel('油耗中位数(MPG)') plt.grid(True, alpha=0.3) plt.show()

回归分析图

# 油耗与重量的回归关系 plt.figure(figsize=(10,6)) sns.regplot(data=mpg, x='weight', y='mpg', scatter_kws={'alpha':0.4}, line_kws={'color':'red'}) plt.title('车辆重量与油耗的回归关系') plt.xlabel('重量(磅)') plt.ylabel('油耗(MPG)') plt.show()

5. 深入分析与洞察提取

在前面的基础上,我们可以进行更深入的分析,挖掘更有价值的洞察。

马力重量比分析

# 创建马力重量比分析 plt.figure(figsize=(12,6)) sns.scatterplot(data=mpg, x='power_to_weight', y='mpg', hue='origin', size='weight', sizes=(20,200), alpha=0.7) plt.title('马力重量比与油耗的关系') plt.xlabel('马力/重量 (hp/lb)') plt.ylabel('油耗(MPG)') plt.axvline(x=0.05, color='gray', linestyle='--', alpha=0.5) plt.text(0.051, 45, '性能分界线', color='gray') plt.show()

气缸数影响分析

# 气缸数对油耗的影响 plt.figure(figsize=(10,6)) sns.violinplot(data=mpg, x='cylinders', y='mpg', inner='quartile', palette='Set2') plt.title('不同气缸数车辆的油耗分布') plt.xlabel('气缸数') plt.ylabel('油耗(MPG)') plt.show()

多变量交互分析

# 三维关系分析:排量、重量与油耗 g = sns.relplot(data=mpg, x='displacement', y='weight', size='mpg', hue='origin', sizes=(20, 200), alpha=0.7, height=6, aspect=1.2) g.set_axis_labels('排量(立方英寸)', '重量(磅)') plt.title('排量、重量与油耗的三维关系') plt.show()

6. 完整代码整合与优化

将所有分析步骤整合到一个可执行的Python脚本中,并添加适当注释:

""" 完整的MPG数据分析脚本 包含数据加载、清洗、探索分析和可视化 """ import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 1. 数据加载与初步检查 mpg = sns.load_dataset('mpg') print(mpg.info()) # 2. 数据清洗 mpg['horsepower'] = pd.to_numeric(mpg['horsepower'], errors='coerce') median_hp = mpg.groupby('cylinders')['horsepower'].transform('median') mpg['horsepower'] = mpg['horsepower'].fillna(median_hp) # 3. 特征工程 mpg['power_to_weight'] = mpg['horsepower'] / mpg['weight'] mpg['model_year'] = mpg['model_year'].astype('int16') # 4. 可视化设置 sns.set_style("whitegrid") plt.figure(figsize=(10,6)) # 5. 核心分析可视化 sns.scatterplot(data=mpg, x='weight', y='mpg', hue='origin', alpha=0.7) plt.title('车辆重量与油耗关系(按产地分类)') plt.xlabel('重量(磅)') plt.ylabel('油耗(MPG)') plt.show() # 6. 保存处理后的数据 mpg.to_csv('processed_mpg.csv', index=False)

注意:在实际项目中,建议将不同分析步骤封装为函数,并使用Jupyter Notebook或Python脚本分步执行,便于调试和修改。

7. 常见问题与解决方案

在实际操作过程中,可能会遇到以下典型问题:

问题1:Seaborn图表显示中文乱码

解决方案:

# 设置中文字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # Windows系统 # plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] # Mac系统 plt.rcParams['axes.unicode_minus'] = False

问题2:大数据集可视化缓慢

优化建议:

  • 使用alpha参数设置透明度,避免点重叠
  • 对数据进行采样:df_sample = df.sample(frac=0.1)
  • 使用hexbin图替代散点图:
plt.hexbin(x=mpg['weight'], y=mpg['mpg'], gridsize=30, cmap='Blues') plt.colorbar()

问题3:分类变量排序混乱

解决方法:

# 指定分类顺序 cyl_order = sorted(mpg['cylinders'].unique()) sns.boxplot(data=mpg, x='cylinders', y='mpg', order=cyl_order)

问题4:重复代码过多

优化方案:将常用绘图配置封装为函数

def my_plot_settings(): """自定义绘图默认设置""" plt.rcParams['figure.figsize'] = (10,6) plt.rcParams['axes.titlesize'] = 14 plt.rcParams['axes.labelsize'] = 12 my_plot_settings() # 应用设置
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/26 17:57:02

OpenFace完整教程:5分钟掌握面部行为分析核心技术

OpenFace完整教程:5分钟掌握面部行为分析核心技术 【免费下载链接】OpenFace OpenFace – a state-of-the art tool intended for facial landmark detection, head pose estimation, facial action unit recognition, and eye-gaze estimation. 项目地址: https:…

作者头像 李华
网站建设 2026/4/26 17:54:45

终极指南:如何用TV Bro让智能电视变身全能上网神器

终极指南:如何用TV Bro让智能电视变身全能上网神器 【免费下载链接】tv-bro Simple web browser for android optimized to use with TV remote 项目地址: https://gitcode.com/gh_mirrors/tv/tv-bro 在智能电视上浏览网页,你是否还在忍受笨拙的鼠…

作者头像 李华
网站建设 2026/4/26 17:43:29

小米智能门锁临时密码管理:hass-xiaomi-miot数字组件实战指南

小米智能门锁临时密码管理:hass-xiaomi-miot数字组件实战指南 【免费下载链接】hass-xiaomi-miot Automatic integrate all Xiaomi devices to HomeAssistant via miot-spec, support Wi-Fi, BLE, ZigBee devices. 小米米家智能家居设备接入Hass集成 项目地址: ht…

作者头像 李华
网站建设 2026/4/26 17:41:24

Docker运行AI代码总被入侵?揭秘3层隔离失效链及5分钟应急熔断方案

更多请点击: https://intelliparadigm.com 第一章:Docker Sandbox 运行 AI 代码隔离技术 面试题汇总 Docker Sandbox 是当前 AI 工程化部署中保障安全执行的关键实践,尤其适用于模型推理服务、用户提交代码沙箱(如在线编程平台、…

作者头像 李华
网站建设 2026/4/26 17:40:20

Keras词嵌入层应用与实战指南

1. 词嵌入层在Keras深度学习中的应用解析词嵌入(Word Embedding)是自然语言处理(NLP)中一种革命性的技术突破,它彻底改变了传统文本表示方式。想象一下,如果我们能让计算机像人类一样理解词语之间的微妙关系…

作者头像 李华