실습하면서 배웠던 의약품 중 한 종류를 선정할지, 새로운 데이터를 찾아서 연습해볼지(코시스 데이터셋을 사용할지, 다른 데이터셋을 찾아볼지) 고민을 많이 했다.
연습에 도전해볼만하면서 제주도 관광 특성을 알아볼 수 있을 것 같아 BC카드 사용 데이터를 분석해보기로 결정했다.
< 제주특별자치도_개별관광(FIT)_증가에_따른_제주_관광객_소비패턴_변화_분석_BC카드_빅데이터_내국인관광객_20170216 >
https://www.data.go.kr/data/15046091/fileData.do
제주특별자치도 BC카드 사용 데이터 EDA분석 연습 (2014~2016)
1. 라이브러리 로드, 데이터 파일 불러오기
- 한글 폰트 사용
- glob, read_csv
2. 데이터 파악
- shape, info, describe
- sample, head, tail 통해 재확인
2. 전처리
- 결측치 확인(결측치 없음)
*nunique 는 어떤 컬럼을 할지 의논 필요
- 기준년월 : 년과 월을 나눈다. -> 년별, 월별 비교가 가능
- "데이터 기준 일자" 컬럼 제거
*관광객 유형은 외국인은 없나? 컬럼을 삭제할지, '관광객'이라는 단어를 전처리할지
*제주 대분류만 활용할지, 중분류만 활용할지?
3. 파생변수
- 전처리 한 년, 월 파생변수 생성
*연습삼아 성별인 (여, 남)을 (1,2)란 코드로 바꿔볼까
4. 기술통계 (수치 기술통계, 범주형 기술통계)
- describe
- corr / heatmap 상관관계 파악
5. 시각화(seaborn, pandas, plotly 라이브러리 당 3개 이상)
* 내국인, 외국인 비교 위해 정규화?
6. 결론
encoding을 안하면 파일이 깨지기 때문에 꼭 넣어줘야 했다.df.describe를 했었는데, 기술통계를 알아보면서 다시 하게 되니 여기서는 head, tail로 간단하게 체크했어도 되었을 것 같다.외국인 데이터가 있기 힘들었다.df.describe(include="object")
# 결과, 관광객 유형의 unique 값이 1개였다.
df[df["관광객 유형"]=="외국인 관광객"]
# 때문에 외국인 관광객을 찾아본 결과, 출력되는 데이터가 없었다.
# 관광객 유형 컬럼은 삭제해도 되겠다는 결론을 얻었다.
관광객 유형, 데이터기준일자 컬럼 제거
# 아래와 같은 방법으로 관광객 유형 컬럼을 전처리 가능하다.
# 하지만 필요 없는 컬럼이기 때문에 삭제한다.
# df["유형"] = df["관광객 유형"].str.replace("관광객", "").str.strip()
df = df.drop(columns=["데이터기준일자", "관광객 유형"])
하지만 포맷을 %Y-%m으로 지정해줬음에도 %Y-%m-%d형식으로 고정되어 출력이 되어 map과 split을 사용하여 파생변수를 생성했다.import datetime
df["기준년월"]=pd.to_datetime(df["기준년월"], format="%Y-%m")
df["연"]=df["기준년월"].dt.year
df["월"]=df["기준년월"].dt.month
df["연"]=df["기준년월"].map(lambda x : int(x.split("-")[0]))
df["월"]=df["기준년월"].map(lambda x: int(x.split("-")[1]))
# df["기준연월"].str.split("-", expand=True)[0].astype(int)
gender_dict={"남" : 1, "여" : 2}
df["gender"] = df["성별"].map(gender_dict)
# 성별 여, 남을 여자, 남자로 바꿔보는 연습
# df["gender_2"] = df["성별"].str.replace("여", "여자")
# df["gender_2"] = df["성별"].str.replace("남", "남자")
# df = df.drop(columns=["gender", "gender_2"])
# 연동에서 제일 많이 찾은 업종명 찾기
df.loc[df["제주 중분류"]=="연동", "업종명"].value_counts()
df.groupby(by="업종명")["카드이용금액"].sum().sort_values(ascending=False).iloc[:5]
컬럼명에 공백이 있다는 것을 발견하여, 도움을 받았다.# 컬럼명 확인
df.columns
# 공백 제거
df.columns = df.columns.str.replace(" ", "")
df.columns
# 카드이용금액이 가장 큰 사람의 카드이용건수 찾기
card_max = df.loc[df["카드이용금액"]==df["카드이용금액"].max(), "카드이용건수"]
df[df["카드이용건수"].isin(card_max)].sort_values(["카드이용건수", "카드이용금액"])

강한 양의 상관관계, 건당이용금액과 카드이용금액도 약간의 양의 상관관계corr=df.corr()
mask=np.triu(np.ones_like(corr))
plt.figure(figsize=(10,5))
sns.heatmap(df.corr(), cmap="coolwarm", annot=True, vmax=1, mask=mask)

regplot으로 양의 상관 관계 확인
2015년은 1~12월까지의 데이터이고 2016년은 1~8월까지의 데이터임에도 카드이용금액이 높다.

슈퍼마켓과 기념품은 건당이용금액은 낮지만, 총 카드이용금액은 높다.
크로스탭으로 어떤 업종을 많이 이용했는지 볼 수 있다.

크로스탭에서 기념품, 기타음료식품, 농축수산품, 슈퍼마켓, 스넥, 약국 등이 높게 나오는 것을 볼 수 있다.

4.1 놓쳤지만 팀원들을 통해 배운 점
4.2 실패한 부분
4.3 어려웠던 부분
4.4 아쉬운 점
조금 옛날 데이터라 와닿지 않았던 부분이 아쉽다.
(+BC카드 사용 데이터니까 관광객 유형에 내국인 관광객 밖에 없었구나! 외국인 데이터가 없을 수 밖에 없었다.)
+)노션 팀 자료 추가
5.2 plotly
5.3 pandas