机器学习入门-数值特征-数据四分位特征 1.quantile(用于求给定分数位的数值) 2.plt.axvline(用于画出竖线) 3.pd.pcut(对特征进行分位数切分,生成新的特征)...

本文介绍了如何使用Python的pandas库对数据集中的特征进行四分位数划分,包括导入数据、绘制直方图、查找四分位数值、画竖线标识四分位,并使用pd.qcut函数创建新的四分位特征。

函数说明:

1.  .quantile(cut_list) 对DataFrame类型直接使用,用于求出给定列表中分数的数值,这里用来求出4分位出的数值

2.  plt.axvline()  # 用于画出图形中的竖线

3.  pd.qcut(feature, cut_list, labels)  用于对特征进行切分,cut_list切分的分数位置,labels切分后新的标签值 

我们可以根据某个特征的四分位数值,给定这个特征一个新的四分位数值的特征

四分位表示的是数值的中位数,1/4位和3/4位

比如,我们可以根据工资的四分位,给定工资一个新的四分位特征,这里的分数我们可以做出自我定义

代码:

      第一步:导入数据

      第二步:对数据中的收入特征画出直方图

      第三步:使用.quantile(cut_list) 找出cut_list分数对应的特征数值

      第四步:使用plt.axvline对四分位特征数值画竖线

      第五步:使用pd.qcut(data, cut_list, labels) 对收入特征做四分位切分,labels表示切分后新的标签名,不输入labels使用的是数值范围

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 第一步导入数据
fcc_survey_df = pd.read_csv('datasets/fcc_2016_coder_survey_subset.csv', encoding='utf-8')

# 第二步:对收入数据画直方图
fig, ax = plt.subplots()
fcc_survey_df['Income'].hist(bins=30, color='#A9C5D3')
ax.set_xlabel('Income', fontsize=10)
ax.set_ylabel('Frequency', fontsize=10)
ax.set_title('Frequency', fontsize=10)
plt.show()

   

# 第三步:使用.quantile 找出四分位处的数值,
cut_list = [0, 0.25, 0.5, 0.75, 1]
cut_income = fcc_survey_df['Income'].quantile(q=cut_list)
print(cut_income)

# 第四步:在上述图形的基础上使用plt.axvline画出竖线
fig, ax = plt.subplots()
fcc_survey_df['Income'].hist(bins=30, color='#A9C5D3')
colors = ['red', 'green', 'blue', 'yellow']
for i in range(0, 4):
    plt.axvline(cut_income[cut_list[i]], color=colors[i], label=str(cut_list[i])+'_line')
plt.legend(fontsize=14)
ax.set_xlabel('Income', fontsize=10)
ax.set_ylabel('Frequency', fontsize=10)
ax.set_title('Frequency', fontsize=10)
plt.show()

# 第五步:使用pd.qcut将原始特征转换为4分位数的特征
cut_labels = ['0-25Q', '25-50Q', '50-75Q', '75-100Q']
fcc_survey_df['cut_qua'] = pd.qcut(fcc_survey_df['Income'], cut_list)
fcc_survey_df['cut_qua_labels'] = pd.qcut(fcc_survey_df['Income'], cut_list, labels=cut_labels)
print(fcc_survey_df[['Income', 'cut_qua', 'cut_qua_labels']].head())

 

转载于:https://www.cnblogs.com/my-love-is-python/p/10322024.html

