촉촉한초코칩
[부스트코스] 데이터 사이언스 (5) 본문
K-beauty 온라인 판매분석
1) 국가통계포털 데이터셋 소개
- 국내 통계 > 주제별 통계
- K-beauty 상품의 판매액 분석을 통해 어떤 품목이 얼마나 판매되었는지 알 수 있다.
- 도소매 서비스 > 온라인쇼핑동향조사 > 국가(대륙)별/상품군별 온라인쇼핑 해외직접판매액
- 분기별, 년도별로 다운로드받을 수 있다. > 분기별로 분석 선택 > csv 형태로 다운로드
2) 데이터셋 로드하기
#라이브러리 로드
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
#구버전
%matplotlib inline
#시각화를 위한 폰트 설정
import os
if os.name == "posix":
sns.set(font="AppleGothic")
elif os.name == "nt":
sns.set(font="Malgun Gothic")
#레티나 설정 > 글씨가 조금 더 선명하게 보인다.
#폰트 주변이 흐릿하게 보이는 것 방지
%config InlineBackend.figure_format = 'retina'
df_raw = pd.read_csv("/content/drive/MyDrive/Colab Notebooks/k_beauty.csv", encoding="cp949")
df_raw.shape
#국가(대륙)별 데이터 빈도수 세기
df_raw["국가(대륙)별"].value_counts()
#국가(대륙)별 중 미국 데이터만 보기
df_raw[df_raw["국가(대륙)별"] == "미국"]
3) 데이터 전처리 - tidy data 만들기
df_raw.columns
df_raw.values
#id_vars : 어떤 컬럼이 기준이 될 것인지 > 여러개 지정할 때는 [] 리스트형태로
#var_name : variable명 변경
#vaue_name : value명 변경
df = df_raw.melt(id_vars=["국가(대륙)별", "상품군별", "판매유형별"], var_name="기간", value_name="백만원")
df.shape
df.head()
df.info()
4) 데이터 전처리 - 문자열 분리하고 데이터 타입 변경하기
#기간에서 연도 분리하기
df["기간"]
#split()을 사용하면 공백으로 데이터를 분리한다.
"2019 4/4 p)".split()
#첫번째 인덱스 불러오기
"2019 4/4 p)". split()[0]
#데이터 타입 출력해보기 > string 타입
type("2019 4/4 p)".split()[0])
#str > integer 형변환
int("2019 4/4 p)".split()[0])
#map : 안에 함수 넣기
#map 안에 lambda 함수를 넣는다. x.split()한 데이터의 첫번째 인덱스 값을 integer 형으로 변경한다.
#기간이 . 으로 나뉘어져 있기 때문에 .으로 문자열을 나누고 0번째 인덱스 값을 int형으로 변경한다.
df["연도"] = df["기간"].map(lambda x : int(x.split('.')[0]))
df.head()
#분기 열 만들기
#. 와 / 을 기준으로 데이터를 split하여 1/4안에 있는 1와 4를 분리시킨다.
df["기간"].map(lambda x : (x.split('.')[1]).split("/"))
#1과 4를 분리시키고 앞에 있는 숫자를 가져온다.
df["분기"] = df["기간"].map(lambda x : (x.split('.')[1]).split("/")[0])
df.head()
#금액을 수치 데이터로 표현하기 위해 데이터 타입 변경
#- 로 표시된 값은 결측치이므로 NaN으로 대치(replace)한다.
df["백만원"].replace("-", pd.np.nan)
#astype(float)를 사용하여 데이터를 float 데이터 형태로 확인한다.
#- > Nan 변경
#숫자 > 소수점으로 변경 (float)
#replace한 값을 다시 "백만원" 열에 덮어씌운다.
df["백만원"] = df["백만원"].replace("-", pd.np.nan).astype(float)
df["백만원"]
#필요없는 데이터 제거하기
df.info()
#데이터 용량 > 590KB
#값이 "합계"가 아닌 데이터만 집계하여 df을 다시 업데이트한다.
df = df[(df["국가(대륙)별"]!="합계") & (df["상품군별"]!="합계")].copy()
df
df.info()
#결측치 확인하기 > 백만원에 결측치가 많다.
df.isnull().sum()
5) 전체 상품군별 데이터로 연도별 증가추세 시각화 하기
#전체 상품군 판매액 시각화
#NaN으로 나타난 행 데이터 제거
df_total = df[df["판매유형별"] == "계"].copy()
df_total.head()
#연도에 따른 판매액을 lineplot으로 그려본다.
sns.lineplot(data=df_total, x="연도", y="백만원")
#상품군 별로 다른 색상으로 표시하기
#legend 값을 밖에 표시하는 소스코드를 stack overflow에서 가져온다.
sns.lineplot(data=df_total, x="연도", y="백만원", hue="상품군별")
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)``
#relpot을 lineplot의 서브플롯을 그리기 위해 사용한다.
#kind을 line으로 설정한다.
sns.relplot(data=df_total, x="연도", y="백만원", hue="상품군별", kind="line")
#상품군별로 색상을 다르게 하기 위해 col 옵션을 활용하고 한 행에 4개를 표시하기 위해 col_wrap 옵션을 사용한다.
sns.relplot(data=df_total, x="연도", y="백만원", hue="상품군별", kind="line", col="상품군별", col_wrap=4)
#화장품이 다른 상품군들에 비해 해외직접판매액이 꾸준히 증가하고 있다는 것을 알 수 있다.
#화장품만 빼고 출력해본다.
# ~을 사용하면 데이터가 반전된다. 상품군별이 '화장품'인 데이터만 빼고 df_sub에 담는다.
df_sub = df_total[~df_total["상품군별"].isin(["화장품"])].copy()
df_sub
#kind 기본값이 scatter이므로 line으로 바꿔준다.
#의류, 패션 상품, 가전전자 통신기기, 음반 비디오 악기 쪽도 성장세가 있음을 알 수 있다.
sns.relplot(data=df_sub, x="연도", y="백만원", hue="상품군별", col="상품군별", col_wrap=4, kind="line")
#의류, 패션 상품도 빼고 보니 가전, 음반 쪽 판매도 두드러지게 나타난다.
df_sub = df_total[~df_total["상품군별"].isin(["화장품", "의류 및 패션관련 상품"])].copy()
6) 화장품 온라인 해외 직접 판매액 시각화
#화장품 데이터를 가져오기 위해 boolean 식을 만든다.
df_total["상품군별"] == "화장품"
#상품군별이 화장품인 데이터를 가져온다.
#copy()로 복사하지 않으면 원본 데이터에 영향을 미치게 된다.
df_cosmetic = df_total[df_total["상품군별"] == "화장품"].copy()
df_cosmetic
#unique() : 어떤 값이 들어있는지 확인하기
df_cosmetic["상품군별"].unique()
#시각화 그래프 그리기
sns.lineplot(data=df_cosmetic, x="연도", y="백만원")
#분기 별로 보기
plt.figure(figsize=(15,4))
sns.lineplot(data=df_cosmetic, x="연도", y="백만원", hue="분기")
#기간별 화품 판매액 데이터 시각화
#기간으로 그래프 그리기
#글씨가 겹쳐지지 않게 하기 위해 xticks()를 사용하여 글자를 회전시킨다.
plt.figure(figsize=(15,4))
plt.xticks(rotation=30)
sns.lineplot(data=df_cosmetic, x="기간", y="백만원")
#국가, 대륙 별로 출력하고 df_cosmetic 데이터 프레임 출력
df_cosmetic.head()
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[df_cosmetic["국가(대륙별)"]!="중국"], x="기간", y="국가(대륙)별")
#기간 별로 시각화
#"계" 데이터를 빼고 그래프를 그리면 온라인 면세점이 성장하고 있다는 것을 알 수 있다.
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)
7) 패션 의류 온라인 해외 직접 판매액 시각화
#의류 및 패션 관련 상품의 판매액 시각화
#의류 데이터만 df_fashion 변수에 넣는다.
df_fashion = df[df["상품군별"] == "의류 및 패션 관련상품"].copy()
df_fashion.head()
#"판매유형별"이 "계"인 데이터를 df_fashion에 넣는다.
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_fashion2, x="기간", y="백만원", hue="판매유형별", ci=None)
8) 데이터 pivot table로 집계하고 heatmap 으로 표현하기
#데이터 집계하기
df_fashion
#함수 뒤에 ? 를 붙이면 도움말을 볼 수 있다.
df_fashion.pivot_table?
#aggfunc : 기본값이 mean이므로 평균값이 나온다.
df_fashion.pivot_table(index="국가(대륙)별", columns="연도", values="백만원")
#aggfunc 값을 sum으로 하여 합계값을 알아본다.
df_fashion.pivot_table(index="국가(대륙)별", columns="연도", values="백만원", aggfunc="sum")
#계만 있기 때문에 데이터를 가공 없이 그대로 sum을 사용하면 연도별 합계를 알 수 있다.
df_fashion["판매유형별"].value_counts()
#위 결과를 result 변수에 담는다.
result = df_fashion.pivot_table(index="국가(대륙)별", columns="연도", values="백만원", aggfunc="sum")
result
#heatmap을 그려보면 온라인에서 판매가 많이 일어난다는 것을 알 수 있다.
#vmax : 시각화를 할 때 나타내는 최대값
#vmin : 시각화를 할 때 나타내는 최소값
sns.heatmap(result)
#cmap : 색상 변경
sns.heatmap(result, cmap = "Blues_r")
#annot : 수치 표현
sns.heatmap(result, cmap="Blues_r", annot=True)
#fmt : 소수접 없이 float형의 숫자를 나타낼 수 있다.
#plt.figure() : 그래프 사이즈 재설정
plt.figure(figsize=(10,6))
sns.heatmap(result, cmap="Blues_r", annot=True, fmt=".0f")
#중국에서 구매액이 가장 많다는 것을 알 수 있다.
#pivot table보다는 heatmap에서 분포를 색상으로 편하게 볼 수 있다.
9) 전체상품군별 시각화
#판매유형별이 "계"인 데이터만 모인 데이터프레임 활용하기
df_total
#x축에 연도, y축에 금액 넣기
sns.barplot(data=df_total, x="연도", y="백만원")
#그래프를 보면 판매액이 꾸준히 증가했다는 사실을 알 수 있고 신뢰구간도 연도에 따라 계속 길어진다.
#estimator : 기본적으로 mean(평균) 값을 구한다.
#lineplot 그리기
#seaborn > 그래프 사용법이 유사하다.
plt.figure(figsize=(15,4))
sns.lineplot(data=df_total, x="연도", y="백만원", hue="국가(대륙)별")
#그래프에서는 꾸준히 판매액이 성장하고 있다는 사실을 알 수 있다.
#연도별 판매액을 "상품군별"로 다른 색상으로 표현
#legend 그래프를 밖에 그리기 위해 plt.legend() 함수를 사용한다.
#bbox_to_anchor를 변경하면 그래프와 범례 사이의 간격을 조절할 수 있다.
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,)
'Study > Big Data' 카테고리의 다른 글
파이썬으로 시작하는 데이터 사이언스 - 3강 (0) | 2023.10.21 |
---|---|
파이썬으로 시작하는 데이터 사이언스 - 2강 (0) | 2023.10.21 |
파이썬으로 시작하는 데이터 사이언스 - OT, 1강 (0) | 2023.10.13 |
[부스트코스] 데이터 사이언스 (4) (0) | 2023.04.01 |
[부스트코스] 데이터 사이언스 (3) (0) | 2023.03.22 |