내일배움캠프(QA,QC_5기)

[내일배움캠프] QA/QC_5기 ( 18일차 )

lshxkwh 2026. 4. 1. 20:22

[ 데이터 전처리 & 시각화 개인과제 ]

  1. 과제 개요 및 목표
    • 주요 과제 : 결측치 처리 , 날짜 데이터 전처리 , 불량률 계산 , 데이터 시각화
  2. 과제 수행 소회 ( 경험 )

    🔩 Level. 1 : 데이터 전처리

    공장 데이터(Defects, Temperature 등)를 포함한 CSV 파일을 불러오고,
    • 결측치 처리 : Defects 열의 이상치로 추정되는 특정 값을 NaN으로 대체하고, Temperature의 결측값은 평균값으로 채웁니다.도전 과제
  3. 품질 분석에 앞서 필수적으로 수행해야 하는 전처리 작업을 진행합니다.
더보기

문제 1-1 : 데이터 전처리 요구 사항


CSV 파일 읽기 및 데이터 기본 확인

  1. CSV 파일을 읽어 DataFrame(df) 을 생성합니다.
  2. 데이터셋 미리보기 : df의 상위 5개 행을 출력하세요.
  3. 데이터 정보 : 컬럼명, 데이터 타입, 결측치 등 기본 정보를 출력하세요.
  4. 기술 통계 : 평균, 표준편차, 최소/최대값 등 기술 통계를 출력하세요.
  5. 결측값 개수 : 각 열별로 결측값이 몇 개인지 출력하세요.
  6. 중복 행이 몇 개인지 출력하세요.
import pandas as pd
import numpy as np
# 1) CSV 파일을 읽어 DataFrame 생성 (Data는 manu)
df = pd.read_csv('/content/manufacturing_data_400.csv')

# 2) df의 상위 5개 행을 확인하고 출력
df.head(5)
# 3) df의 기본 정보(컬럼명, 데이터 타입, etc.) 출력
df.info()
# 4) df의 기술 통계(평균, 표준편차 등) 출력
df.describe()
# 5) df의 컬럼별 결측값 개수 출력
df.isnull().sum()
# 6) df의 중복 행이 몇 개인지 출력
df.duplicated().count()

 

문제 1-2 : 결측치 처리

요구사항


  1. Defects 열에 이상치로 추정되는 9999라는 값을 발견했습니다.
  2. 이는 현실적인 결함 수로 보기 어려우므로 NaN(결측치)로 대체해야 합니다.
  3. Temperature 열에 존재하는 결측치(또는 NaN)을 Temperature 열의 평균값으로 대체
# 1) Defects 열에서 9999 -> NaN으로 대체
df['Defects'].replace(9999,np.nan)
# 2) Temperature 열 결측치를 해당 열의 평균값으로 대체
df['Temperature'] = df['Temperature'].fillna(df['Temperature'].mean())

 

문제 1-3 : 날짜 데이터 전처리

요구사항


  • 날짜 컬럼의 데이터 타입 확인
    • Date 열이 문자열(object) 타입인지 확인하세요.
  • 문자열을 날짜 타입으로 변환
    • pd.to_datetime()을 사용하여 Date 열을 datetime64 타입으로 변환하세요.
  • 변환 후 데이터 타입 확인
    • 변환된 Date 열의 타입이 datetime64[ns]인지 확인하세요.
  • 연도, 월, 일 파생 컬럼 생성
    • Date 열로부터 Year, Month, Day 세 개의 컬럼을 추출해 새로운 열로 추가하세요.
# 라이브러리 불러오기
import pandas as pd

# CSV 파일 불러오기
df = pd.read_csv('/content/manufacturing_data_400.csv')
# 1) Date 컬럼의 데이터 타입 확인
df.dtypes
# 2) 문자열을 datetime 타입으로 변환

df['Date'] =pd.to_datetime(df['Date'],format = 'mixed',errors='coerce')

# 3) 변환 후 데이터 타입 확인
print("After conversion:", df['Date'].dtype)

