scikit-learnのワインの成分データを使って因子分析を行い、GPTに結果の解釈をさせてみました。OpenAIのAPIを利用しています。
import os
import pandas as pd
from sklearn.datasets import load_wine
from factor_analyzer import FactorAnalyzer
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
def factor_analysis():
wine = load_wine()
x = pd.DataFrame(wine.data, columns=wine.feature_names)
x_stats = x.describe().transpose()
x = (x - x_stats['mean'])/x_stats['std']
fa = FactorAnalyzer(n_factors=3, rotation=None)
fa.fit(x)
loadings_df = pd.DataFrame(fa.loadings_, columns=['factor1', 'factor2', 'factor3'])
loadings_df.index = wine.feature_names
print(loadings_df)
llm = ChatOpenAI(model_name='gpt-4', openai_api_key=os.environ['OPENAI_API_KEY'], temperature=0)
prompt = PromptTemplate(
input_variables=["factor_info"],
template="""
あなたはシニアデータサイエンティストです。
以下にワインの成分のデータをもとに因子分析を行った結果があります。
factor1、factor2、factor3はそれぞれ何を表すと考えられますか。
因子分析結果:
{factor_info}
""",
)
chain = LLMChain(llm=llm, prompt=prompt)
result = chain.run(loadings_df.to_string())
print(result)
if __name__ == '__main__':
factor_analysis()
因子分析の結果、因子負荷量は以下のとおりです。
factor1 factor2 factor3
alcohol 0.303696 0.718459 -0.184135
malic_acid -0.469445 0.278685 0.086192
ash -0.000897 0.449071 0.651790
alcalinity_of_ash -0.510072 -0.028359 0.699151
magnesium 0.263600 0.349077 0.091006
total_phenols 0.845208 0.094727 0.166563
flavanoids 0.938545 -0.012179 0.190408
nonflavanoid_phenols -0.580890 0.044361 0.138686
proanthocyanins 0.618387 0.042691 0.122036
color_intensity -0.185668 0.809678 -0.108117
hue 0.598262 -0.388603 0.050280
od280/od315_of_diluted_wines 0.803487 -0.262018 0.174507
proline 0.602834 0.548470 -0.124684
上の数表をプロンプトに含めて、各因子が何を表すか、GPTに考察させています。
GPTのレスポンスは以下のとおりです。
因子分析は、多数の変数間の関連性を探るための統計的手法で、観測された変数をより少ない数の潜在的な因子にまとめることができます。因子負荷量は、各変数がどの程度その因子に影響を受けているかを示しています。負荷量が高いほど、その因子がその変数をより強く影響していると言えます。
この結果から、以下のように解釈できます:
– factor1は、フェノール類(total_phenols、flavanoids、proanthocyanins)や色調(hue)、OD280/OD315(od280/od315_of_diluted_wines)などの成分に強く影響を与えていると考えられます。これらの成分はワインの品質や風味に大きく関わるため、factor1は「品質・風味因子」と考えることができます。
– factor2は、アルコール度数(alcohol)や色の強さ(color_intensity)、プロリン(proline)などに強く影響を与えています。これらの成分はワインの強さや色合いに関わるため、factor2は「色・強さ因子」と考えることができます。
– factor3は、灰分(ash)や灰分のアルカリ度(alcalinity_of_ash)に強く影響を与えています。これらの成分はワインの酸性度に関わるため、factor3は「酸性度因子」と考えることができます。
各因子に影響を与えている変数の解釈は問題ないように思います。
以下の「スタビジ」さんの記事でも同じデータで因子分析が行われていますが、名称の付け方は異なるものの、解釈は大きくずれていないかと思います。
プラグインも出てはおりますが、統計解析結果の解釈をGPTに行わせるのは有用と思います。
因子分析そのものの理解のため、以下の記事を書きましたので、よろしければご参照ください。