본 프로젝트는 모 단체 교육지원실의 업무 효율화를 위한 데이터 분석 자동화 프로젝트입니다. 실제 데이터의 보안 문제로 인해 더미 데이터를 생성하고, 이를 기반으로 메시지 발송 현황 및 교육 만족도 조사 결과를 분석한 결과를 공유합니다.
- 📨 교육 홍보 메시지 발송 데이터 생성 및 분석
- 📊 교육 만족도 조사 데이터 생성 및 통계 분석
- 🔍 대용량 엑셀 파일의 구조 스캔
- Python 3.x
- pandas: 데이터 처리 및 분석
- numpy: 수치 연산
- xlsxwriter: 엑셀 파일 생성
- openpyxl: 엑셀 파일 읽기
Python 3.7 이상이 필요합니다.
# Git을 사용하는 경우
git clone <repository-url>
cd <project-directory>
# 또는 ZIP 파일 다운로드 후 압축 해제# 가상환경 생성
python -m venv venv
# 가상환경 활성화
venv\Scripts\activate# 가상환경 생성
python3 -m venv venv
# 가상환경 활성화
source venv/bin/activate가상환경이 활성화되면 터미널 프롬프트 앞에 (venv)가 표시됩니다.
프로젝트 루트 디렉토리에 requirements.txt 파일을 생성합니다:
pandas>=1.3.0
numpy>=1.21.0
xlsxwriter>=3.0.0
openpyxl>=3.0.0의존성 패키지 일괄 설치:
pip install -r requirements.txtpython -c "import pandas; import numpy; print('설치 완료!')"project/
├── course_names.txt # 교육 과정명 목록
├── generate_message_dummy.py # 메시지 더미 데이터 생성
├── generate_survey_dummy.py # 만족도 조사 더미 데이터 생성
├── analyze_message_data.py # 메시지 데이터 분석
├── analyze_survey_data.py # 만족도 조사 데이터 분석
├── scan_xlsx.py # 엑셀 파일 구조 스캔
├── dummy_raw_messages.xlsx # (생성됨) 메시지 더미 데이터
└── dummy_raw_survey_data.xlsx # (생성됨) 만족도 조사 더미 데이터
course_names.txt 파일에 10개의 교육 과정명이 정의되어 있는지 확인합니다.
python generate_message_dummy.py- 출력 파일:
dummy_raw_messages.xlsx - 생성 데이터: 1,000개의 메시지 발송 기록
python generate_survey_dummy.py- 출력 파일:
dummy_raw_survey_data.xlsx - 생성 데이터: 10개 과정 × 10차수 × 25~30명의 만족도 조사 결과
python analyze_message_data.py분석 결과:
- 전체 메시지 발송 개수 (성공/실패)
- 각 교육 과정별 메시지 발송 횟수
- 키워드 매칭 통계
python analyze_survey_data.py분석 결과:
- 차수별 전반적 만족도 평균
- 만족도 4.5점 이상/4.0점 미만 차수 구분
- 각 문항별 전체 평균 만족도
대용량 파일의 구조를 확인하고 싶을 때 사용:
python scan_xlsx.py주의: 파일명을 코드 내에서 수정해야 합니다.
- 역할: 분석 대상이 되는 10개 교육 과정명 정의
- 형식: 각 줄에 하나의 과정명
- 특징: 모든 스크립트에서 공통으로 참조
더미 메시지 데이터 생성 스크립트
datetime+timedelta를 활용한 시간 분산 생성- 랜덤 전화번호 생성 (개인정보 보호)
- 한 메시지에 1~3개의 교육 과정 키워드 삽입
- 성공(S)/실패(F) 상태 랜덤 할당
send_date: 발송 시간callback: 발신번호mobile_no: 수신번호message_type: SMS/LMS/MMSresult: 발송 결과 (S/F)message: 메시지 본문
더미 만족도 조사 데이터 생성 스크립트
- 멀티 시트 구조: 각 교육 과정을 별도 시트로 생성
- 공통 문항 + 과정별 특화 문항: 딕셔너리 기반 동적 문항 구성
COURSE_SPECIFIC_QUESTIONS를 통한 과정별 맞춤 문항 추가- 1~5점 척도 랜덤 응답 생성
- 각 과정당 10개 차수
- 각 차수당 25~30명의 응답자
- 공통 8개 문항 + 과정별 추가 문항 (최대 2개)
과정명,차수,날짜,장소- 문항별 만족도 점수 (1~5)
메시지 발송 데이터 분석 스크립트
- 문자열 검색 최적화:
str.contains()+na=False로 안전한 검색 - 성공 메시지 필터링:
result == "S"조건으로 유효 데이터만 분석 - 키워드 카운팅: 각 교육 과정별로 메시지 내 출현 빈도 집계
- 딕셔너리 기반 집계: 효율적인 카운팅 및 결과 저장
- 전체 메시지 개수
- 성공(S)/실패(F) 메시지 분리 집계
- 교육 과정별 메시지 발송 횟수
- 매칭된 키워드 총합
만족도 조사 데이터 분석 스크립트
- 멀티 시트 순회:
sheet_name=None으로 모든 시트 자동 처리 - 정규표현식 활용:
re.match(r'^\d+\.')로 문항 컬럼 자동 감지 - groupby 집계: 차수별 평균 계산에 pandas groupby 활용
- 동적 컬럼 처리: 과정별로 다른 문항 개수 자동 대응
- 조건부 필터링: 고/저 만족도 차수 자동 분류
- 차수별 전반적 만족도(1번 문항) 평균
- 만족도 4.5점 이상 차수 (우수)
- 만족도 4.0점 미만 차수 (개선 필요)
- 각 문항별 전체 평균
HIGH_SCORE = 4.5: 우수 만족도 기준LOW_SCORE = 4.0: 낮은 만족도 기준
엑셀 파일 구조 스캔 유틸리티
- 대용량 파일의 메타 정보만 추출
- 컬럼명, 데이터 타입, 샘플 데이터 확인
- 데이터 로딩 없이 구조 파악 가능
- 실제 데이터 분석 전 구조 확인
- 컬럼명 불일치 디버깅
- 데이터 타입 검증
# generate_message_dummy.py
NUM_ROWS = 1000 # 원하는 개수로 변경# generate_survey_dummy.py
def generate_course_sheet(course_name, num_batches=10): # 차수 개수 조정
num_people = random.randint(25, 30) # 인원 범위 조정course_names.txt에 과정명을 추가하면 자동으로 모든 스크립트에 반영됩니다.
# analyze_survey_data.py
HIGH_SCORE = 4.5 # 우수 기준 조정
LOW_SCORE = 4.0 # 개선 필요 기준 조정# generate_survey_dummy.py
COURSE_SPECIFIC_QUESTIONS = {
"새로운 과정명": ["9. 추가 문항", "10. 또 다른 문항"],
}===========================
📌 전체 종합 결과 (S 메시지 기준)
===========================
전체 S 메시지 행 개수: 850개
F 메시지 총 개수: 150개
강의명 매칭된 개수 총합: 1,720개
🔎 강의명별 총합
디지털 문제해결 역량 향상 과정 : 172개
고객 중심 서비스 커뮤니케이션 과정 : 168개
...
차수별 1번 문항(전반적 만족도) 평균 :
- 1차 : 3.27
- 2차 : 3.52
- 3차 : 4.56
🔹 평균 >= 4.5점 이상 차수:
- 3차 : 4.56
- 7차 : 4.63
🔹 평균 < 4.0점 이하 차수:
- 1차 : 3.27
- 2차 : 3.52
course_names.txt파일이 반드시 존재해야 합니다- 분석 스크립트 실행 전 반드시 더미 데이터를 먼저 생성하세요
- 모든 파일은 UTF-8 인코딩을 사용합니다
- Windows 환경에서 텍스트 파일 수정 시 인코딩 주의
- 대용량 데이터 생성 시 메모리 부족 가능
NUM_ROWS를 점진적으로 증가시켜 테스트 권장
- 분석 중인 엑셀 파일을 Excel에서 열어두면 오류 발생
- 분석 전 모든 엑셀 파일을 닫아야 합니다
해결:
scan_xlsx.py로 파일 구조 확인- 어떤 컬럼이 존재하며 그 컬럼의 타입이 무엇인지 확인
- 스캔 데이터를 토대로 데이터 분석 코드 작성 (analyze_message_data.py)
해결:
# 파일 열 때 명시적으로 인코딩 방식 지정
with open(file, "r", encoding="utf-8") as file:
...실제 업무 데이터를 사용하려면:
- 컬럼명 매핑: 실제 데이터의 컬럼명에 맞게 스크립트 수정
- 데이터 형식 확인:
scan_xlsx.py로 실제 파일 구조 파악 - 교육 과정명 업데이트:
course_names.txt를 실제 과정명으로 수정 - 파일명 변경: 분석 스크립트의
excel_files리스트 수정
# analyze_message_data.py 수정 예시
excel_files = [
"실제_메시지_데이터_2025.xlsx",
]본 프로젝트는 교육지원실 내부 업무용으로 개발되었습니다.
- 코드 개선 사항이나 버그 발견 시 이슈 등록
- 새로운 분석 기능 추가 시 Pull Request
프로젝트 관련 문의사항은 [email protected]으로 연락주시기 바랍니다.
마지막 업데이트: 2025년 11월