# 4) 연도, 월, 일 파생 컬럼 생성
df['Year'] = df['Date'].dt.year
df['Month'] = df['Date'].dt.month # (힌트: dt.month)
df['Day'] = df['Date'].dt.day
# 결과 일부 출력
print(df[['Date', 'Year', 'Month', 'Day']].head())

 

문제 1-4 : 불량률(Defect Rate) 계산

문제 설명

공정 데이터에는 생산량(Production)과 결함 수(Defects)가 기록되어 있습니다. 하지만 Defects 열에는 이상치(9999)가 포함되어 있어 분석에 방해가 됩니다. 이러한 이상치를 처리하고, 각 행에 대해 불량률(DefectRate = Defects / Production)을 계산하세요.

요구사항


  • Defects 열에서 9999를 결측치(NaN)로 처리하세요.
  • DefectRate라는 새로운 열을 만들고, 결함 수 / 생산량을 계산하여 저장하세요.
  • Line, Production, Defects, DefectRate 컬럼만 선택하여 앞부분 5개 행을 출력하세요.

 

# 라이브러리 불러오기
import pandas as pd
import numpy as np
# CSV 파일 불러오기
df = pd.read_csv('/content/manufacturing_data_400.csv')
# 1) 이상치 처리: Defects 값이 9999인 경우 결측치(NaN)로 변경
df['Defects'] = df['Defects'].replace(9999,np.nan)
# 2) 불량률 계산: 새로운 컬럼 DefectRate 생성
df['DefectRate'] = df['Defects'] /df['Production']                #힌트 불량률(DefectRate = Defects / Production)

# 3) 결과 일부 출력
print(df[['Line', 'Production', 'Defects', 'DefectRate']].head())

🔩Level. 2 : 데이터 시각화

Level. 1에서 가공한 데이터를 바탕으로 본격적인 시각화를 만들어 봅니다.


  1. Bar Chart : 라인별로 데이터를 그룹화하여 생산량과 불량 수치 를 파악하고, **막대 그래프(Bar Chart)**를 생성합니다.
  2. Pie Chart : 전체 생산량(Production)에서 각각 어느 정도의 비중을 차지하는지 파악하기 위해, 파이 차트(Pie Chart) 를 생성합니다.
  3. Line Chart : 일자별 생산량(Production)과 불량 수량(Defects) 을 시각적으로 비교하여 불량률 추이와 생산 변동성을 파악하는 복합 선 그래프(Line Chart) 를 생성합니다.
더보기

문제 2-1 : Bar Chart - 라인별 Production & Defects

문제 설명


공장 내에는 A, B, C 등 여러 생산 라인(Line) 이 존재하며, 각 라인마다 하루 생산량(Production)  불량(Defects) 데이터가 기록됩니다. 라인별로 이러한 데이터를 그룹화하여 생산량과 불량 수치 를 파악하고, 막대 그래프(Bar Chart) 로 시각화하여 비교하려고 합니다.

요구사항


  • 라인별 그룹화
    • 주어진 데이터에서 라인(Line) 을 기준으로 그룹화하세요.
    • 각 라인별 생산량(Production)  불량(Defects) 의 총합(합계)을 구하세요.
  • Bar Chart 작성
    • X축에는 라인(Line) 을 표시합니다.
    • Y축에는 생산량(Production)  불량(Defects) 의 합계를 나타냅니다.
    • 각 라인별로 두 가지 막대(Production/Defects)를 나란히 배치하여 시각적인 비교가 가능하도록 합니다.
  • 그래프 꾸미기
    • 그래프의 제목(title) 을 적절히 설정하세요.
    • X축 라벨(xlabel)과 Y축 라벨(ylabel)을 알맞게 설정합니다.
    • 범례(legend)를 추가하여 Production  Defects 를 명확하게 구분하세요.
    • X축에 라인(A, B, C) 이름이 정확히 표시되도록 하세요 (필요에 따라 plt.xticks 등을 사용)
    • Y축에 대한 격자(grid)를 추가하여 막대의 높이를 쉽게 확인할 수 있도록 합니다.
