본문으로 바로가기

먼저, 이번 게시글에서 사용할 예시입니다.

 

seaborn 라이브러리를 활용해서 데이터 탐색을 해보도록 하겠습니다. 

아래와 같이 코드를 쓰면 다음과 같은 그래프가 나오게 됩니다.

import seaborn as sns

sns.heatmap(gu_df[['강간', '강도', '살인', '절도', '폭력']])

우리는 여기서 두 가지 문제점을 발견할 수 있습니다. 

1) 한글 깨짐 문제

2) Scaling 문제

3) 너무 작은 사이즈와 한눈에 알아보기 힘든(친절하지 않은) 그래프

 

순서대로 해결해보도록 하겠습니다.

 


1. 한글 데이터 시각화

# from matplotlib import font_manager, rc # rc == run configure(configuration file)
# jupyter notebook 내에 figure를 보여주기
%matplotlib inline   # 필수는 아님


# 모든 폰트에 대해 적용되는 건 아님
# (폰트 파일 이름이 한글이거나 공백이 있으면 적용이 안됨, 그 경우 폰트 파일 복사해서 이름을 새로 고치기)
# FontProperties : 폰트 파일 꺼내는 역할
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()

# rc == run configure(설정), 폰트를 설정하는 역할
# font_name
rc('font', family=font_name)


sns.heatmap(gu_df[['강간', '강도', '살인', '절도', '폭력']])

위의 코드를 실행시키고 다시 sns.heatmap 코드를 실행하면 한글이 깨지지 않고 잘 나오는 것을 확인할 수 있다.

 


2. Scaling 문제

(다음번에 코드로 더 자세히 다뤄보겠다.)

(아래는 기본적인 이론 설명을 해두었다.)

https://lafgh.tistory.com/21

 

[2주차 총정리] Feature Scaling (Feature Normalization) 이론

Feature Scaling (Feature Normalization) - 주로 머신러닝에서 쓰이는 기법 (특히 거리 기반의 머신러닝 기법들) - Feature별로 단위, 규모가 너무 차이가 나다보면 Feature들을 서로 비교하거나, Feature끼리 곱..

lafgh.tistory.com

- 아래 heatmap은 단순히 max값으로 나누어 scaling한 결과이다. 

- Feature의 scale이 달라서 새까맣게 나왔던 부분이 잘 나오는 것을 확인할 수 있다.


3. heatmap 꾸미기

- 몇 가지 옵션으로 더 내용을 확인하기 편하도록 수정할 수 있다.

# 전체 figure 의 사이즈를 조정
plt.figure(figsize = (10, 10))
# dpi를 써주면 더 깔끔하게 볼 수 있음
# plt.figure(figsize = (10, 10), dpi=100)   


# annot : 셀 내에 수치 입력 여부 (annot == 주석을 달다)
# fmt : 셀 내 입력될 수치의 format (f == float)
# linewidths : 셀 간 이격거리 (하얀 부분, 내부 테두리)
# cmap : matplotlib colormap @ https://goo.gl/YWpBES (camp을 통해 색깔 기준이 바뀌었음)
sns.heatmap(crime_count_norm.sort_values(by='살인', ascending=False), 
            annot=True, fmt='f', linewidths=.5, cmap='Reds')

# 기타
# fontsize : 제목, label 이름 등 폰트 사이즈 조정
# annot_kws={"size": } : 셀 내에 입력되는 주석 글씨 크기 조정


plt.title('범죄 발생(살인발생으로 정렬) - 각 항목별 최대값으로 나눠 정규화')
plt.show()

 


이외에도 알아두면 좋은 함수들을 잠깐 소개하자면,

1. A.div( B['col_name'], axis=0 )

2. A.sort_values( by='col_name', ascending=True)

3. A.mean( )   # axis=1 설정 가능

4. A.quantile(0.75)   # 바닥부터 0.75에 해당하는 값 출력