こんにちは、アドラーです!
今回は「QC検定1級論文対策シリーズ」として、「多変量解析の理論と実践①〜Pythonで行う重回帰分析〜」という記事を書きました。
QC検定1級の合格体験談で紹介したようにQC検定1級に合格するためには30分で750字の作文を書く必要があり、QCの本質を理解し、実務活用の経験を積むことが重要です。
一方で、体系的なQC知識は書籍で学ぶことはできても中々その知識を実務に適用することが難しいと感じている方も多いのではないでしょうか。
そこで今回は、製品開発を5年以上続けている研究開発職の私が多変量解析、特に重回帰分析の解説からQC検定1級での論文例も紹介します。
多変量解析を使いこなすことができれば、固有技術(ものづくりに関する知識と手段)と五巻を働かせることで問題解決に臨む際にヒントが得られると思います。
是非、本記事を読むことで、QC検定1級の論文問題を書くためのヒントを得ていただきながら、皆様のQC知識を実務に活かし、品質トラブルの解決やキャリア形成の方向性を考えるきっかけにしていただけると幸いです。
※本記事は以下の図書を参考に作成しております。品質管理の勉強をしたい方はぜひ以下のリンクから購入ください!(楽天だと0,5のつく日に楽天ポイントが5倍になり、お得に購入ができます!)

筆者のプロフィール・ブログ運営の理念は自己紹介からご覧ください!
目次
概要

- 多変量解析は複数の説明変数から目的変数を予測したり、データの構造を要約することが可能になる。
- 多変量解析の一つである重回帰分析では、多くの説明変数と一つの目的変数の因果関係を求め、目的変数への影響度を知りたい、もしくは目的変数を予測したい場合に有効である。
- QC検定1級の論文試験でも重回帰分析に関するテーマがあり、①基本手順に則って作文すること、②どのように品質改善に努めていくかを記述するようにするとよい。
トヨタ必須の17の品質管理手法を伝授 品質の教科書 [ 皆川 一二 ]から引用
それでは一緒に勉強していきましょう!
多変量解析とは?
多変量解析では、互いに関係する多種類のデータの関係性を整理し、将来の数値の予測をしたり、要約したりするために使う統計的データ解析の総称です。
多変量解析は主に3つの利用シーンに応じて適切な手法を使い分けます。
利用場面 | 手法 |
---|---|
多数の説明変数に対する量的な目的変数の因果関係を明らかにして、目的変数を予測する。 | 重回帰分析(説明変数:量的変数) 数量化1類(説明変数:カテゴリ変数) |
多数の説明変数に対して質的変数(カテゴリ変数)である目的変数との因果関係を明らかにして、未知のサンプルがどのカテゴリに属するかを明らかにする。 | 判別分析(説明変数:質的変数) 数量化2類(説明変数:質的変数) |
多くの変数をできる限り情報のロスがないように要約し、サンプルのグルーピングする。 ※目的変数なし | 主成分分析(説明変数:量的変数) 数量化3類(説明変数:質的変数) |
重回帰分析と数量化1類の違い
前項で述べたように、重回帰分析は説明変数も目的変数も量的な変数であることが特徴です。数量化1類は重回帰分析とよく似た手法ですが、説明変数が量的変数かカテゴリ変数(質的変数)かで区別されます。
手法 | 説明変数 | 目的変数 | 事例 |
---|---|---|---|
重回帰分析 | 複数の量的変数 | 量的変数 | 野球の勝率予測 |
数量化1類 | カテゴリ変数 | 量的変数 | 健康診断の検査値から健常者|患者を判別 |
例えば、重回帰分析を野球に適用しようとするとチーム打率と防御率、本塁打、出場メンバーの体調などから勝率を予測するイメージです。
数量化1類では、健康診断の各検査値を元に受診者が健常者なのか、要治療の患者なのかを判別するイメージです。
重回帰分析の進め方

具体的には以下の手順を踏んで解決案の検討を行います。
- 解析するデータの収集
関係性を求めたいデータが体系的にまとめられたデータセットを準備する。- データセットを説明変数と目的変数へ分割
- 重回帰分析の実施と決定係数の確認
重回帰分析を行い、確からしい予測ができているかを決定係数を元に確認する。- (必要があれば)新たなデータをデータセットに加えていき、予測精度を高めてみる。
重回帰分析用のPythonコード
今回は、scikit-learnサイトで公開されている「カリフォルニア住宅価格データセット」を使って簡単な重回帰分析をしてみます。
Google colaboratoryの全般使い方はこちらのブログにまとまっていましたのでご参考ください。
今回、重回帰分析を行なうpythonコードは以下のURLからも見ることができます。
【重回帰分析のモデルコード】
https://colab.research.google.com/drive/1qoizZmdrps2RXgI1ENDkbOQe6yj8y6yF?usp=sharing
①ライブラリのインポート
# ライブラリのインポート
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
Google colaboratoryでは以下のような画像が出ていると思いますが、▶︎ボタンを押すとプログラムが動きます。▶︎マークがチェックマークに変わると思いますがそれで正しくプログラムは動いています。

