240607 Today I Learn
๋ฐ์ดํฐ ์์ง
๋ฐ์ดํฐ ์์ง ํ๋ก์ธ์ค
- Data Source
- OLTP Database: OnLine Transaction Processing ์ ์จ๋ผ์ธ ๋ฑ ํน,์ผํ, ์ฃผ๋ฌธ ์ ๋ ฅ ๋ฑ ๋์์ ๋ฐ์ํ๋ ๋ค์์ ํธ๋์ญ์ (๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ๋จ์) ์ฒ๋ฆฌ ์ ํ
- Enterprise Applications: ํ์ฌ ๋ด ๋ฐ์ดํฐ (ex ๊ณ ๊ฐ ๊ด๊ณ ๋ฐ์ดํฐ, ์ ํ ๋ง์ผํ ์ธ์ผ์ฆ)
- Third - Party: Google Analytics์ ๊ฐ์ ์ธ๋ถ์์ค์์ ์์ง๋๋ ๋ฐ์ดํฐ
- Web/Log: ์ฌ์ฉ์์ ๋ก๊ทธ๋ฐ์ดํฐ
- ETL(Extract, Transform, and Load) : ๋ค์ํ ์์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ ์จ์ดํ์ฐ์ค์ ๊ฒฐํฉํ๋ ๊ณผ์
- Data Lake: ์์ ํํ์ ๋ค์ํ ์ ํ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
- Data Warehouse: ๋ณด๋ค ๊ตฌ์กฐํ๋ ํํ๋ก ์ ์ ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
- Data Marts: ํ์ฌ์ ๊ธ์ต, ๋ง์ผํ , ์์ ๋ถ์์ ๊ฐ์ด ํน์ ์กฐ์ง์ ๋ชฉ์ ์ ์ํด ๊ฐ๊ณต๋ ๋ฐ์ดํฐ
- BI/Analytics: business Intelligence(BI): ์์ฌ๊ฒฐ์ ์ ์ฌ์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ ๋ถ์ํ๋ ํ๋ก์ธ์ค
๋ฐ์ดํฐ ์์ง ๋ฐฉ๋ฒ
- ํ์ฌ ๋ด ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ → SQL, Python์ ์ฌ์ฉํด ๋ฐ์ดํฐ๋งํธ ์์ฑ
- ํ์ฌ ๋ด ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ
- CSV, EXCEL ํ์ผ ๋ค์ด๋ก๋
- API๋ฅผ ์ด์ฉํ ๋ฐ์ดํฐ ์์ง
- Data Crawling
๐ก API(Application Programming Interface)๋?
์์ฉํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ ์ ์๋๋ก, ์ด์์ฒด์ ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ ์ดํ ์ ์๊ฒ ๋ง๋ ์ธํฐํ์ด์ค.
๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ ๊ฒ์ ์น API๋ก, HTTP ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ์ธํฐ๋ท์ ํตํด ๋ฐ์ดํฐ ๋ฐ ๊ธฐ๋ฅ์ ์ ์กํ ์ ์๋๋ก ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
API์ ์์ : ์์ ๋ฏธ๋์ด
- ์์ ๋ฏธ๋์ด ํ์ฌ๋ API๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ฃผ์ฒด๊ฐ ์์ ๋ฏธ๋์ด ์ฑ์์ ์ ๊ณตํ๋ ์ฝํ ์ธ ๋ฅผ ๊ณต์ ํ๊ณ ์์ ์ ์ฌ์ดํธ์ ์๋ฒ ๋ํ ์ ์๋๋ก ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ธ์คํ๊ทธ๋จ API๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ์ ์ด ์น์ฌ์ดํธ์ ์ธ์คํ๊ทธ๋จ ๊ทธ๋ฆฌ๋๋ฅผ ์ฝ์ ํ๊ณ ์ฌ์ฉ์๊ฐ ์ ๊ฒ์๋ฌผ์ ์ถ๊ฐํ๋ฉด ๊ทธ๋ฆฌ๋๊ฐ ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋๋๋ก ํ ์ ์์ต๋๋ค.
ํ์์ ๋ฐ์ดํฐ ๋ถ์(EDA)
- ๊ธฐ์ ํต๊ณ๋ฅผ ์ด์ฉํ EDA
- info : ์ปฌ๋ผ๋ณ ๋ฐ์ดํฐ ๊ฐ์ ๋ฐ ๋ฐ์ดํฐ ํ์ ํ์ธ
- describe : ์ปฌ๋ผ๋ณ ๊ธฐ์ ํต๊ณ๋
→ include = 'all' ์ต์ ์ ์ฌ์ฉํ๋ฉด ๋ฒ์ฃผํ ๋ฐ์ดํฐ์ ๊ธฐ์ ํต๊ณ๋(์ต๋น๊ฐ) ํ์ธ ๊ฐ๋ฅ
- ์๊ฐํ๋ฅผ ์ด์ฉํ EDA
- countplot: ๋ฒ์ฃผํ ์๋ฃ์ ๋น๋ ์ ์๊ฐํ
→ ๋ฐ์ดํฐ์ ๊ฐ ์นดํ ๊ณ ๋ฆฌ๋ณ ๋น๋์ - barplot: ๋ฒ์ฃผํ ์๋ฃ์ ์๊ฐํ
→ ๊ฐ ์นดํ ๊ณ ๋ฆฌ์ ๋ฐ๋ฅธ ์์น ๋ฐ์ดํฐ์ ํ๊ท ์ ๋น๊ต - boxplot: ์์นํ & ๋ฒ์ฃผํ ์๋ฃ์ ์๊ฐํ
→ ๋ฐ์ดํฐ์ ๋ถํฌ, ์ค์๊ฐ, ์ฌ๋ถ์ ์, ์ด์์น ๋ฑ์ ํ๋์ ํํ - histogram: ์์นํ ์๋ฃ ๋น๋ ์๊ฐํ
→ ์ฐ์ํ ๋ถํฌ๋ฅผ ๋ํ๋ด๊ณ ์ถ์ ๋, ๋ฐ์ดํฐ๊ฐ ๋ชฐ๋ ค์๋ ๊ตฌ๊ฐ์ ํ์ - scatterplot: ์์นํ๋ผ๋ฆฌ ์๋ฃ์ ์๊ฐํ
→ ๋ ์ฐ์ํ ๋ณ์๊ฐ์ ๊ด๊ณ๋ฅผ ์๊ฐ์ ์ผ๋ก ํ์ - pairplot: ์ ์ฒด ๋ณ์์ ๋ํ ์๊ฐํ
→ ํ ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ ๋ณ์๋ฅผ ๋์์ ์๊ฐํ
- countplot: ๋ฒ์ฃผํ ์๋ฃ์ ๋น๋ ์ ์๊ฐํ
๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
์ด์์น์ ๊ฒฐ์ธก์น ์ฒ๋ฆฌ
- ์ด์์น ์ฒ๋ฆฌ
- Extreme Studentized Deviation(ESD) ์ด์ฉ : ๋ฐ์ดํฐ๊ฐ ์ ๊ท๋ถํฌ๋ฅผ ๋ฐ๋ฅธ๋ค๊ณ ๊ฐ์ ํ ๋, ํ๊ท ์์ ํ์คํธ์ฐจ์ 3๋ฐฐ ์ด์ ๋จ์ด์ง ๊ฐ์ด๋ค.
- IQR(Inter Quantile Range)๋ฅผ ์ด์ฉํ ์ด์์น ๋ฐ๊ฒฌ
- ๊ฒฐ์ธก์น ์ฒ๋ฆฌ
์ธ์ฝ๋ฉ
- ๋ ์ด๋ธ ์ธ์ฝ๋ฉ : ๋ฌธ์์ด ๋ฒ์ฃผํ ๊ฐ์ ๊ณ ์ ํ ์ซ์๋ก ํ ๋น
→sklearn.preprocessing.LabelEncoder
- ์ฅ์ : ๋ชจ๋ธ์ด ์ฒ๋ฆฌํ๊ธฐ ์ฌ์ด ์์นํ์ผ๋ก ๋ฐ์ดํฐ ๋ณํ
- ๋จ์ : ์ค์ ๋ก๋ ๊ทธ๋ ์ง ์์๋ฐ, ์์ ๊ฐ ํฌ๊ธฐ์ ์๋ฏธ๊ฐ ๋ถ์ฌ๋์ด ๋ชจ๋ธ์ด ์๋ชป ํด์ ํ ์ ์์
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
# ๋ผ๋ฒจ์ธ์ฝ๋๋ fitting ์ 1์ฐจ์ array๋ง์ ๋ฃ์ด์ผ ํจ.
le.fit(titanic['Sex'])
titaninc_df['Sex_le'] = le.transform(titaninc['Sex'])
# transform๊ณผ fitting์ ํ๋ฒ์ ํ๊ณ ์ถ๋ค๋ฉด
# fit_transform ์ฌ์ฉํ๊ธฐ
# titanic['Sex_le'] =le.fit_transform(titanic['Sex'])
- ์ ํซ ์ธ์ฝ๋ฉ : ๊ฐ ๋ฒ์ฃผ๋ฅผ ์ด์ง ํ์(0,1)์ผ๋ก ๋ณํํ๋ ๊ธฐ๋ฒ
→pd.get_dummies
,sklearn.preprocessing.OneHotEncoder
- ์ฅ์ : ๊ฐ ๋ฒ์ฃผ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ํํ๋์ด, ์์๊ฐ ์ค์๋๋ฅผ ์๋ชป ํ์ตํ๋ ๊ฒ์ ๋ฐฉ์ง, ๋ช ๋ชฉํ ๋ฐ์ดํฐ์ ๊ถ์ฅ
- ๋จ์ : ๋ฒ์ฃผ ๊ฐ์๊ฐ ๋ง์ ๊ฒฝ์ฐ ์ฐจ์์ด ํฌ๊ฒ ์ฆ๊ฐ(์ฐจ์์ ์ ์ฃผ) , ๋ชจ๋ธ์ ๋ณต์ก๋๋ฅผ ์ฆ๊ฐ, ๊ณผ์ ํฉ ์ ๋ฐ
from sklearn.preprocessing import OneHotEncoder
oe = OneHotEncoder()
# fitting
oe.fit(titanic[['Embarked']])
# transform
embarked_csr = oe.transform(titanic[['Embarked']])
# columns = oe.get_feature_names_out()์ด์ฉํด ๊ฐ๊ฐ์ ์ปฌ๋ผ์ผ๋ก ์ธ์ฝ๋ฉํ๊ธฐ
# ์๋ ๋ฐ์ดํฐ ํ๋ ์๊ณผ mergeํด์ ์ฌ์ฉํ ์ ์์
embarked_csr_df = pd.DataFrame(embarked_csr.toarray(), columns = oe.get_feature_names_out())
์ค์ผ์ผ๋ง
- ํ์คํ : ๊ฐ ๋ฐ์ดํฐ์ ํ๊ท ์ ๋นผ๊ณ ํ์คํธ์ฐจ๋ฅผ ๋๋์ด ํ๊ท ์ 0 ํ์คํธ์ฐจ๋ฅผ 1๋ก ์กฐ์
→sklearn.preprocessing.StandardScaler
- ์ฅ์ : ์ด์์น๊ฐ ์๊ฑฐ๋ ๋ถํฌ๊ฐ ์น์ฐ์ณ์ ธ ์์ ๋ ์ ์ฉ. ๋์ฒด๋ก ๋ง์ ์๊ณ ๋ฆฌ์ฆ์์ ์ข์ ์ฑ๋ฅ
- ๋จ์ : ๋ฐ์ดํฐ์ ์ต์-์ต๋ ๊ฐ์ด ์ ํด์ง์ง ์์.
# 'Fare'์ ๊ฒฝ์ฐ std๊ฐ ์ฝ 49.7 ๊ฐ๋์ผ๋ก ๋์ํธ
# ๋ฐ๋ผ์ ์ด์์น์ ๋ฏผ๊ฐํ์ง ์์ standard scaler ์ฌ์ฉ
from sklearn.preprocessing import StandardScaler
sd_sc = StandardScaler()
# fitting & transformation
titanic['Fare_sd_sc'] = sd_sc.fit_transform(titanic[['Fare']])
- ์ ๊ทํ : ๋ฐ์ดํฐ๋ฅผ 0๊ณผ 1์ฌ์ด ๊ฐ์ผ๋ก ์กฐ์ (์ต์๊ฐ 0, ์ต๋๊ฐ 1)
→sklearn.preprocessing.MinMaxScaler
- ์ฅ์ : ์ต๋-์ต์ ๋ฒ์๊ฐ ๋ช ํ
- ๋จ์ : ์ด์์น์ ์ํฅ์ ๋ง์ด ๋ฐ์ ์ ์์(๋ฐ๋๋ก ๋งํ๋ฉด ์ด์์น๊ฐ ์์ ๋ ์ ์ฉ)
# 'Age'์ ๊ฒฝ์ฐ ์ต๋, ์ต์ ๋ฒ์๊ฐ ๋ช
ํํด MinMaxScaler ์ฌ์ฉ
from sklearn.preprocessing import MinMaxScaler
mm_sc = MinMaxScaler()
# fitting & transformation
titanic['Age_mean_mm_sc'] = mm_sc.fit_transform(titanic[['Age_mean']])
- ๋ก๋ฒ์คํธ ์ค์ผ์ผ๋ง : ์ค์๊ฐ๊ณผ IQR์ ์ฌ์ฉํ์ฌ ์ค์ผ์ผ๋ง
→sklearn.preprocessing.RobustScaler
- ์ฅ์ : ์ด์์น์ ์ํฅ์ ๋ ๋ฏผ๊ฐ
- ๋จ์ : ํ์คํ์ ์ ๊ทํ์ ๋นํด ๋ ์ฌ์ฉ๋จ
๋ฐ์ดํฐ ๋ถ๋ฆฌ
๐ก ๊ณผ๋์ ํฉ(Overfitting)
๋ฐ์ดํฐ๋ฅผ ๋๋ฌด ๊ณผ๋ํ๊ฒ ํ์ตํ ๋๋จธ์ง ํด๋น ๋ฌธ์ ๋ง ์ ๋ง์ถ๊ณ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ ๋๋ก ์์ธก ํน์ ๋ถ๋ฅํ์ง ๋ชปํ๋ ํ์. ๋ชจํ์ด ์ง๋์น๊ฒ ๋ณต์กํ๊ฑฐ๋ ๋จ์ํ ๋ ๊ณผ๋์ ํฉ์ด ๋ฐ์ํ ์ ์์.
- ๋ชจ๋ธ์ ๋ณต์ก๋
- ๋ฐ์ดํฐ ์์ด ์ถฉ๋ถํ์ง ์์
- ํ์ต ๋ฐ๋ณต์ด ๋ง์(๋ฅ๋ฌ๋์ ๊ฒฝ์ฐ)
- ๋ฐ์ดํฐ ๋ถ๊ท ํ(์ ์ํ์ - ์ํ์์ ๋น์จ์ด 95: 5)
โท ๋ถ์ ๋จ๊ณ์์ ๊ณผ๋์ ํฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ชจ๋ธ์ ํ์ตํ๊ธฐ ์ํ Train ๋ฐ์ดํฐ์ ๋ชจ๋ธ์ ํ๊ฐํ๊ธฐ ์ํ Test ๋ฐ์ดํฐ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌํจ.
→ sklearn.model_selection.train_test_split
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(titanic[['Fare','Sex']],
titanic[['Survived']],
test_size= 0.3, # test ๋ฐ์ดํฐ์ ํฌ๊ธฐ ๋น์จ๋ก ์ง์ (test data๊ฐ 0.3์ผ๋ก ์
๋ ฅ๋๋ฉด train data๋ ์๋์ผ๋ก 0.7)
shuffle = True, # ๋ฐ์ดํฐ ์
ํ
random_state= 42, # seed
stratify = titanic[['Survived']]) # stratify (์ธตํ์ถ์ถ) ๋ฐ์ดํฐ์ ๋น์จ์ ๋ง์ถฐ์ ์ถ์ถํด์ค๋ค.
๋ชจ๋ธ๋ง ํ๊ฐ
๊ต์ฐจ ๊ฒ์ฆ๊ณผ GridSearch
๐ก๊ต์ฐจ๊ฒ์ฆ(Cross Validation)
๋ฐ์ดํฐ ์ ์ ์ฌ๋ฌ ๊ฐ์ ํ์ ์งํฉ์ผ๋ก ๋๋์ด ๋์๊ฐ๋ฉด์ ๊ฒ์ฆ ๋ฐ์ดํฐ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ. ๊ณ ์ ๋ ํ ์คํธ ๋ฐ์ดํฐ์์ ๋ฐ์ํ ์ ์๋ ๊ณผ์ ํฉ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ์ํด ์ฌ์ฉ
- K-Fold Validation : Train Data๋ฅผ K๊ฐ์ ํ์ ์งํฉ์ผ๋ก ๋๋์ด ๋ชจ๋ธ์ ํ์ต์ํค๊ณ ๋ชจ๋ธ์ ์ต์ ํ ํ๋ ๋ฐฉ๋ฒ
→skelarn.model_selection.KFold
,sklearn.model_selection.StrifiedKFold
- ๋ฐ์ดํฐ๊ฐ ๋ถ์กฑํ ๊ฒฝ์ฐ ์ ์ฉ
- K๊ฐ๋ก ๋๋ ์ง ๋ฐ์ดํฐ์ค 1๊ฐ์ฉ ํ ์คํธ ๋ฐ์ดํฐ๋ก ๋ฝ์์ ์ฌ์ฉ(5๊ฐ๋ผ๋ฉด 1๊ฐ๋ ํ ์คํธ, 4๊ฐ๋ Train ๋ฐ์ดํฐ๋ก ํ์ฉํ๊ณ ์ด ์์ ์ ์ด 5ํ ๋ฐ๋ณตํ๊ฒ ๋๋ค.)
from sklearn.model_selection import KFold
import numpy as np
# kfold ์ค์ - ๋ช ๊ฐ๋ก ๋ฐ์ดํฐ๋ฅผ ๋๋์ง
kfold = KFold(n_splits = 5)
# split๋ง๋ค score๋ฅผ ์ ์ฅํ ๋น ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ
scores = []
X = train_2[['Age_mm_sc','Fare_sd_sc','Family_mm_sc','Pclass_le','Sex_le','Embarked_C','Embarked_C','Embarked_C']]
y = train_2['Survived']
# kfold ๋ฒ ๋ชจ๋ธ์ ๊ต์ฐจ๊ฒ์ฆ ์ ํ๋ ํ์ธ
for i, (train_index, test_index) in enumerate(kfold.split(X)):
X_train, X_test = X.values[train_index], X.values[test_index]
y_train, y_test = y.values[train_index], y.values[test_index]
# accuracy ๊ณ์ฐํ๊ธฐ
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
model_lor2 = LogisticRegression()
model_lor2.fit(X_train,y_train)
y_pred2 = model_lor2.predict(X_test)
accuracy = accuracy_score(y_test, y_pred2)
# ๊ต์ฐจ๊ฒ์ฆ ์ ํ๋ print ํ ํ๊ท ์ ํ๋ ๊ณ์ฐ ์ํด ์ด๋ฅผ score์ ์ ์ฅ
print(i,'๋ฒ์งธ ๊ต์ฐจ๊ฒ์ฆ ์ ํ๋๋', accuracy)
scores.append(accuracy)
print('ํ๊ท ์ ํ๋', np.mean(scores))
๐กGrid Search
ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋์ ์ฌ์ฉ๋๋ ๊ธฐ์ ์ผ๋ก, ๋ชจ๋ธ์ ํ์ตํ ๋, ๋ค์ํ ํ์ดํผํ๋ผ๋ฏธํฐ ๊ฐ๋ค์ ์๋ํด๋ณด๊ณ ์ต์ ์ ์กฐํฉ์ ์ฐพ๋ ๊ณผ์ ์์ ํ์ฉ๋๋ค.๊ฐ๋ฅํ ๋ชจ๋ ํ์ดํผํ๋ผ๋ฏธํฐ ๊ฐ๋ค์ ์กฐํฉ์ ์๋ํด๋ณด๊ณ , ์ด๋ฅผ ํตํด ์ต์ ์ ๋ชจ๋ธ ์ฑ๋ฅ์ ์ฐพ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ ํจ์์ด๋ค. ํ์ดํผํ๋ผ๋ฏธํฐ ๊ณต๊ฐ์ด ์ปค์ง์๋ก ๊ณ์ฐ ๋น์ฉ์ด ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐํ๋ค๋ ๋จ์ ์ด ์๋ค.
# gridsearch ๋ผ์ด๋ธ๋ฌ๋ฆฌ import
from sklearn.model_selection import GridSearchCV
# solver(5) x max_iter(2) ๊ฐ์ ๋ชจ๋ธ์ ๋ง๋ค์ด์ ๊ฒฝ์ฐ์ ์ ๊ฒ์
params = {'solver' : ['newton-cg','lbfgs','liblinear','sag','saga'],
'max_iter' : [100,200]}
# solver์ default = lbfgs
grid_lor = GridSearchCV(model_lor2, param_grid = params, scoring='accuracy', cv = 5)
grid_lor.fit(X_train, y_train)
print('์ต๊ณ ์ ํ์ดํผ ํ๋ผ๋ฏธํฐ',grid_lor.best_params_)
print('์ต๊ณ ์ ์ ํ๋', grid_lor.best_score_.round(3))
'๐ Today I Learn > ๐ Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํต๊ณ์ผ ๋์ (4) ์ง๋ํ์ต๊ณผ ๋น์ง๋ํ์ต (1) | 2024.06.11 |
---|---|
ํต๊ณ์ผ ๋์ (3) ํ๊ท์ ์์ธก (2) | 2024.06.10 |
ํต๊ณ์ผ ๋์ (2) ๊ฐ์ค๊ฒ์ , ํต๊ณ์ ์ ์์ฑ, t๊ฒ์ (0) | 2024.06.05 |
๋จธ์ ๋ฌ๋์ ์ดํด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ฉ (3) ๋ก์ง์คํฑ ํ๊ท (1) | 2024.06.04 |
๋จธ์ ๋ฌ๋์ ์ดํด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ฉ (2) ๋ค์ค์ ํํ๊ท (0) | 2024.06.04 |