품질관리(QAQC) 데이터 부트캠프(본캠프)

본캠프_4주차(월)_TIL

Wat_zy 2025. 9. 29. 15:28

✅ 오늘 한 것

Library 개인 과제(Level 2.), 파이썬 Pandas 문제 복습, 라이브 세션(Python Library & 데이터 전처리와 시각화)


✏️ 오늘 배운 점

import numpy as np
import pandas as pd

titanic = pd.DataFrame({
'Name': ['A', 'B', 'C', 'D', 'E'],
'Age': [25, None, 31, None, 40],
'Fare': [10.5, 20.0, 30.5, 40.0, 50.5]
})

titanic = titanic.dropna(subset=['Age'])
print(titanic.shape[0])

행과 열의 개수를 알기 위해서는 shape[0]을 사용하면 행의 개수, shape[1]을 사용하면 열의 개수를 확인할 수 있는 것을 복습할 수 있었다.

import numpy as np
import pandas as pd

df = pd.DataFrame({
'Age': [22, None, 35, None],
'Cabin': [None, 'C85', None, None],
'Embarked': ['S', None, 'C', None]
})

df_age_na = df['Age'].isnull().sum()
na_ratio = (df_age_na / len(df) * 100).round(1)
print(na_ratio)

굳이 'Age'의 행 개수를 찾을 필요 없이 DataFrame의 행 개수를 찾으면 그것이 분모로 들어갔을 때 똑같은 숫자가 되기에 DataFrame의 길이를 찾는 코드로 작성하면 되는 것을 이해하게 되었다.

import pandas as pd

orders_df = pd.DataFrame({
'order_id': ['ORD001', 'ORD002', 'ORD003'],
'order_date': ['2024-01-01', '2024-02-10', '2024-03-05'],
'delivery_date': ['2024-01-04', '2024-02-15', '2024-03-07']
})

orders_df.info()
orders_df['order_date'] = pd.to_datetime(orders_df['order_date'])
orders_df['delivery_date'] = pd.to_datetime(orders_df['delivery_date'])
orders_df.info()
orders_df['delivery_days'] = (orders_df['delivery_date'] - orders_df['order_date']).dt.days
print(orders_df['delivery_days'])

SQL에서는 날짜 차이 계산을 datediff로 사용하여 코드를 작성해보았지만 pandas에는 datediff가 없다고 오류가 나타나서 dt.days르 통해 일 수 차이를 확인해볼 수 있었다.

import pandas as pd

orders_df = pd.DataFrame({
'order_id': ['ORD001', 'ORD002', 'ORD003', 'ORD004', 'ORD005', 'ORD006'],
'order_date': ['2024-01-15', '2024-02-20', '2024-03-10', '2024-04-01', '2024-05-05', '2024-06-01'],
'delivery_date': ['2024-01-18', '2024-02-25', '2024-03-15', '2024-04-05', '2024-05-10', '2024-06-06']
})

orders_df['delivery_date'] = pd.to_datetime(orders_df['delivery_date'])
orders_df['order_date'] = pd.to_datetime(orders_df['order_date'])
orders_df['delivery_days'] = (orders_df['delivery_date'] - orders_df['order_date']).dt.days
orders_df_count = (orders_df['delivery_days'] <= 3).sum()
print(orders_df_count)

.sum() : 조건 만족 개수 (True 개수)

.count() : 전체 데이터 개수 (NaN 제외)

를 나타내기에 조건을 만족하는 개수를 확인할 때에는 .sum()으로 코드를 작성해줘야 한다는 것을 배울 수 있었다.


def solution(price):
    if price >= 500000:
        return int(price * 0.8)
    elif price >= 300000:
        return int(price * 0.9)
    elif price >= 100000:
        return int(price * 0.95)
    else:
        return price

역순으로 조건문을 달아서 금액에 따른 할인율 문제를 풀었으나 문제 조건에서 소수점 이하를 버린 정수를 return해야 한다는 것이 있기에 할인이 들어가는 조건에 int를 넣어 정수 조건을 만족시켜 코드 작성을 완료할 수 있었다.

 


1. CSV 파일

  • open(file, mode, encoding)

file (파일명/경로) : 열고자 하는 파일의 이름이나 경로를 문자열로 지정

mode (모드, 기본값 'r') : 파일을 어떤 방식으로 열지 지정

'r' : 읽기

'w' : 쓰기

'a' : 추가

'x' : 새 파일 생성

encoding (인코딩 방식, 기본값 None) : 텍스트 파일 입출력 시 사용할 문자 인코딩 지정

"utf-8", "cp949", "euc-kr"

 

