์ฌํํ๋ก์ ํธ : ํ๊ท๋ถ์์ ํ์ฉํ ์๋งํธ ์ฃผ๊ฐ ํ๋งค๋ ์์ธก
โ Weekly Sales์ ์์๊ฐ, ๊ณผ์ฐ ์ด์์น(์ค๊ธฐ์ )๋ก ๋ด์ผํ๋๊ฐ?
์๋๋ค. Sales ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ, ํ๋ถ์ด๋ ํ์ ๋ฑ์ ์ฌ์ ๋ก ์์๊ฐ์ด ๋์ฌ์ ์๋ค. ๋ฐ๋ผ์ ์์๊ฐ์ ์ด์์น๋ก ๋ณผ ์ ์๋ค.
โ๏ธ ์ด๊ธฐ ๋ณ์ ์ ํ
1. Markdown 1~5 ์ปฌ๋ผ์ ์ฌ์ฉํด์ผํ๋๊ฐ?
์๋์ ์ด์ ๋ค๋ก Markdown 1~5 ์ปฌ๋ผ์ ์ฌ์ฉํ์ง ์๊ธฐ๋ก ํ๋ค.
- ๊ฒฐ์ธก์น์ ๋น์จ์ด ๋๋ฌด ๋๋ค. → ์ ์ฒด์ 64%๊ฐ ๊ฒฐ์ธก์น
- ์ปฌ๋ผ์ ๋ํ ์ ๋ณด๊ฐ ๋ถ์กฑํ๋ค → ํด๋น ํ๋ชฉ์ ๋ํ sales์ ํฉ๊ณ์ธ์ง ํด๋น ์ผ์์ ๋ํ weekly sales ํฉ๊ณ์ธ์ง ๋ถ๋ช ํํจ.
2. Type, Size ๋ณ์๋ฅผ ๋ชจ๋ ์ฌ์ฉํด์ผํ๋๊ฐ?
Type, Size ๋ ๋ณ์๊ฐ ํผ์ด์จ ์๊ด๊ณ์๊ฐ -0.81๋ก ๋ค์ค๊ณต์ ์ฑ ๋ฌธ์ ๊ฐ ์ผ์ด๋ ์ ์๋ค๊ณ ํ๋จ, ๋ ๋ณ์์ค ํ๋์ ๋ณ์๋ง ์ ํํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
- Weekly_Sales ๋ณ์์ ๋ ์ํฅ์ ๋ง์ด ์ฃผ๋ ๋ณ์๋ Size์ด๋ค.
df[['Size', 'Type_le']].corrwith(df['Weekly_Sales'])
- Type๋ณ Size๋ฅผ ๋ํ๋์ ๋, ๋์ผ Type๋ด์์ ๊ณผ๋ํ๊ฒ Size๊ฐ ์์ Store๋ค์ด ์กด์ฌ. A์ B์ ์ด์์น๋ค์ ์คํ๋ ค C์ ๊ฐ๊ฒฉ ํ๊ท ์ด ๋น์ทํ ์์์ ๋.
# Size๋ฅผ ๊ธฐ์ค์ผ๋ก store df ์ ๋ ฌ
stores.sort_values(by='Size', ascending=False).reset_index()
# ๊ทธ๋ํ๋ก ๋ถํฌ ํ์ธ
sns.histplot(data=stores, x='Size', hue='Type', bins = 10)
plt.axvline(x=75000, linestyle='--', color='r')
plt.axvline(x=145000, linestyle='--', color='r')
Boxplot์ผ๋ก ํ์ธํด๋ณธ ๊ฒฐ๊ณผ, A, B ๊ฐ๊ฐ์ ์ด์์น๊ฐ ์กด์ฌํ๋ค. ์ด ์ด์์น ๊ทธ๋ฃน์ Type์ ๋ฐ๋ผ (out_a, out_b)๋ก ๋๋์ด ํ๊ท ์ ํ์ธํ ๊ฒฐ๊ณผ, A์ B์ ์ฌ์ด์ฆ ๋ณด๋ค๋ C์ ์ฌ์ด์ฆ์ ๋ ๋น์ทํ๋ค๋ ์ฌ์ค์ ํ์ธํ๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก Type ๋ณ์ ๋์ Size ๋ณ์๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
๐งจ ML ๋ชจ๋ธ ์ค๊ณ
๊ธฐ๋ณธ ํ ์ด๋ธ
# Type, MarkDown1-5 ์ ๊ฑฐ
df = train.copy()
mask = ['Type','MarkDown1','MarkDown2','MarkDown3','MarkDown4','MarkDown5']
df = train.drop(columns=mask)
# ๋ ์ง ๋ฐ์ดํฐ ์ฒ๋ฆฌ
df["Date"] = pd.to_datetime(df["Date"])
df['Year'] = df['Date'].dt.year
df['Month'] = df['Date'].dt.month
df['Day'] = df['Date'].dt.day
df['Week'] = df['Date'].apply(lambda x: x.isocalendar()[1])
์ธ์ฝ๋ฉ
๋ชจ๋ธ๋ง์ ์ํด ๋ถ๋ฆฌ์ธ ์ธ๋ฑ์ฑ ๋์ด์๋ IsHoliday ๋ณ์์, ๋ชจ๋ธ๋ง ์ ์ค์ฐจ ๊ณ์ฐ์ ์ค์ด๊ธฐ ์ํด Year ๋ณ์๋ฅผ ๋ผ๋ฒจ ์ธ์ฝ๋ฉํ์๋ค. ์ถํ ๋ถ์์ ์๋ณธ ์ปฌ๋ผ์ ํ์ฉํ ์ ์์ด Year_le, IsHoliday_le์ ๊ฐ์ด ๋ผ๋ฒจ๋ง๋ ๋ฐ์ดํฐ ์ปฌ๋ผ์ ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ์ธ์ฝ๋ฉ์ ์งํํ๋ค.
# isHoliday, Year ์ธ์ฝ๋ฉ
from sklearn.preprocessing import LabelEncoder
le1 = LabelEncoder()
le2 = LabelEncoder()
df['IsHoliday_le'] = le1.fit_transform(df['IsHoliday'])
df['Year_le'] = le2.fit_transform(df['Year'])
์ค์ผ์ผ๋ง
์ค์ผ์ผ๋ง์ ํ๊ธฐ์ ์์, ๋ฐ์ดํฐ์ ํํ์ ์ ํฉํ ์ค์ผ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด Store ํ ์ด๋ธ์ ์๋ ํผ์ฒ Size์, Features ํ ์ด๋ธ์ ์๋ feature๋ค์ ๋ํด ์ถ๊ฐ์ ์ผ๋ก ์ด์์น ๋ฐ ๋ถํฌ ํ์์ ์งํํ๋ค.
Lower Bound | Upper Bound | |
Temperature | 5.28 | 115.68 |
Fuel Price | 1.73 | 4.95 |
CPI | 11.43 | 333.01 |
Unemployment | 4.37 | 11.09 |
๋ณด๋ค์ํผ Temperature์ Unemployment์ ๊ฒฝ์ฐ ์ด์์น๊ฐ ์กด์ฌํจ์ ํ์ธํ ์ ์์๋ค. ๋ชจ๋ธ์ ์ค๊ณํ๊ธฐ ์ํด ์ต๋ํ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ํ๋ณดํ๊ธฐ ์ํด ์ด์์น๋ฅผ ์ ๊ฑฐํ๊ธฐ ๋ณด๋ค๋, ์ด์์น์ ๊ฐ๊ฑดํ Standard Scaler๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค.
๋ํ, ํ ์ด๋ธ ์กฐ์ธ์ Dept๋ฑ์ ์ํฅ์ผ๋ก ๋ถํฌ์ ์ํฅ์ด ์๋์ง ํ์ธํ๊ธฐ ์ํด, ์กฐ์ธ๋ ํ ์ด๋ธ์์์ ๋ณ์์ ๋ถํฌ์ ์กฐ์ธ๋๊ธฐ ์ ์๋ณธ(Original) ํ ์ด๋ธ์์ ๋ณ์์ ๋ถํฌ๋ฅผ ๋น๊ตํด๋ณด์๋ค.
sns.kdeplot(data=df, x='Fuel_Price_sd', color = '#57AEFF', fill = True)
sns.kdeplot(data=features, x='Fuel_Price_sd', color = '#FFC220', fill = True)
plt.axvline(x=-2, linestyle = '--', color = '#EB5757')
plt.axvline(x=-0.5, linestyle = '--', color = '#EB5757')
plt.title('Distribution of Fuel_Price(Joined vs. Original)')
plt.legend(['Joined','Original'])
ํ์ธ ๊ฒฐ๊ณผ ์๋์ ํ ์ด๋ธ๊ณผ ์กฐ์ธ๋ ํ ์ด๋ธ์ ๋ถํฌ๊ฐ ๋ค๋ฅด๊ฒ ๋ํ๋ฌ๋ค. ๋ฐ๋ผ์ ์๋์ ๋ถํฌ๋ฅผ ์ด๋ฆฌ๊ธฐ ์ํด์ Fit์ ์๋ ํ ์ด๋ธ(๊ฐ๊ฐ Stores, Features)์์ ์งํํ๊ณ Transform์ ์กฐ์ธ๋ ๋ฐ์ดํฐํ๋ ์์์ ์ ์ฉํ์๋ค.
๋ฐ๋ผ์ ๋ชจ๋ธ๋ง์ ์ํด Size, Temperature, Fuel_Price, CPI, Unemployment ํผ์ฒ๋ค์ด ์์ ๊ฐ์ด ์ค์ผ์ผ๋ง๋์๋ค.
# ์ค์ผ์ผ๋ง
# ๋์
# Store-Size Scaling
from sklearn.preprocessing import StandardScaler
store_sd = StandardScaler()
store_sd.fit(store[['Size']])
# Store-Size Scaler df์ ์ ์ฉ
df['Size_sd'] = store_sd.transform(df[['Size']])
# ์ํด
# ์ค์ผ์ผ๋งํ ์ด ๋ชฉ๋ก
columns_to_scale = ['Temperature', 'Fuel_Price', 'CPI', 'Unemployment']
# ์ค์ผ์ผ๋ง ์งํ
scaler = StandardScaler()
scaler.fit(features[columns_to_scale])
#๋ฐ์ดํฐํ๋ ์์ด์ ๋ถ์ด๊ธฐ(์ปฌ๋ผ๋ช
๋ง๋ค๊ธฐ)
col_names = ['Temperature_sd', 'Fuel_Price_sd', 'CPI_sd', 'Unemployment_sd']
#4๊ฐ ์ปฌ๋ผ ์์ฑ ํธ๋์คํผ.
df[col_names] = scaler.transform(df[columns_to_scale])