[Data Analysis] 데이터 정제 및 분석 해보기

2025. 3. 23. 01:13·Data Analysis/Basic
아마존 리뷰 데이터 세트를 이용해서 Pandas를 통해 데이터 정제 및 분석을 해보았다.

 

 

아마존 리뷰 데이터 세트를 사용했다.
 

 

pandas 데이터 프레임 길이 제한

pd.set_option('display.max_rows', 10)

 

1. 데이터 세트에 저장된 인덱스와 컬럼의 총 개수를 확인하고 데이터 타입이 문자열인 컬럼 조회하기

import pandas as pd

df_json = pd.read_json('Magazine_Subscriptions.json', lines=True)

info = df_json.info()
print("\n------------------------------------\n")

shape = df_json.shape
print(f"행 수: {shape[0]}, 열 수: {shape[1]}")

string_columns = df_json.select_dtypes(include=['object']).columns
print(f"데이터 타입이 문자열인 컬럼: {list(string_columns)}")

df = df_json.copy()

 

 

2. 데이터 세트에서 열 이름 변경하기

 
'asin' => 'item_id' , 'reviewerName' => 'user_id'
df = df.rename(columns={'asin': 'item_id', 'reviewerName': 'user_id'})
print(list(df.columns))
 
3. 5개 이상의 리뷰를 작성한 유저(‘user_id’)만을 포함한 데이터프레임을 생성하시오.
df_filtered = df.groupby('user_id').filter(lambda x: len(x) >= 5)
print(df_filtered)

 

4. ('verified'가 True인 경우)된 경우만을 필터링하고 인덱스를 초기화\

df_verified = df[df['verified'] == True]
df_verified_reset = df_verified.reset_index(drop=True)
print(df_verified_reset)

 

df_verified.reset_index(drop=True):

  • reset_index()는 데이터프레임의 인덱스를 초기화하는 역할을 합니다. 기본적으로, reset_index()는 새로운 인덱스를 생성하고 기존의 인덱스를 index라는 이름의 새로운 컬럼으로 추가
  • drop=True를 지정하면 기존 인덱스를 새로운 컬럼으로 추가하지 않고 그냥 버림. 즉, 기존 인덱스는 삭제되고 새롭게 0부터 시작하는 기본 정수 인덱스가 할당됨

5. (item_id) 칼럼에 대한 평균 평점(‘overall’)을 계산하여 새로운 열을 생성하고 개별 평점과 평균 평점 간의 차이의 절댓값을 계산하여 새로운 열에 저장하시오.

df['overall_mean'] = df.groupby('item_id')['overall'].transform('mean')
df['overall_deviation_abs'] = abs(df['overall'] - df['overall_mean'])
print(df[['item_id', 'overall', 'overall_mean', 'overall_deviation_abs']])
 

 

6. 'vote' 컬럼에서 누락된 데이터(Null 값)를 평균값으로 대체하시오. 데이터를 4개 구간으로 나누고 각 구간에 'Low', 'Medium', 'High', 'Very High'의 라벨을 적용하여 저장하시오.

df['vote'] = pd.to_numeric(df['vote'], errors='coerce')
df['vote'] = df['vote'].fillna(df['vote'].mean())

labels = ['Low', 'Medium', 'High', 'Very High']
df['label'] = pd.cut(df['vote'], bins=[0, 5, 10, 12, vote_max], labels=labels)

 

  • df['vote'] = pd.to_numeric(df['vote'], errors='coerce'):
    • pd.to_numeric()는 Pandas에서 데이터를 숫자형으로 변환하는 함수
    • df['vote']는 vote라는 컬럼을 의미. 이 컬럼의 데이터가 숫자형이 아닐 수 있기 때문에, 이를 숫자형으로 변환
    • errors='coerce'는 변환할 수 없는 값을 NaN (결측값)으로 처리하도록 지시. 예를 들어, vote 컬럼에 숫자가 아닌 값(문자열 등)이 있다면 그 값을 NaN으로
    예를 들어, df['vote']가 다음과 같은 값을 가질 경우:pd.to_numeric()는 'a'를 NaN으로 변환하고 나머지는 숫자 그대로 남깁니다:

 

  • df['vote'] = df['vote'].fillna(df['vote'].mean()):
    • df['vote'].fillna(df['vote'].mean())는 vote 컬럼의 결측값(NaN)을 해당 컬럼의 평균값으로
    • df['vote'].mean()는 vote 컬럼의 평균값을 계산합니다. 예를 들어, df['vote']가 [1, 2, NaN, 4, 5]일 경우, 평균값은 (1 + 2 + 4 + 5) / 4 = 3.0
    • fillna()는 NaN 값을 특정 값으로 채우는 함수입니다. 여기서는 df['vote'].mean() 값(3.0)을 NaN 대신 넣음

 

7. (‘reviewTime’)가 2015년 이전인 경우 '0', 이후인 경우 '1'로 표시하는 새로운 파생변수를 만드시오.

df['reviewTime'] = pd.to_datetime(df['reviewTime'], errors='coerce')
df['reviewTime_label'] = df['reviewTime'].apply(lambda x: 0 if x.year < 2015 else 1)

count_zeros = (df['reviewTime_label'] == 0).sum()
count_ones = (df['reviewTime_label'] == 1).sum()

 

 