# 라이브러리 불러오기
import matplotlib.pyplot as plt
import pandas as pd
# 여기에 코드를 입력하세요

# 빈칸을 작성하세요
plt.rc('font', family='NanumBarunGothic')
df.groupby("Line")[['Production','Defects']].sum().plot(kind= 'bar')
plt.title('라인별 생산량 및 불량률 수')
plt.xlabel('Line')
plt.ylabel('합계')
plt.xticks(rotation=0)
plt.legend(['Production', 'Defects'])
plt.grid(axis='y')

# 그래프 표시
plt.show()

 

문제 2-2 : Pie Chart - 라인별 Production 비중

문제 설명


공장 내 여러 생산 라인(A, B, C)이 전체 생산량(Production)에서 각각 어느 정도의 비중을 차지하는지 파악하기 위해, 파이 차트(Pie Chart) 를 작성하려고 합니다.

요구사항


  • Pie Chart 작성
    • 파이 차트를 사용하여 각 라인의 Production 비중을 시각화하세요.
    • 각 파이 조각에 라인 이름 퍼센트(%) 를 표시하기 위해 autopct='%1.1f%%' 옵션을 사용하세요.
    • 파이 차트의 색상을 라인별로 다르게 지정하여 구분이 용이하도록 합니다.
  • 그래프 꾸미기
    • 그래프의 제목(title) 을 적절히 설정하세요 (예: "라인별 Production 비중").
    • 불필요한 축 라벨(예: 축 눈금)을 제거하여 파이 차트가 깔끔하게 보이도록 합니다.
    • 그래프의 색상을 명확히 구분할 수 있도록 설정하세요.
# 라이브러리 불러오기
import matplotlib.pyplot as plt
import pandas as pd
a = df.groupby('Line')['Production'].sum()
plt.pie(
    a,
    labels = a.index,
    colors = ['blue','orange','green'],
    autopct = '%1.1f%%',
    startangle = 90

)
plt.title('Percentage of Production by Line')
# 그래프 표시
plt.show()

 

문제 2-3 : 복합 Line Chart - 일자별 Production & Defects

문제 설명


공장에서는 매일 다양한 제품을 생산하고, 그 과정에서 발생하는 불량 수량 역시 기록합니다. 일자별 생산량(Production)과 불량 수량(Defects) 을 시각적으로 비교하여 불량률 추이와 생산 변동성을 파악하려고 합니다. 이에 따라, 주어진 데이터를 날짜별로 집계하고 선 그래프(Line Chart) 로 나타내는 작업을 수행해야 합니다.

요구사항


  • 날짜별 집계
    • 주어진 데이터에서 “일자(Date)”, “생산량(Production)”, “불량(Defects)”을 날짜별로 그룹화하여 총합(또는 평균)으로 집계하세요.
  • Line Chart 작성
    • X축에는 날짜(Date)를, Y축에는 “생산량(Production)”과 “불량(Defects)” 수치를 배치합니다.
    • 날짜별 “Production”을 나타내는 선과 “Defects”를 나타내는 선을 같은 그래프에 그립니다.
  • 그래프 꾸미기
    • 그래프의 제목(title) 을 적절히 설정하세요.
    • X축 라벨(xlabel)과 Y축 라벨(ylabel)을 설정합니다.
    • 범례(legend)를 통해 두 선이 어떤 값(Production/Defects)인지 명확히 구분되도록 합니다.
    • 그래프에 격자(grid)를 추가하여 가독성을 높이세요.
  • 복합 그래프 참고 자료참고 블로그 바로가기
  • 여러 그래프를 겹쳐 그리는 방법을 모르겠다면, 아래 링크를 참고하세요!
# 라이브러리 불러오기
import matplotlib.pyplot as plt
import pandas as pd

# 날짜별 집계
df['Date'] = pd.to_datetime(df['Date'])
daily_data = df.groupby('Date')[['Production', 'Defects']].sum()
# 여기에 코드를 입력하세요

