基于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
相关产品推荐
相关产品推荐

