You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Matplotlib绘制对数刻度直方图及拟合预测需求咨询

飞机维修数据:直方图绘制与拟合方程实现

一、绘制左偏钟形直方图

根据需求,提供两种直方图绘制方式,对应不同分析场景:

1. 每日人工占比的分布直方图

直接统计MTC_Daily_Lbr_percent的频数分布,呈现左偏钟形特征:

import matplotlib.pyplot as plt
import pandas as pd

# 加载数据(替换为你的数据加载方式,比如从csv/数据库读取)
df = pd.read_csv('maintenance_data.csv')

# 绘制直方图
plt.figure(figsize=(10, 6))
# bins数量可根据数据分布调整,edgecolor增强可读性
n, bins, patches = plt.hist(
    df['MTC_Daily_Lbr_percent'],
    bins=30,
    color='skyblue',
    edgecolor='black',
    alpha=0.7
)
plt.title('每日飞机维修人工占比分布')
plt.xlabel('每日人工占比(%)')
plt.ylabel('频数')
plt.grid(axis='y', alpha=0.3)
plt.show()

2. 按维修天数分组的占比分布直方图

如果需要观察不同维修天数下的人工占比变化,可按c_num_days分组后绘制:

# 按维修天数分组,计算每组的平均人工占比
grouped_data = df.groupby('c_num_days')['MTC_Daily_Lbr_percent'].mean()

plt.figure(figsize=(10, 6))
grouped_data.plot(kind='bar', color='salmon', edgecolor='black', alpha=0.7)
plt.title('不同维修天数对应的平均每日人工占比')
plt.xlabel('维修天数')
plt.ylabel('平均每日人工占比(%)')
plt.grid(axis='y', alpha=0.3)
plt.show()

二、生成可预测的拟合方程

针对维修天数(x)和每日人工占比(y)的关系,使用scipy.optimize.curve_fit实现左偏钟形曲线拟合,完整代码如下:

import numpy as np
from scipy.optimize import curve_fit

# 定义左偏钟形拟合函数(适配左偏+末尾微升特征)
def left_skew_model(x, a, b, c, d):
    # a: 峰值高度;b: 峰值对应的维修天数;c: 左半部分宽度;d: 右尾上升系数
    peak_part = a * np.exp(-((x - b) / c) ** 2)
    tail_part = d * np.power(x - b, 2) / (1 + np.power(x - b, 2))
    return peak_part + tail_part

# 提取数据
x_data = df['c_num_days'].values
y_data = df['MTC_Daily_Lbr_percent'].values

# 执行拟合,p0为参数初始猜测值(可根据数据范围调整)
params, params_cov = curve_fit(left_skew_model, x_data, y_data, p0=[20, 5, 3, 1])

# 输出拟合参数
print("拟合参数:")
print(f"峰值高度a = {params[0]:.4f}")
print(f"峰值天数b = {params[1]:.4f}")
print(f"左宽系数c = {params[2]:.4f}")
print(f"尾升系数d = {params[3]:.4f}")

# 生成拟合曲线数据
x_fit = np.linspace(min(x_data), max(x_data), 100)
y_fit = left_skew_model(x_fit, *params)

# 绘制原始数据与拟合曲线
plt.figure(figsize=(10, 6))
plt.scatter(x_data, y_data, color='darkblue', alpha=0.5, label='原始数据')
plt.plot(x_fit, y_fit, color='red', linewidth=2, label='拟合曲线')
plt.title('维修天数与每日人工占比拟合结果')
plt.xlabel('维修天数')
plt.ylabel('每日人工占比(%)')
plt.legend()
plt.grid(alpha=0.3)
plt.show()

# 输出可直接使用的拟合方程
print("\n拟合方程:")
print(f"y = {params[0]:.4f} × exp(-((x - {params[1]:.4f})/{params[2]:.4f})²) + {params[3]:.4f} × (x - {params[1]:.4f})² / (1 + (x - {params[1]:.4f})²)")

注意事项

  • 如果数据量极大,建议先做随机抽样(比如df.sample(frac=0.1)),避免内存占用过高。
  • 若拟合效果不佳,可调整拟合函数形式,比如尝试对数正态分布模型、Beta分布模型,或对x做对数变换后再拟合。
  • 拟合参数的初始猜测值p0可根据数据的大致范围调整,能提升拟合成功率。

内容的提问来源于stack exchange,提问作者Ty Kendall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 17:43:23