汽车数据集清洗与分析实战:从Pandas处理到品牌洞察
2026/9/12 23:03:57 网站建设 项目流程

1. 项目概述与数据背景

汽车数据集分析是数据科学领域极具实用价值的实战项目。这次我们要处理的是一个包含多种品牌汽车信息的结构化数据集,字段可能包括品牌、型号、年份、价格、里程数、发动机类型等常见属性。这类数据通常来源于二手车交易平台、汽车评测网站或企业内部销售系统。

在实际业务场景中,这类分析可以帮助经销商了解市场供需关系,辅助消费者做出购买决策,或者为制造商提供产品改进依据。但原始数据往往存在各种质量问题:缺失值、异常价格、重复记录、品牌名称不一致(比如"BMW"和"宝马"混用)等。这就是为什么我们需要系统化的数据清洗流程。

2. 数据清洗全流程解析

2.1 数据质量诊断

首先我们需要对数据集进行全面"体检"。使用Python的Pandas库可以快速生成数据质量报告:

import pandas as pd # 加载数据集 df = pd.read_csv('auto_data.csv') # 基础信息概览 print(df.info()) # 统计缺失值 missing_values = df.isnull().sum() print(missing_values[missing_values > 0]) # 数值型字段描述统计 print(df.describe())

关键诊断点包括:

  • 各字段缺失值比例(超过30%的字段可能需要特殊处理)
  • 数值字段的分布情况(通过describe()查看最小值、最大值、四分位数)
  • 文本字段的唯一值数量(品牌名称是否标准化)

2.2 缺失值处理实战

汽车数据集中常见的缺失情况包括:

  • 价格字段缺失(约5-10%的记录)
  • 里程数为空(特别是较新的车型)
  • 某些配置信息未填写(如天窗、导航等)

处理方法需要根据字段特性决定:

# 价格使用同品牌同年份车型的中位数填充 df['price'] = df.groupby(['brand','year'])['price'].transform( lambda x: x.fillna(x.median())) # 里程数缺失且年份较新的记录填充为0 df.loc[(df['mileage'].isna()) & (df['year'] >= 2020), 'mileage'] = 0 # 配置类字段缺失视为"无该配置" config_cols = ['sunroof','navigation','leather_seats'] df[config_cols] = df[config_cols].fillna(False)

重要提示:对于关键字段(如价格),填充后应添加标记列(如price_imputed)记录哪些值是估算的,避免后续分析产生偏差。

2.3 异常值检测与处理

汽车数据中典型的异常值包括:

  • 价格异常高/低(可能是单位错误,如美元/人民币混淆)
  • 里程数与年份不匹配(3年车龄但里程20万公里)
  • 发动机排量超出合理范围

使用分位数和业务规则结合的方法检测:

# 价格异常检测 Q1 = df['price'].quantile(0.25) Q3 = df['price'].quantile(0.75) IQR = Q3 - Q1 price_outliers = df[(df['price'] < Q1 - 1.5*IQR) | (df['price'] > Q3 + 1.5*IQR)] # 里程-年份合理性检查 df['miles_per_year'] = df['mileage'] / (2023 - df['year']) unreasonable = df[df['miles_per_year'] > 30000] # 年均超过3万英里视为异常

处理方案建议:

  • 确认是否为录入错误(如多输一个0)
  • 对确认的异常值,可用品牌+车型+年份分组的中位数替换
  • 极端异常且无法修正的记录应考虑删除

2.4 文本字段标准化

品牌名称的混乱是常见问题:

  • 大小写不一致(Toyota vs TOYOTA)
  • 简写与全称(VW vs Volkswagen)
  • 多语言混合(奔驰 vs Benz)

建立品牌映射字典进行统一:

