← ํ”„๋กœ์ ํŠธ ๋ชฉ๋ก์œผ๋กœ

๐Ÿ… ์ธ๊ณต์ง€๋Šฅ ๊ต์œก ๋‹จ์ฒด OUTTA AI ๋ถ€ํŠธ์บ ํ”„ - ๋ฐ์ดํ„ฐ๋ฐ˜ ์šฐ์ˆ˜์ƒ ์ˆ˜์ƒ

์ด์ปค๋จธ์Šค ์ƒํ’ˆ ๋ณ„์  ์˜ˆ์ธก ๋ฐ ์ถ”์ฒœ์‹œ์Šคํ…œ ๊ตฌํ˜„

2023/06/27 โ†’ 2023/08/24

์‚ฐ์—…/๋ถ„์•ผ
์ด์ปค๋จธ์Šค์ƒํ’ˆ
์ง๋ฌด/๊ธฐ์ˆ 
Python์›นํฌ๋กค๋ง์ถ”์ฒœ์‹œ์Šคํ…œ์˜ˆ์ธก
์ด์ปค๋จธ์Šค ์ƒํ’ˆ ๋ณ„์  ์˜ˆ์ธก ๋ฐ ์ถ”์ฒœ์‹œ์Šคํ…œ ๊ตฌํ˜„ ์ปค๋ฒ„ ์ด๋ฏธ์ง€

Step1. ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘

์˜ฌ๋ฆฌ๋ธŒ์˜ ์Šคํ‚จ์ผ€์–ด ์ œํ’ˆ์˜ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ํฌ๋กค๋ง

  • ์ œํ’ˆ ์ •๋ณด: ๋ธŒ๋žœ๋“œ๋ช…, ์ƒํ’ˆ๋ช…, ์นดํ…Œ๊ณ ๋ฆฌ, ์ •๊ฐ€, ํ• ์ธ๊ฐ€
  • ๊ณ ๊ฐ ๋ฐ ๋ฆฌ๋ทฐ ์ •๋ณด: ์•„์ด๋””, ๋ณ„์ , ํ”ผ๋ถ€ํƒ€์ž…, ํ”ผ๋ถ€๊ณ ๋ฏผ ๋“ฑ

selenium, ChromeDriverManager, requests, BeautifulSoup, openpyxl ๋“ฑ ํ™œ์šฉ

ํฌ๋กค๋งํ•œ ์˜ฌ๋ฆฌ๋ธŒ์˜ ์Šคํ‚จ์ผ€์–ด ์ œํ’ˆ ๋ฐ ๋ฆฌ๋ทฐ ๋ฐ์ดํ„ฐ ์ƒ˜ํ”Œ ํ‘œ
ํฌ๋กค๋ง ๋ฐ์ดํ„ฐ ์ƒ˜ํ”Œ

Step2. ์ƒํ’ˆ ๋ณ„์  ์˜ˆ์ธก

Random Forest ๋ฐ KNN(K-Nearest Neighbor) ๋ชจ๋ธ ์‚ฌ์šฉ

SMOTE ์˜ค๋ฒ„์ƒ˜ํ”Œ๋ง, StandardScaler, Grid Search ๋“ฑ ํ™œ์šฉ

๋ฐ์ดํ„ฐ ๋ถˆ๊ท ํ˜• ํ™•์ธ โ†’ SMOTE ์˜ค๋ฒ„์ƒ˜ํ”Œ๋ง ์ˆ˜ํ–‰

๋ณ„์ ๋ณ„ ๋ฆฌ๋ทฐ ์ˆ˜ ๋ถ„ํฌ โ€” 5์ ์— ํŽธ์ค‘๋œ ๋ฐ์ดํ„ฐ ๋ถˆ๊ท ํ˜•
๋ณ„์  ๋ถ„ํฌ (๋ฐ์ดํ„ฐ ๋ถˆ๊ท ํ˜• ํ™•์ธ)

[๋žœ๋คํฌ๋ ˆ์ŠคํŠธ] ํ”ผ์ฒ˜ ์ค‘์š”๋„ ์‹œ๊ฐํ™” / ํ˜ผ๋™ํ–‰๋ ฌ ์‹œ๊ฐํ™”

๋žœ๋คํฌ๋ ˆ์ŠคํŠธ ํ”ผ์ฒ˜ ์ค‘์š”๋„ Top 20 ๋ฐ” ์ฐจํŠธ
ํ”ผ์ฒ˜ ์ค‘์š”๋„ Top 20
๋žœ๋คํฌ๋ ˆ์ŠคํŠธ ํ˜ผ๋™ํ–‰๋ ฌ ํžˆํŠธ๋งต
ํ˜ผ๋™ํ–‰๋ ฌ