with를 습관화하는 것이 좋다.(open()으로 파일을 열면, 작업이 끝난 뒤 반드시 file.close()을 해줘야 하지만, with 구문을 사용하면 블록이 끝날 때 자동으로 file.close()가 실행된다.)

 

쓰기(w, a) 모드에서 csv를 다룰 때 newline='' 을 반드시 포함해야 한다.

import csv

with open('csv_test.csv', 'r', encoding='utf-8') as file:
    csv_reader = csv.reader(file)
    for row in csv_reader:
        print(row)

# -> with 가지고 와서 pandas 상에서 첫번째 줄을 header
# -> pandas 자체 모듈에서 csv : read_csv()

with open('csv_test.csv', 'r', encoding = 'utf-8') as file:
    csv_reader = csv.DictReader(file)
    for row in csv_reader:
        print(row['이름'], row['직업'])
  • csv.reader 

csv 파일을 리스트(List) 형태로 읽어온다.

각 행(row)을 ["값1", "값", ...] 식으로 반환한다.

첫번째 줄(헤더)이 있어도 일반 행으로 취급한다.

  • csv.DictReader

csv 파일을 딕셔너리(Dict) 형태로 읽어온다.

첫번째 줄(헤더)을 자동으로 key로 사용한다.

각 행(row)을 {컬럼명: 값} 형태로 반환한다.

 

컬럼명으로 데이터에 접근하려면 DictReader

그냥 단순히 행 단위로 다루려면 reader

 

2. JSON 파일 

import json

# JSON 파일 읽기
with open('json_test.json', 'r', encoding='utf-8') as file:
    data = json.load(file) # 파일의 JSON을 파이썬 객체로 변환
    print(data)
    print(data['이름'])# 딕셔너리처럼 접근 
    
# JSON 문자열을 객체로 변환
json_string = '{"이름": "남지후", "나이": 27, "선호장르": ["인문", "소설"]}'
data2 = json.loads(json_string)
print(data2['이름'])

json.load(file) --> 파일 객체에서 JSON 읽어서 파이썬 객체 변환

json.loads(string) --> 문자열에서 JSON 읽어서 파이썬 객체 변환

# JSON 파일로 저장
with open('person.json', 'w', encoding='utf-8') as file:
    json.dump(person_data, file, ensure_ascii=False, indent=2)

# 문자열로 변환
json_string = json.dumps(person_data, ensure_ascii=False, indent=2)
print(json_string)

ensure_ascii는 모든 문자열을 ASCII로 강제 변환할지 여부를 결정하기에 한국어나 이모지를 그대로 출력하고 싶을 때에는 ensure_ascii=False를 써줘야 한다.

indent=n → n칸 들여쓰기로 JSON을 보기 좋게 출력

 

3. 텍스트 파일

# 텍스트 파일 읽기 - 전체 내용
with open('Text_test.txt', 'r', encoding='utf-8') as file:
    content = file.read()
    print(content)

# 텍스트 파일 읽기 - 한 줄씩
with open('Text_test.txt', 'r', encoding='utf-8') as file:
    for line_num, line in enumerate(file, 1):
        print(f"{line_num}: {line.strip()}")

# 텍스트 파일 쓰기
with open('output.txt', 'w', encoding='utf-8') as file:
    file.write('공지: 오늘 18시에 마감 점검\n')
    file.write('테이블 배치도는 3층 탕비실 보관\n')

# 여러 줄 한 번에 쓰기
    lines = ['사인회 안내문 업데이트\n', '전자책 체험존 점검\n']
    file.writelines(lines)

file.read() → 파일의 전체 내용을 하나의 문자열로 읽어옵니다.

enumerate(file, 1) → 줄 번호(line_num)와 줄 내용(line)을 함께 가져옵니다. (1번 줄부터 시작)

line.strip() → 줄 끝의 줄바꿈(\n) 같은 공백을 제거합니다.

 

4. 정규표현식 기초

패턴 의미 예시
\d 숫자 (0-9) \d{3} → 3자리 숫자
\w 문자/숫자/언더스코어 \w+ → 단어
\s 공백 문자 \s+ → 하나 이상의 공백
^ 문자열 시작 ^Hello → Hello로 시작
$ 문자열 끝 world$ → world로 끝남
. 임의의 한 문자 a.c → abc, adc 등
* 0회 이상 반복 ab*c → ac, abc, abbc
+ 1회 이상 반복 ab+c → abc, abbc
? 0회 또는 1회 ab?c → ac, abc
{n} 정확히 n회 a{3} → aaa
[...] 문자 집합 [abc] → a, b, c 중 하나

 

