数据分析EDA和特征工程

python 复制代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import datetime
import warnings

1. pandas → 数据处理的 "Excel 神器"

  • 核心作用:处理表格数据(CSV、Excel 文件),做数据清洗、筛选、统计、合并等,是数据分析的 "主力"。
  • 可以把它理解成 Python 版的 Excel,而且功能强 100 倍
  • 常用场景:读文件、看数据、筛选数据、处理缺失值、统计指标。
python 复制代码
# 1. 读入数据(比如你的信用评分数据集)
df = pd.read_csv("credit_data.csv")  # 读csv文件
df = pd.read_excel("credit_data.xlsx")  # 读excel文件

# 2. 看数据基本信息
print(df.head())       # 看前5行数据
print(df.info())       # 看列名、数据类型、缺失值
print(df.describe())   # 看数值列的统计(均值、最大/最小等)

# 3. 简单筛选和处理
print(df[df["age"] > 30])  # 筛选年龄大于30的用户
df.fillna(0, inplace=True) # 把缺失值用0填充

2. numpy → 数值计算的 "数学工具包"

  • 核心作用:做高效的数值计算,尤其是数组、矩阵运算,很多其他库(pandas、sklearn)都依赖它。
  • 可以把它理解成 Python 里的 "计算器 + 数组工具"
  • 常用场景:生成数据、数学运算、数组操作、和 pandas 配合处理数据。
python 复制代码
import numpy as np

# 1. 生成数组
arr = np.array([1, 2, 3, 4, 5])
print(arr * 2)  # 数组每个元素都乘2 → [2 4 6 8 10]

# 2. 常用数学计算
print(np.mean(arr))  # 平均值
print(np.max(arr))   # 最大值
print(np.min(arr))   # 最小值
print(np.log(10))    # 自然对数,评分卡公式里就用到了这个!

3. matplotlib.pyplot → 画图的 "基础画笔"

  • 核心作用:Python 最基础的画图库,用来画各种图表(折线图、柱状图、散点图、直方图等),是所有可视化的 "地基"。
  • 你可以把它理解成 Python 里的 "画板和画笔"
  • 常用场景:画基础图表、设置图的标题 / 坐标轴、保存图片。
python 复制代码
import matplotlib.pyplot as plt

# 画一个简单的柱状图
x = ["A", "B", "C", "D"]
y = [10, 20, 15, 25]

plt.bar(x, y)  # 画柱状图
plt.title("示例柱状图")  # 设置标题
plt.xlabel("类别")       # 设置x轴标签
plt.ylabel("数值")      # 设置y轴标签
plt.show()  # 显示图片

4. seaborn → 美化画图的 "高级画笔"

  • 核心作用:基于 matplotlib 的高级可视化库,画出来的图更美观、更专业,而且画统计图表(比如箱线图、热力图、分布直方图)特别方便。
  • 可以把它理解成 matplotlib 的 "美颜滤镜 + 高级模板"
  • 常用场景:EDA 里画分布、相关性热力图、箱线图,比 matplotlib 写起来更简单。
python 复制代码
import seaborn as sns

# 画箱线图(看数据分布和异常值,风控里很常用)
sns.boxplot(x="target", y="age", data=df)  # target是好坏用户标签
plt.show()

# 画相关性热力图(看变量之间的相关性)
corr = df.corr()
sns.heatmap(corr, cmap="coolwarm", annot=True)
plt.show()
  • pandas读入数据、清洗数据、处理缺失值
  • numpy做数值计算、统计指标
  • datetime处理数据里的时间字段
  • matplotlibseaborn画各种图表,做可视化分析

什么是特征工程?

把手里的原始数据,加工成模型喜欢的 "好特征",让模型更容易学、学得更好

主要包括:

  • 处理文本 / 类别数据(比如 "性别:男 / 女" 转成数字)
  • 特征选择(挑出对模型有用的特征,去掉没用的)
  • 特征缩放(把数值缩到同一个范围)
  • 缺失值处理、异常值处理等
python 复制代码
# 基础数据处理
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import datetime
from tqdm import tqdm  # 进度条,让循环过程更直观

# 【核心特征工程相关】
from sklearn.preprocessing import LabelEncoder
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
from sklearn.preprocessing import MinMaxScaler

# 模型(后面建模用,和特征工程暂时无关)
import xgboost as xgb
import lightgbm as lgb
from catboost import CatBoostRegressor

# 模型评估与交叉验证
from sklearn.model_selection import StratifiedKFold, KFold
from sklearn.metrics import accuracy_score, f1_score, roc_auc_score, log_loss

MinMaxScaler:把数值缩到 0~1 之间

很多数值特征的范围不一样,比如:

  • 年龄:18~60
  • 收入:3000~50000

模型训练时,数值大的特征会 "抢权重",比如收入的数值大,模型就会更关注收入,忽略年龄。MinMaxScaler 会把所有特征缩到 0~1 之间,消除数值范围的影响,让模型公平对待每个特征。

公式:

X_scaled = (X - X.min()) / (X.max() - X.min())

python 复制代码
from sklearn.preprocessing import MinMaxScaler
import pandas as pd

data = pd.DataFrame({
    "age": [20, 30, 40, 50],
    "income": [3000, 8000, 15000, 30000]
})

scaler = MinMaxScaler()
data_scaled = scaler.fit_transform(data)
print(data_scaled)
# 输出结果:
# [[0.         0.        ]
#  [0.33333333 0.17241379]
#  [0.66666667 0.4137931 ]
#  [1.         1.        ]]

