🏠
🔋C1 Laboratory
| フェーズ | 内容 | 手法 | ||
|---|---|---|---|---|
| Define(定義) | 問題点、目標値、管理の理由を定義する 従属変数y | 特性要因図 、 パレート図 | ||
| Mesure(測定、データ記録) | 説明変数x yとxに関して測定データを記録 | チェックシート | ||
| Analyze(解析、分析) | yとxの関係を分析する。 | ヒストグラム 、 散布図 相関分析 、 回帰分析 | ||
| Improve(改善) | yを最良にするxを見つける 改善プラン を立てる | 分散分析、統計的検定、 実験計画法 | ||
| Control(管理) | 改善プラン を計画的に 管理。 ポカヨケ のしくみをつくる | 管理図 1 ) 、ポカヨケ |
| アプリ& 言語 | 説明/ 記述例/プログラム例 | |
|---|---|---|
| python + matplotlib |
plt.scatter(x, y, marker="x", alpha=0.5) |
|
| JavaScript | Webアプリとして、 canvasに出力 | |
| asp | サーバーサイドスクリプトとして として、 svgに出力 | |
| Google sheet> * | 挿入→グラフ→散布図 | |
| offce365/ Excel |
散布図は、 データ の関係を表現するのに多様される プロットです。 QC7つ道具です。 論文の図表や、 講演のスライドにも使われます。
イギリスの遺伝学者であるゴルトン(Francis Galton、1822-1911)は、親と子どもの身長を分析し、非正常的に身長が大きい子どもと小さい子どもの身長は全人口の平均身長に回帰する傾向があることを見つけました。 * *
👨🏫 QC7つ道具
散布図 は、 データ (実験結果)をグラフ化するのに、よく使います。 変化させた値と、測定結果の値の関係がわかりやすく、 相関を調べることができます 3 ) 。
実データには、誤差があります。 滑らかな曲線でつなぐには、モデルとなる関数を仮定するのが一番です。 モデルとなる関数が見つからない場合は、補間することになります。
補間には多項式補間、スプライン補間、Bスプライン補間などがあります。
プロットタイプ
# ■■■ 回帰分析 ■■■
import math
import numpy as np
import random
import matplotlib.pyplot as plt
# A4スライドの推奨設定
plt.rcParams['figure.figsize'] = [8 , 8 *math.sqrt(2)/2 ] # 8インチ白銀比
plt.rcParams['font.size'] = 16 # 16ポイント
plt.rcParams['lines.linewidth'] = 2 # 2ポイント
sm = 157 # 平均(母平均)
ss = 4.6 # 標準偏差(母平均)
sn = 10 # 標本数(繰り返し数)
r = 0.5 #相関係数
#適正体重 = (身長m)2 ×22.
x = np.random.normal(loc=sm, scale=ss, size=sn)
y = [ ((random.gauss(0, ss) * (1 - r * r) + r * (p - sm) + sm) /100) ** 2 * 22 for p in x]
a = np.cov(x, y)[0][1] / np.var(x)
b = np.mean(y) - a * np.mean(x)
fig, ax = plt.subplots()
ax.set_xlabel("height $h$ / cm")
ax.set_ylabel("weight $w$ / kg")
ax.scatter(x, y)
ax.axline((np.mean(x), np.mean(y)), slope=a)
# ■■■ 回帰分析 ■■■
# ■■■ 最小二乗法 ■■■
import numpy as np
import random
import matplotlib.pyplot as plt
from scipy.stats import t
smh = 158.4 # 平均(母平均):21才、女子身長
ssh = 4.5 # 標準偏差(母標準偏差):21才、女子身長
smw = 52.6 # 平均(母平均):21才、女子体重
ssw = 7.5 # 標準偏差(母平均):21才、女子体重
bmimw = 21 # 平均(母平均):20才台、女子BMI
bmisw = 2.9 # 標準偏差(母平均):20才台、女子BMI
sn = 2000 # 母数
en = 20 # 標本数
r = 0.5 #相関係数
# 17 158.4 4.5 16 52.6 7.5
h = np.random.normal(loc=smh, scale=ssh, size=sn)
h2w = [(p*p/10000, random.gauss(bmimw, bmisw) * p*p /10000) for p in h]
#BMI = w/h^2 = 22
#https://www.e-stat.go.jp/dbview?sid=0003224178
fig, ax = plt.subplots() # Figureオブジェクトとそれに属する一つのAxesオブジェクトを同時に作成
u,v = zip(*h2w)
A = np.vstack((np.array(u), np.ones(len(u)))).T
vv = np.array(v).T
uu, residuals, rank, s = np.linalg.lstsq(A, vv, rcond=None)
au = uu[0]
bu = uu[1]
#au = np.cov(u, v)[0][1] / np.var(u)
#bu = np.mean(v) - au * np.mean(u)
u1 = np.array([np.mean(u) - np.std(u)*3 , np.mean(u) + np.std(u)*3])
v1 = bu + au * u1 # 回帰曲線
ax.annotate("$w=$"+ "{:.1f}".format(au) + "$h^2+$" + "{:.1f}".format(bu)\
,xy = (np.mean(u) , np.mean(v))\
,xytext = (np.mean(u)+ np.std(u), np.mean(v)- 3*np.std(v))\
,arrowprops=dict(arrowstyle="->"))
x2y = random.sample(h2w, en) #無作為抽出
x,y = zip(*x2y)
A = np.vstack((np.array(x), np.ones(len(x)))).T
vv = np.array(y).T
uu, residuals, rank, s = np.linalg.lstsq(A, vv, rcond=None)
a = uu[0]
b = uu[1]
#a = np.cov(x, y)[0][1] / np.var(x)
#b = np.mean(y) - a * np.mean(x)
ax.annotate("$w=$"+ "{:.1f}".format(a) + "$h^2+$" + "{:.1f}".format(b)\
,xy = (np.mean(x) , np.mean(y))\
,xytext = (np.mean(x)+ np.std(x),np.mean(y)+ 3*np.std(y))\
,color="m",arrowprops=dict(arrowstyle="->"))
x1 = np.array([np.mean(x) - np.std(x)*3 , np.mean(x) + np.std(x)*3])
y1 = b + a * x1 # 回帰曲線
y_hat = [b + a * p for p in x]
alpha = 0.05 # 有意水準
n = len(x)
tvalue = t.ppf(1 - alpha / 2, n - 2) # 自由度n-2の時のt値(alphaを1/2することに注意)
ve = (np.sum(np.array(y) ** 2) - np.sum(np.array(y_hat) ** 2)) / (n - 2)
x_bar = np.mean(x)
conf = np.arange(np.mean(u) - np.std(u)*3 , np.mean(u) + np.std(u)*3, np.std(u)/16)
conf_hi = [b + a * p + tvalue * np.sqrt(1 / n + (p - x_bar) ** 2 / np.sum((x - x_bar) ** 2)) * ve for p in conf]
conf_lo = [b + a * p - tvalue * np.sqrt(1 / n + (p - x_bar) ** 2 / np.sum((x - x_bar) ** 2)) * ve for p in conf]
pred = np.arange(np.mean(x) - np.std(x)*3 , np.mean(x) + np.std(x)*3, np.std(x)/16)
pred_hi = [b + a * p + tvalue * np.sqrt(1 + 1 / n + (p - x_bar) ** 2 / np.sum((x - x_bar) ** 2)) * ve for p in pred]
pred_lo = [b + a * p - tvalue * np.sqrt(1 + 1 / n + (p - x_bar) ** 2 / np.sum((x - x_bar) ** 2)) * ve for p in pred]
ax.scatter(u,v,alpha=0.2)
ax.plot(u1,v1)
ax.plot(conf, conf_hi, 'k:', label='conf_95%')
ax.plot(conf, conf_lo, 'k:')
ax.fill_between(conf, conf_hi, conf_lo, facecolor='lightcoral', alpha=0.3)
ax.plot(pred, pred_hi, 'k:', label='pred_95%')
ax.plot(pred, pred_lo, 'k:')
ax.fill_between(pred, pred_hi, pred_lo, facecolor='lightgreen', alpha=0.2)
ax.scatter(x, y,color = "m")
ax.plot(x1, y1,color = "m")
ax.set_xlabel("Height$^2$ $h^2$ / m$^2$")
ax.set_ylabel("Weight $w$ / kg")
plt.show()
# ■■■ 最小二乗法 ■■■