python分箱统计个数_【数据处理】python变量分箱常见手法:分类型、数值型、卡方、自定义...

本文介绍了Python中对数据进行分箱统计的方法,包括针对类别型和数值型特征的不同处理策略。对于类别型特征,当类别数量较少时直接按类别分箱,反之则建议降基处理。数值型特征,离散型可直接按非重复值分箱,连续型则可采用卡方或自定义分箱。此外,还讨论了如何处理缺失值和稀疏特征的分箱。文中提供了几个分箱函数,如`binning_cate`、`binning_self`、`binning_num`和`binning_sparse_col`,用于计算特征的分箱结果、IV值、WOE值等评估指标。
摘要由CSDN通过智能技术生成

"""

分箱逻辑:

1.类别型特征:

1)类别数在5个以下,可以直接根据类别来分箱 (binning_cate)

2)类别数在5个以上,建议做降基处理,再根据降基后的类别做分箱

2.数值型特征:

1)离散型数值特征(特征value的变动幅度较小):

若特征value的非重复计数在5个以下,可以直接根据非重复计数值来分箱(binning_cate)

若特征value的非重复计数在5个以上,建议根据业务解释或者数据分布做自定义分箱(binning_self)

2)连续型数值特征(特征value的变动幅度较大):

可以用卡方分箱或自定义分箱。(binning_num,binning_self)

PS:一些特征用卡方分可能会报错,建议这些特征改为手动自定义分箱

3.特征有缺失:

1)缺失率在5%以下,可以先对缺失做填充处理再分箱(binning_num)

2)缺失率在5%以上,建议将缺失当作一个类别来分箱(binning_sparse_col)

4.稀疏特征分箱

建议将稀疏值(一般为0)单独分为一箱,剩下的值做卡方或者自定义分箱(binning_sparse_col)

"""

def binning_cate(df, col, target):

"""

df:数据集

col:输入的特征

target:好坏标记的字段名

return:

bin_df :特征的评估结果

"""

total = df[target].count()

bad = df[target].sum()

good = total - bad

d1 = df.groupby([col], as_index=True)

d2 = pd.DataFrame()

d2['样本数'] = d1[target].count()

d2['黑样本数'] = d1[target].sum()

d2['白样本数'] = d2['样本数'] - d2['黑样本数']

d2['逾期用户占比'] = d2['黑样本数'] / d2['样本数']

d2['badattr'] = d2['黑样本数'] / bad

d2['goodattr'] = d2['白样本数'] / good

d2['WOE'] = np.log(d2['badattr'] / d2['goodattr'])

d2['bin_iv'] = (d2['badattr'] - d2['goodattr']) * d2['WOE']

d2['IV'] = d2['bin_iv'].sum()

bin_df =

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Python代码示例,用于将含有缺失值的数据进行卡方分箱: ```python import pandas as pd import numpy as np from scipy.stats import chi2_contingency def chisq_bin(data, col, target, max_bins=5, iv_min=0.02): """ 卡方分箱函数 :param data: 数据集 :param col: 需要分箱变量 :param target: 目标变量 :param max_bins: 最大分箱数 :param iv_min: 最小IV值 :return: 分箱结果 """ data = data[[col, target]].copy() data['missing'] = data[col].isnull().astype(int) data = data.groupby(['missing', target]).size().unstack().fillna(0) data.columns = ['neg', 'pos'] data['tot'] = data['neg'] + data['pos'] data['neg_prop'] = data['neg'] / data['neg'].sum() data['pos_prop'] = data['pos'] / data['pos'].sum() data['tot_prop'] = data['tot'] / data['tot'].sum() data['woe'] = np.log((data['neg'] / data['neg'].sum()) / (data['pos'] / data['pos'].sum())) data['iv'] = (data['neg_prop'] - data['pos_prop']) * data['woe'] iv = data['iv'].sum() if iv < iv_min: return None cut_points = [np.nan] while len(cut_points) < max_bins: data = data.sort_values('woe') x = np.array(data['neg']) y = np.array(data['pos']) xy = np.array([x, y]) chisq = chi2_contingency(xy)[0] p = chi2_contingency(xy)[1] if p < 0.05: cut_point = data.index[0] cut_points.append(cut_point) data = data.loc[cut_point:].copy() data['woe'] = np.log((data['neg'] / data['neg'].sum()) / (data['pos'] / data['pos'].sum())) data['iv'] = (data['neg_prop'] - data['pos_prop']) * data['woe'] iv = data['iv'].sum() if iv < iv_min: break else: break cut_points.append(np.inf) labels = range(len(cut_points) - 1) result = pd.cut(data[col], cut_points, labels=labels, include_lowest=True) return result ``` 这个函数将缺失值视为一个单独的类别,并根据卡方检验的结果将数据成多个箱子,返回一个Pandas Series对象,其中每个值表示变量分箱编号。您可以使用此结果来替换原始数据中的变量,然后使用OneHot编码或WOE编码等其他技术进一步处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值