3. SelectKBest + chi2:帮你挑出 "最有用" 的特征

有很多特征(比如几十上百个),里面有些特征对模型没什么用,甚至会干扰模型。SelectKBest 会根据指定的评分方法,帮你选出对目标变量(比如 "是否违约")最有用的前 K 个特征。chi2 是它的一种评分方法(卡方检验),专门用来衡量类别特征和类别目标变量之间的相关性,相关性越高,特征越有用。

python 复制代码
from sklearn.feature_selection import SelectKBest, chi2
import pandas as pd

# 示例数据:特征 + 目标变量(0=不违约,1=违约)
X = pd.DataFrame({
    "gender": [0,1,0,1,0,1],
    "age": [20,30,40,50,25,35],
    "useless_feature": [1,1,1,1,1,1]  # 完全没用的特征
})
y = [0,0,1,1,0,1]

# 选前2个最好的特征
selector = SelectKBest(score_func=chi2, k=2)
X_new = selector.fit_transform(X, y)

# 查看哪些特征被选中了
print(selector.get_support())  # 输出:[ True  True False ]
print(X.columns[selector.get_support()])  # 输出:Index(['gender', 'age'], dtype='object')

模型评估方法:

假设有一份1000 条用户数据(其中好用户 800 条,坏用户 200 条,比例 4:1),要训练一个信用评分模型,需要划分训练集和测试集。


① 留出法(Holdout)

核心思想:一刀切开,一分为二

  • 训练集(用来教模型)
  • 测试集(用来检验模型效果)

举个例子

我们按 8:2 划分:

  • 训练集:800 条(其中好用户 640 条,坏用户 160 条,保持 4:1 的比例,这就是分层采样)
  • 测试集:200 条(其中好用户 160 条,坏用户 40 条)

步骤拆解

  1. 按好 / 坏用户的比例,分层抽样,保证训练集和测试集的分布和原数据一致
  2. 用训练集训练模型
  3. 用测试集看模型效果(比如准确率、AUC)

优缺点

✅ 优点:简单粗暴,一次划分就能搞定,速度快❌ 缺点:只分一次,结果受划分影响大(比如刚好测试集里坏用户特别少,结果就不准)


② 交叉验证法(K 折交叉验证)

核心思想:反复切分,取平均

把数据分成 K 份,轮流拿其中 1 份当测试集,剩下的当训练集,重复 K 次,最后取平均结果。最常用的是 10 折交叉验证

举个例子(10 折交叉验证)

还是那 1000 条数据,按好 / 坏用户分层,分成 10 份,每份 100 条(其中好用户 80 条,坏用户 20 条):

  1. 第 1 次:用第 1 份当测试集,剩下 9 份训练 → 得到第 1 个结果
  2. 第 2 次:用第 2 份当测试集,剩下 9 份训练 → 得到第 2 个结果
  3. ...
  4. 第 10 次:用第 10 份当测试集,剩下 9 份训练 → 得到第 10 个结果
  5. 最终:把 10 次的结果取平均值,就是模型的最终效果

留一法(K=1 的特殊情况)

如果数据特别少,比如只有 10 条数据:

  • 每次拿 1 条当测试集,剩下 9 条训练,重复 10 次
  • 特点:划分最公平,但数据量大的时候速度极慢,几乎不用

优缺点

✅ 优点:结果稳定,不容易被一次划分带偏,能更客观地评估模型❌ 缺点:要训练 K 次,速度比留出法慢很多


③ 自助法(Bootstrap)

核心思想:有放回抽样,数据少的时候用

从数据里有放回地抽样本,组成训练集,没被抽到的当测试集。

还是 1000 条数据:

  1. 有放回地抽 1000 次,每次抽 1 条,组成一个新的训练集
    • 因为是有放回,有的样本会被抽中多次,有的一次都没被抽到
    • 理论上,大约有 36.8% 的样本没被抽到(这就是测试集)
  2. 用抽到的样本训练模型
  3. 用没被抽到的样本测试模型

优缺点

✅ 优点:数据量特别少的时候也能用,不用硬切分❌ 缺点:训练集里有重复样本,会引入偏差,数据量充足时不推荐用

场景 推荐方法
数据量很大(比如上万条) 留出法(8:2/7:3),速度快
数据量中等,想结果更稳定 K 折交叉验证(常用 10 折)
数据量特别少(比如几百条) 自助法 或 留一法
相关推荐
babe小鑫2 小时前
2026年人力资源数据分析的技术价值与应用前景
数据挖掘·数据分析
hhb_6182 小时前
R语言数据分析与可视化实战指南
开发语言·数据分析·r语言
babe小鑫3 小时前
2026财务岗学数据分析的可行性分析
数据挖掘·数据分析
babe小鑫14 小时前
2026数字营销学数据分析的价值分析
数据挖掘·数据分析
2401_8274999917 小时前
数据分析学习05(黑马)-Pandas
学习·数据分析·pandas
MediaTea1 天前
AI 术语通俗词典:召回率(分类)
人工智能·算法·机器学习·分类·数据挖掘
2401_827499991 天前
数据分析学习06(黑马)-Matplotlib
学习·数据分析·matplotlib
YangYang9YangYan1 天前
2026数字化转型时代学数据分析的技术价值
数据挖掘·数据分析
AI科技星1 天前
算子数学|独立完整学科章节(百条原创公式· ROOT传世定稿)
大数据·算法·机器学习·数学建模·数据挖掘·量子计算