コンクリート圧縮強度と成分などの関係性について分析してみた
私の環境
Python3
Macbook Pro
Google Chrome
Google Colaboratory
目的
コンクリート圧縮強度と成分などの関係性を分析することで、工事現場や成分研究、化合物作成などの参考データとして活用する。データを活用することで作業効率の向上やその他のデータとの比較が期待される。
データの中身
・コンクリート圧縮強度
・成分(セメント、高炉スラグ、フライアッシュ、水、高性能減水剤、粗骨 材、細骨材)、日数
データの可視化・相関
題材についてのデータをconcrete_dataに代入して読み込みます。今回はPandasのライブラリを使用するので、あらかじめインポートして使えるようにしておきます。
import pandas as pd
concrete_data = pd.read_excel("https://archive.ics.uci.edu/ml/machine-learning
-databases/concrete/compressive/Concrete_Data.xls")
データを読み込むことで、以下のように各種成分表が出力されます。
concrete_data
上記のデータで相関行列を算出します。
concrete_data.corr()
同じ項目同士の相関は1です。1に近ければ近いほど正の相関、−1に近ければ負の相関が高いということになります。
次はseabornとmatplotlibを用いて散布図を作りながらデータを可視化します。横のx軸はセメントから順に、縦のy軸はコンクリート圧縮強度から順に項目を並べていきます。
import seaborn as sns
sns.heatmap(concrete_data.corr())
import matplotlib.pyplot as plt
x = concrete_data['Cement (component 1)(kg in a m^3 mixture)']
y = concrete_data['Concrete compressive strength(MPa, megapascals) ']
plt.scatter(x, y)
plt.show()
上記の可視化されたデータを分析します。色が薄い箇所が正の相関が強いといえますが、特にコンクリート圧縮強度の行をみると、セメント、高性能減水剤で他の項目より比較的に色が薄くなっていることが分かります。以上より項目を2つに絞って各々の散布図を作成していきます。
初めに、セメントとの相関を散布図を用いながらみていきます。
import matplotlib.pyplot as plt
x = concrete_data['Cement (component 1)(kg in a m^3 mixture)']
y = concrete_data['Concrete compressive strength(MPa, megapascals) ']
plt.scatter(x, y)
plt.show()
右側に数値が増加するにつれて、点も上側に凝集されている傾向がみてとれます。この時点でコンクリート圧縮強度とセメントは相関が強いことが予測されます。
実際にseabornを用いて該当するデータの線形回帰を行うと、以下のように右肩上がりの直線が出力されます。
sns.regplot(x = "Cement (component 1)(kg in a m^3 mixture)" , y = "Concrete
compressive strength(MPa, megapascals) ",data=concrete_data)
同じように高性能減水剤についても、散布図と直線回帰を作ります。
mport matplotlib.pyplot as plt
import pandas as pd
x2 = concrete_data['Superplasticizer (component 5)(kg in a m^3 mixture)']
y2 = concrete_data['Concrete compressive strength(MPa, megapascals) ']
plt.scatter(x2,y2)
plt.show()
sns.regplot(x = "Superplasticizer (component 5)(kg in a m^3 mixture)" ,
y = "Concrete compressive strength(MPa, megapascals) ",data=concrete_data)
データ前分析による考察
コンクリート圧縮強度との相関を分析してみた結果、「セメント」「高性能減水剤」において他の項目より正の相関が強いことが分かりました。その他にも、日数との正の相関があることや、水分においては最も負の相関が強いことからも、成分の乾湿状態がコンクリート圧縮強度に大きく影響していると予想されます。
重回帰分析による数値予測
今までのデータを基に、各成分に値する説明変数を減らしてみます。そして、線形回帰・ラッソ回帰・リッジ回帰の多重分析による決定係数を算出します。
線形回帰は、特に数値を予測するときに線形式で予測する回帰を指します。線形重回帰になると、予測したいデータが1つに対し、予測に用いるデータが複数個ある回帰分析となります。ラッソ回帰は、予測に影響を及ぼしにくいデータにかかる係数をゼロに近づけながら、線形回帰の適切なパラメータを設定する回帰モデルです。主に余分な情報がたくさん存在するようなデータの回帰分析を行う際に用います。また、特徴量削減の手法として用いることもできます。リッジ回帰は、係数が大きくなりすぎないように制限する手法として、過学習を抑えるために用いられます。学習の結果、得られる係数が大きくならないので汎化しやすいという特徴があります。決定係数は、予測データと実際の正解データが、どのくらい一致しているかを示す指標です。
モジュールを追記して、データを読み込みます。参考値としてコンクリート圧縮強度を削除した場合の決定係数をみます。
mport pandas as pd
from sklearn.model_selection import train_test_split
# 必要なモジュール
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Lasso
from sklearn.linear_model import Ridge
concrete_train_X, concrete_test_X, concrete_train_y, concrete_test_y = train_tes
t_split(concrete_data.drop('Concrete compressive strength(MPa, megapascals) ',
axis=1),concrete_data['Concrete compressive strength(MPa, megapascals) '], ran
dom_state=42)
max_score = 0
best_model = ""
# 線形回帰
model = LinearRegression()
model.fit(concrete_train_X, concrete_train_y)
score = model.score(concrete_test_X, concrete_test_y)
if max_score < score:
max_score = score
best_model = "線形回帰"
# ラッソ回帰
model = Lasso()
model.fit(concrete_train_X, concrete_train_y)
score = model.score(concrete_test_X, concrete_test_y)
if max_score < score:
max_score = score
best_model = "ラッソ回帰"
# リッジ回帰
model = Ridge()
model.fit(concrete_train_X, concrete_train_y)
score = model.score(concrete_test_X, concrete_test_y)
if max_score < score:
max_score = score
best_model = "リッジ回帰"
print("モデル:{}".format(best_model))
print("決定係数:{}".format(max_score))
モデル:ラッソ回帰
決定係数:0.6255946866551905 という数値が算出されました。
上記の数値を参考に、例としてコラムの前列6番目と後列2番目を削除した数値予測をしていきます。
concrete_train_X, concrete_test_X, concrete_train_y, concrete_test_y = train_tes
t_split(concrete_data.drop(concrete_data.columns[[5, -1]], axis=1),concrete_data
['Concrete compressive strength(MPa, megapascals) '], random_state=42)
max_score = 0
best_model = ""
# 線形回帰
model = LinearRegression()
model.fit(concrete_train_X, concrete_train_y)
score = model.score(concrete_test_X, concrete_test_y)
if max_score < score:
max_score = score
best_model = "線形回帰"
# ラッソ回帰
model = Lasso()
model.fit(concrete_train_X, concrete_train_y)
score = model.score(concrete_test_X, concrete_test_y)
if max_score < score:
max_score = score
best_model = "ラッソ回帰"
# リッジ回帰
model = Ridge()
model.fit(concrete_train_X, concrete_train_y)
score = model.score(concrete_test_X, concrete_test_y)
if max_score < score:
max_score = score
best_model = "リッジ回帰"
print("モデル:{}".format(best_model))
print("決定係数:{}".format(max_score))
モデル:ラッソ回帰
決定係数:0.6274862799650957
最初の数値予測より若干高い値が算出されました。
まとめ
一通りテーマに沿ってデータ分析をした結果、コンクリート圧縮強度は「セメント」「高性能減水剤」と相関が高いことが分かりました。強度を高める際は、以上2つの成分を配合すると良いことが予測されます。
また、「粗骨材」「日数」を削除した説明変数で重回帰分析を行うと、標準よりはやや高い数値が算出されました。今回のデータにはない成分との相関を算出したり、反対にコンクリート圧縮強度を下げる要因となる成分の特定について分析してみても面白そうだと思いました。
この記事が気に入ったらサポートをしてみませんか?