본문 바로가기
Study/CODE 3기 [파이썬으로 배우는 데이터 사이언스]

[2조:ACE] K-beauty 온라인 판매 분석

by 문하진 2024. 6. 1.

1. 데이터 전처리

작성자: 문하진

1. 필요한 라이브러리 import 하기 및 글꼴 설정

import pandas as pd   
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

2. 파일 불러오기

from google.colab import drive
drive.mount('/content/drive')

3. melt 함수 사용

*melt는 pandas 라이브러리에서 제공하는 함수로, 데이터를 넓은 형식에서 긴 형식으로 변환하는 데 사용된다.

df=k_b.melt(id_vars=["국가(대륙)별","상품군별","판매유형별"],
             var_name="기간",value_name="백만원")

df.head()를 통해 자료의 앞부분만을 요약해서 볼 수 있다.

4. 전처리

df["기간"]에서  연도를 분리한다.

*map(function, iterable): 반복 가능한 객체의 모든 요소에 지정된 함수를 적용하여 결과를 반환하는 함수

df["기간"].map(lambda x: int(x.split('.')[0]))
df["연도"]=df["기간"].map(lambda x: int(x.split(".")[0]))

df["기간"]에서 분기를 분리한다.

df["기간"].map(lambda x: int(x.split(".")[1].split("/")[0]))
df["분기"]=df["기간"].map(lambda x: int(x.split(".")[1].split("/")[0]))

df["백만원"]에서 -문자를 결측치로 변경하고 float 타입으로 변경한다

df["백만원"] = df["백만원"].replace("-",np.nan).astype(float)

합계 데이터는 따로 구할 수 있으므로 제거하도록 한다. 

copy를 하여 원본 df의 변형을 막고 맨 아래의 값만 출력하는 것을 막기 위해 &를 쓴다. 

*&는 and와 비슷한 개념이며 |는 or과 비슷한 개념이다.

 

df=df[(df["국가(대륙)별"]!="합계")&(df["상품군별"]!="합계")].copy()

판매유형별 데이터에 '계'만이 존재하는 일부 기간이 있으므로  '계'를 나타내는 데이터만 불러온다.

df_total=df[df["판매유형별"]=="계"].copy()

2. 데이터 시각화

작성자: 문하진

x축을 연도로, y축을 백만원으로 하여 상품군별 판매액을 볼 수 있다.

sns.lineplot(data=df_total, x="연도", y="백만원", hue="상품군별")
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)

서브플롯으로 표시하여 그래프를 자세히 볼 수도 있다.

sns.relplot(data=df_total, x="연도", y="백만원",
            hue="상품군별", kind="line", col="상품군별", col_wrap=4)

isin()을 사용하여 특정 데이터를 제외하여 변수에 담을 수 있다.

아래 코드는 화장품과 의류 및 패션 관련 상품을 제외하여 변수에 담은 것이다.

df_sub=df_total[~df_total["상품군별"].isin(["화장품","의류 및 패션 관련상품"])].copy()

K-beauty 판매를 분석하기 위해 상품군별이 화장품인 데이터만 가져온다.

df_cosmetic=df_total[df_total["상품군별"]=="화장품"].copy()
df_cosmetic["상품군별"].unique()

연도와 판매액을 각각 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="백만원")

첫코드는 그림의 크기를 가로15인치 세로 4인치로 설정한다는 의미이고 두 번째 코드는 x축 값들을 30도 회전시켜 나타내겠다는 의미입니다. 마지막 코드로 데이터에서 기간과 매출로 그래프를 만들었습니다.

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

직전 코드에서 hue 국가대륙별을 추가하여 구가별로 구분하여 나타냈습니다.

plt.figure(figsize=(15,4))
plt.xticks(rotation=30)
sns.lineplot(data=df_cosmetic[(df_cosmetic["국가(대륙)별"]!="중국")&(df_cosmetic["국가(대륙)별"]!="일본")&(df_cosmetic["국가(대륙)별"]!="미국")&(df_cosmetic["국가(대륙)별"]!="아세안(ASEAN)")&(df_cosmetic["국가(대륙)별"]!="기타")], x="기간", y="백만원",hue="국가(대륙)별")

 

다시 직전 코드에서 중국 일본 미국 아세안의 수치를 제거하여 비교적 작아서 가시성이 떨어지는 수치들을 확인해보았습니다. 중남미를 보시면 2016년 4분기에 매출이 급증한 모습을 확인할 수 있는데 뒤에서 이유를 추측해보겠습니다~

df_fashion=df[(df["상품군별"]=="의류 및 패션 관련상품") & (df["판매유형별"]=="계")].copy()
df_fashion.head()

의류 및 패션 관련상품 쪽 데이터만 뽑아서 전처리해보겠습니다~

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_fashion, x="기간", y="백만원", hue="판매유형별", ci=None)

그 중 계값만 뽑아주고 ci=None을 추가하여 신뢰구간을 없애주었습니다.

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

국가를 행으로 연도를 열로하는 피벗테이블을 만들었습니다. func는 sum으로 하여 합계값으로 피벗테이플에 표시됩니다.

sns.heatmap(result)

그 피벗테이블을 고대로 색깔로 표시해주는 히트맵입니다.

 

