本記事では、csvファイルから各列のCpk(cpu, cplの小さい方)を計算して、csvファイルに出力する雛形コードを載せました。
また、下図のようにヒストグラムも作成します。
使用した例題のcsvデータの作成方法は、次のリンク先を参照下さい。https://hk29.hatenablog.jp/entry/2019/12/10/201705
■本プログラム
#!/usr/bin/env python # coding: utf-8 # In[1]: import pandas as pd import numpy as np from matplotlib import pyplot as plt plt.rcParams['font.size'] = 16 # グラフの基本フォントサイズの設定 # ファイルを読み込む file_path = 'boston_XYdata.csv' df = pd.read_csv(file_path) # インデックスを1からに振り直す df.index = np.arange(1, len(df) + 1) df # In[2]: # 必要なデータ列の抽出とヒストグラムの作成 DF = df[['RM', 'LSTAT', 'PRICE']] DF.hist() plt.tight_layout() DF # In[3]: # cpkを算出する def cpk_func(i, col, df_col, lsl, usl): # 平均値の算出 ave = df_col.mean() # 標準偏差の算出 sigma = np.std(df_col.values, ddof=1) # 正規分布のためのx軸の範囲を作成 x = np.linspace(ave - 3 * sigma, ave + 3 * sigma, num = 1000) # 正規分布の計算 y = np.exp(-(x - ave) ** 2 / (2 * sigma ** 2)) / (np.sqrt(2 * np.pi) * sigma) # cpuとcplの計算 cpu = (usl - ave) / (3 * sigma) cpl = (ave - lsl) / (3 * sigma) # cpkを選定する(cpuとcplの小さい方を選択) cpk = min(cpu, cpl) # ヒストグラムでプロット ax = fig.add_subplot(1, len(DF.columns), i, title = col + ": cpk={:.2f}".format(cpk)) ax.hist(df_col.values, bins = 10, density=False, color='b', rwidth=0.9) # 2軸にする ax2 = ax.twinx() ax2.plot(x, y, c='r') ax.grid() plt.tight_layout() return ave, sigma, cpk # 各列の下限と上限をリストで作成(後ほど、pandasデータフレームに結合する) judge_list = [(5, 9), (0, 50), (-70, 70)] ave_list = [] sigma_list = [] cpk_list = [] lower_judge_list = [] upper_judge_list = [] fig = plt.figure(figsize = (14, 6)) for i, (col, (lower, upper)) in enumerate(zip(DF.columns, judge_list), start=1): my_ave, my_sigma, my_cpk = cpk_func(i, col, DF[col], lower, upper) ave_list.append(my_ave) sigma_list.append(my_sigma) cpk_list.append(my_cpk) lower_judge_list.append(lower) upper_judge_list.append(upper) cpk_list # In[4]: # cpk計算結果をpandasデータフレームに結合する def df_insert_func(df, index, value): # index 行目までを抽出し、その直後に行を追加 df1 = df.iloc[:index].append(pd.Series(value, index=df.columns), ignore_index=True) # index + 1 行目以降を抽出 df2 = df.iloc[index:] # 縦方向に結合 df_concat = pd.concat((df1, df2)).reset_index(drop=True) return df_concat new_df = df_insert_func(DF, 0, sigma_list) new_df = df_insert_func(new_df, 0, ave_list) new_df = df_insert_func(new_df, 0, lower_judge_list) new_df = df_insert_func(new_df, 0, upper_judge_list) new_df = df_insert_func(new_df, 0, cpk_list) new_df # In[5]: # 新しいインデックスをリストで作成する row_list = DF.index.to_list() new_index_list = ['cpk', 'usl', 'lsl', 'ave', 'sigma'] + row_list #new_index_list # In[6]: # インデックスを差し替える new_df.set_axis(new_index_list, axis = 'index', inplace = True) # In[7]: new_df.to_csv('new_' + file_path) new_df # In[ ]:
以上
<広告>
リンク