from tabnanny import verbose import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import xgboost from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.ensemble import RandomForestRegressor from xgboost import XGBRegressor from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error, confusion_matrix, accuracy_score from 实验1 import param_grid # 解决中文显示问题 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # ----------------------------- 1. 数据加载与预处理 ----------------------------- def load_and_preprocess_data(): """加载数据并执行预处理""" df = pd.read_excel('.che22.xlsx') # 处理缺失值(将'暂无'替换为NaN) df.replace('暂无', np.nan, inplace=True) # 字段格式转换 df['售价'] = df['售价'].str.replace('万', '').astype(float) df['新车指导价'] = df['新车指导价'].str.replace('万', '').astype(float) df['里程'] = df['里程'].str.replace('万公里', '').astype(float) df['过户次数'] = df['过户次数'].str.replace('次', '').astype(float) # 提取品牌前4字符(如“奔驰GLC” → “奔驰”) df['品牌'] = df['品牌'].str[:4] # 更合理的品牌提取方式 # 计算车龄(修复空值问题) current_year = pd.Timestamp.now().year df['上牌时间'] = pd.to_numeric(df['上牌时间'].str[:4], errors='coerce') # 转换为年份数字 df['车龄'] = current_year - df['上牌时间'] # 排量处理(正则提取数值 + 填充均值) df['排量'] = df['排量'].astype(str).str.extract(r'(\d+\.?\d*)', expand=False).astype(float) df['排量'].fillna(df['排量'].mean(), inplace=True) # 删除重复项 df.drop_duplicates(inplace=True) df.reset_index(drop=True, inplace=True) return df # 加载数据 df = pd.read_excel('./che22.xlsx') # ----------------------------- 2. 探索性数据分析(EDA) ----------------------------- # 箱线图:检测异常值 fig, ax = plt.subplots(1, 2, figsize=(16, 6)) df.boxplot(column=['里程'], ax=ax[0], flierprops={'marker': 'o', 'markerfacecolor': 'red', 'markersize': 4}) df.boxplot(column=['售价'], ax=ax[1], flierprops={'marker': 'o', 'markerfacecolor': 'red', 'markersize': 4}) plt.suptitle('里程与售价异常值检测') plt.show()
时间: 2025-07-10 10:41:31 浏览: 14
<think>好的,我需要回答用户关于如何正确加载、清洗和检测二手车销售数据的问题。首先,根据用户的引用内容,数据集是“used_car_train_20200313.csv”,所以第一步是数据加载。用户提到使用Python的话可能需要pandas库,记得要检查路径是否正确,编码方式可能有中文或其他字符,可能需要用encoding参数指定,比如'utf-8'或'gbk'。同时,还要查看数据的前几行和基本信息,如shape、info()、describe(),这些能帮助了解数据结构和缺失情况。
接下来是数据清洗。用户提到的缺失值处理,应该先统计各列的缺失比例,然后根据情况处理。比如,品牌、车型这类重要字段如果缺失太多可能需要删除行,而数值型字段如里程数可以考虑用均值或中位数填充。另外,异常值检测方面,用户想检测价格、公里数这些数值变量。可以用箱线图或3σ原则找出离群点。比如价格过低或过高可能是异常,需要结合业务背景判断是否合理。
然后是数据类型的转换,比如制造年份应该是日期类型,但可能以整数存储,可能需要转换或分箱处理。分类变量如品牌、车型可能需要编码,比如用LabelEncoder或OneHotEncoder。还有重复值处理,用duplicated()和drop_duplicates()来处理。
在探索性分析部分,用户可能想了解不同品牌的价格分布,公里数与价格的关系,年份对价格的影响等。可视化方面,可以用直方图、散点图、折线图,比如引用[2]提到的公里数与数量的折线图。此外,相关性分析可以帮助找出影响价格的主要因素,比如用相关系数矩阵或热力图。
需要注意的是,预处理时要分步骤进行,每一步处理完后都要检查数据,比如用head()或info()确认更改是否正确。异常值的处理可能需要业务知识,比如二手车的价格不可能为负数,或者里程数过高可能不现实,需要根据实际情况判断是否删除或修正。
最后,还要考虑数据预处理的流程是否可复现,比如保存清洗后的数据到新文件,方便后续分析。可能还需要处理文本数据,比如车型中的特殊字符或统一大小写,确保数据一致性。整个过程需要仔细记录每个步骤,方便回溯和调整。</think>### 二手车数据加载、预处理及探索性数据分析步骤
#### 一、数据加载
1. **文件读取**
使用Python的`pandas`库加载CSV文件,并检查编码格式(如`utf-8`或`gbk`):
```python
import pandas as pd
df = pd.read_csv('used_car_train_20200313.csv', encoding='gbk')
```
2. **初步数据预览**
- 查看前5行:`df.head()`
- 检查数据维度:`df.shape`
- 查看列名和数据类型:`df.info()`
- 数值型字段统计摘要:`df.describe()`
(引用[3]提到需先预览数据基本信息[^3])
---
#### 二、数据清洗
1. **缺失值处理**
- 统计缺失比例:`df.isnull().sum() / len(df)`
- **处理策略**:
- 若字段缺失率>30%(如“事故历史”),考虑删除该列
- 数值型字段(如“里程数”)用中位数填充:`df['mileage'].fillna(df['mileage'].median(), inplace=True)`
- 分类字段(如“品牌”)用众数填充:`df['brand'].fillna(df['brand'].mode()[0], inplace=True)`
2. **异常值检测**
- **数值型变量(价格、公里数)**:
- 箱线图分析:`sns.boxplot(x=df['price'])`
- 3σ原则:过滤`|值-均值| > 3*标准差`的数据
- 业务逻辑判断:如价格低于1000元或高于200万元视为异常
- **文本型变量(车型、品牌)**:
- 检查无效字符(如“##N/A”),统一命名格式
3. **重复值处理**
```python
df.drop_duplicates(inplace=True)
```
4. **数据类型转换**
- 将“制造年份”转为时间格式:`pd.to_datetime(df['year'], format='%Y')`
- 分类变量编码(如品牌):`pd.get_dummies(df['brand'])`
---
#### 三、探索性分析(EDA)
1. **单变量分析**
- 价格分布直方图:`plt.hist(df['price'], bins=50)`
- 品牌频次统计:`df['brand'].value_counts().plot(kind='bar')`
2. **多变量分析**
- 公里数与价格关系:散点图`plt.scatter(df['mileage'], df['price'])`
- 不同品牌平均价格对比:`df.groupby('brand')['price'].mean().sort_values()`
3. **相关性分析**
```python
corr_matrix = df[['price','mileage','year']].corr()
sns.heatmap(corr_matrix, annot=True)
```
(引用[2]提到可通过可视化分析公里数与车辆数量关系[^2])
---
#### 四、注意事项
1. **流程记录**:保存清洗后的数据到新文件(如`cleaned_data.csv`)
2. **反爬兼容性**:若数据来源于爬虫,需检查格式一致性(引用[4]强调预处理需考虑异常处理[^4])
---
阅读全文
相关推荐


















