ํ๊ท๋ถ์
์ค๊ธ๊ณ ๊ธ
ํ์ต ๋ชฉํ
- ๋จ์/๋ค์ค ์ ํ ํ๊ท ์ดํด
- ํ๊ท ๊ณ์ ํด์
- ๋ชจ๋ธ ํ๊ฐ (Rยฒ, RMSE)
0. ์ฌ์ ์ค๋น (Setup)
๋ฐ์ดํฐ ์ค์ต์ ์ํด CSV ํ์ผ์ ๋ก๋ํฉ๋๋ค.
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.formula.api import ols
# Load Data
orders = pd.read_csv('src_orders.csv', parse_dates=['created_at'])
items = pd.read_csv('src_order_items.csv')
products = pd.read_csv('src_products.csv')
# Merge for Analysis
df = orders.merge(items, on='order_id').merge(products, on='product_id')1. ๋จ์ ์ ํ ํ๊ท
์ด๋ก
๋จ์ ์ ํ ํ๊ท๋ ํ๋์ ๋ ๋ฆฝ๋ณ์(X)๋ก ์ข ์๋ณ์(Y)๋ฅผ ์์ธกํฉ๋๋ค.
๋ชจ๋ธ: Y = ฮฒโ + ฮฒโX + ฮต
Python ๊ตฌํ
import statsmodels.api as sm
# ๋
๋ฆฝ๋ณ์์ ์ข
์๋ณ์
X = df['retail_price']
y = df['sale_price']
# ์์ํญ ์ถ๊ฐ
X = sm.add_constant(X)
# ํ๊ท ๋ชจ๋ธ ์ ํฉ
model = sm.OLS(y, X).fit()
# ๊ฒฐ๊ณผ ์ถ๋ ฅ
print(model.summary())
print(f"\nํด์:")
print(f"- ์ ํธ (ฮฒโ): {model.params['const']:.2f}")
print(f"- ๊ธฐ์ธ๊ธฐ (ฮฒโ): {model.params['retail_price']:.4f}")
print(f"- Rยฒ: {model.rsquared:.4f}")
print(f"โ ์ ๊ฐ๊ฐ $1 ์ฆ๊ฐํ๋ฉด ํ๋งค๊ฐ๋ ${model.params['retail_price']:.4f} ์ฆ๊ฐ")์คํ ๊ฒฐ๊ณผ
OLS Regression Results
==============================================================================
Dep. Variable: sale_price R-squared: 1.000
Model: OLS Adj. R-squared: 1.000
Method: Least Squares F-statistic: 2.045e+36
Date: Sat, 20 Dec 2025 Prob (F-statistic): 0.00
Time: 00:24:23 Log-Likelihood: 5.4535e+06
No. Observations: 181026 AIC: -1.091e+07
Df Residuals: 181024 BIC: -1.091e+07
Df Model: 1
Covariance Type: nonrobust
================================================================================
coef std err t P>|t| [0.025 0.975]
--------------------------------------------------------------------------------
const -1.644e-15 6.28e-17 -26.160 0.000 -1.77e-15 -1.52e-15
retail_price 1.0000 6.99e-19 1.43e+18 0.000 1.000 1.000
==============================================================================
Omnibus: 210423.122 Durbin-Watson: 1.142
Prob(Omnibus): 0.000 Jarque-Bera (JB): 32784753.264
Skew: 6.036 Prob(JB): 0.00
Kurtosis: 67.813 Cond. No. 120.
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
ํด์:
- ์ ํธ (ฮฒโ): -0.00
- ๊ธฐ์ธ๊ธฐ (ฮฒโ): 1.0000
- Rยฒ: 1.0000
โ ์ ๊ฐ๊ฐ $1 ์ฆ๊ฐํ๋ฉด ํ๋งค๊ฐ๋ $1.0000 ์ฆ๊ฐ2. ๋ค์ค ์ ํ ํ๊ท
์ฌ๋ฌ ๋ ๋ฆฝ๋ณ์ ์ฌ์ฉ
from statsmodels.formula.api import ols
# ์์์ผ๋ก ๋ชจ๋ธ ์ ์
model = ols('sale_price ~ retail_price + cost + num_of_item', data=df).fit()
print(model.summary())
# ๊ณ์ ํด์
print("\n๋ณ์๋ณ ์ํฅ:")
for var, coef in model.params.items():
if var != 'Intercept':
print(f"- {var}: {coef:.4f}")์คํ ๊ฒฐ๊ณผ
OLS Regression Results
==============================================================================
Dep. Variable: sale_price R-squared: 1.000
Model: OLS Adj. R-squared: 1.000
Method: Least Squares F-statistic: 9.789e+34
Date: Sat, 20 Dec 2025 Prob (F-statistic): 0.00
Time: 00:24:23 Log-Likelihood: 5.2778e+06
No. Observations: 181026 AIC: -1.056e+07
Df Residuals: 181022 BIC: -1.056e+07
Df Model: 3
Covariance Type: nonrobust
================================================================================
coef std err t P>|t| [0.025 0.975]
--------------------------------------------------------------------------------
Intercept -2.618e-14 2.79e-16 -93.752 0.000 -2.67e-14 -2.56e-14
retail_price 1.0000 9.97e-18 1e+17 0.000 1.000 1.000
cost 1.442e-16 2.16e-17 6.681 0.000 1.02e-16 1.87e-16
num_of_item 2.086e-15 1.17e-16 17.822 0.000 1.86e-15 2.32e-15
==============================================================================
Omnibus: 174196.359 Durbin-Watson: 1.677
Prob(Omnibus): 0.000 Jarque-Bera (JB): 11170271.467
Skew: -4.624 Prob(JB): 0.00
Kurtosis: 40.355 Cond. No. 236.
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
๋ณ์๋ณ ์ํฅ:
- retail_price: 1.0000
- cost: 0.0000
- num_of_item: 0.0000๋ฒ์ฃผํ ๋ณ์ ํฌํจ
# ๋ฒ์ฃผํ ๋ณ์๋ ์๋์ผ๋ก ๋๋ฏธ ์ธ์ฝ๋ฉ
model = ols('sale_price ~ retail_price + C(department)', data=df).fit()
print(model.summary())์คํ ๊ฒฐ๊ณผ
OLS Regression Results
==============================================================================
Dep. Variable: sale_price R-squared: 1.000
Model: OLS Adj. R-squared: 1.000
Method: Least Squares F-statistic: 1.018e+36
Date: Sat, 20 Dec 2025 Prob (F-statistic): 0.00
Time: 00:24:23 Log-Likelihood: 5.4530e+06
No. Observations: 181026 AIC: -1.091e+07
Df Residuals: 181023 BIC: -1.091e+07
Df Model: 2
Covariance Type: nonrobust
==========================================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------------------
Intercept -1.7e-14 8.01e-17 -212.274 0.000 -1.72e-14 -1.68e-14
C(department)[T.Women] -1.179e-14 9.43e-17 -125.084 0.000 -1.2e-14 -1.16e-14
retail_price 1.0000 7.02e-19 1.42e+18 0.000 1.000 1.000
==============================================================================
Omnibus: 176025.839 Durbin-Watson: 1.474
Prob(Omnibus): 0.000 Jarque-Bera (JB): 15454549.554
Skew: -4.573 Prob(JB): 0.00
Kurtosis: 47.331 Cond. No. 213.
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.3. ๋ชจ๋ธ ํ๊ฐ
Rยฒ (๊ฒฐ์ ๊ณ์)
- ๋ชจ๋ธ์ด ์ค๋ช ํ๋ ๋ถ์ฐ์ ๋น์จ
- 0~1 ์ฌ์ด, ๋์์๋ก ์ข์
RMSE (ํ๊ท ์ ๊ณฑ๊ทผ์ค์ฐจ)
from sklearn.metrics import mean_squared_error
import numpy as np
# ์์ธก
y_pred = model.predict(df)
# RMSE ๊ณ์ฐ
rmse = np.sqrt(mean_squared_error(df['sale_price'], y_pred))
print(f"RMSE: ${rmse:.2f}")์คํ ๊ฒฐ๊ณผ
RMSE: $0.00
๋ค์ค๊ณต์ ์ฑ ํ์ธ (VIF)
from statsmodels.stats.outliers_influence import variance_inflation_factor
# VIF ๊ณ์ฐ
X = df[['retail_price', 'cost', 'num_of_item']]
X = sm.add_constant(X)
vif_data = pd.DataFrame()
vif_data['๋ณ์'] = X.columns
vif_data['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
print("VIF (10 ์ด์์ด๋ฉด ๋ค์ค๊ณต์ ์ฑ ์์ฌ):")
print(vif_data)์คํ ๊ฒฐ๊ณผ
VIF (10 ์ด์์ด๋ฉด ๋ค์ค๊ณต์ ์ฑ ์์ฌ):
๋ณ์ VIF
0 const 5.081528
1 retail_price 29.215176
2 cost 29.215126
3 num_of_item 1.000010ํด์ฆ
๋ฌธ์
์ ๊ฐ(retail_price)์ ์๊ฐ(cost)๋ฅผ ์ฌ์ฉํ์ฌ ํ๋งค๊ฐ(sale_price)๋ฅผ ์์ธกํ๋ ํ๊ท ๋ชจ๋ธ์ ๋ง๋ค๊ณ , ๊ฐ ๋ณ์์ ์ํฅ๋ ฅ์ ํด์ํ์ธ์.
์ ๋ต ๋ณด๊ธฐ
from statsmodels.formula.api import ols
# ๋ค์ค ํ๊ท ๋ชจ๋ธ
model = ols('sale_price ~ retail_price + cost', data=df).fit()
print(model.summary())
print("\n=== ํด์ ===")
print(f"Rยฒ: {model.rsquared:.4f} (๋ชจ๋ธ์ด {model.rsquared*100:.1f}%์ ๋ถ์ฐ ์ค๋ช
)")
print(f"\n๊ณ์:")
print(f"- ์ ๊ฐ $1 ์ฆ๊ฐ โ ํ๋งค๊ฐ ${model.params['retail_price']:.4f} ์ฆ๊ฐ")
print(f"- ์๊ฐ $1 ์ฆ๊ฐ โ ํ๋งค๊ฐ ${model.params['cost']:.4f} ์ฆ๊ฐ")
# p-value ํ์ธ
for var in ['retail_price', 'cost']:
p = model.pvalues[var]
sig = "์ ์ํจ" if p < 0.05 else "์ ์ํ์ง ์์"
print(f"- {var}: p={p:.4f} ({sig})")์คํ ๊ฒฐ๊ณผ
OLS Regression Results
==============================================================================
Dep. Variable: sale_price R-squared: 1.000
Model: OLS Adj. R-squared: 1.000
Method: Least Squares F-statistic: 3.002e+34
Date: Sat, 20 Dec 2025 Prob (F-statistic): 0.00
Time: 00:24:24 Log-Likelihood: 5.1341e+06
No. Observations: 181026 AIC: -1.027e+07
Df Residuals: 181023 BIC: -1.027e+07
Df Model: 2
Covariance Type: nonrobust
================================================================================
coef std err t P>|t| [0.025 0.975]
--------------------------------------------------------------------------------
Intercept -3.617e-15 3.75e-16 -9.655 0.000 -4.35e-15 -2.88e-15
retail_price 1.0000 2.21e-17 4.53e+16 0.000 1.000 1.000
cost 9.236e-16 4.77e-17 19.345 0.000 8.3e-16 1.02e-15
==============================================================================
Omnibus: 179421.631 Durbin-Watson: 1.178
Prob(Omnibus): 0.000 Jarque-Bera (JB): 13824323.079
Skew: -4.786 Prob(JB): 0.00
Kurtosis: 44.727 Cond. No. 136.
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
=== ํด์ ===
Rยฒ: 1.0000 (๋ชจ๋ธ์ด 100.0%์ ๋ถ์ฐ ์ค๋ช
)
๊ณ์:
- ์ ๊ฐ $1 ์ฆ๊ฐ โ ํ๋งค๊ฐ $1.0000 ์ฆ๊ฐ
- ์๊ฐ $1 ์ฆ๊ฐ โ ํ๋งค๊ฐ $0.0000 ์ฆ๊ฐ
- retail_price: p=0.0000 (์ ์ํจ)
- cost: p=0.0000 (์ ์ํจ)๋ค์ ๋จ๊ณ
A/B ํ ์คํธ์์ ์คํ์ ํตํ ์ธ๊ณผ๊ด๊ณ ๊ฒ์ฆ์ ๋ฐฐ์๋ณด์ธ์.
Last updated on