본문 바로가기
수업 복습/크롤링과 데이터분석

데이터 분석 활용 - 가상 쇼핑몰 데이터 예제

by 김복칠 2024. 4. 17.
# 데이터 프레임 형태로 불러오기
import pandas as pd

retail = pd.read_csv('/content/drive/MyDrive/데이터 분석/데이터/OnlineRetail.csv')

# 출력 row 갯수 설정
pd.options.display.max_rows = 6
retail

  • 먼저 데이터 프레임 형태로 데이터를 불러옵니다
  • 이때 출력되는 row 갯수를 6개로 설정해서 첫 3개, 마지막 3개가 출력될 수 있도록 해줍니다
  • 데이터의 형태를 보면 541909개의 데이터와 8개의 컬럼으로 구성되어 있는걸 볼 수 있습니다
retail.info()

  • 컬럼의 정보를 확인해 보면 데이터의 type과 컬럼명을 확인할 수 있습니다
  • 주문 번호와 국가, 아이디가 나오는걸로 보아 사이트를 통해 상품을 구매한 내역과 구매자의 기본정보가 포함되어 있다는것을 알수 있습니다
# 각 컬럼당 null이 몇 개 있는지 확인
retail.isnull().sum()

  • 이번에는 각 컬럼에 null이 몇 개 있는지 확인해 보았습니다
  • Description(상품 설명), Customer ID(고객 아이디)에서 null이 있는걸 확인해 볼 수 있습니다
# 비회원을 제거
retail = retail[pd.notnull(retail['CustomerID'])]

# 구입 수량이 1 이상인 데이터만 저장
retail = retail[retail['Quantity']>=1]

# 구입 가격이 1 이상인 데이터만 저장
retail = retail[retail['UnitPrice']>0]

# 고객의 총 지출비용(CheckoutPrice) 파생변수 구하기
# 가격 * 수량
retail['CheckoutPrice'] = retail['UnitPrice'] * retail['Quantity']
retail

  • 이번에는 다양한 과정을 통해 데이터를 정리해 보겠습니다
  • 먼저 고객 아이디에 있던 null 값(비회원)을 제거합니다
  • 그리고 Quantity(주문 수량)와 UnitPrice(상품 가격)이 1이상인 데이터만 저장합니다
  • 마지막으로 새로운 컬럼인 CheckoutPrice를 생성해서 추가해줍니다
retail['InvoiceDate'] = pd.to_datetime(retail['InvoiceDate'])
retail.info()

  • 이제 불필요한 데이터는 다 정리해 주었고 데이터들의 타입을 정리해 줍니다
  • 이때 InvoiceDate(구매 날짜)가 object 형태로 되어 있기 때문에 datetime 형태로 바꾸어 줍니다
# 국가별 매출
rev_by_countries = retail.groupby('Country')['CheckoutPrice'].sum().sort_values()
rev_by_countries

plot = rev_by_countries.plot(kind='bar',figsize=(20,10))
plot.set_xlabel('Country',fontsize=12)
plot.set_ylabel('Revenue',fontsize=12)
plot.set_title('Revenue by Country',fontsize=15)
plot.set_xticklabels(labels=rev_by_countries.index,rotation=45)

  • 이제 정리된 데이터를 바탕으로 분석을 진행해보겠습니다
  • 가장 먼저 국가별 매출을 확인해보면 Country 컬럼으로 그룹을 묶고 새로 생성했던 컬럼인 CheckoutPrice의 총합을 sum 함수를 활용해 확인합니다
  • 수치상으로도 영국이 가장 많은 매출을 올렸으며 이를 plot을 이용한 그래프를 확인해보면 쉽게 확인할 수 있습니다
def extract_month(date):
    month = str(date.month)
    if date.month < 10:
        month = '0' + month
    return str(date.year) + month
    
rev_by_month = retail.set_index('InvoiceDate').groupby(extract_month)['CheckoutPrice'].sum()
rev_by_month

  • 이번에는 각 연도에 따른 월별 매출을 확인해보겠습니다
  • 먼저 2010년과 2011년 두 해에 걸쳐 취합된 데이터이기 때문에 월을 나누는 함수를 만들어 준뒤 그룹으로 묶어 국가별 매출을 출력한 과정과 동일하게 출력합니다
  • 수치상으로 확인했을 때는 2011년 09월 부터 매출이 증가하는 모습을 보이다가 12월 급격하게 하락하는걸 볼 수 있습니다
def plot_bar(df, xlabel, ylabel, title, rotation=45, titlesize=15, fontsize=12, figsize=(20, 10)):
    plot = df.plot(kind='bar', figsize=figsize)
    plot.set_xlabel(xlabel, fontsize=fontsize)
    plot.set_ylabel(ylabel, fontsize=fontsize)
    plot.set_title(title, fontsize=titlesize)
    plot.set_xticklabels(labels=df.index, rotation=rotation)

plot_bar(rev_by_month,'Month','Revenue','Revenue By Month')

# 요일별 매출 구하기
def extract_dow(date):
    return date.dayofweek
    
rev_by_dow = retail.set_index('InvoiceDate').groupby(extract_dow)['CheckoutPrice'].sum()
DAY_OF_WEEK = np.array(['Mon',"Tue",'Wen',"Thur","Fri",'Sat','Sun'])
rev_by_dow.index = DAY_OF_WEEK[rev_by_dow.index]
rev_by_dow

  • 요일별 매출을 확인해본 결과 토요일에 따른 매출이 없는걸로 보아 토요일은 휴무일이었다는걸 알수 있습니다
plot_bar(rev_by_dow, 'Dow','Revenue','Revenue By Dow')

 

'수업 복습 > 크롤링과 데이터분석' 카테고리의 다른 글

Matplotlib  (0) 2024.04.15
판다스  (0) 2024.04.01
넘파이  (0) 2024.04.01
크롤링(Crawling)  (0) 2023.12.27