Skip to content

노란우산 교육지원실에서 근무 시 주어진 데이터 분석 업무를 자동화했습니다.

Notifications You must be signed in to change notification settings

devminsu1101/Read-excel

Repository files navigation

교육지원실 업무 자동화 툴

📋 프로젝트 개요

본 프로젝트는 모 단체 교육지원실의 업무 효율화를 위한 데이터 분석 자동화 프로젝트입니다. 실제 데이터의 보안 문제로 인해 더미 데이터를 생성하고, 이를 기반으로 메시지 발송 현황 및 교육 만족도 조사 결과를 분석한 결과를 공유합니다.

주요 기능

  • 📨 교육 홍보 메시지 발송 데이터 생성 및 분석
  • 📊 교육 만족도 조사 데이터 생성 및 통계 분석
  • 🔍 대용량 엑셀 파일의 구조 스캔

🛠 기술 스택

  • Python 3.x
  • pandas: 데이터 처리 및 분석
  • numpy: 수치 연산
  • xlsxwriter: 엑셀 파일 생성
  • openpyxl: 엑셀 파일 읽기

📦 설치 및 환경 설정

1. Python 설치

Python 3.7 이상이 필요합니다.

2. 프로젝트 클론 또는 다운로드

# Git을 사용하는 경우
git clone <repository-url>
cd <project-directory>

# 또는 ZIP 파일 다운로드 후 압축 해제

3. 가상환경 설정 (권장)

Windows

# 가상환경 생성
python -m venv venv

# 가상환경 활성화
venv\Scripts\activate

macOS/Linux

# 가상환경 생성
python3 -m venv venv

# 가상환경 활성화
source venv/bin/activate

가상환경이 활성화되면 터미널 프롬프트 앞에 (venv)가 표시됩니다.

4. 의존성 패키지 설치

프로젝트 루트 디렉토리에 requirements.txt 파일을 생성합니다:

pandas>=1.3.0
numpy>=1.21.0
xlsxwriter>=3.0.0
openpyxl>=3.0.0

의존성 패키지 일괄 설치:

pip install -r requirements.txt

5. 설치 확인

python -c "import pandas; import numpy; print('설치 완료!')"

3. 프로젝트 구조

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          # (생성됨) 만족도 조사 더미 데이터

🚀 실행 순서

Step 1: 교육 과정명 확인

course_names.txt 파일에 10개의 교육 과정명이 정의되어 있는지 확인합니다.

Step 2: 더미 데이터 생성

2-1. 메시지 데이터 생성

python generate_message_dummy.py
  • 출력 파일: dummy_raw_messages.xlsx
  • 생성 데이터: 1,000개의 메시지 발송 기록

2-2. 만족도 조사 데이터 생성

python generate_survey_dummy.py
  • 출력 파일: dummy_raw_survey_data.xlsx
  • 생성 데이터: 10개 과정 × 10차수 × 25~30명의 만족도 조사 결과

Step 3: 데이터 분석

3-1. 메시지 데이터 분석

python analyze_message_data.py

분석 결과:

  • 전체 메시지 발송 개수 (성공/실패)
  • 각 교육 과정별 메시지 발송 횟수
  • 키워드 매칭 통계

3-2. 만족도 조사 데이터 분석

python analyze_survey_data.py

분석 결과:

  • 차수별 전반적 만족도 평균
  • 만족도 4.5점 이상/4.0점 미만 차수 구분
  • 각 문항별 전체 평균 만족도

Step 4: (선택) 엑셀 구조 스캔

대용량 파일의 구조를 확인하고 싶을 때 사용:

python scan_xlsx.py

주의: 파일명을 코드 내에서 수정해야 합니다.


📂 파일 상세 설명

1. course_names.txt

  • 역할: 분석 대상이 되는 10개 교육 과정명 정의
  • 형식: 각 줄에 하나의 과정명
  • 특징: 모든 스크립트에서 공통으로 참조

2. generate_message_dummy.py

더미 메시지 데이터 생성 스크립트

기술적 포인트

  • datetime + timedelta를 활용한 시간 분산 생성
  • 랜덤 전화번호 생성 (개인정보 보호)
  • 한 메시지에 1~3개의 교육 과정 키워드 삽입
  • 성공(S)/실패(F) 상태 랜덤 할당

생성 컬럼

  • send_date: 발송 시간
  • callback: 발신번호
  • mobile_no: 수신번호
  • message_type: SMS/LMS/MMS
  • result: 발송 결과 (S/F)
  • message: 메시지 본문

3. generate_survey_dummy.py

더미 만족도 조사 데이터 생성 스크립트

기술적 포인트

  • 멀티 시트 구조: 각 교육 과정을 별도 시트로 생성
  • 공통 문항 + 과정별 특화 문항: 딕셔너리 기반 동적 문항 구성
  • COURSE_SPECIFIC_QUESTIONS를 통한 과정별 맞춤 문항 추가
  • 1~5점 척도 랜덤 응답 생성