Step3. ์ถ”์ฒœ์‹œ์Šคํ…œ ๊ตฌํ˜„

๊ณ ๊ฐ-์ œํ’ˆ ํ‰์  ํ–‰๋ ฌ ์ƒ์„ฑ, ๊ณ ๊ฐ ๊ฐ„ ์œ ์‚ฌ๋„ ๋ถ„์„ (cosine_similarity ํ™œ์šฉ)

# ๊ณ ๊ฐ ๊ฐ„ ์œ ์‚ฌ๋„ ๊ณ„์‚ฐ
from sklearn.metrics.pairwise import cosine_similarity

cos_matrix = cosine_similarity(df_users)
df_users_cosine = pd.DataFrame(cos_matrix, index=df_users.index, columns=df_users.index)
๊ณ ๊ฐ ๊ฐ„ ์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„ ํ–‰๋ ฌ ์ถœ๋ ฅ ๊ฒฐ๊ณผ
๊ณ ๊ฐ ๊ฐ„ ์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„ ํ–‰๋ ฌ

์ œํ’ˆ ๋ฐ ๋ณ„์  ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ User-Based CF ์ถ”์ฒœ์‹œ์Šคํ…œ ๊ตฌํ˜„

๊ณ ๊ฐ ์•„์ด๋””์™€ ์›ํ•˜๋Š” ์ œํ’ˆ ์œ ํ˜• ์ž…๋ ฅ โ†’ ํ•ด๋‹น ์œ ์ €์™€ ์œ ์‚ฌ๋„๊ฐ€ ๋†’์€ ๊ณ ๊ฐ์˜ ํ‰์  ๋†’์€ ์ œํ’ˆ ์ถ”์ฒœ

def user_based_recommend(user_id, product_type):
    # ์œ ์ € ์•„์ด๋””์™€ ์œ ์‚ฌ๋„ ๋†’์€ 5๋ช… ์ฐพ๊ธฐ
    sim_users = df_users_cosine[user_id].sort_values(ascending=False)[1:6].index

    # ์œ ์‚ฌํ•œ ์œ ์ €๋“ค์˜ ๋ฐ์ดํ„ฐ ์ถ”์ถœ
    sim_user_df = df[df['user_id'].isin(sim_users)]

    # ์ž…๋ ฅํ•œ product_type๊ณผ ์ผ์น˜ํ•˜๋Š” ์ œํ’ˆ ์ถ”์ถœ ๋ฐ ์ •๋ ฌ
    products = sim_user_df[sim_user_df['product_type'] == product_type].sort_values(by='rating', ascending=False)

    # rating 4์  ์ด์ƒ์ธ ์ œํ’ˆ๋งŒ ์ถ”์ถœ
    products = products[products['rating'] >= 4.0]

    # product_name ์ค‘๋ณต ์ œ๊ฑฐ (์ฒซ ๋ฒˆ์งธ ๊ฐ’๋งŒ ๋‚จ๊น€)
    products.drop_duplicates(subset='product_name', keep='first', inplace=True)

    result = pd.DataFrame(products['product_name'])
    result.columns = ['๋‚˜์™€ ๋น„์Šทํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ์กฑํ•œ ' + product_type + ' ์ œํ’ˆ']
    return result

result = user_based_recommend(user_id=1, product_type='์•ฐํ”Œ')
user_id=1, product_type='์•ฐํ”Œ'์— ๋Œ€ํ•œ ์ถ”์ฒœ ๊ฒฐ๊ณผ ์ถœ๋ ฅ
์ถ”์ฒœ ๊ฒฐ๊ณผ ์˜ˆ์‹œ (์•ฐํ”Œ ์ œํ’ˆ)

๋กœ์ง: ์ž…๋ ฅ ์•„์ด๋””์™€ ์œ ์‚ฌ๋„ ๋†’์€ 5๋ช… ํƒ์ƒ‰ โ†’ ํ•ด๋‹น ์œ ์ €๋“ค์˜ ๋ฐ์ดํ„ฐ ์ค‘ ์›ํ•˜๋Š” product_type ํ•„ํ„ฐ๋ง โ†’ rating ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ โ†’ rating 4์  ์ด์ƒ๋งŒ โ†’ ์ƒํ’ˆ๋ช… ์ค‘๋ณต ์ œ๊ฑฐ โ†’ ์ถ”์ฒœ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