Practice

EDA_제주지역 공간 데이터 분석

0. 개요

 

연습용으로 Dacon에서 흥미로운 데이터를 하나 주워왔다. 

2020년 5월~8월 동안 제주지역에서 발생한 결제금액 및 재난지원금 사용 금액에 관한 데이터다. 

사람들은 과연 어느 업종에서 재난지원금을 많이 썼는지 알아보도록 하자. 

 

 

공간정보 탐색적 데이터 분석 경진대회

출처 : DACON - Data Science Competition

dacon.io

 

주요 column은 다음과 같다.

  • FranClass : 규모(영세/중소/중소1/중소2/일반)
  • Type : 업종명
  • TotalSpent : 총사용금액
  • DisSpent : 재난지원금 사용금액
  • NumOfSpent : 총 이용건수
  • NumOfDisSpent : 총 재난지원금 이용건수

 

1. 불러오기 

 

일단 5월 데이터만 불러와보았다. info()를 이용해 대략적인 내용도 파악해본다. 친절하게도 결측값이 없다. 

may = pd.read_csv("KRI-DAC_Jeju_data5.txt", sep = "\,", engine='python', encoding = "UTF-8")
may.info()

우리 친구는 이렇게 생긴 데이터다

 

 

2. 나름의 전처리 

 

무작정 업종 데이터를 plot에다 넣고 보았다. 

plt.plot(may.groupby(["Type"]).size().sort_values(ascending = False))

.............

 

그래프를 그리기 전에 제발 좀 계산을 먼저 해보자는 결론을 얻었다.  

부랴부랴 unique()를 써보니 업종이 205개다. 대분류같은 건 주어지지 않는다. 하...

마음을 비우고, 한국표준산업분류를 옆에 띄워놓고 분류를 해본다. (분류를 굳이 보고자 하신다면 더보기를 클릭하세요) 

더보기
food = ['건강식품(회원제형태)', '농축수산품', '기타건강식', '기타음료식품' ,'인삼제품', '홍삼제품', '정육점']

furniture = ['철제가구', '일반가구', '카메라', '컴퓨터', '조명기구', '사무기기', '가전제품', '기타가구', '기타전기제품', '냉열기기', 
             '소프트웨어', '통신기기', 'CATV']

book = ['출판인쇄물', '서적출판(회원제형태)', '정기간행물', '전문서적', '일반서적', '화랑']

agri = ['비료농약사료종자', '농기계', '기타농업관련']

building = ['인테리어', '목재석재철물', '기타건축자재', '건축요업품', '보일러펌프', '페인트']

logis = [ '화물운송', '기타유통업', '보관창고업', '기타운송','자동차부품', '유류판매', '주차장', '주유소', 
       '세차장', '기타자동차서비스', '견인서비스', '중고자동차', '수입자동차', '카인테리어', '자동차시트타이어', 
       '이륜차판매', 'LPG' , '택시']

restaurant = ['일반한식', '스넥', '서양음식', '일식회집', '중국음식' , '제과점']

alc = ['단란주점', '노래방', '유흥주점', '칵테일바', '주점', '주류판매점']

market = ['편의점', '슈퍼마켓', '대형할인점', '구내매점', '농축협직영매장', '농협하나로클럽', '연쇄점']

hotel = ['기타숙박업', '콘도', '특급호텔', '2급호텔', '1급호텔']

leisure = ['기타레져업', '골프경기장', '문화취미기타', '볼링장', '골프연습장', '헬스크럽', 
           '레져업소(회원제형태)', '수영장', '종합레져타운', '테니스장', '당구장']

living = ['독서실', '세탁소', '사우나', '애완동물', '침구수예점', '사진관', '영화관' ,'악기점',  '주방용구', '정수기', '주방용식기'
, '기타잡화', '카페트커텐천막', '화원']

service = ['사무서비스', '자동차정비', '조세서비스', '위탁급식업', '기타보험', '법률회계서비스', '손해보험', 
           '사무서비스(회원제형태)', '부동산중개임대', '기타대인서비스', '부동산분양', '기타수리서비스', '레져용품수리', 
           '중장비수리', '가정용품수리', '신변잡화수리', '사무통신기기수리', '기타용역서비스', '산후조리원', 
           '안마스포츠마사지', '종합용역', '가례서비스','수족관']

beauty = ['화장품', '피부미용실', '정장', '악세사리', '미용원', '스포츠의류', '이용원', '내의판매점', '신발', '기타의류', 
          '단체복', '아동의류', '양품점', '시계', '안경', '캐쥬얼의류', '맞춤복점', '옷감직물', '미용재료', 
          '제화점', '가방' , '귀금속']

health = ['약국', '종합병원', '의원', '동물병원', '기타의료기관및기기', '의료용품', '한의원', '건강진단', '치과의원', '병원', 
          '치과병원', '한약방']

edu = ['보습학원', '기타교육', '외국어학원', '학원(회원제형태)', '예체능학원', '컴퓨터학원', '학습지교육', '대학등록금', 
       '초중고교육기관', '기능학원', '유아원']

online = ['인터넷Mall', '인터넷종합Mall']

tour = ['항공사', '관광여행', '기념품점', '렌트카', '면세점', '여객선']

public = [ '공공요금']


leisure_retail = ['스포츠레져용품', '골프용품' , 'DVD음반테이프판매', '완구점', '기타서적문구', '문구용품', '화방표구점']

etc = ['기타회원제형태업소', '성인용품점', '상품권', '기계공구', '기타업종', '민예공예품', '기타연료', '티켓' , '유리', 
 '기타교통수단', '기타사무용', '과학기자재', '윤활유전문판매', '기타비영리유통', '기타직물' , '기타광학품',
       '제약회사', '골동품점']