# 선 그래프(Line Chart) 작성
plt.figure(figsize=(12, 5))
plt.plot(daily_data.index, daily_data['Production'], label='Production',marker='o')   # 예시
plt.plot(daily_data.index, daily_data['Defects'], label='Defects',marker='o')      # 예시


plt.title('Daily Trends: Production and Defects')
plt.xlabel('Date')
plt.ylabel('Count')
plt.legend(['Total Production','Total Defects'])
plt.grid()

# 그래프 표시
plt.show()

 

문제 2-4 : Boxplot – 라인별 온도 분포 시각화

문제 설명


공장에서는 라인별 온도(Temperature)를 일정하게 유지하는 것이 품질 관리에 매우 중요합니다.

온도는 제품 품질에 직접적인 영향을 줄 수 있기 때문에, 각 라인의 온도 분포를 주기적으로 점검하는 것이 필수적입니다.

Boxplot을 활용하면 각 생산 라인(Line)에서 측정된 온도의 범위, 중앙값, 이상치 등을 시각적으로 확인할 수 있습니다.

이를 통해 특정 라인의 온도 편차가 큰지, 혹은 이상 온도가 자주 발생하는 라인이 있는지를 쉽게 파악할 수 있습니다.

데이터를 기반으로 라인별 온도 데이터를 시각화하고, 품질 관리에 활용할 수 있는 인사이트를 도출해보세요.

요구사항


  • 라인별 그룹화
    • 주어진 데이터에서 Line 컬럼을 기준으로 온도(Temperature) 데이터를 그룹화하세요.
  • Boxplot 작성
    • seaborn 또는 matplotlib를 사용하여 라인별 온도 분포를 Boxplot으로 시각화합니다.
    • X축에는 라인 이름(Line), Y축에는 온도 값(Temperature) 을 배치합니다.
  • 그래프 꾸미기
    • 그래프의 제목(title) 을 적절히 설정하세요.
    • X축 라벨(xlabel)과 Y축 라벨(ylabel)을 설정합니다.
    • 격자(grid) 를 추가하여 그래프의 가독성을 높이세요.
# 라이브러리 불러오기
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

# Boxplot 작성
plt.figure(figsize=(10, 6))
sns.boxplot(x='Line', y='Temperature', data=df)  # 예: x='Line', y='Temperature', data=df

plt.title('Temperature Distribution by Line')       # 예: 'Temperature Distribution by Line'
plt.xlabel('Production Line')      # 예: 'Production Line'
plt.ylabel('Temperature')      # 예: 'Temperature'
plt.grid(True)

# 그래프 표시
plt.show()

 

문제 2-5 : Violinplot – 라인별 온도 분포 및 밀도 시각화

문제 설명


공장에서 라인(Line)마다 일정한 온도를 유지하는 것은 제품의 품질과 생산 안정성에 직결됩니다.

온도 편차가 크거나, 특정 라인에서 온도가 한쪽으로 쏠리는 현상은 공정 이상이나 설비 문제로 이어질 수 있으므로,

라인별로 온도 데이터의 분포를 면밀히 분석하는 것이 중요합니다.

Boxplot은 이상치 및 중앙값, 사분위수 등 요약 통계를 제공해주지만,

데이터가 어느 구간에 몰려 있는지, 즉 분포의 형태(밀도)를 파악하는 데는 한계가 있습니다.

이러한 한계를 보완하기 위해 Violinplot을 활용하면,

Boxplot의 요약 통계 정보와 함께 데이터의 분포 밀도를 함께 시각화할 수 있습니다.

요구사항


  • Line 컬럼을 기준으로 데이터를 분리하고, 각 라인의 Temperature 분포를 비교하세요.
  • 시각화는 Seaborn의 violinplot() 함수를 사용합니다.
  • 그래프는 다음과 같은 구성 조건을 충족해야 합니다:
    • X축: 생산 라인 이름 (Line)
    • Y축: 온도 값 (Temperature)
    • 그래프 제목(title) 을 명확히 설정하세요.
    • X/Y축 라벨을 지정하세요.
    • grid()를 추가하여 그래프의 가독성을 높이세요.
