K-beauty 온라인 판매분석


해당 내용은 부스트코스 < 파이썬으로 시작하는 데이터 사이언스(박조은 님) >의 강좌를 학습하며 작성한 것입니다.

  • 데이터셋 :: 국가(대륙)별/상품군별 온라인쇼핑 해외직접판매액 from KOSIS(국가통계포털)
  • 데이터 도구 :: Google Colaboratory
  • 라이브러리 :: pandas, numpy, seaborn, matplotlib.pyplot

🎄 가설 세우기

  • K-beauty는 성장하고 있을까?

🎄 데이터 로드 및 전처리

[데이터 로드]
# 폰트 다운로드 및 설치
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf
### 라이브러리 로드
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as pl
import os
  
%matplotlib inline
# windows: os.name='nt'
# mac: os.name='posix'
sns.set(font="Malgun Gothic")
  
### 데이터 로드
df_raw = pd.read_csv("/content/국가_대륙_별_상품군별_온라인쇼핑_해외직접판매액
  			_20210810120634.csv", encoding = "cp949")
[전처리]
### 데이터 전처리
# tidy data(깔끔한 데이터) 생성
# melt() : 행에 있는 데이터 열로 옮기는 함수
df_raw.melt(id_vars=["국가(대륙)별", "상품군별", "판매유형별"])
# stack(): 세로로 데이터를 나열하는 것
df_raw.stack()
  
# reset_index(): 인덱스 초기화

# 기간에서 연도, 분기 분리
df["연도"] = df["기간"].map(lambda x: int(x.split()[0]))
df["분기"] = df["기간"].map(lambda x : int(x.split()[1].split("/")[0]))

  
# 금액 -> 수치데이터
# - 결측치 값 -> nan
df["백만원"] = df["백만원"].replace("-", np.nan).astype(float)
  
# 필요 없는 데이터 제거 :: 합계가 아닌 데이터만 남기기 -> 메모리 절약
df = df[(df["국가(대륙)별"] != "합계") & (df["상품군별"] != "합계")].copy()

🎄 데이터 시각화, 가설 검정

[전체 상품군]
### 전체 상품군별 판매량 시각화
df_total = df[df['판매유형별'] == '계'].copy()
sns.lineplot(data=df_total, x='연도', y='백만원')
  
### 상품군별 판매량 시각화
# matplotlib를 활용하여 legend 표시
sns.lineplot(data=df_total, x="연도", y="백만원", hue="상품군별")
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
# seaborn 활용하여 legend 표시
sns.relplot(data=df_total, x="연도", y="백만원", hue="상품군별",kind="line")
  
# barplot
# 검정선 = 신뢰구간
# estimator 기본값 = 평균 ##########################################
sns.barplot(data=df_total, x='연도', y='백만원')
  
# linplot - 국가(대륙)별 -> 중국 우세
plt.figure(figsize=(15, 4))
sns.lineplot(data=df_total, x="연도", y="백만원", hue="국가(대륙)별")  
# linplot - 상품군별 -> 화장품 우세
plt.figure(figsize=(15, 4))
sns.lineplot(data=df_total, x="연도", y="백만원", hue="상품군별")
plt.legend(bbox_to_anchor=(1.02, 1), loc=2, borderaxespad=0,)  
  
### 각각의 상품군에 대해 데이터 시각화  
### (결과)화장품 > 의류 및 패션 관련 상품 > 가전.전자,통신기기, 음반.비디오.악기
# col='상품군별' :: 상품군별 색상 다르게 표시 / col_wrap=4: 한 행에 4개씩 표시
sns.relplot(data=df_total, x="연도", y="백만원", hue="상품군별", 
		kind="line",col="상품군별", col_wrap=4)
  
# '화장품' 우세
# '화장품'을 제외한 상품군에 대한 데이터 확인
df_sub = df_total[~df_total["상품군별"].isin(["화장품"])].copy()
sns.relplot(data=df_sub, x="연도", y="백만원", hue="상품군별",
  			col="상품군별", col_wrap=4, kind="line")
  
# '의류 및 패션 관련상품' 우세
# '화장품'과 '의류 및 패션 관련상품' 제외
# '가전.전자,통신기기'와 '음반.비디오.악기' 우세
df_sub = df_total[~df_total["상품군별"]
  			.isin(["화장품","의류 및 패션 관련상품"])].copy()
sns.relplot(data=df_sub, x="연도", y="백만원", hue="상품군별",
  			col="상품군별", col_wrap=4, kind="line") 
[화장품]
### 분기별 화장품 판매액 데이터 시각화
# 원본 데이터를 건드리지 않기 위해 copy() 활용
df_cosmetic = df_total[df_total["상품군별"] == "화장품"].copy()
  
# 상품군이 화장품만 담겨졌는지 확인
df_cosmetic["상품군별"].unique()

### 시간별 판매액 확인
# 연도별 판매액 확인
sns.lineplot(data=df_cosmetic, x="연도", y="백만원")
  
# 분기별 판매액 확인
plt.figure(figsize=(15, 4))
sns.lineplot(data=df_cosmetic, x="연도", y="백만원", hue="분기")

# 기간별 판매액 확인
plt.figure(figsize=(15,4))
plt.xticks(rotation=30)
sns.lineplot(data=df_cosmetic, x="기간", y="백만원")

### 국가별 판매 확인
plt.figure(figsize=(15,4))
plt.xticks(rotation=30)
sns.lineplot(data=df_cosmetic, x="기간", y="백만원", hue="국가(대륙)별")

# 중국 우세
# 중국을 제외한 국가별 판매 확인 -> 
plt.figure(figsize=(15,4))
plt.xticks(rotation=30)
sns.lineplot(data=df_cosmetic[df_cosmetic["국가(대륙)별"] != "중국"], 
  		x="기간", y="백만원", hue="국가(대륙)별")

### 판매유형별 판매액 확인  
# 온라인 면세점 성장
plt.figure(figsize=(15,4))
plt.xticks(rotation=30)
df_sub = df[df["판매유형별"] != "계"].copy()
sns.lineplot(data=df_sub, x="기간", y="백만원", hue="판매유형별")

# 온라인 면세점을 제외한 시각화 -> '면세점 이외'도 증가
plt.figure(figsize=(15,4))
plt.xticks(rotation=30)
df_sub = df[(df["판매유형별"] != "계") 
  			& (df["판매유형별"] != "면세점")].copy()
sns.lineplot(data=df_sub, x="기간", y="백만원", hue="판매유형별", ci=None)
[의류 및 패션 관련 상품]
# 의류 및 패션 관련상품 데이터
df_fashion = df[df['상품군별']=='의류 및 패션 관련상품'].copy()
  
# 판매유형별=계 인 데이터만 추출 <국가별 확인>
df_fashion = df[(df["상품군별"] == "의류 및 패션 관련상품") & (df["판매유형별"] == "계")].copy()
# (코로나 전 기준) 보면 중국, 일본, 미국, 아세아 순으로 성장
plt.figure(figsize=(15, 4))
plt.xticks(rotation=30)
sns.lineplot(data=df_fashion, x="기간", y="백만원", hue="국가(대륙)별")

# 계를 제외하고 확인
df_fashion2 = df[(df["상품군별"] == "의류 및 패션 관련상품") & (df["판매유형별"] != "계")].copy()
# (코로나 전 기준) 면세점, 면세점 이외 모두 상승세
plt.figure(figsize=(15, 4))
plt.xticks(rotation=30)
sns.lineplot(data=df_fashion2, x="기간", y="백만원", hue="판매유형별", ci=None)

### 데이터 집계
# df_fashion에 대해 집계
# aggfunc의 기본값 = mean(평균)
df_fashion.pivot_table(index='국가(대륙)별', columns='연도', values='백만원')

# 합 표시
df_fashion.pivot_table(index="국가(대륙)별", columns="연도", values="백만원", aggfunc="sum")  

  
df_fashion["판매유형별"].value_counts() 	# 유형: 계
df_fashion2["판매유형별"].value_counts()	# 유형: 면세점, 면세점 이외  

### heatmap
# 데이터들의 변화를 나타내는 데 효과적인 chart
# 2019 기준 중국 일본 미국 아세안 순 확인
result = df_fashion.pivot_table(index='국가(대륙)별', columns='연도', values='백만원', 
  				aggfunc='sum')
sns.heatmap(result)
# 크기, 색상, 셀의 값 표시 여부 변경
plt.figure(figsize=(10, 6))
sns.heatmap(result, cmap = "Blues_r", annot=True)

🎄 코드 결과 확인

k-beauty 온라인 판매분석.ipynb

좋은 웹페이지 즐겨찾기