์ฌํํ๋ก์ ํธ : ํ๊ท๋ถ์์ ํ์ฉํ ์๋งํธ ์ฃผ๊ฐ ํ๋งค๋ ์์ธก
์ฃผ์ ์ ์
์ฃผ์ ๋ฅผ ๊ณ ๋ฅด๋๋ฐ ์๊ฐ์ด ๊ฝค๋ ์ค๋ ๊ฑธ๋ ธ์ง๋ง, ๊ฒฐ๋ก ์ ์ผ๋ก๋ ๊ฝค๋ ๋ง์กฑํ๋ ์ ํ. ์ฒ์์๋ ๋๋ฌด ๊ฐ๋จํ์ง ์์๊น ์ถ์๋๋ฐ ๋ฐ์ดํฐ๋ฅผ ๋ง์ ๋ฏ์ด๋ณด๋ ์๊ฐํ๋ ๊ฒ๋ณด๋ค ์ด๋ ค์ ๋ค.
ํ๋ก์ ํธ ๊ฐ์
- ๋ถ์ ๋ชฉ์ : Walmart ๋งค์ฅ์ ํ๋งค ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ฉฐ, ์ฃผ๊ฐ ํ๋งค๋ ์์ธกํ๊ธฐ
- ๋ฐ์ดํฐ ์์ง : Kaggle
๋ฐ์ดํฐ ์๊ฐ
๐ก ์ด๋ ค์ ๋ ์
- Markdwon ์ปฌ๋ผ์ด ์ดํด๊ฐ ์ ๊ฐ์ง ์์์. (์ปฌ๋ผ ์ ๋ณด๊ฐ ๋ถ์กฑ)
- Dept, Store ์ด ๋ ๊ฐ์ ๋ฒ์ฃผํ ๋ณ์๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผํ ์ง ๊ณ ๋ฏผ์ด ๋ง์ด ๋์๋ค.
- ๋ฐ์ดํฐ์ ์๊ฐ ๋๋ฌด ๋ง์๋ฐ ์ด๋ฅผ ์ด๋ป๊ฒ ์ค์ฌ๋๊ฐ์ผ ํ ์ง ๊ณ ๋ฏผ
EDA
๊ทธ๋ฃน์ ๋๋ ์ EDA๋ฅผ ์งํํ๋ค. ๋ด๊ฐ ๋งก์ ํํธ๋ Holiday ๋ณ์ ์ค์ฌ์ EDA์๋ค.
df = train.copy()
# ๋งํฌ๋ค์ด ๊ฒฐ์ธก์น ์ฑ์๋ด
markdowns = ['MarkDown1','MarkDown2','MarkDown3','MarkDown4','MarkDown5']
df[markdowns] = train[markdowns].fillna(0)
๐ Store ๋ณ holiday์ ๋น์ค์ ๋น์ทํ๋ค.
df1 = df.groupby(['Store', 'IsHoliday']).size().unstack(1)
## ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
#stacked=True ๋ก ์ค์ ํ๋ฉด ๋์ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆด ์ ์์ต๋๋ค.
plt.figure(figsize= (16,9))
stacked_plot= df1.plot(kind='bar', stacked=True, color = ['#0071ce','#ffc220'])
plt.title("Holiday Ratio by Stores")
plt.xlabel("Store Num")
plt.xticks(rotation = 45)
plt.ylabel("Number of Dates")
## describe
df2 = df.groupby('Store')['IsHoliday'].agg({'count','sum'}).reset_index()
df2['Holiday_Ratio'] = df2['sum']/df2['count']
Store๋ณ date์ ์๊ฐ ๋ค๋ฅด๋ค. ์ด๋ ์ฆ, ๋ชจ๋ store๋ค์ ๋ ์ง ๋ฐ์ดํฐ๊ฐ ๋์ผ๊ธฐ๊ฐ ์์ง๋์ง ์์์์ ์๋ฏธ(๋์ ์์์ผ๋ก๋ ๋งค์ฅ๋ณ ์คํ ์๊ธฐ๊ฐ ์์ดํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ์ง ์์๊น ์๊ฐํ๋ค.) ํ๊ธฐ์, ์ค์ํ ๋ณ์๋ก ๋ Holiday์ ๋น์ค์ด ์ผ์ ํ์ง ํ์ธํด๋ณด์๋ค. Holiday ratio์ ๋น์จ์ด min 0.069, max 0.071 ๊ทธ๋ฆฌ๊ณ std๊ฐ 0.00004 ์ ๋๋ก ๋น๊ต์ ๋น์ทํ ๋น์จ์ ๊ฐ์ง๊ณ ์์์ ํ์ธํ๋ค.
๐ ์ด๋ค Holiday ์ฃผ๊ฐ์ด Weekly Sales๊ฐ ๋์๊น?
๋ณธ ๋ฐ์ดํฐ์๋ ์๋ 4๊ฐ์ holiday ๊ธฐ๊ฐ์ ๋ํด์ IsHoliday = True ๋ผ๊ณ ํ๊ธฐ๋์ด์์๋ค.
- Super Bowl(2์): 12-Feb-10, 11-Feb-11, 10-Feb-12, 8-Feb-13
- Labor Day(9์): 10-Sep-10, 9-Sep-11, 7-Sep-12, 6-Sep-13
- Thanksgiving(11์): 26-Nov-10, 25-Nov-11, 23-Nov-12, 29-Nov-13
- Christmas(12์): 31-Dec-10, 30-Dec-11, 28-Dec-12, 27-Dec-13
IsHoliday๊ฐ True์ธ ๊ฒ์ค, Holiday์(2,9,11,12์)์ ํด๋นํ๋ค๋ฉด holiday๋ณ ์์ต์ ์ ์ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํด์ ๋ค์๊ณผ ๊ฐ์ด ๋ถ์์ ์งํํด๋ณด์๋ค.
df_holiday['holiday_type'] = df_holiday['Month'].apply(lambda x:
'SuperBowl' if x == 2 else
'LaborDay' if x == 9 else
'ThanksGiving' if x == 11 else
'Christmas' if x == 12 else
'anomalies'
)
df_holiday_mean_sales = df_holiday.groupby(['holiday_type','Store'])['Weekly_Sales'].mean().reset_index()
๋ฐ์ดํฐ์ ์์ง๊ธฐ๊ฐ์ด 2010.2์~ 2012.10์์ด๋ฏ๋ก, ์ถ์๊ฐ์ฌ์ ๊ณผ ํฌ๋ฆฌ์ค๋ง์ค์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ ์๊ฐ ์๋์ ์ผ๋ก ์ ์๋ค. ๋ฐ๋ผ์ holiday์ ์ข ๋ฅ ๋ณ๋ก store์ weekly sales ํ๊ท ์ ์์ ๊ฐ์ด ๊ตฌํด๋ณด์๋ค.
๋ถ์ ๊ฒฐ๊ณผ Thanksgiving์ ์ฃผ๊ฐ ํ๋งค๋์ด ๋๋จธ์ง holiday์ ๋นํด ์๋์ ์ผ๋ก ๋์ ๊ฒ์ ํ์ธํ ์ ์์๋ค. ์ฐจ์ด๊ฐ ํฌ์ง ์์ง๋ง, christmas์ weekly sales๊ฐ ๊ฐ์ฅ ๋ฎ์๋ค.
* ์ด๊ธฐ ์งํํ๋ ๋ถ์์ sum ์ ๊ตฌํ๋ ๋ฐฉ์์ด์๋๋ฐ ๋ด๊ฐ ์ ๊ทธ๋ฌ์๊น..ํํ
๐ Holiday Type ๋ณ๋ก popular department๊ฐ ์๋์ง?
df_holiday_dept_avg = df_holiday.groupby(['holiday_type','Dept'])['Weekly_Sales'].mean().reset_index()
holiday type๋ณ๋ก weekly sales์ ํ๊ท ์ด ๊ฐ์ฅ ๋์ dept๋ฅผ ์์๋ณด๊ธฐ ์ํด ์์ ๊ฐ์ ๋ฐ์ดํฐ ํ๋ ์์ ๋ง๋ค์๋ค.
plt.figure(figsize=(16,9))
sns.barplot(data=df_holiday_dept_avg,x='Dept',y='Weekly_Sales', hue = 'holiday_type')
plt.xticks(rotation = 45)
plt.title('Popular Department by Holiday Types')
plt.show()
์ธ๊ธฐ์๋ ํ๋ชฉ๋ค์ ๋์ฒด๋ก ๋น์ทํ๋, Thanksgiving์ ๊ฒฝ์ฐ 5,7,๊ทธ๋ฆฌ๊ณ 72๋ฒ Dept์ ๊ฐ์ด ๋์ ๋๊ฒ ๋์ ๊ฐ์ ๊ธฐ๋กํ๋ค. ํด๋น ํ๋ชฉ์ ๊ฒฝ์ฐ Thanksgiving holiday์ ์ฐ๊ด์ด ๋์ ํญ๋ชฉ์ผ ๊ฒ์ด๋ผ๊ณ ์์ํด๋ณผ ์ ์๋ค.