②データセットの表示と確認
# カリフォルニアの住宅価格データセットをロード
california_housing = fetch_california_housing()
# データをデータフレームに格納
df = pd.DataFrame(california_housing.data, columns=california_housing.feature_names)
df['Price'] = california_housing.target
# データの確認
df.head(5)
上のコードを動かすとデータのロード、データ格納が始まり、データセットの最初の5行のデータが以下のように表示されます。
MedInc | HouseAge | AveRooms | AveBedrms | Population | AveOccup | Latitude | Longitude | Price | |
---|---|---|---|---|---|---|---|---|---|
0 | 8.3252 | 41.0 | 6.984127 | 1.023810 | 322.0 | 2.555556 | 37.88 | -122.23 | 4.526 |
1 | 8.3014 | 21.0 | 6.238137 | 0.971880 | 2401.0 | 2.109842 | 37.86 | -122.22 | 3.585 |
2 | 7.2574 | 52.0 | 8.288136 | 1.073446 | 496.0 | 2.802260 | 37.85 | -122.24 | 3.521 |
3 | 5.6431 | 52.0 | 5.817352 | 1.073059 | 558.0 | 2.547945 | 37.85 | -122.25 | 3.413 |
4 | 3.8462 | 52.0 | 6.281853 | 1.081081 | 565.0 | 2.181467 | 37.85 | -122.25 | 3.422 |
各変数は以下のような意味です。データの読み込みと各変数の意味を確認できたので、実際にデータの中身を見ていきましょう。
変数名称 | 意味 |
---|---|
Medlnc | 各地区における、世帯所得中央値。単位は10,000ドル |
HouseAge | 各地区における、家の平均築年数。単位は年 |
AveRooms | 各地区における、平均の部屋数。 |
AveBedrms | 各地区における、平均の寝室数。 |
Poplation | 各地区における、合計の居住人数数。 |
AveOcuup | 各地区における、平均の世帯人数。 |
Latitude | 各地区における、代表地区の緯度。 |
Longitude | 各地区における、代表地区の経度。 |
#要約統計量を確認
df.describe()
始めに要約統計量を始確認して全体像を確認してみましょう。
データ数、平均値、標準偏差、最小値、25%、50%(中央値)、75%タイルと最大値が出力されました。
MedInc | HouseAge | AveRooms | AveBedrms | Population | AveOccup | Latitude | Longitude | Price | |
---|---|---|---|---|---|---|---|---|---|
count | 20640.000000 | 20640.000000 | 20640.000000 | 20640.000000 | 20640.000000 | 20640.000000 | 20640.000000 | 20640.000000 | 20640.000000 |
mean | 3.870671 | 28.639486 | 5.429000 | 1.096675 | 1425.476744 | 3.070655 | 35.631861 | -119.569704 | 2.068558 |
std | 1.899822 | 12.585558 | 2.474173 | 0.473911 | 1132.462122 | 10.386050 | 2.135952 | 2.003532 | 1.153956 |
min | 0.499900 | 1.000000 | 0.846154 | 0.333333 | 3.000000 | 0.692308 | 32.540000 | -124.350000 | 0.149990 |
25% | 2.563400 | 18.000000 | 4.440716 | 1.006079 | 787.000000 | 2.429741 | 33.930000 | -121.800000 | 1.196000 |
50% | 3.534800 | 29.000000 | 5.229129 | 1.048780 | 1166.000000 | 2.818116 | 34.260000 | -118.490000 | 1.797000 |
75% | 4.743250 | 37.000000 | 6.052381 | 1.099526 | 1725.000000 | 3.282261 | 37.710000 | -118.010000 | 2.647250 |
max | 15.000100 | 52.000000 | 141.909091 | 34.066667 | 35682.000000 | 1243.333333 | 41.950000 | -114.310000 | 5.000010 |
平均の部屋数の最大値、人口、世帯数などの最大値が平均値より異常に大きく、データの偏りがあることが示唆されました。
今回は細かな分析は行いませんがデータに偏りがあることを念頭に置いて分析を進めていきましょう。
import pandas as pd
import matplotlib.pyplot as plt
# Select the numerical columns for the scatter matrix
numerical_cols = ['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude', 'Price']
# Create the scatter matrix plot
pd.plotting.scatter_matrix(df[numerical_cols], alpha=0.2, figsize=(15, 15), diagonal='kde') # Use kde for kernel density estimation on diagonal
plt.show()
先ほどの要約統計量だけではデータの全体像が捉え切れないので実際に散布図行列を用いて可視化してみましょう。

