본문 바로가기
유데미 스타터스 데이터 분석

유데미 스타터스 취업 부트캠프 4기 - 데이터분석/시각화(태블로) 2주차 학습 일지

2023. 2. 19.

2022.02.13 ~ 2022.02.17

2주차에는 다양한 데이터 셋을 다루며 집계 및 시각화를 해보았다. 연간 기온 변화와 같은 시계열 데이터도 있었고 폭염과 열대야라는 지표를 정의하고 이에 따라 필요한 데이터를 추출, 가공하기도 했다. 지역, 성별, 연령과 같은 범주형 데이터로 그룹핑 될 경우 그룹별 분포를 확인하기도 했다.

이번 학습 일지 역시 1주차에 이어서 서울시 가격안정 모범업소 상품목록 현황 데이터를 활용하여 다양한 집계와 시각화를 복습하려 한다.


사용 데이터

서울시 가격안정 모범업소 상품목록 현황
가격이 저렴하고 서비스가 좋은 가격안정모범업소(착한가게)들의 상품목록 정보에 대한 OpenAPI 서비스입니다. 지방물가안정을 위해 해당 업소를 발굴·이용토록 하여 지방물가 안정에 기여하고자 합니다.

출처: 서울 열린데이터 광장

지역구별 상품가격 알아보기

데이터 전처리

기준이 될 분류코드명 데이터 추출
분류코드명, 즉 업종에 따라 상품가격대가 다르므로 가장 많은 분류코드명을 확인하고 해당 업종을 기준으로 한다.

df['분류코드명'].value_counts()

✅ 분류코드명이 한식인 업소가 가장 많으므로 해당 조건의 데이터를 추출한다.

df_hansik = df[df['분류코드명'] == '한식'].copy()

 

지역구별 한식 상품가격의 평균, 최대, 최소, 중간값 데이터 추출

df_hansik_mean = df_hansik.groupby('지역구')['상품가격(일반)(원)'].mean()
df_hansik_max = df_hansik.groupby('지역구')['상품가격(일반)(원)'].max()
df_hansik_min = df_hansik.groupby('지역구')['상품가격(일반)(원)'].min()
df_hansik_median = df_hansik.groupby('지역구')['상품가격(일반)(원)'].median()

✅ 지역구별 분류코드명이 한식인 상품가격의 평균, 최대, 최소, 중간값 데이터를 추출한다.

지역구별 한식 상품가격의 평균, 최대, 최소, 중간값 데이터 전처리

df_hansik_price = pd.concat([df_hansik_mean,df_hansik_max, df_hansik_min, df_hansik_median], axis = 1)
df_hansik_price.columns = ['평균', '최대', '최소', '중간']
df_hansik_price = df_hansik_price.sort_values('평균', ascending = False)
df_hansik_price['평균'] = round(df_hansik_price['평균'],1)

✅ 추출한 데이터 셋을 열 방향으로 합쳐주고 각 컬럼명을 지정해준다.

지역구별 상품가격 시각화

구하고자 하는 것: 지역구별 한식의 평균, 최대, 최소, 중간 상품가격

  • X축: 지역구
  • Y축: 상품가격

✅ 지역구별 4개의 지표를 시각화해야 하므로 다중 막대그래프를 사용한다.

import numpy as np
x_index = np.arange(1,len(df_hansik_price)+1)
x_index

✅ df_hansik_price의 길이만큼의 배열 x_index를 생성한다. x_index는 가로축의 눈금으로 사용된다.

plt.rcParams['figure.figsize']=(15,5)

plt.bar(x_index-0.3, df_hansik_price['최대'], width=0.2, label='최대')
plt.bar(x_index-0.1, df_hansik_price['평균'], width=0.2, label='평균')
plt.bar(x_index+0.1, df_hansik_price['중간'], width=0.2, label='중간')
plt.bar(x_index+0.3, df_hansik_price['최소'], width=0.2, label='최소')

