Feature engineering-MANOVA分析+Boxplots

import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
from sklearn.feature_selection import f_classif

# 读取数据,指定第一行为标题
df = pd.read_csv('data.csv')

# 假设最后一列是因变量的数值列,这里用'target_value'作为示例列名
# 如果不知道列名,可以使用 df.columns[-1] 来获取最后一列的列名
#target_column = 'target_value'  # 替换为你的实际列名
target_column = df.columns[-1]  # 替换为你的实际列名

# 将最后一列的数值转换为类别(0或1)
df['target_category'] = df[target_column].apply(lambda x: 1 if x > 1000 else 0)

# 提取特征数据(除了因变量的数值列和转换后的类别列)
X = df.drop([target_column, 'target_category'], axis=1)

#多因素ANOVA分析
f_values, p_values = f_classif(X,df['target_category'])
for i in range(len(f_values)):
    #print (feature_name, f"Feature {i+1}: F-score={f_values[i]}, p-value={p_values[i]}")
    print (X.columns[i], f": F-score={f_values[i]}, p-value={p_values[i]}")

# 绘制F值的条形图
plt.figure(figsize=(10, 6))
bars = plt.bar(X.columns, f_values, color='skyblue')

# 在每个柱的顶部添加p值
for bar, p_value in zip(bars, p_values):
    if p_value > 0.05:
        plt.text(bar.get_x() + bar.get_width() / 2, bar.get_height(), f'{p_value:.3f}', ha='center', va='bottom', fontsize=8)

#plt.xlabel('Features')
plt.ylabel('F-values')
plt.title('ANOVA F-values and p-values for each feature')
plt.xticks(rotation=90)
plt.tight_layout()
plt.savefig(f'MANOVA.png')
plt.show()
plt.close()

#print (plt.style.available)
# 选择一种你喜欢的样式
#plt.style.use('ggplot')
#plt.style.use('seaborn-v0_8-poster')
plt.style.use('seaborn-v0_8-paper')

# 设置字体为Arial
plt.rcParams['font.family'] = 'sans-serif'

# 设置线宽
plt.rcParams['lines.linewidth'] = 10

num = 1

# 对于每个特征,绘制两类的箱型图并计算F得分
for feature_name in X.columns:
    # 根据因变量的类别将数据分为两类
    group0 = X[df['target_category'] == 0][feature_name]
    group1 = X[df['target_category'] == 1][feature_name]

    # 绘制箱型图
    plt.figure(figsize=(10, 7))
    box = plt.boxplot([group0, group1], labels=['inactive', 'active'], showmeans=True, patch_artist=True)
    #plt.title(f'Boxplot for Feature: {feature_name}', fontsize=16)
    #plt.xlabel('Activity', fontsize=14)
    plt.ylabel(feature_name, fontsize=16)

    # 设置标签的大小
    plt.setp(plt.gca().get_xticklabels(), 'fontsize', 14)
    plt.setp(plt.gca().get_yticklabels(), 'fontsize', 12)

    # 设置箱型的填充颜色
    #box['boxes'][0].set_facecolor('blue')
    #box['boxes'][1].set_facecolor('yellow')
    box['boxes'][0].set_facecolor((91/255,131/255,152/255))
    box['boxes'][1].set_facecolor((219/255,143/255,136/255))

    # 设置中位数线的颜色
    for median in box['medians']:
        median.set(color='black')

    # 设置均值线的颜色
    for mean in box['means']:
        mean.set(color='black')


    # 设置标签的大小
    plt.setp(plt.gca().get_xticklabels(), 'fontsize', 14)
    plt.setp(plt.gca().get_yticklabels(), 'fontsize', 12)

    # 设置图形大小
    plt.gcf().set_size_inches(4, 7)

    # 减少图片两端的空白
    plt.tight_layout()


    # 保存图形
    #plt.savefig(str(num) + f'_{feature_name}_boxplot.png')

    num += 1

    # 显示图形
    #plt.show()
    plt.close()

    # 计算t统计量和p值
    t_stat, p_value = stats.ttest_ind(group0, group1)

    # 打印结果
    print(f'T-statistic for Feature: {feature_name}: {t_stat:.2f}')
    print(f'P-value for Feature: {feature_name}: {p_value:.4f}\n')

    # 计算U统计量和p值
    u_stat, p_value = stats.mannwhitneyu(group0, group1)

    # 打印结果
    print(f'U-statistic for Feature: {feature_name}: {u_stat:.2f}')
    print(f'P-value for Feature: {feature_name}: {p_value:.4f}\n')

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值