본문 바로가기
인공지능/데이터분석

online Retail 데이터셋 - 캐글

by hyunji00pj 2025. 1. 17.

1. 캐글

캐글(Kaggle)은 데이터 과학자와 머신러닝 엔지니어들이 학습, 협업, 경쟁할 수 있는 온라인 플랫폼입니다. 구글에 소속된 이 플랫폼은 다양한 데이터셋과 머신러닝 문제를 제공하며, 사용자들이 자신의 모델을 개발하고 성능을 경쟁적으로 평가받을 수 있는 경진대회도 열립니다. 초보자는 데이터를 다루는 실습을 하고, 경험 많은 전문가들은 포트폴리오를 확장하거나 상금을 받을 기회를 얻을 수 있습니다. 또한, 커뮤니티 포럼과 튜토리얼, 노트북 공유를 통해 지식을 공유하고 학습할 수 있는 환경을 제공합니다. 캐글은 데이터 분석과 머신러닝을 배우고 실제 문제에 적용해 보고 싶은 사람들에게 유용한 플랫폼입니다.

 

2. Online Retail

아래 사이트에 접속해 데이터를 다운로드합니다.

 

retail = pd.read_csv('/content/drive/MyDrive/KDT 시즌4/9. LLM 서비스 기초/10.데이터 분석/Data/online_retail_II.csv')
retail

retail.info()

'''
InvoiceNo: 주문 번호
StockCode: 상품 코드
Description: 상품 설명
Quantity: 주문 수량
InvoiceDate: 주문 날짜
Price: 상품 가격
Customer ID: 고객 아이디
Country: 고객 거주지역(국가)
'''
retail.columns

# Index(['Invoice', 'StockCode', 'Description', 'Quantity', 'InvoiceDate',
#       'Price', 'Customer ID', 'Country'],
#      dtype='object')
retail.describe()#통계확인

len(retail)#전체데이터의 크기 len으로 알기
# 1067371
# 각 컬럼당 null이 몇 개 있는지 확인
retail.isnull().sum()

# 각 컬럼당 null이 얼마나 있는지 비율 확인
retail.isnull().mean()

# 비회원/탈퇴/휴면회원 제거
retail = retail[pd.notnull(retail['Customer ID'])]
retail

len(retail)
# 824364
# 구입 수량이 0 이하인 데이터를 확인
retail[retail['Quantity'] <= 0]

# 구입 가격이 0보다 큰 데이터만 저장
retail = retail[retail['Price'] > 0]
len(retail)

# 805549
# 고객의 총 지출비용(CheckoutPrice) 파생변수 만들기
# 총 지출비용(CheckoutPrice) = 가격(Price) * 수량(Quantity)
# A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead 경고가 발생할 수 있음
# 행과 열이 다르게 계산 될수 있다는 경고임
retail.loc[:, 'CheckoutPrice'] = retail['Price'] * retail['Quantity']
retail

retail.info()

# to_datetime(): 다양한 형식의 데이터를 일관된 datetime 형식으로 변환
retail['InvoiceDate'] = pd.to_datetime(retail['InvoiceDate'])
retail.info()

# 전체 매출
total_revenue = retail['CheckoutPrice'].sum()
total_revenue

# 17743429.178000003
# 각 나라별 구매 횟수
retail['Country'].value_counts()
#pd.options.display.max_rows = 20
# ...으로 줄임 표시 되면 위에 주석으로 값을 늘려서 확인하기

# retail.groupby('Country')['Quantity'].count()
# 위 코드랑 같은 역할

# value_counts(): 객체의 각 고유값(유니크 값)의 개수를 계산하고, 이를 내림차순으로 정렬해 반환하는 함수
retail['Country'].value_counts()
# retail.groupby('Country')['Quantity'].count()
# 국가별 매출
rev_by_countries = retail.groupby('Country')['CheckoutPrice'].sum().sort_values()
rev_by_countries

import matplotlib.pyplot as plt