sns.heatmap(result, cmap = "Blues_r")

cmap을 활용하여 그래프의 색깔을 바꿀  수 있다. _r을 활용하여 색의 연하기를 변형할 수 있다. r이 많아질 수록 색이 연해짐.

plt.figure(figsize=(10, 6))
sns.heatmap(result, cmap="Blues_r", annot=True, fmt=".0f")

위 그래프에서 annot = True를 사용하여 히트맵 안에 데이터 값을 포함시킨다.

fmt = ".0f"로 하여 정수를 나타낸다.

이러한 결과값이 나온다.

판매유형별 데이터의 "계"만 모은 df_total 변수를 통한 연도별 합계 금액을 시각화하기 위해

sns.barplot(data=k_b_total, x="연도", y="백만원")

 

plt.figure(figsize=(15, 4))
sns.lineplot(data=k_b_total, x="연도", y="백만원", hue="국가(대륙)별")

그래프 다른 색상으로 나타내기

plt.figure(figsize=(15, 4))
sns.lineplot(data=k_b_total, x="연도", y="백만원", hue="상품군별")
plt.legend(bbox_to_anchor=(1.02, 1), loc=2, borderaxespad=0,)

마지막 코드로 박스 사이 간격과 위치를 설정할 수 있습니다.

 

작성자 최혜윤

<변형>

사진 속에서 중국의 그래프를 제거함에도 불구하고 중동, 중남기, 대양주의 그래프가 눈에 잘 들어오지 않는다.

미국, 일본, 아세안, 기타, 유럽연 그래프를 제거하여 나머지 수치가 낮은 항목들을 자세히 살펴보고자 한다.

합계 데이터는 따로 구할 수 있기에 전체 데이터에서 제거한다.

df=df[(df["국가(대륙)별"]!="합계") &(df["상품군별"]!="합계")].copy()
df.info()
이런 식으로 &를 사용해 보았다. &를 쓰는 이유는 파이썬이나 주피터 노트북에서는 맨 아래의 값들만 출력하기 때문이다.
위 코드에서 괄호와 &를 제거하고 다른 상품군별을 아래로 내려 실행하면 상품군별에서 합계인 것들만 계산이 된다.
 
plt.figure(figsize=(15,4))
plt.xticks(rotation=30)#xticks(rotation)으로 글자 기울이기(30도 만큼)
sns.lineplot(data=df_cosmetic[(df_cosmetic["국가(대륙)별"]!="중국")&(df_cosmetic["국가(대륙)별"]!="미국")&(df_cosmetic["국가(대륙)별"]!="일본")&(df_cosmetic["국가(대륙)별"]!="아세안(ASEAN)")&(df_cosmetic["국가(대륙)별"]!="유럽연합(EU)")&(df_cosmetic["국가(대륙)별"]!="기타")], x="기간", y="백만원",hue="국가(대륙)별")

이 코드를 실행하게 되면,

이런 그래프가 나타난다.

중남미 그래프를 보면, 2016년 4분기에 k 뷰티가 크게 확산된 것을 확인할 수 있다.

이와 관련해서 이 시기에 어떤 것이 중남미에 영향을 끼쳤는지 찾아보았다.

https://www.cmn.co.kr/mobile/sub_view.asp?news_idx=23573

 

https://www.cmn.co.kr/mobile/sub_view.asp?news_idx=23573

중남미서 8년만에 7배 넘는 수출액 달성...비결은 ‘가성비와 디자인’ [CMN 박일우 기자] 콜롬비아 1,688%, 칠레 134%, 멕시코 126%. 최근 3년간 한국 화장품 수출 증가율이다. K-뷰티가 중남미에서도

www.cmn.co.kr

[한국 화장품, 중남미 여심(女心)도 녹였다]

https://www.koreana.or.kr/koreana/na/ntt/selectNttInfo.do?mi=1544&nttSn=51653&bbsId=1114&langTy=KOR

 

한국국제교류재단 KF

한국국제교류재단은 대한민국의 대표 공공기관으로서 외국과의 교류사업을 통해 한국에 대한 이해를 제고하고 국제적 우호친선을 증진

www.koreana.or.kr

이 기사를 통해 k 뷰티 열풍은 한류 스타들로부터 출발했다는 것을 알 수 있다.

2016년 드라마 <태양의 후예>가 흥행하면서 극 중 주인공이었던 송혜교가 출연한 광고 제품들이 해외에서 지속적인 인기를 끌었다. 또한 이 시기에 k 팝도 함께 떠오르면서 대세 아이돌이었던 트와이스나 마마무 같은 걸그룹의 메이크업을 따라하는 외국인들도 많이 늘어나기 시작했다. k 팝, k 드라마 등 한국 문화로 접하기 시작한 한국의 뷰티 제품들은 외국인을 만족시키기에 충분했다.

 모유와 유사한 성분의 당나귀 우유를 사용한 마스크팩, 한방 성분이 함유된 스킨케어 제품, 달팽이 점액 성분의 영양크림 등 좋은 성분이 담겨져 있고 비싸지 않은 가격으로 k 뷰티 산업은 중남미까지 크게 발을 넓혀 나갈 수 있었다.