【汽车市场数据分析与商业洞察项目(Python)】1
·
【汽车市场数据分析与商业洞察项目(Python)——数据爬取 - CSDN App】https://blog.csdn.net/m0_74617873/article/details/155431323?sharetype=blogdetail&shareId=155431323&sharerefer=APP&sharesource=m0_74617873&sharefrom=link
【【汽车市场数据分析与商业洞察项目(Python)】2 】https://blog.csdn.net/m0_74617873/article/details/155430773?sharetype=blogdetail&shareId=155430773&sharerefer=APP&sharesource=m0_74617873&sharefrom=link
【【汽车市场数据分析与商业洞察项目(Python)】3】https://blog.csdn.net/m0_74617873/article/details/155430928?sharetype=blogdetail&shareId=155430928&sharerefer=APP&sharesource=m0_74617873&sharefrom=link
模块 1:数据清洗与预处理
2.1 分析目标
- 处理缺失值,确保数据完整性
- 检测并处理价格、销量等关键字段的异常值
- 规范数据格式(如上市时间转换为日期格式)
2.2 代码实现
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
from sklearn.preprocessing import MinMaxScaler
# 重新读取原始数据
df = pd.read_csv('./car_data.csv')
print("原始数据形状:", df.shape)
# 1. 缺失值处理
print("\n1. 缺失值处理")
print("-" * 30)
# 查看缺失值情况
missing_info = df.isnull().sum()
missing_percent = (df.isnull().sum() / len(df)) * 100
missing_df = pd.DataFrame({
'缺失数量': missing_info,
'缺失比例(%)': round(missing_percent, 2)
}).sort_values('缺失数量', ascending=False)
print("缺失值统计:")
print(missing_df[missing_df['缺失数量'] > 0])
# 处理策略:
# - 分类变量(厂商、车型、能源类型):用众数填充
# - 时间变量(上市时间):用中位数填充
df_clean = df.copy()
# 填充分类变量缺失值
for col in ['厂商', '车型', '能源类型']:
mode_val = df_clean[col].mode()[0]
df_clean[col].fillna(mode_val, inplace=True)
print(f"\n{col} 缺失值用众数 '{mode_val}' 填充")
# 填充上市时间缺失值(先转换为日期格式)
# 处理上市时间格式(如2025.09 → 2025-09-01)
def convert_date(date_str):
if pd.isna(date_str):
return None
try:
year, month = str(date_str).split('.')
return datetime(int(year), int(month), 1)
except:
return None
# 转换上市时间
df_clean['上市日期'] = df_clean['上市时间'].apply(convert_date)
# 用中位数填充上市日期缺失值
median_date = df_clean['上市日期'].median()
df_clean['上市日期'].fillna(median_date, inplace=True)
print(f"\n上市日期缺失值用中位数 '{median_date.strftime('%Y-%m-%d')}' 填充")
# 2. 异常值检测与处理(针对价格、销量字段)
print("\n2. 异常值检测与处理")
print("-" * 30)
numeric_cols = ['最低价', '最高价', '销量']
# 使用IQR方法检测异常值(修复round函数问题)
def detect_outliers_iqr(data, col):
Q1 = data[col].quantile(0.25)
Q3 = data[col].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers = data[(data[col] < lower_bound) | (data[col] > upper_bound)]
return outliers, lower_bound, upper_bound
# 检测每个数值字段的异常值
outlier_summary = {}
for col in numeric_cols:
outliers, lower, upper = detect_outliers_iqr(df_clean, col)
outlier_summary[col] = {
'异常值数量': len(outliers),
'占比(%)': round((len(outliers)/len(df_clean)*100), 2),
'下界': round(lower, 2),
'上界': round(upper, 2)
}
print(f"\n{col}:")
print(f" 正常范围: [{round(lower, 2)}, {round(upper, 2)}]")
print(f" 异常值数量: {len(outliers)} ({round((len(outliers)/len(df_clean)*100), 2)}%)")
# 异常值处理策略:采用缩尾处理(将异常值替换为上下界)
for col in numeric_cols:
_, lower, upper = detect_outliers_iqr(df_clean, col)
# 缩尾处理
df_clean[col] = np.clip(df_clean[col], lower, upper)
print(f"\n{col} 异常值已进行缩尾处理,超出范围值替换为边界值")
# 3. 数据标准化(便于后续分析)
print("\n3. 数据标准化")
print("-" * 30)
# 对销量进行标准化(0-1标准化)
scaler = MinMaxScaler()
df_clean['销量_标准化'] = scaler.fit_transform(df_clean[['销量']])
# 计算平均价格字段(业务常用指标)
df_clean['平均价格'] = (df_clean['最低价'] + df_clean['最高价']) / 2
df_clean['平均价格'] = round(df_clean['平均价格'], 2) # 保留2位小数
# 4. 数据质量验证
print("\n4. 数据清洗结果验证")
print("-" * 30)
print(f"清洗后数据形状: {df_clean.shape}")
print(f"缺失值总数: {df_clean.isnull().sum().sum()} (已完全处理)")
print(f"新增字段: 上市日期、销量_标准化、平均价格")
# 显示关键数值字段的清洗后统计
print("\n清洗后关键数值字段统计:")
print(round(df_clean[['最低价', '最高价', '平均价格', '销量', '销量_标准化']].describe(), 2))
# 保存清洗后的数据(便于后续分析使用)
df_clean.to_csv('/mnt/car_data_clean.csv', index=False, encoding='utf-8')
print(f"\n✅ 清洗后的数据已保存: car_data_clean.csv")
数据清洗报告: 1. 处理原始数据664条,包含11个字段,涵盖汽车销量、价格、厂商、能源类型等核心信息 2. 缺失值处理:采用众数填充分类变量(厂商、车型、能源类型),中位数填充时间变量(上市时间),缺失值率从0.75%降至0% 3. 异常值处理:使用IQR方法检测价格、销量字段异常值,采用缩尾处理确保数据合理性 4. 特征工程:新增平均价格、销量标准化、上市日期字段,为后续分析提供基础 5. 数据质量:清洗后数据无缺失值、异常值可控,数据完整性和准确性显著提升
更多推荐
所有评论(0)