# matplotlib 객체 생성
# 그래프를 그릴 축(ax)과 그림(fig)을 생성
fig, ax = plt.subplots(figsize=(20, 10))

# 막대 그래프 그리기
ax.bar(rev_by_countries.index, rev_by_countries.values)

# 라벨 설정
ax.set_xlabel('Country', fontsize=12)
ax.set_ylabel('Revenue', fontsize=12)
ax.set_title('Revenue By Country', fontsize=15)

# x축 눈금 라벨 회전
ax.set_xticks(range(len(rev_by_countries.index)))
ax.set_xticklabels(rev_by_countries.index, rotation=45)

# 그래프 출력
# 래프와 텍스트가 잘리지 않고 보기 좋게 배치되도록 자동으로 여백을 조정하는 유용한 함수
plt.tight_layout()
plt.show()

rev_by_countries / total_revenue

# 월별 매출 구하기
retail['InvoiceDate'].sort_values(ascending=False)

#각 년도별의 월별 매출이 있어야함
def month_extractor(date):
    month = str(date.month)
    if date.month < 10:
        month = '0' + month
    return str(date.year) + '-' + month #201101 형식으로 그룹맺을수 있도록 함
rev_by_month = retail.set_index('InvoiceDate').groupby(month_extractor)['CheckoutPrice'].sum()
#retail.set_index 년월일을 인덱스로 만듦
#groupby(month_extractor) 날짜를 하나씩 뽑아서 위 함수에 넣음 콜백함
#['CheckoutPrice'].sum() CheckoutPrice의 합계를 보게 됨
rev_by_month

def plot_bar(df, xlabel, ylabel, title, figsize=(20, 10), fontsize=12, titlesize=15, rotation=45):
    fig, ax = plt.subplots(figsize=figsize)
    ax.bar(df.index, df.values)
    ax.set_xlabel(xlabel, fontsize=fontsize)
    ax.set_ylabel(ylabel, fontsize=fontsize)
    ax.set_title(title, fontsize=titlesize)
    ax.set_xticks(df.index)
    ax.set_xticklabels(df.index, rotation=rotation, fontsize=fontsize)
    plt.tight_layout()
    plt.show()
plot_bar(rev_by_month, 'Month', 'Revenue', 'Revenue By Month')

insite

영국이 주된 고객
매출이 가을 겨울에 매출이 많이 증가하는 편인것 같다
# 요일별 매출 구하기
def extract_dow(date):
    return date.dayofweek
rev_by_dow = retail.set_index('InvoiceDate').groupby(lambda date: date.dayofweek)['CheckoutPrice'].sum()
rev_by_dow

import numpy as np
DAY_OF_WEEK = np.array(['Mon', 'Tue', 'Web', 'Thur', 'Fri', 'Sat', 'Sun'])
rev_by_dow.index = DAY_OF_WEEK[rev_by_dow.index]
rev_by_dow.index

# Index(['Mon', 'Tue', 'Web', 'Thur', 'Fri', 'Sat', 'Sun'], dtype='object')
rev_by_dow

plot_bar(rev_by_dow, 'DOW', 'Revenue', 'Revenue By DOW')

# 시간대별 매출 구하기
rev_by_hour = retail.set_index('InvoiceDate').groupby(lambda date: date.hour)['CheckoutPrice'].sum()
rev_by_hour

plot_bar(rev_by_hour, 'Hour', 'Revenue', 'Revenu By Hour')

# 시간대별 매출 계산
rev_by_hour = retail.set_index('InvoiceDate').groupby(lambda date: date.hour)['CheckoutPrice'].sum()

# 정렬 (시간 순서대로)
rev_by_hour = rev_by_hour.sort_index()

# 그래프 그리기
plt.figure(figsize=(10, 6))
plt.bar(rev_by_hour.index, rev_by_hour.values)
plt.title('Revenue By Hour')
plt.xlabel('Hour')
plt.ylabel('Revenue')
plt.xticks(range(0, 24))  # X축을 0~23까지 고정
plt.grid(axis='y')
plt.show()