plt.legend()
plt.xticks(x_index, labels=df_hansik_price.index, rotation=45)

plt.grid(axis='y', ls=':')
plt.title('지역구별 한식 상품가격 현황(원)', size=20)
plt.ylabel('상품가격(원)')

plt.show()

✅ 지역구별 최대, 평균, 중간, 최소 4개의 막대그래프가 위치해야 하므로 x_index를 기준으로 그래프의 위치를 조절한다.

✅ 거의 모든 지역구의 평균값이 중간값보다 큰데 극단적으로 큰 최대값이 평균값에 영향을 준 것으로 추측된다. 더 정확한 분포는 박스플롯을 통해 확인할 수 있다.

지역구별 상품가격 분포 시각화

# 지역구 리스트
gu = df_hansik['지역구'].unique()

# 지역구별 상품가격 데이터를 가져와 df_gu에 append
df_gu = []
for i in range(len(gu)):
    df_gu.append(df_hansik.groupby('지역구')['상품가격(일반)(원)'].get_group(gu[i]))

✅ 지역구별 한식 상품 가격을 get_group()으로 추출하여 df_gu 데이터프레임을 만들어준다.

get_group()
group 추출은 get_group('카테고리명') 함수로 할 수 있다. 그리고 이는 그 결과를 반환해 카테고리별로 데이터를 분리할 수가 있다. 이는 물론 아래 주석 처리한 기본 검색 기능으로도 할 수 있지만 groupby를 활용하면 간결할뿐더러 처리 이후 다시 합치는 것 외에 다양한 기능을 한 번에 해줘서 매우 편리하다. 

#1
df_hansik_price.get_group('송파구')

#2
df_hansik_price[df_hansik_price['지역구']=='송파구']

출처:
[Pandas] groupby(), get_group()으로 범주형 칼럼 그룹화/그룹 객체 생성
plt.boxplot(df_gu, labels=gu)
plt.xticks(rotation=45)
plt.ylabel('상품가격(원)')
plt.title('지역구별 한식 상품가격 분포')
plt.show()

생각보다 이상치가 많아서 박스플롯 해석에 대해 알아보았다.

박스플롯 해석하기


Boxplot의 수염에 해당하는 박스 바깥의 위, 아래에 가로로 긴 직선을 각각 최댓값, 최솟값이라고 부릅니다. 최댓값은 IQR 값에 1.5를 곱한 값에 제3사분위수(Q3)를 더한 값이고, 최솟값은 제1사분위수(Q1)에서 IQR 값에 1.5를 곱한 값을 뺀 값입니다. 이상치는 이 최솟값과 최댓값보다 각각 크거나 작은 값을 극단치라고 부릅니다. 

출처: Boxplot 그래프 해석방법(이상치 탐색방법)

✅ 최댓값과 최솟값이 1QA을 가지고 만드는 값이라 해당 범위를 넘어가는 값들은 모두 이상치로 간주하기 때문에 이상치가 많은 것처럼 보이는 것이었다.

그래프를 그리기 전에 X축과 Y축 데이터, 원하는 그래프의 모양 등 간단한 기획이 선행되어야 할 것 같다. 가령 지역구별 한식 상품가격을 알아보는 취지가 어떤 지역구가 가장 저렴한지, 가장 비싼지 알아보기 위함이라면 서울시 전체 평균과 지역구별 평균, 최소, 최대, 중간값을 4개의 꺾은선 그래프로 비교하는 것도 좋을 것 같다.

이런 느낌으로..


>> 유데미 바로가기
>> 
STARTERS 취업 부트캠프 공식 블로그 보러가기

본 후기는 유데미-웅진씽크빅 취업 부트캠프 4기 데이터 분석 과정 학습 일지 리뷰로 작성되었습니다.

 

#유데미 #유데미코리아 #유데미큐레이션 #유데미부트캠프 #취업부트캠프 #스타터스부트캠프 #데이터시각화 #데이터분석 #데이터드리븐 #태블로

댓글