type_list = [food, furniture, book, agri, building, logis, restaurant, alc,market, hotel, leisure, living, service, beauty, 
            health, edu, online, tour, public, leisure_retail, etc]

type_name = ["식료품", "가구가전", "출판서적", "농업", "건축", "물류운송교통", "음식점", "주점", "마트", "숙박", 
             "레저", "생활", "서비스", "뷰티패션", "의료", "교육", "온라인", "관광", "공공", "레저소매", "기타"]

 

 

다음과 같이 21개의 대분류로 분류해보았다. 

type_name = ["식료품", "가구가전", "출판서적", "농업", "건축", "물류운송교통", "음식점", "주점", "마트", "숙박", 
             "레저", "생활", "서비스", "뷰티패션", "의료", "교육", "온라인", "관광", "공공", "레저소매", "기타"]

 

사실 분류가 썩 마음에 들진 않는다. 아마 틀린 분류도 많을 것이다. (다시 보니 레저소매는 괜히 나눴나 싶기도)

 

일단 데이터 자체에 정확히 무슨 의미인지 알 수 없는 업종들이 더러 있었다. 예를 들면 "유리"는 유리 제품을 파는 소매점인지, 창문/샷시 전문점인지 알 수 없었다. '기타'가 붙은 업종들도 많아서 그냥 기타로 묶어 버렸다. 기타회원제형태업소가 도대체 무엇인가.(참고로 이 분류는 비씨카드에서 자체적으로 분류한 기준이라고 한다.)  

 

그리고 한국표준산업분류도 개인적으로는 동의할 수 없는 분류들이 있었다. 이를테면 47130. 면세점의 경우 대형마트(47112), 슈퍼마켓(47121)과 같은 종합 소매업(471)으로 묶이는데, 그렇다고 '종합 소매업'을 하나의 대분류로 삼기에는 면세점과 마트, 슈퍼마켓이 일상에서 갖는 의미가 다르다고 생각되었다.  

 

어차피 연습용이니 절대적으로 맞는 기준을 설정하는 데에 시간을 쏟기 보다는 자체적으로 분류하되 애매한 업종만 한국표준산업분류의 힘을 빌리기로 했다. 추후에 수정할 수 있는 부분이니까. 

 

아무튼 이제 apply()를 이용해 대분류를 부여해준다. 

def classify(x):
    for num, i in enumerate(type_list) : 
        if x in i:
            return type_name[num]
            
may["Type"].apply(classify)

may_group = may.drop(["POINT_X", "POINT_Y",  "YM", "SIDO", "SIGUNGU"], axis="columns")
#안 쓸 column은 drop해버렸다
may_group = may_group.groupby(["main"]).sum()

 

3. 시각화 

 

그럼 본격적으로 재난지원금액이 어디서 많이 쓰였는지를 살펴볼까.

seaborn 패키지 너무 좋다. 예쁘다. 

 

3-1. 해당 업종의 재난지원금 결제액 / 총 재난지원금 결제액

 

 

예상 밖의 결과가 나오진 않았다. 전체 재난지원금 중에서는 31.6%가 마트에서, 25.1%가 음식점에서 결제되었다.

일단 결제 횟수 자체가 압도적으로 많은 업종이다. 전체 결제 횟수가 510만 건 정도고, 대분류당 결제 횟수 평균이 24만 5천 건인데, 마트의 경우 혼자서 결제 횟수가 200만 건에 달하고, 음식점은 150만 건을 넘는다.  

이에 결제 건당 금액이 다른 업종만큼 크지 않아도 횟수로 밀어붙여서 높은 비중을 차지하게 되었다. 

 

참고로 공공요금과 온라인몰의 경우, 해당 분류에 속하는 모든 업종이 재난지원금 사용불가 업종이다. 

 

may_group["disspent_ratio"] = round(may_group["DisSpent"] / may_group["DisSpent"].sum() *100, 2)

f, ax= plt.subplots(figsize = (6, 10))
sns.set_color_codes("pastel")

sns.barplot(x="disspent_ratio", y="main", data=may_data, color="r")
ax.set(xlabel ="총 재난지원금 사용금액 중 해당 업종에서 사용된 재난지원금의 비중(%)", ylabel="")

 

 

3-2. 해당 업종의 재난지원금 결제액 / 해당 업종의 총 결제액

 

한편, 해당 업종의 총 사용금액 중 레저 소매업종에서는 24.6%, 뷰티/패션 업종에서 24.5%가 재난지원금으로 결제되었다. 레저 소매업종은 '스포츠레져용품', '골프용품' 등을 포함하며, 뷰티/패션의 경우 '피부미용실', '화장품', '캐쥬얼의류' 등이 포함된다. 이때다 싶어서 쇼핑한 분들이 있는 것 같다.

 

may_group["spent_ratio"] = round(may_group["DisSpent"] / may_group["TotalSpent"] *100, 2)

f, ax= plt.subplots(figsize = (6, 10))
sns.set_color_codes("pastel")
sns.barplot(x="spent_ratio", y="main", data=may_data, color="b")

ax.set(xlabel ="총 사용금액 중 재난지원금 사용금액의 비중(%)", ylabel="")

 


 

우선적으로 알아본 것은 여기까지. 다음번에는 일단 두 그래프를 하나로 합친 다음 annotation을 추가해보아야겠다. 두 그래프를 하나로 나타내고 싶은데 이게 아무래도 seaborn 만으로는 안되는 것으로 보인다. 내가 못 찾았을 수도 있지만. 

그러고나서 월별로 변화가 있는지도 알아보면 재밌을 것 같다. 어쩐지 급 결론이지만 산업 분류하느라 시간을 쏟는 바람에 어쩔 수 없다:)