5. with 문을 활용한 안전한 파일 처리

# 권장: with 문 사용
with open('notice.txt', 'r', encoding='utf-8') as file:
    content = file.read()
# 블록이 끝나면 자동으로 파일이 닫힘

# 비권장: 수동으로 파일 닫기
file = open('notice.txt', 'r', encoding='utf-8')
try:
    content = file.read()
finally:
    file.close()# 실수로 빠뜨리기 쉬움
# 두 개의 파일을 동시에 열기
with open('event_source.txt', 'r', encoding='utf-8') as infile, \
     open('event_upper.txt', 'w', encoding='utf-8') as outfile:

    for line in infile:
        processed_line = line.upper()# 대문자로 변환
        outfile.write(processed_line)

# 파일 복사 예제
def copy_file(source, destination):
    with open(source, 'r', encoding='utf-8') as src, \
         open(destination, 'w', encoding='utf-8') as dst:
         dst.write(src.read())

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 데이터 불러오기
df = pd.read_csv("C:\Python_Code\practice\manufacturing_data_400.csv")

# 이상치 처리: Defects 값이 9999인 경우 결측치(NaN)로 변경
df['Defects'] = df['Defects'].replace(9999, np.nan)
# 라인별 생산량 합계
df_line_production = df.groupby('Line')['Production'].sum()


# 파이 차트 그리기
df_line_production.plot(kind='pie', figsize=(7.5, 7.5), autopct='%1.1f%%', startangle = 90)
plt.title("Percentage of Production by Line")
plt.ylabel("____")  # 불필요한 y라벨 제거
plt.show()

groupby()[].sum()으로 진행되어야 하지만 groupby[][].sum()으로 작성하여 오류가 발생하였었다. 이때, 적혀있는 단어들은 모두 확실하다고 생각하여 어떠한 오류가 발생하였는지 인지하기까지 시간이 걸렸다.

DataFrame.plot(kind='차트유형', figsize=(가로, 세로)) 을 활용하여 많은 차트 유형을 만들어낼 수 있다는 것을 알게 된 것이 좋고 계속해서 이를 작성하면서 까먹지 않게 반복 학습이 진행되어야 할 것 같다.

# 라이브러리 불러오기
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.read_csv('C:\Python_Code\practice\manufacturing_data_400.csv')
# 상관계수 행렬 계산
corr_matrix = df.corr(numeric_only=True)

# 히트맵 시각화
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt=".2f")

plt.title('Correlaton Heatmap: Defects vs Other Variables')
plt.xlabel('Features')
plt.ylabel('Features')
plt.show()

annot=True에 의해서 각 셀 안에 수치값(상관계수)가 표시된다. annot=False로 작성하면 색상만 나타나고 숫자는 보이지 않는다.

cmap='coolwarm'에 의해 파란색(음수) - 흰색(중간) - 빨간색(양수) 그라데이션이 나타난다. 

fmt=".2f"에 의해 소수점 2자리까지 출력된다.


✏️ 오늘의 핵심

오늘은 Pandas와 파일 입출력, 시각화 전반을 복습하며 세부적인 문법 차이와 활용법을 다시 확인할 수 있었다. Pandas에서는 shape[0], shape[1]로 행·열 개수를 확인하고, isnull().sum()과 .sum()/.count()의 차이를 이해했으며, 날짜 차이는 dt.days로 처리해야 한다는 점을 배웠다.

 

정규표현식의 기초 패턴도 익혔고, 시각화에서는 groupby()[].sum() 문법 오류를 통해 작은 오타도 코드 동작을 좌우한다는 것을 체감했다. DataFrame.plot()으로 다양한 차트를 만들 수 있고, Seaborn 히트맵에서는 annot, cmap, fmt 옵션을 통해 시각화 결과를 세밀히 조정할 수 있다는 점을 알게 되었다. 즉, 오늘은 데이터 전처리와 파일 처리, 시각화 과정에서 기본기와 디테일의 중요성을 다시 한번 확인하는 시간이었다.


📌추가로 해야할 점

Library 개인 과제 Level 3. , 알고리즘 문

'품질관리(QAQC) 데이터 부트캠프(본캠프)' 카테고리의 다른 글

본캠프_4주차(수)_TIL  (0) 2025.10.01
본캠프_4주차(화)_TIL  (0) 2025.09.30
본캠프_3주차(일)_TIL  (0) 2025.09.26
본캠프_3주차(토)_TIL  (0) 2025.09.26
본캠프_3주차(5일)_TIL  (0) 2025.09.25