๐ง ์ด์ปค๋จธ์ค ๋ฐ์ดํฐ ๋ถ์ 1 ํฌ์คํ ๊ณผ ์ด์ด์ง๋๋ค!
์ง๊ธ๊น์ง ๋ฐ์ดํฐ์ ์ ํ๊ณผ ๊ตญ๊ฐ๋ณ ๋ถํฌ๋ฅผ ์ ๋ฐ์ ์ผ๋ก ์ดํด๋ณด์๋ค. ๋ํ ํจ์๋ฅผ ์ง์ ํ์ฌ ๊ฒฐ์ธก์น์ ์ค๋ณต๊ฐ๋ ๊ฐ๋จํ ํ์ธํ๋ค.
์ด์ ๋ฐ์ดํฐ๋ฅผ ์ข ๋ ๊ตฌ์ฒด์ ์ผ๋ก ๋ค์ฌ๋ค๋ณด๋ '๊ธฐ์ ํต๊ณ'๋ฅผ ์์ํ๋ค.
๊ธฐ์ ํต๊ณ : Descriptive Statistics
desc_stats ํจ์๋ฅผ ์ ์ํ์ฌ ๊ธฐ์ ํต๊ณ ๊ฐ์ ๋ถ๋ฌ์ค๋๋ก ํ๋ค.
- df.describe(). T๋ฅผ ์ฌ์ฉํ์ฌ df์ ๊ธฐ์ ํต๊ณ๋์ ๊ณ์ฐํ๊ณ , ์ด๋ฅผ ์ ์นํ๋ค.
- ์ด ํต๊ณ๋์ pd.DataFrame()์ ํตํด ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์์ธ desc_df๋ก ๋ง๋ ๋ค.
- matplotlib์ f, ax๋ก Figure, Axes ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , sns๋ก ํํธ๋งต์ ๊ทธ๋ ค์ค๋ค.
- annot_kws : ํ์๋๋ ์ซ์์ ๊ธ๊ผด ํฌ๊ธฐ
def desc_stats(df):
desc_df = pd.DataFrame(index = df.columns,
columns = df.describe().T.columns,
data = df.describe().T)
f, ax = plt.subplots(figsize = (10, desc_df.shape[0] * 0.81))
sns.heatmap(desc_df, annot = True, cmap = 'Greens', fmt = '.2f', ax = ax, linecolor = 'white',
linewidth = 1.1, cbar = False, annot_kws = {'size':12})
plt.xticks(size = 18)
plt.yticks(size = 14, rotation = 0)
plt.title('Descriptive Statistics', size = 14)
plt.show()
๐ ์ด๋ ๊ฒ ์ซ์ํ ๋ฐ์ดํฐ์ ๊ธฐ์ ํต๊ณ๋์ ์๊ฐ์ ์ผ๋ก ํ์ธํ ์ ์๋ค.
๐ ๊ฒฐ๊ณผ๋ฅผ ํด์ํ๊ณ ์ฌ๊ธฐ๊น์ง ๋ถ์ํ ๋ด์ฉ์ ์ ๋ฆฌํด ๋ณด์.
๐ ์ ํ ํ๋งค ์๋(Quantity)๊ณผ ๋จ๊ฐ(UnitPrice)์ ์ด์์น(outliers)๊ฐ ๋ช ํํ๊ฒ ๋ณด์ด๋ฉฐ ์ฒ๋ฆฌ๋์ด์ผ ํจ.
๐ ๋จ๊ฐ(UnitPrice)์ ์์ ๊ฐ์ด ์์(์ฃผ๋ฌธ ์ทจ์ ๋๋ฌธ)
๐ ๊ณ ๊ฐ ID(Customer ID)์ ์ํ ์ค๋ช (Description)์ ๊ฒฐ์ธก๊ฐ์ด ์์(์ ํฌ์คํ ์์ ๊ฒฐ์ธก์น ์ฒดํฌ)
๐ ์ด ๊ฐ๊ฒฉ(Total Price)์ ์์ฑํ๊ธฐ ์ํด ์๋(Quantity)๊ณผ ๋จ๊ฐ(Unit Price)๋ฅผ ๊ณฑํด์ผ ํจ!
๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ : Data Preprocessing
๐ ์ ํ ํ๋งค ์๋(Quantity)๊ณผ ๋จ๊ฐ(UnitPrice)์ ์ด์์น(outliers)๊ฐ ๋ช ํํ๊ฒ ๋ณด์ด๋ฉฐ ์ฒ๋ฆฌ๋์ด์ผ ํจ.
- ์ด์์น๋ฅผ IQR๋ก ์ ๊ฑฐํ๋ ํจ์๋ฅผ ์ ์ํด ๋ณด์
- ๋งค๊ฐ๋ณ์๋ก dataframe, ์ ๊ฑฐํ๊ณ ์ ํ๋ ๋ณ์, q1, q3 ๊ฐ์ ์ง์ ํ๋ค.
- ๋ฐ์ดํฐ ํ๋ ์์ ๋ณต์ฌํ ํ, quantile() ํจ์๋ก q1, q3๋ฅผ ์ฐพ๋๋ค.
- q3 - q1์ผ๋ก IQR์ ์ฐพ๊ณ , up_limit, low_limit์ ์ง์ ํ๋ค.
- ๋ง์ง๋ง์ผ๋ก, ๋ฐ์ดํฐํ๋ ์์์ up_limit, low_limit์ ๋ฒ์ด๋ ๊ฐ์ up_limit, low_limit์ผ๋ก ๋์ฒดํ๋๋ก ํ๋ค!
- df_. loc [ ์กฐ๊ฑด, ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํ์ variable ์ด ] = ํ ๋นํ ์ ๊ฐ
def replace_with_thresholds(df, variable, q1 = 0.25, q3 = 0.75):
df_ = df.copy()
quartile1 = df_[variable].quantile(q1)
quartile3 = df_[variable].quantile(q3)
iqr = quartile3 - quartile1
up_limit = quartile3 + 1.5 * iqr
low_limit = quartile1 - 1.5 * iqr
# ์ค์!! 'variable' ์ด์ ๊ฐ์ 'low_limit'์ผ๋ก ๋์ฒด
df_.loc[(df_[variable] < low_limit), variable] = low_limit
df_.loc[(df_[variable] > up_limit), variable] = up_limit
return df_
๐ ๋จ๊ฐ(UnitPrice)์ ์์ ๊ฐ์ด ์์(์ฃผ๋ฌธ ์ทจ์ ๋๋ฌธ)
& ๊ณ ๊ฐ ID(Customer ID)์ ์ํ ์ค๋ช
(Description)์ ๊ฒฐ์ธก๊ฐ์ด ์์
& ์ด ๊ฐ๊ฒฉ(Total Price)์ ์์ฑํ๊ธฐ ์ํด ์๋(Quantity)๊ณผ ๋จ๊ฐ(Unit Price)๋ฅผ ๊ณฑํด์ผ ํจ!
- ๋๋จธ์ง ์ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ ํจ์๋ฅผ ์ ์ํด ๋ณด์.
- ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๊ณ , ๊ฐ์ฅ ๋จผ์ ๊ฒฐ์ธก์น๋ dropna()๋ก ์ ๊ฑฐํ๋ค.
- ์ทจ์๋ ์ฃผ๋ฌธ(ํ) ์ ๊ฑฐ : InvoiceNo ์ด์ C ๋ฌธ์์ด์ ํฌํจํ๋ ํ์ ์ ๊ฑฐ
- df_['InvoiceNo']. str.contains๋ก C๋ฅผ ํฌํจํ๋ ๊ฒ์ True๋ก ๋ฐํ
- ~ ๋ฅผ ๋ถ์ฌ์ค์ผ๋ก์จ C๋ฅผ ํฌํจํ๋ ๊ฒ์ False๋ก ๋ฐํ
- C๋ฅผ ํฌํจํ์ง ์๋ (True) ๊ฐ๋ง์ ๋ฐํํ์ฌ df_์ ์ ์ฅ
- ์ฃผ๋ฌธ๋์ 0 ์ด ์๋ ๊ฒ๋ง ํํฐ๋งํ๋ค.
- ์ด์์น๋ ์์ IQR๋ฅผ ํ์ฉํ๋ ํจ์๋ฅผ ์ด์ฉํ๋ค.(์ฌ๊ธฐ์๋ ์ํ์ 0.01%๋ง ์ ๊ฑฐํ๋ ๊ฒ์ผ๋ก ์ง์ )
- ํ๋งค ์ด์ก ์นผ๋ผ์ ์ถ๊ฐ
# ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ํจ์
def ecommerce_preprocess(df):
df_ = df.copy()
# ๊ฒฐ์ธก์น ์ ๊ฑฐ
df_ = df_.dropna()
# ์ทจ์๋ ์ฃผ๋ฌธ๊ณผ ์ฃผ๋ฌธ๋
# 'InvoiceNo' ์ด์ 'C' ๋ฌธ์์ด์ ํฌํจํ๋ ํ์ ์ ๊ฑฐ(nan๊ฐ์ ๋ฌด์)
df_ = df_[~df_['InvoiceNo'].str.contains('C', na = False)]
# ์ฃผ๋ฌธ๋์ด 0์ด ์๋ ๊ฒ๋ง ํํฐ๋ง
df_ = df_[df_['Quantity'] > 0]
# ์ด์์น ์ ๊ฑฐ
df_ = replace_with_thresholds(df_, 'Quantity', q1 = 0.01, q3 = 0.99)
df_ = replace_with_thresholds(df_, 'UnitPrice', q1 = 0.01, q3 = 0.99)
# ํ๋งค์ด์ก ์ปฌ๋ผ ์ถ๊ฐ
df_['TotalPrice'] = df_['Quantity'] * df_['UnitPrice']
return df_
๐ง๐ป ์ ์ฒ๋ฆฌ ํจ์ ์คํ ํ, ๊ธฐ์ ํต๊ณ๋ ๋ค์ ํ์ธํด ๋ณด๊ธฐ
- ๊ธฐ์ ํต๊ณ๋ ํ์ธ ํจ์์์ df.select_dtypes()๋ก ์ค์ํ๊ณผ ์ ์ํ ์นผ๋ผ์ ๋ํด์๋ง ๊ธฐ์ ํต๊ณ๋์ ํ์ธํ ์ ์๋๋ก ํ๋ค.
- df.select_dtypes(include = [float, int])
df = ecommerce_preprocess(df)
desc_stats(df.select_dtypes(include = [float, int]))
๐ ์ ์ฒ๋ฆฌ ํ, TotalPrice์ ๊ธฐ์ ํต๊ณ๋์ด ์ถ๊ฐ๋์์ผ๋ฉฐ / ๋จ๊ฐ์ ์ต์๊ฐ์ด ์์๊ฐ ์๋๋ฉฐ, ๊ทน๋จ์ ์ด์์น๊ฐ ์ ๊ฑฐ๋จ์ ์ ์ ์๋ค.