웅진X유데미 STARTERS/TIL (Today I Learned)

[스타터스 TIL] 8일차.파이썬 데이터 시각화 (5) - 시각화 실습

라밍쏭 2023. 2. 16. 09:35
728x90


1. 새롭게 알게된 내용

1.1 다중 막대그래프

## 1. x축을 숫자로 표현하기 위해 index 리스트를 만들기
import numpy as np
x_index = np.arange(1, len(df_84_price)+1)
# [out] array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17])

## 2. figure 크기 설정
plt.rcParams['figure.figsize'] = (15, 5)

## 3. 각 그래프의 위치를 조정하기 위해 위에서 만든 index 리스트 활용
# x축을 숫자로 해야 위치 조정이 가능함
# 각 그래프의 너비를 0.2로 설정 (width)
plt.bar(x_index - 0.3, df_84_price['최대'], width = 0.2, label = '최대')
plt.bar(x_index - 0.1, df_84_price['평균'], width = 0.2, label = '평균')
plt.bar(x_index + 0.1, df_84_price['중간'], width = 0.2, label = '중간')
plt.bar(x_index + 0.3, df_84_price['최소'], width = 0.2, label = '최소')

## 4. 그래프 세부사항 설정
plt.legend()

# 숫자로 표현한 x축을 label 설정하여 지역명으로 변경
plt.xticks(x_index, labels = df_84_price.index, rotation = 45)
plt.grid(axis = 'y', ls = ':')
plt.title('2021년 8월 시도별 아파트 매매가 현황(84㎡)', size = 20, weight = 'bold')
plt.ylabel('매매가(만원)')
plt.show()

 

1.2 그룹핑 후 각 그룹별 데이터프레임을 가져와 박스플롯으로 시각화

1) 지역 구 이름을 리스트로 담기

seoul_gu = df_84_seoul['구'].unique()
seoul_gu

array(['강남구', '강동구', '강북구', '강서구', '관악구', '광진구', '구로구', '금천구', '노원구',
       '도봉구', '동대문구', '동작구', '마포구', '서대문구', '서초구', '성동구', '성북구', '송파구',
       '양천구', '영등포구', '용산구', '은평구', '종로구', '중구', '중랑구'], dtype=object)

 

2) 구 별로 그룹핑을 한 후, 각 그룹별 데이터프레임을 만들어 리스트에 저장하기

# get_group : 그룹핑된 데이터프레임을 가져옴

# 데이터 저장할 리스트
df_seoul_gu = []

for i in seoul_gu:
    df_seoul_gu.append(df_84_seoul.groupby('구')['거래금액(만원)'].get_group(i))

 

3) 박스플롯으로 시각화

- 시각화할 데이터 : 그룹별 데이터프레임이 담긴 리스트 (df_seoul_gu)

- 라벨 : 구 이름이 담긴 리스트 (seoul_gu)

plt.boxplot(df_seoul_gu, labels = seoul_gu, showmeans = True, meanline = True)
plt.xticks(rotation = 45)
plt.ylabel('매매가(만원)')
plt.title('2021년 8월 서울시 아파트 매매가 분포(84㎡)', size = 20, weight = 'bold')
plt.show()

 

1.3 seaborn 히트맵 그래프 그리기

- colorbar 옵션을 추가하지 않아도 seaborn 히트맵의 경우, 자동으로 추가가 됨

plt.figure(figsize = (15, 5))
sns.heatmap(df_store_pivot
            , cmap = 'Blues' # cmap 색상 적용
            , annot = True   # 히트맵 내 수치 표현
            , fmt = 'd')     # 수치를 정수로 표현
plt.show()

 

1.4 판다스 함수로 시각화 (df.plot.함수명)

- matplotlib, seaborn이 아닌 Pandas에서 제공하는 함수로 시각화가 가능하다.

- 데이터프레임명.plot(kind = 함수명) / 데이터프레임명.plot.함수명

# 어떤 그래프를 그릴 수 있는지에 대한 정보 출력
df_store_seoul_gu.plot?

 

fig = plt.figure(figsize = (10, 5))

