시스템 사용량과 업무 실적의 관계를 보고해야 했다. 처음엔 상관계수와 2×2 매트릭스로 정리했는데, 보고를 받는 사람도 하는 사람도 데이터 전공자가 아니었다. 산점도와 추세선 하나로 바꿨다.
문제
분석 결과를 상관계수로 설명하니 보고 자리에서 질문이 숫자 해석으로 흘러감
원인
보고 대상이 아니라 분석하는 사람 기준으로 표현을 고름
해결
그림 하나로 결론이 보이게 바꾸고, 통계 용어는 빼고, 기준일과 범위는 명확히 적음
바꾼 것
| 구분 | 처음 | 최종 |
|---|---|---|
| 관계 표현 | 상관계수 | 산점도 + 추세선 |
| 구성 | 2×2 매트릭스 | 원래 질문 하나에 답하는 그림 하나 |
| 막대 정렬 | 부서 이름순 | 값 큰 순 |
| 라벨 | 점마다 이름, 겹침 | 겹치는 점은 묶어서 +N |
| 기간 | 데이터 있는 만큼 | 보고 범위와 기준일 명시 |
| 용어 | 조직 정식 명칭 | 현업이 부르는 약칭 |
질문에서 벗어나지 않는다
2×2 매트릭스는 그럴듯해 보였지만 "사용량이 많은 부서가 실적도 좋은가"라는 원래 질문에서 벗어나 있었다. 사분면 이름을 붙이는 순간 새로운 해석 논쟁이 생겼다. 질문이 두 변수의 관계라면 산점도 하나가 가장 직접적이다.
산점도 스크립트
Python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Noto Sans KR'
df = pd.read_excel('input.xlsx', engine='openpyxl') # 컬럼: 부서, 사용량, 실적
x, y = df['사용량'], df['실적']
k, b = np.polyfit(x, y, 1)
fig, ax = plt.subplots(figsize=(8, 5), dpi=220)
ax.scatter(x, y, s=40, color='#256ef4')
xs = np.linspace(x.min(), x.max(), 50)
ax.plot(xs, k * xs + b, color='#6d7882', linewidth=1.5, linestyle='--')
for _, r in df.nlargest(5, '사용량').iterrows(): # 라벨은 일부만
ax.annotate(r['부서'], (r['사용량'], r['실적']), xytext=(6, 4),
textcoords='offset points', fontsize=9)
ax.set_xlabel('월 사용량')
ax.set_ylabel('실적')
ax.spines[['top', 'right']].set_visible(False)
fig.tight_layout()
fig.savefig('scatter.png', facecolor='white')DRM이 걸린 엑셀
사내 문서 보안 솔루션이 적용된 엑셀은 일반 xlsx(zip) 구조가 아니라서 Python에서 열면 BadZipFile 오류가 난다. 오류를 잡아 안내하고, CSV로 저장한 파일을 대신 읽도록 했다.
Python
import zipfile, os, sys
def load(path):
try:
return pd.read_excel(path, engine='openpyxl')
except zipfile.BadZipFile:
csv = os.path.splitext(path)[0] + '.csv'
if os.path.exists(csv):
return pd.read_csv(csv, encoding='utf-8-sig')
sys.exit('보안이 적용된 파일입니다. 엑셀에서 CSV로 저장한 뒤 같은 폴더에 두고 다시 실행하세요.')환경 차이Windows에서 실행할 때는 pandas가 엑셀 엔진을 자동으로 찾지 못하는 경우가 있어 engine을 명시했다.
보고 자료 점검 목록
- 그림만 보고 결론을 말할 수 있는가
- 통계 용어 없이 설명할 수 있는가
- 원래 질문에 답하는 그림인가
- 막대는 값 순서로 정렬했는가
- 데이터 범위와 기준일을 적었는가
- 라벨이 겹치거나 잘리지 않는가
시리즈 목차 16편
- PI 담당자가 로우코드로 사내 시스템을 직접 만들고 운영한 기록
- Mendix Datagrid2 대신 HTMLSnippet과 JS로 목록 화면 만들기
- Mendix SPA에서 HTMLSnippet JS가 꼬이는 이유: 이벤트 중복과 DOM 공존
- Mendix mx.data.commit이 조용히 실패할 때
- Mendix Java heap OOM 추적기: base64 이미지 컬럼
- Mendix 커밋 롤백, 용량 문제가 아니었다: FileDocument 전환기
- Mendix 첫 접속 지연 줄이기: 워밍업과 캐시
- Mendix SAML SSO 자동 로그인과 딥링크 유지
- Mendix Studio Pro에서 안 바뀌는 스타일 main.scss로 바꾸기
- Mendix MPK 파일 열어서 마이크로플로우 구조 보기
- SSO 로그 테이블로 MAU와 재방문율 구하는 SQL
- Mendix DateTime이 BI 도구에서 하루 빠르게 보이는 이유
- 대시보드 숫자가 틀렸을 때 확인하는 순서
- 보기 좋은 대시보드에서 할 일을 알려주는 대시보드로
- 여러 점검 시스템을 하나로 합치는 데이터 모델
- 데이터 비전공자에게 분석 결과 보고하기 (현재 글)