Data/Python
[데이터 분석] Seaborn, 통계 자료 분석 (4)
밍츠
2022. 3. 24. 01:33
12. 데이터 살펴보기
gu_df.head(3)
검거율 기준으로 오름차순 정렬하기
- sort_values 활용
gu_df.sort_values(by='검거율', ascending=False, inplace=True) # ascending=False : 내림차순, inplace=True : 덮어쓰기
- ascending= False : 내림차순 정렬
- inplace=True : 덮어쓰기
13. 데이터 시각화
13-0. 라이브러리 불러오기
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc # rc == run configure(configuration file)
13-1. 히트맵(Heatmap) 그리기
sns.heatmap(gu_df[['강간', '강도', '살인', '절도', '폭력']])
히트맵 : X축과 Y축에 2개의 범주형 자료의 계급별로 연속형 자료를 집계한 자료를 사용하여, 집계한 값에 비례하여 색깔을 다르게 해서 2차원으로 자료를 시각화
출력 결과 :
문제점 : 한글이 깨진다, 색깔 구분이 잘 안 된다
13-2. 한글 깨짐 해결
# jupyter notebook 내에 figure를 보여주기
%matplotlib inline
# matplotlib의 한글문제를 해결
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name() #폰트 이름에 한글이 있거나 공백이 존재하면 error 가능성 있음
# font_name
rc('font', family=font_name)
13-3. 색깔 구분 해결
이유 : 강도, 살인은 십의 자리인 반면 절도, 폭력은 백의 자리~천의 자리로 자릿수가 다르다 (=스케일)
해결 : Feature scaling = Feature Normalization
방법 1) Min_Max algorithm
- 값이 딱 떨어지고 해석을 직관적으로 할 수 있어 많이 사용한다.
- 값을 min(열)=0, max(열)=1으로 설정하여 데이터를 이 사이 값으로 조절하다.
방법 2) Standardization (표준화)
- 머신러닝 성능을 더 높일 때가 있다.
- 값을 mean(열)=0, std(열)=1으로 설정하여 데이터를 이 사이 값으로 조절한다.
+ 두 방법 중 어느 것이 더 좋다고 말하기 어려워 실험 기반으로 접근한다
13-4. 정규화
- 값을 최댓값으로 나누어 정규화한다.
- 값은 1을 넘지 않는다.
# 5대 범죄별 수치를 해당 범죄별 최대값으로 나눠줌
weight_col = gu_df[['강간', '강도', '살인', '절도', '폭력']].max() # Series
crime_count_norm = gu_df[['강간', '강도', '살인', '절도', '폭력']] / weight_col
+div함수
- DataFrame에 다른 DataFrame이나, Series, 스칼라 등 데이터를 나눈다.
- axis로 열/행 방향 설정 가능 (헷갈림 주의)
13-5. 살인 발생 순위
sns.heatmap(crime_count_norm.sort_values(by='살인', ascending=False))
- 살인을 기준으로 내림차순 하여 heatmap 시각화
결과 :
옵션 추가
1. 사이즈 조절
2. 셀 내에 수치 입력
3. 셀 간 이격 거리 설정
4. 색깔 설정
# 몇 가지 옵션으로 더 내용을 확인하기 편하도록 수정하기
# 전체 figure 의 사이즈를 조정
plt.figure(figsize = (10, 10))
# annot : 셀 내에 수치 입력 여부
# fmt : 셀 내 입력될 수치의 format (f == float)
# linewidths : 셀 간 이격거리 (하얀 부분, 내부 테두리)
# cmap : matplotlib colormap @ https://goo.gl/YWpBES
sns.heatmap(crime_count_norm.sort_values(by='살인', ascending=False), annot=True, fmt='f', linewidths=.5, cmap='Reds')
plt.title('범죄 발생(살인발생으로 정렬) - 각 항목별 최대값으로 나눠 정규화')
plt.show()
결과 :