Data_10기

Python 데이터 분석 기초 실습

senu 2025. 11. 13. 19:28

오늘은 csv 파일을 불러와서 데이터를 전처리하고, 평균 점수와 합격 여부를 판별한 뒤 결과를 JSON 파일로 저장하는 과정을 실습했다. 이전까지 배웠던 리스트, 딕셔너리, 조건문, 반복문, 함수 개념이 모두 종합적으로 사용된 시간이었다.


CSV 파일 불러오기와 데이터 처리

먼저 csv 파일을 아래와 같이 만들어주고, 해당 파일을 다루기 위해 csv 라이브러리를 불러왔다.

'''
school_scores.csv

name,kor,eng,math
Hannah,90,95,85
Minjun,80,88,92
Yujin,75,85,100
Dohyeok,100,70,88
Suyun,88,90,93
Jiwon,95,97,99
Hojun,65,75,60
Yuna,78,82,85
Taeyang,92,89,91
Seojin,55,70,68
'''
import csv

with open("school_scores.csv", "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)  # 첫 줄은 key, 나머지는 value로 인식
    students = list(reader)

 

DictReader 를 사용하면 첫 번째 줄(헤더)를 key, 나머지를 데이터를 value로 자동 인식한다. 즉, 한 줄의 데이터가 하나의 딕셔너리가 되고, 전체 파일은 리스트 안의 딕셔너리 구조가 된다.

[
 {'name': 'Minjun', 'kor': '80', 'eng': '88', 'math': '92'},
 {'name': 'Yujin', 'kor': '75', 'eng': '85', 'math': '100'},
 {'name': 'Dohyeok', 'kor': '100', 'eng': '70', 'math': '88'},
 ...
]

 

이 구조 덕분에 students[i]["kor"] 형태로 특정 학생의 점수에 접근할 수 있다.

 

문자열을 숫자로 변환하기

CSV로 불러온 데이터는 모두 문자열(String)로 되어 있다. 따라서 수학 계산을 하기 위해 int( )로 변환해야 한다.

for i in students:
    i["kor"] = int(i["kor"])
    i["eng"] = int(i["eng"])
    i["math"] = int(i["math"])

 

 

평균과 합격 여부 계산하기

각 학생의 평균을 구한 뒤, 평균이 80점 이상이면 '합격', 그렇지 않으면 '불합격'으로 표시했다.

for i in students:
    avg = (i["kor"] + i["eng"] + i["math"]) / 3
    i["avg"] = avg

    if avg >= 80:
        i["status"] = "합격"
    else:
        i["status"] = "불합격"

 

이렇게 하면 각 학생의 데이터에 "avg""status" 키가 추가되어 완성된다.


예외 처리와 함수화

오후에는 실제로 데이터 안에 결측값이나 잘못된 값이 있을 때를 가정하고, 에러를 처리하는 방법을 배웠다.

for i in students:
    try:
        i['kor'] = int(i['kor'])
        i['eng'] = int(i['eng'])
        i['math'] = int(i['math'])
    except ValueError as ve:
        print(f"값 변환 오류: {ve}")
        continue
    except Exception as e:
        print(f"예상치 못한 오류 발생: {e}")

 

try-except 문을 사용하면, 오류가 발생하더라도 프로그램이 멈추지 않고 다음 데이터를 계속 처리할 수 있다.

특히 ValueError 는 "숫자로 바꿀 수 없는 문자열(예: 'abc')"이 있을 때 발생한다.

 

함수로 정리하기

같은 작업을 반복적으로 수행할 때는 함수를 사용해 코드를 정리하면 효율적이다.

def analyze_scores(scores):
    try:
        kor = int(scores["kor"])
        eng = int(scores["eng"])
        math = int(scores["math"])
        avg = (kor + eng + math) / 3
        status = "합격" if avg >= 80 else "불합격"
        return {"name": scores["name"], "avg": avg, "status": status}
    except Exception as e:
        print(f"에러 발생: {e}")
        return None

 

그리고 이 함수를 학생 리스트에 반복 적용해 결과를 정리했다.

results = []
for s in students:
    r = analyze_scores(s)
    if r:
        results.append(r)

 

결과를 JSON 파일로 저장하기

마지막으로, 분석된 결과를 JSON 형식으로 파일에 저장했다.

import json

with open("results.json", "w", encoding="utf-8") as f:
    json.dump(results, f, ensure_ascii=False, indent=4)

print("파일이 완성되었습니다.")

 

결과 파일(results.json)에는 이름, 평균, 합격 여부만 깔끔하게 저장된다.

[
    {"name": "Hannah", "avg": 90.0, "status": "합격"},
    {"name": "Minjun", "avg": 85.0, "status": "합격"},
    {"name": "Yujin", "avg": 70.0, "status": "불합격"}
]

 


마무리

오늘은 데이터를 불러오고, 처리하고, 저장하는 전 과정을 하나의 흐름으로 실습을 해보았다. 아직은 예외 처리나 파일 입출력 등 파이썬 문법들이 익숙하지는 않지만, 프로그래밍의 흐름을 파악해볼 수 있었다. 앞으로 이런 과정을 자주 복습하면서, 데이터를 다루는 흐름을 익히고 응용할 수 있도록 연습해야겠다.