目次
こんにちは美容室経営研究所Refineの井上です。
今回は、美容室を複数店舗運営している企業で店舗ごとの売上高データを利用して重回帰分析を行っていこうと思います。
※データはあくまで例であり、私が作成した人工データです!
データの読み込みと説明
読み込み
以下のデータフレームが今回用意したデータセットです。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
#データの読み込み
df = pd.read_excel('beauty_salon_data.xlsx')
df
各変数について説明します。
- 「駅徒歩15分以内」は、店舗の立地が駅から徒歩15分以内であれば1、そうでなければ0のダミー変数が付与されています。
- 「店舗席数」は、そのまま店舗の座席数を表しています。
- 「ホットペッパー掲載費」は、月間のホットペッパービューティー掲載費用です。(ここでは77,000円と154,000円の2種類としています)
- 「ホットペッパー評価」は、ホットペッパービューティーの口コミページに表示される星の平均値です。5点満点なので標準化しようか迷いましたが、解釈性を優先してそのまま使用しています。
- 「スタッフ数」は、店舗ごとのスタッフ数です。
- 「売上」は、店舗ごとの月間売上高です
仮説を立ててみる
上記のデータからどのような仮説が立てられるか考えてみます。
一般的な感覚として、各説明変数は売上高に対してプラスに働きそうな感じがしますね。
理想としては、算出されたパラメータがプラスであることで売上高を説明できればと思います。
同じような働きの変数同士の多重共線性に注意しながら重回帰分析を実行していきたいと思います。
EDA(Explanatory Data Analysis)
要約統計量
要約統計量を表示してみます。
df.describe()
データの各変数について説明していきます。
データ数は30件、要するに30店舗分のデータとしています
売上高を目的変数yとしてモデリングしていきます。
# 説明変数と目的変数に分ける
X = df[['駅徒歩15分以内','店舗席数','ホットペッパー掲載費(万/月)','ホットペッパー評価(平均)','スタッフ数']]
y = df['売上(万)']相関行列
説明変数同士の相関係数をプロットします。
計算は以下の通りです。
$$\rho_{ij} = \frac{\text{Cov}(X_i, X_j)}{\sigma_{X_i} \sigma_{X_j}}$$
相関行列の表示には、seabornのheatmapを使用します。
import seaborn as sns
correlation_matrix = X.corr()
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='bwr')
plt.title('Correlation Matrix')
plt.show()
結果を見る限り、強い相関がある組み合わせはなさそうですね。
VIF
説明変数に多重共線性が発生していないか確認するために変数インフレーション係数(Variance Inflation Factor、VIF)を計算しようと思います。
VIFの計算式と判断目安の基準を以下に記載します。
$$
VIF_i = \frac{1}{1 – R_i^2}
$$
- VIF = 1: ほとんどまたは全く共線性なし。
- 1 < VIF < 5: 一般的に容認可能だが、値が大きくなるにつれて、。
- VIF ≥ 5: この値は、中程度から高い共線性の存在を示唆している。このレベルでは、特にVIFが10に近づくにつれて、共線性が統計分析に与える影響に注意が必要。
- VIF ≥ 10: この値は、非常に高い共線性を示し、回帰モデルの信頼性に影響を及ぼす可能性がある。このレベルでは、モデルから変数を除外する、または他の方法で問題を緩和する必要があるかもしれない。
from statsmodels.stats.outliers_influence import variance_inflation_factor
# 各特徴量のVIF
vif_data = pd.DataFrame()
vif_data["Feature"] = X.columns
vif_data["VIF"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
vif_data
VIFを見る限り、駅徒歩15分以内の変数と、ホットペッパー掲載費以外の変数はダメそうですね。
あまり変数を減らしたくないので、とりあえずこのまま分析してみようと思います。