先ほどの要約統計量よりもデータの全体像が捉えやすくなりました。データは正規分布しておらず、かなりの偏りを持っているようです。
また、最下行にある目的変数の値段と各説明変数の対応を見てみるとMedInc(世帯所得中央値)と家賃は正の相関を持っているように見えることがわかりました。
# ヒートマップを表示
plt.figure(figsize=(12, 9))
sns.heatmap(data.corr(), annot=True, fmt='.2f', linewidths=.5)
plt.savefig('california_housing_heatmap.png')
先ほどの散布図行列で全体像を捉えられたので、相関係数を行列形式で確認してみましょう。先ほどの考察通りに家賃と世帯年収の中央値の相関係数は0.69とかなり相関が強いことがわかりました。

また、経度と緯度にも「-0.92」と非常に強い相関関係が見られます。相関の高い変数を同時に重回帰分析の説明変数とすると多重共線性が生じる可能性があります。
多重共線性の問題点は、「多重共線性の問題点は、目的変数と有意に影響を与える変数を見逃してしまうこと」にありますが、こちらについては以下のブログリンクでわかりやすく解説されていました。多重共線性の問題点がいまいちわからない方はぜひ以下のリンク先のブログをご確認ください。
多重共線性の問題点をわかりやすく!基準や目安はvifと相関係数のどちらを使う?
今回の重回帰分析では、実験なのでそこまで厳密に考えずにモデル構築をするようにします。
③説明変数と目的変数への分割
# 説明変数と目的変数に分ける
X = df.drop('Price', axis=1)
y = df['Price']
# データをトレーニングセットとテストセットに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
データの全体像を確認したところで、実際の重回帰分析に着手します。
上記のコードでデータセットを説明変数と目的変数に分けます。Price(家賃)が目的変数y, そのほかの変数を説明変数xとします。
④重回帰分析と決定係数の確認
# 線形回帰モデルを作成
model = LinearRegression()
# モデルをトレーニングデータにフィット
model.fit(X_train, y_train)
# テストデータを用いて予測
y_pred = model.predict(X_test)
# 決定係数を表示
print('決定係数(train):{:.3f}'.format(model.score(X_train,y_train)))
print('決定係数(test):{:.3f}'.format(model.score(X_test,y_test)))
# 回帰係数と切片を表示
print('\n回帰係数\n{}'.format(pd.Series(model.coef_, index=X.columns)))
print('切片: {:.3f}'.format(model.intercept_))
上記のコードで重回帰分析が終了します。
解析の結果として以下の結果が出力されました。
決定係数(train):0.613
決定係数(test):0.576回帰係数
MedInc 0.448675
HouseAge 0.009724
AveRooms -0.123323
AveBedrms 0.783145
Population -0.000002
AveOccup -0.003526
Latitude -0.419792
Longitude -0.433708dtype: float64
切片: -37.023
ここで重回帰分析の目的を思い出しましょう。重回帰分析の目的は「多数の説明変数に対する一つの量的な目的変数の因果関係を明らかにして、目的変数を予測する」ことでした。
予測する目的変数は、未知データですから訓練データへの当てはまりを追求しすぎると訓練データへの当てはまりがよくても未知のデータ(テストデータ)への予測精度が下がってしまいます。
このことを過学習と呼びます。重回帰分析を行う際には過学習したモデルになっていないかを常に注意しましょう。
訓練データの決定係数が0.613、テストデータの決定係数が0.576となりました。訓練時スコアとテスト時のスコアが近いことから、このモデルは過学習に陥っておらず、未知のデータに対しても一定の予測精度を持っていることがわかりました。
(必要があれば)データセットに新たなデータを加えて予測精度を高める
データセットに新たなデータを加えることでより予測精度を高められる可能性があります。
重回帰分析をきっかけに、自身の所属する部署でデータの蓄積を習慣化できるように働きがけ、定期的に作成した回帰式の予測精度を高めていきましょう。
予測の高い回帰式を作ることができれば、将来的に品質トラブルが発生した時に、どの説明変数が変化して品質トラブルが発生してしまったのかを突き止めやすくなります。
QC検定1級論文の事例
次に、これまで説明した重回帰分析の実施ポイントをもとに670字程度(制限の750字に対して9割程度)の作文例を作成しましたので、QC検定1級の論文対策としてご活用ください。
重回帰分析に関する出題は、以下の過去4回の論文問題で1回, 手法でも1回出題されています。
【論文の出題】
第32回・第1問(21年9月)
【手法の出題】
第35回・第4問(23年3月)
【作文テーマ】
自身の業務で重回帰分析を用いた際に、解析の際に注意した点とどのような形でQCDの改善に繋げたかを記述せよ。
※QC検定1級問題を一部改変しました。
作文例(669字)
私は化学メーカーの研究開発業務の実施者である。重回帰分析を用いて自社製品のQCDの改善に繋げた事例について記述する。
私は今年から新製品開発を担当するチームに異動し、従来製品で課題となっていた熱耐性を改善可能な新たな組成開発に取り組むことになった。既にチーム内で複数のレシピが提案されていたが、最適なレシピであるか判別できなかった。そこで、技術開発部で蓄積されていた過去データを重回帰分析することによって、提案の中で最適なレシピの判別を試みた。
はじめに、過去のデータセットの要約統計量、散布図行列、相関行列を作成することでデータの全体像を把握した。今回解析したデータでは顕著なデータの偏りはなく、多重共線性(説明変数同士が強い相関関係を持つこと)は認められなかったため、重回帰分析を適切に行えると判断した。
次に、データセットを目的変数と説明変数に分けて、重回帰分析を行なった。訓練データとテストデータの決定係数を比較すると共に0.70程度であったため、過学習したモデルでないことを確認できた。このモデルをもとに、提案されていた複数のレシピ10個から熱耐性の予測値を計算すると最適と考えられるレシピを3つまで絞ることができた。これら3つのレシピをもとにサンプルを作成し、熱耐性を取得したところ既存製品よりも大幅に熱耐性が改善し、目標コスト内で生産可能なレシピを得ることができた。
今後はこのレシピで少量の試作を進め、製造部・品証部・営業部などの関係部署とデザインレビューを行なって品質トラブルを未然防止しながら本格的な上市に取り組む予定である。
作文のポイント
①重回帰分析をする動機を明確にする。
重回帰分析の目的は「大量に蓄積したデータから優位なデータ・傾向を見出すこと」です。開発部では最適レシピの探索が主な業務になるため、「提案されているレシピから最高性能の達成が高いレシピを判別すること」を目的に使用されることになるでしょう。
なぜ重回帰分析を行なったのかを作文の冒頭に明記することで、審査官が作文の意図を理解しやすくなるので、重回帰分析を行なった動機を必ず記述するようにしましょう。
②データの全体像・多重共線性・過学習の有無を確認する確認する
次に、Pythonで示したケーススタディに則り、①データの全体像、②多重共線性、③モデルの過学習がないことの3点セットを確認するようにしましょう。
3点セットを行う理由は前章で述べた通りですが、データの予測の信頼性を担保したことを審査官にアピールすることができます。
③今後の抱負について記述する
重回帰分析を行うことで最適レシピの絞り込みを行うことができましたが、予測を行うだけではQCDの改善に繋げることはできません。
ぜひこの最適な品質のレシピを上市するために取り組んだこと、もしくはこれから取り組もうとしていることを記述しましょう。
基本に忠実に作文をしながら、今後の抱負をしっかり盛り込むことが重要です。
まとめ
記事のまとめは以下のとおりです。
- 多変量解析は複数の説明変数から目的変数を予測したり、データの構造を要約することが可能になる。
- 多変量解析の一つである重回帰分析では、多くの説明変数と一つの目的変数の因果関係を求め、目的変数への影響度を知りたい、もしくは目的変数を予測したい場合に有効である。
- QC検定1級の論文試験でも重回帰分析に関するテーマがあり、①基本手順に則って作文すること、②どのように品質改善に努めていくかを記述するようにするとよい。
トヨタ必須の17の品質管理手法を伝授 品質の教科書 [ 皆川 一二 ]から引用
更にケーススタディやQC検定1級の作文例から、重回帰分析の実施を体験することができました。
是非、本記事のテンプレートを使って重回帰分析を行い、既存のデータから優位な情報を見出すことで品質改善に向けた議論を進めていただけると幸いです。
以下に本記事を作るのに参考とした書籍を紹介します。
統計学、QCの勉強におすすめの書籍ですので、「QCの知識をより高めたい!」という人はぜひ以下の書籍を読んで勉強していただけると筆者の励みになります。


それでは最後に、私の大好きなドラえもんの言葉で今日の記事を締めさせていただきたいと思います。

「なやんでるひまに、一つでもやりなよ」
— ドラえもん
今日もありがとうございました!