=> 47842 41847

 

지금부터 각 질문에 대한 답변은 이전 질문에서 저장한 데이터를 계속해서 사용

df_json = pd.read_json('Magazine_Subscriptions.json', lines=True)
df_json_meta = pd.read_json('meta_Magazine_Subscriptions.json', lines=True)

df = df_json.copy()
df_meta = df_json_meta.copy()

 

8. 메타데이터 세트에서 'asin' 열에 포함된 중복 값을 제거한 후, 새로운 데이터프레임을 생성

df_meta.drop_duplicates(subset='asin', inplace=True)

 

9. 메타데이터 세트에서 'brand' 열에 포함된 공백 값을 제거하고 데이터프레임을 새롭게 생성한 뒤 인덱스를 초기화

df_meta = df_meta[df_meta['brand'].apply(lambda x: len(x) > 0)] 
df_meta_cleaned = df_meta.reset_index(drop=True)

 

10. 데이터 세트를 'asin' 열을 기준으로 결합하고, 다음 열을 포함하는 새로운 데이터프레임을 저장하시오. ['reviewerID', 'asin', 'overall', 'reviewText', 'brand', 'vote']

df_merged = pd.merge(df, df_meta_cleaned, on='asin', how='inner')
df_merged = df_merged[['reviewerID', 'asin', 'overall', 'reviewText', 'brand', 'vote']]
print(df_merged)

 

11. 'brand' 열에서 빈도가 가장 높은 상위 2개 브랜드를 찾고, 이 중 어떤 브랜드의 평균 평점이 더 높은지 확인하시오. 

top_brands = df_merged['brand'].value_counts().head(2).index
print(top_brands)

brand_avg_ratings = df_merged.groupby('brand')['overall'].mean()
print(brand_avg_ratings)

top_brands_avg_ratings = brand_avg_ratings[top_brands]
print(top_brands_avg_ratings)

 

12. 'brand' 열에서 빈도가 가장 높은 브랜드 중에서 최소 5개 이상의 리뷰를 가진 아이템을 선택하시오. 이 중에서 평균 평점(소수점 둘째 자리까지)이 가장 높은 상위 5개 아이템(asin)을 출력

top_brand = df_merged['brand'].value_counts().idxmax()
print(top_brand)

df_brand_filtered = df_merged[df_merged['brand'] == top_brand]
item_review_counts = df_brand_filtered['asin'].value_counts()
df_filtered_items = df_brand_filtered[df_brand_filtered['asin'].isin(item_review_counts[item_review_counts >= 5].index)]

# 아이템의 평균 평점 계산
item_avg_ratings = df_filtered_items.groupby('asin')['overall'].mean()

top_5_items = item_avg_ratings.sort_values(ascending=False).head(5)
print("평균 평점이 가장 높은 상위 5개 아이템(asin):")
print(top_5_items)

 

12. 각 아이템(asin)에 대한 리뷰 투표수(vote)의 총합을 계산(누락 데이터 제외)하고, 해당 결과를 내림차순으로 정렬하시오.

df_filtered_items['vote'] = pd.to_numeric(df_filtered_items['vote'], errors='coerce')

item_vote_sum = df_filtered_items.groupby('asin')['vote'].sum()

item_vote_sum_sorted = item_vote_sum.sort_values(ascending=False)

 

 

  • ascending=True (기본값): 오름차순 정렬. 작은 값에서 큰 값으로 정렬
  • ascending=False: 내림차순 정렬. 큰 값에서 작은 값으로 정렬

 

'Data Analysis > Basic' 카테고리의 다른 글

[Data Analysis] 데이터 전처리 해보기  (0) 2025.03.29
[Data Analysis] 데이터 시각화 해보기  (0) 2025.03.23
[Data Analysis] Pandas 라이브러리 연습 2  (0) 2025.03.20
[Data Analysis] Pandas 라이브러리 연습  (0) 2025.02.25
[Data Analysis] 데이터 분석 프로세스 알아보기  (0) 2025.02.19
'Data Analysis/Basic' 카테고리의 다른 글
  • [Data Analysis] 데이터 전처리 해보기
  • [Data Analysis] 데이터 시각화 해보기
  • [Data Analysis] Pandas 라이브러리 연습 2
  • [Data Analysis] Pandas 라이브러리 연습
임승택
임승택
"Hello, I am Lim Seungtaek, a computer engineering student. Nice to meet you!"
  • Lim's Technology
    임승택
    임승택
    "Welcome to Lim's Technology!"
  • 누적 조회수
    총 회
    구독하기
    • 분류 전체보기 (102)
      • Blog (10)
      • Computer Vision (44)
        • Computer Vision (4)
        • Paper reviews (24)
        • Project (8)
        • Basic (8)
      • LLM (8)
        • Paper reviews (3)
        • Project (3)
        • Basic (2)
      • Data Analysis (11)
        • Basic (8)
        • Project (3)
      • Computer Graphics (2)
        • Basic (2)
      • Robotics (5)
        • Paper reviews (3)
        • Basic (2)
      • Technology Notes (15)
      • Memo (5)
  • 인기 글

  • 최근 댓글

  • 최근 글

임승택
[Data Analysis] 데이터 정제 및 분석 해보기
상단으로

티스토리툴바