plt.subplot(121)
# df_store_seoul_gu.plot(kind = 'bar')
df_store_seoul_gu.plot.bar(color = 'r')

plt.subplot(122)
df_store_seoul_gu.plot.pie(autopct = '%.f%%', pctdistance = 0.8, wedgeprops = {'width':0.6})

fig.suptitle('서울시 구별 상가등록 현황', size = 20)
fig.tight_layout()
plt.show()

 

 

1.5 seaborn의 scatterplot

- 데이터에 있는 경도, 위도 정보를 바탕으로 지역별 데이터 분포를 그릴 수 있다.

plt.figure(figsize = (8, 6))

# 시군구명으로 경도, 위도를 평균낸 데이터프레임 생성
df_store_seoul_location = df_store_seoul[['시군구명', '경도', '위도']].groupby('시군구명').mean()

# 커피전문점/카페/다방인 데이터만 추출한 데이터프레임 생성
df_store_seoul_class3 = df_store_seoul[df_store_seoul['상권업종소분류명'] == '커피전문점/카페/다방']

sns.scatterplot(data = df_store_seoul_class3
                , x = '경도', y = '위도'
                , hue = '시군구명'      # 데이터를 그룹핑할 컬럼
                , marker = '.', alpha = 0.1)  # 마커를 .으로 하여 작게 표현, alpha로 투명도 조절

plt.legend(ncol = 2, loc = (1.01, 0))

# 시군구명의 평균 경도, 위도를 활용하여 지도에 시군구명을 표현
for i in range(len(df_store_seoul_location)):
    x = df_store_seoul_location.iloc[i, 0]
    y = df_store_seoul_location.iloc[i, 1]
    
    text = df_store_seoul_location.index[i]
    
    plt.text(x, y, text, ha = 'center')

plt.title('커피전문점/카페/다방', size = 20)
plt.show()

 

 

1.6 hexbin 그래프

- seaborn의 scatterplot과 유사하게 경도, 위도 정보를 바탕으로 지역별 데이터 분포를 그릴 수 있다.

plt.figure(figsize = (8, 6))

# 시군구명으로 경도, 위도를 평균낸 데이터프레임 생성
df_store_seoul_location = df_store_seoul[['시군구명', '경도', '위도']].groupby('시군구명').mean()

# 커피전문점/카페/다방인 데이터만 추출한 데이터프레임 생성
df_store_seoul_class3 = df_store_seoul[df_store_seoul['상권업종소분류명'] == '커피전문점/카페/다방']

plt.hexbin(df_store_seoul_class3['경도'], df_store_seoul_class3['위도']
            , cmap = 'Blues'
            , gridsize = 30)   # x축 기준 그리드 한 칸의 크기

plt.colorbar()

# 시군구명의 평균 경도, 위도를 활용하여 지도에 시군구명을 표현
for i in range(len(df_store_seoul_location)):
    x = df_store_seoul_location.iloc[i, 0]
    y = df_store_seoul_location.iloc[i, 1]
    
    text = df_store_seoul_location.index[i]
    
    plt.text(x, y, text, ha = 'center')

plt.title('커피전문점/카페/다방', size = 20)

plt.show()

 

 

2. 회고

파이썬 시각화에 대해 많이 배웠다고 생각을 했는데, 여전히 새로운 그래프들이 많아서 놀랬다.

일반 scatterplot을 위도, 경도 데이터를 활용해서 지도로 그릴 수 있다는 점을 새롭게 배웠다. 

이렇게 배운 시각화를 데이터셋에 적용해서 내 것으로 만들어 봐야겠다. 어떤 데이터가 적합할지 찾아보고 시도해봐야지!

 

이번만큼 파이썬 문법부터 시각화까지 제대로 배운 적이 없어서 그런지 더더욱 알찬 시간이었고 많은 도움이 되었다. :)

배운 것을 적극적으로 활용해봐야지!


 

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

분석시각화 대회 코드 공유 게시물은 내용 확인 후 좋아요(투표) 가능합니다.

dacon.io

💡 ▲ 해당 데이터로 해보기

728x90