### 手动计算四分数的 MATLAB 方法 在 MATLAB 中,虽然有内置函数 `quantile` 和 `prctile` 可以方便地计算四分数,但如果需要手动实现这一功能,则可以通过排序数组并找到特定百分对应的值来完成。以下是详细的实现过程。 --- #### 1. **核心思路** - 首先对输入数据进行升序排序。 - 根据定义,第一四分($Q1$) 对应于第25百分,第二四分($Q2$, 即中) 对应于第50百分,第三四分($Q3$) 对应于第75百分- 百分置可通过公式 $\text{index} = p \times (n + 1)$ 计算,其中 $p$ 是目标百分(如 0.25 表示 $Q1$),而 $n$ 是数据长度[^1]。 - 若计算所得索引为整数,则直接取对应置的值;若为非整数,则采用插值法近似得结果。 --- #### 2. **MATLAB 实现代码** 以下是一个完全不依赖 `quantile` 函数的手动实现: ```matlab function [q1, q2, q3] = manual_quartiles(data) % 输入检查 if isempty(data) error(&#39;输入数据为空!&#39;); end % 去掉 NaN 值 data = data(~isnan(data)); % 排序数据 sorted_data = sort(data); n = length(sorted_data); % 数据点总数 % 定义百分置计算函数 percent_pos = @(percent) round(percent * (n + 1)); % 计算 Q1 (25%), Q2 (50%, 中), Q3 (75%)置 pos_q1 = percent_pos(0.25); pos_q2 = percent_pos(0.50); pos_q3 = percent_pos(0.75); % 插值处理 interpolate_value = @(pos) interp1(1:n, sorted_data, pos, &#39;linear&#39;, &#39;extrap&#39;); q1 = interpolate_value(pos_q1 / (n + 1) * n); % 第一四分数 q2 = interpolate_value(pos_q2 / (n + 1) * n); % 第二四分数(中数) q3 = interpolate_value(pos_q3 / (n + 1) * n); % 第三四分数 end ``` --- #### 3. **测试代码** 为了验证上述函数的正确性,可以运行以下测试脚本: ```matlab % 测试数据 test_data = [7, 15, 36, 39, 40, 41]; % 调用手动实现的函数 [q1_manual, q2_manual, q3_manual] = manual_quartiles(test_data); % 输结果 fprintf(&#39;手动计算:\n&#39;); fprintf(&#39;Q1 = %.2f\n&#39;, q1_manual); fprintf(&#39;Q2 = %.2f\n&#39;, q2_manual); fprintf(&#39;Q3 = %.2f\n&#39;, q3_manual); % 使用 quantile 函数作为对照 q1_builtin = quantile(test_data, 0.25); q2_builtin = quantile(test_data, 0.50); q3_builtin = quantile(test_data, 0.75); fprintf(&#39;\nbuilt-in quantile 函数计算:\n&#39;); fprintf(&#39;Q1 = %.2f\n&#39;, q1_builtin); fprintf(&#39;Q2 = %.2f\n&#39;, q2_builtin); fprintf(&#39;Q3 = %.2f\n&#39;, q3_builtin); ``` --- #### 4. **解释与注意事项** - 上述方法基于线性插值技术,在索引为非整数的情况下能够提供更加精确的结果[^2]。 - 不同软件(如 Excel、SPSS 和 MATLAB)对于百分位数的具体算法可能存在差异,因此最终结果可能会略有不同[^1]。 - 如果希望严格匹配其他工具的结果,需详细了解其内部实现细节,并据此调整插值逻辑或边界条件。 --- #### 5. **进一步扩展** 如果要支持更高维度的数据结构(例如二维矩阵),可沿指定方向逐列或逐行调用此函数。例如: ```matlab function quartiles_matrix = manual_quartiles_matrix(matrix, dim) % matrix: 输入矩阵 % dim: 指定操作的方向 (dim=1 沿列, dim=2 沿行) if nargin < 2 || isempty(dim) dim = 1; % 默认按列操作 end [rows, cols] = size(matrix); if dim == 1 quartiles_matrix = zeros(3, cols); for i = 1:cols col_data = matrix(:,i); [~, q2, ~] = manual_quartiles(col_data); quartiles_matrix(:,i) = [q1;q2;q3]; end elseif dim == 2 quartiles_matrix = zeros(rows, 3); for i = 1:rows row_data = matrix(i,:); [~, q2, ~] = manual_quartiles(row_data); quartiles_matrix(i,:) = [q1,q2,q3]; end else error(&#39;仅支持维度 12.&#39;); end end ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值