# 라이브러리 불러오기
import matplotlib.pyplot as plt
import seaborn as sns

# Violinplot 작성
plt.figure(figsize=(10, 6))
sns.violinplot(x='Line', y='Temperature', data=df)  # 예: x='Line', y='Temperature', data=df

plt.title('Temperature Distribution by Line')        # 예: 'Temperature Distribution by Line (Violinplot)'
plt.xlabel('Producrion Line')       # 예: 'Production Line'
plt.ylabel('Temperature')       # 예: 'Temperature'
plt.grid(True)

# 그래프 표시
plt.show()

 

문제 2-6: 결함 관련 상관관계 히트맵 시각화

문제 설명


제품 생산 중 발생하는 불량(Defects)은 공정 조건, 생산량, 온도 등 다양한 수치형 변수의 영향을 받을 수 있습니다.

이러한 변수들과의 관계를 분석하는 것은 결함 원인을 파악하고 품질 개선 방향을 제시하는 데 매우 중요합니다.

상관관계 히트맵(correlation heatmap)은 여러 수치형 변수 간의 관계를 시각적으로 직관적으로 파악할 수 있는 강력한 도구입니다.

특히 Defects가 다른 변수들과 얼마나 밀접하게 연결되어 있는지를 한눈에 확인할 수 있습니다.

요구사항


  • df.corr() 함수를 사용하여 수치형 변수 간 상관계수(Correlation Coefficient)를 계산하세요.
  • seaborn의 heatmap() 함수를 사용하여 히트맵 시각화를 작성하세요.
  • 히트맵에는 반드시 Defects 컬럼이 포함되도록 하며, 해석 중심은 Defects와의 관계입니다.
  • 시각화 구성 요소는 다음 조건을 반드시 포함해야 합니다:
    • 색상은 상관계수의 크기에 따라 변화 (cmap 설정)
    • annot=True로 각 셀에 상관계수 숫자 표시
    • 그래프 제목(title), 컬러바(colorbar), X/Y축 라벨 추가
# 라이브러리 불러오기
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df['Defects'] = pd.to_numeric(df['Defects'], errors='coerce')

# 상관계수 행렬 계산
corr_matrix = df.corr(numeric_only=True)

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

plt.title('Correlation Heatmap: Defects vs Other Variables')         # 예: 'Correlation Heatmap of Defects and Related Variables'
plt.xlabel('Features')        # 예: 'Features'
plt.ylabel('Features')        # 예: 'Features'
plt.show()
  • 해결과정 : 노션과 실시간 세션 자료를 활용하여 문제를 해결하였다.
  • 느낀점 : 전에는 시각화를 단순히 '예쁜 결과물을 만드는 과정'이라고 생각했다. 하지만 이번 과제를 통해 시각화는 내 분석의 논리를 상대방에게 설득하는 가장 강력한 언어라는 점을 깨달았다. 동일한 데이터라도 어떤 축을 설정하고, 어떤 시각화 기법을 선택하느냐에 따라 전달되는 메시지가 완전히 달라진다는 사실이 무척 흥미로웠다. 이제는 그래프를 볼 때 '어떻게 예쁘게 그릴까'가 아니라, 이 그래프를 통해 어떤 의사결정을 이끌어낼 것인가를 먼저 고민하게 되었다

   3. 해설 세션 핵심 내용

  • 문제점의 Want
  • 가설 설정
  • 현업에서 센서 데이터, 데이터 구매. 데이터 수집 후 분석
    • 분석 방법
      : 시각적 분석 , 통계 분석(회귀,시계열,상관관계,F검정) , 머신러닝/딥러닝 -XAI , 기출 통계(평균, 분산, 표준편차,max,min), 추론검정 ( t검정 , f검정 , 카이제곱 검정 )
  • 결론
  1. 데이터 프레임이 회손 될 경우
    1. 방지 : df = df.copy()
  2. 데이터 클랜징 :결측값 제거, 이상치 제거
    1. .isnull()
    2. .isnull().sum() 결측값 개수