brand_mapping = { 'vw': 'Volkswagen', 'benz': 'Mercedes-Benz', 'bmw': 'BMW', 'toyota': 'Toyota', # 其他品牌映射... } df['brand'] = df['brand'].str.lower().map(brand_mapping).fillna(df['brand'])

3. 品牌分布深度分析

3.1 基础品牌统计

清洗后的数据可以进行有意义的品牌分析了:

import matplotlib.pyplot as plt # 品牌数量分布 brand_counts = df['brand'].value_counts() # 可视化前20品牌 brand_counts[:20].plot(kind='barh', figsize=(10,6)) plt.title('Top 20 Car Brands by Count') plt.xlabel('Number of Listings') plt.show()

3.2 品牌价格对比

分析各品牌的价格分布能揭示市场定位:

# 按品牌分组价格统计 brand_price = df.groupby('brand')['price'].agg(['median','mean','count']) brand_price = brand_price[brand_price['count'] > 30] # 过滤样本量小的品牌 # 价格最高的10个品牌 top10_expensive = brand_price.sort_values('median', ascending=False)[:10]

3.3 品牌-年份-价格三维分析

使用热力图展示品牌随年份的价格变化:

import seaborn as sns # 筛选主流品牌且车龄5-10年的数据 condition = (df['brand'].isin(top_brands)) & \ (df['year'].between(2013, 2018)) pivot_data = df[condition].pivot_table( index='brand', columns='year', values='price', aggfunc='median') plt.figure(figsize=(12,8)) sns.heatmap(pivot_data, annot=True, fmt=".0f", cmap="YlGnBu") plt.title('Median Price by Brand and Year') plt.show()

4. 高级分析技巧

4.1 品牌市场占有率趋势

计算各品牌在不同年份的市场份额变化:

# 按年份和品牌计数 year_brand_counts = df.groupby(['year','brand']).size().unstack() # 计算年度占比 year_brand_pct = year_brand_counts.div(year_brand_counts.sum(axis=1), axis=0) # 可视化前5品牌趋势 top5_brands = year_brand_pct.mean().sort_values(ascending=False).index[:5] year_brand_pct[top5_brands].plot(figsize=(10,6)) plt.title('Market Share Trend of Top 5 Brands') plt.ylabel('Percentage') plt.show()

4.2 品牌溢价分析

通过回归分析量化品牌对价格的影响:

import statsmodels.api as sm # 准备虚拟变量 df_with_dummies = pd.get_dummies(df, columns=['brand'], drop_first=True) # 选择特征和目标变量 features = [col for col in df_with_dummies.columns if col.startswith('brand_')] features += ['year', 'mileage'] X = df_with_dummies[features] y = df_with_dummies['price'] # 添加常数项 X = sm.add_constant(X) # 拟合模型 model = sm.OLS(y, X).fit() print(model.summary())

5. 实战经验与避坑指南

5.1 数据清洗常见陷阱

  1. 过度清洗问题

    • 不要机械地删除所有缺失值,要分析缺失模式
    • 示例:电动车没有发动机排量字段是合理的缺失
  2. 品牌合并误区

    • 不要将不同子品牌随意合并(如雷克萨斯不应合并到丰田)
    • 豪华版与普通版应视为不同车型
  3. 时间处理陷阱

    • 注意数据采集时间与车辆年份的关系
    • 2023年采集的数据中,2024款车辆可能是预售

5.2 分析优化建议

  1. 价格分析技巧

    • 使用对数变换处理价格的正偏态分布
    • 按地区分层分析(不同城市品牌偏好不同)
  2. 可视化最佳实践

    • 品牌分布图按数量降序排列
    • 箱线图比柱状图更适合展示价格分布
  3. 性能优化

    • 对大型数据集使用Dask替代Pandas
    • 分类字段转换为category类型节省内存
# 内存优化示例 df['brand'] = df['brand'].astype('category') df['model'] = df['model'].astype('category')

5.3 项目扩展方向

  1. 增加车型级别分析(SUV、轿车等)
  2. 结合地理数据研究区域分布
  3. 构建价格预测模型
  4. 分析配置组合对价格的影响

清洗后的数据集和完整分析代码建议保存为以下结构:

/project /data raw_data.csv cleaned_data.csv /notebooks 1_data_cleaning.ipynb 2_brand_analysis.ipynb /output brand_distribution.png price_heatmap.png

这个项目展示了如何从原始汽车数据中提取有价值的品牌洞察。在实际操作中,我发现品牌名称的标准化往往需要多次迭代,建议建立一个可维护的映射表。另外,不同地区的数据可能需要不同的清洗规则,比如美国的里程单位是英里,而中国是公里,这些细节对分析结果影响很大。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询