생성 구조

  • 각 과정당 10개 차수
  • 각 차수당 25~30명의 응답자
  • 공통 8개 문항 + 과정별 추가 문항 (최대 2개)

생성 컬럼

  • 과정명, 차수, 날짜, 장소
  • 문항별 만족도 점수 (1~5)

4. analyze_message_data.py

메시지 발송 데이터 분석 스크립트

기술적 포인트

  • 문자열 검색 최적화: str.contains() + na=False로 안전한 검색
  • 성공 메시지 필터링: result == "S" 조건으로 유효 데이터만 분석
  • 키워드 카운팅: 각 교육 과정별로 메시지 내 출현 빈도 집계
  • 딕셔너리 기반 집계: 효율적인 카운팅 및 결과 저장

분석 항목

  • 전체 메시지 개수
  • 성공(S)/실패(F) 메시지 분리 집계
  • 교육 과정별 메시지 발송 횟수
  • 매칭된 키워드 총합

5. analyze_survey_data.py

만족도 조사 데이터 분석 스크립트

기술적 포인트

  • 멀티 시트 순회: sheet_name=None으로 모든 시트 자동 처리
  • 정규표현식 활용: re.match(r'^\d+\.')로 문항 컬럼 자동 감지
  • groupby 집계: 차수별 평균 계산에 pandas groupby 활용
  • 동적 컬럼 처리: 과정별로 다른 문항 개수 자동 대응
  • 조건부 필터링: 고/저 만족도 차수 자동 분류

분석 항목

  • 차수별 전반적 만족도(1번 문항) 평균
  • 만족도 4.5점 이상 차수 (우수)
  • 만족도 4.0점 미만 차수 (개선 필요)
  • 각 문항별 전체 평균

주요 변수

  • HIGH_SCORE = 4.5: 우수 만족도 기준
  • LOW_SCORE = 4.0: 낮은 만족도 기준

6. scan_xlsx.py

엑셀 파일 구조 스캔 유틸리티

기술적 포인트

  • 대용량 파일의 메타 정보만 추출
  • 컬럼명, 데이터 타입, 샘플 데이터 확인
  • 데이터 로딩 없이 구조 파악 가능

사용 시나리오

  • 실제 데이터 분석 전 구조 확인
  • 컬럼명 불일치 디버깅
  • 데이터 타입 검증

🔧 커스터마이징 가이드

데이터 생성량 조정

메시지 데이터

# 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

⚠️ 주의사항

1. 파일 의존성

  • course_names.txt 파일이 반드시 존재해야 합니다
  • 분석 스크립트 실행 전 반드시 더미 데이터를 먼저 생성하세요

2. 인코딩

  • 모든 파일은 UTF-8 인코딩을 사용합니다
  • Windows 환경에서 텍스트 파일 수정 시 인코딩 주의

3. 메모리 사용

  • 대용량 데이터 생성 시 메모리 부족 가능
  • NUM_ROWS를 점진적으로 증가시켜 테스트 권장

4. 엑셀 파일 열림 상태

  • 분석 중인 엑셀 파일을 Excel에서 열어두면 오류 발생
  • 분석 전 모든 엑셀 파일을 닫아야 합니다

🐛 트러블슈팅

문제: 컬럼 관련 오류 - 너무 방대한 데이터

해결:

  1. scan_xlsx.py로 파일 구조 확인
  2. 어떤 컬럼이 존재하며 그 컬럼의 타입이 무엇인지 확인
  3. 스캔 데이터를 토대로 데이터 분석 코드 작성 (analyze_message_data.py)

문제: 인코딩 오류 (UnicodeDecodeError)

해결:

# 파일 열 때 명시적으로 인코딩 방식 지정
with open(file, "r", encoding="utf-8") as file:
    ...

🔄 실제 데이터 적용 가이드

실제 업무 데이터를 사용하려면:

  1. 컬럼명 매핑: 실제 데이터의 컬럼명에 맞게 스크립트 수정
  2. 데이터 형식 확인: scan_xlsx.py로 실제 파일 구조 파악
  3. 교육 과정명 업데이트: course_names.txt를 실제 과정명으로 수정
  4. 파일명 변경: 분석 스크립트의 excel_files 리스트 수정
# analyze_message_data.py 수정 예시
excel_files = [
    "실제_메시지_데이터_2025.xlsx",
]

📝 라이선스 및 기여

본 프로젝트는 교육지원실 내부 업무용으로 개발되었습니다.

개선 제안

  • 코드 개선 사항이나 버그 발견 시 이슈 등록
  • 새로운 분석 기능 추가 시 Pull Request

📧 문의

프로젝트 관련 문의사항은 [email protected]으로 연락주시기 바랍니다.


마지막 업데이트: 2025년 11월

About

노란우산 교육지원실에서 근무 시 주어진 데이터 분석 업무를 자동화했습니다.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages