강의
https://www.metacodes.co.kr/edu/read2.nx?M2_IDX=31635&EP_IDX=15271&EM_IDX=15095
데이터
- Book Recommendation Dataset - https://www.kaggle.com/datasets/arashnic/book-recommendation-dataset
- 실사용 데이터 ( 강사님이 간단한 전처리를 진행하셨다. )
https://www.kaggle.com/datasets/liamsong/books-data
EDA를 하는 이유
진행 과정
중복 리뷰 id 확인
print(df.shape)
print(df.user_id.nunique()) # the number of unique users
print(df.isbn.nunique()) # the number of unique items
(383852, 10)
68092
149842
기초 통계치 만들기
book_info = df[['isbn', 'book_title', 'year_of_publication', 'book_author', 'category']].drop_duplicates()
book_info_rating = df.groupby(['isbn']).agg(rating_mean=('rating', 'mean'), rating_count=('rating', 'size')).reset_index()
book_info = book_info.merge(book_info_rating, on='isbn').sort_values("rating_count", ascending=False)
book_info.head(10)
print(book_info.shape)
print(book_info.isbn.nunique())
print(book_info.book_author.nunique())
print(book_info.category.nunique())
(149842, 7)
149842
62115
4295
결측치 확인
book_info.isnull().sum()
isbn 0
book_title 0
year_of_publication 0
book_author 1
category 68990
rating_mean 0
rating_count 0
dtype: int64
빈도 및 분포 그래프로 확인
# 1 row and 2 columns suplot 생성
fig, axes = plt.subplots(1, 2, figsize=(9, 4))
# 유저의 연령대별 빈도수 분포
df[['user_id', 'age_range']].drop_duplicates()['age_range'].value_counts().sort_index().plot(kind='bar', rot=0, ax=axes[0])
axes[0].set_title('Age Range Distribution')
# 유저가 남긴 평점들의 분포
df['rating'].value_counts().sort_index().plot(kind='bar', rot=0, ax=axes[1])
axes[1].set_title('Rating Distribution')
plt.tight_layout()
plt.show()
- 30대 리뷰어가 대부분이며, 평점은 주로 8점 근처에 수렴
- 단순 카운트와 유저당 어떤 통계를 내서 비교하는 것은 의미상 차이가 존재
- 유저당 통계는 단순 카운트와 달리 유저라는 분석 단위를 설정하고 분석하는 방법이며,
좀더 안정적인 통계를 산출하는 경향
평점 분포 확인
# 유저당 평균 점수로 확인
df.groupby("user_id")['rating'].mean().describe()
count 68092.000000
mean 7.487156
std 1.618264
min 1.000000
25% 6.666667
50% 7.769673
75% 8.500000
max 10.000000
Name: rating, dtype: float64
# 유저당 남긴 리뷰수의 분포
df.groupby("user_id")['rating'].size().value_counts().sort_index()[:50].plot(kind='bar', figsize=(12, 4), rot=0)
plt.title("The Count of Users' rates")
plt.tight_layout()
# 유저당 평점의 평균
df.groupby("user_id")['rating'].mean().hist(bins=10, figsize=(5,4), color='green', alpha=.4)
plt.title("The Histogram of Users' rating")
plt.axvline(x=7.487156, color='b', linestyle='--')
plt.grid()
plt.tight_layout()
[출처] 메타코드M
'코드 및 쿼리문 > 강의 - 메타코드M' 카테고리의 다른 글
Kaggle 데이터를 활용한 개인화 추천시스템(5) (1) | 2024.12.10 |
---|---|
Kaggle 데이터를 활용한 개인화 추천시스템(4) (1) | 2024.12.05 |
Kaggle 데이터를 활용한 개인화 추천시스템(3) (2) | 2024.12.05 |
Kaggle 데이터를 활용한 개인화 추천시스템(2) (2) | 2024.12.05 |
5년차 대기업 DA가 알려주는 A/B테스트 실무 방법론 (0) | 2024.12.02 |