2025 내일배움캠프 QAQC_2기

2025 내일배움캠프 QAQC_2기 본캠프 16일차

mingdoremi 2025. 6. 2. 20:12

안녕하세요!! 오늘은 본캠프 16일차입니다!!

다들 주말 잘 쉬고 오셨나요?? 저는 묭실가서 머리도 자르고, 영화 '미션임파서블'도 봤습니다~!

활동을 해서 그런지 주말이 너무 짧게 지나가버린 것 같아요..ㅜ.ㅜ

하.지.만! 내일 6/3일은 선거날이라 쉰답니다!!! 넘넘 신나용 ㅋㅋㅋㅋ

오늘은 개인과제가 나와서 개인과제 풀어보고 세션을 들었습니다!

데이터 전처리 및 시각화에 대한 개인과제라서 어렵기도 했지만 힌트들이 있어서 많은 도움이 되었어요!

 

문제 1-1 : 데이터 전처리

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

# 1) CSV 파일을 읽어 DataFrame 생성 (Data는 manu)
df = pd.read_csv('/content/manufacturing_data_400.csv')
# 2) df의 상위 5개 행을 확인하고 출력
df.head()
# 3) df의 기본 정보(컬럼명, 데이터 타입, etc.) 출력
df.info()
# 4) df의 기술 통계(평균, 표준편차 등) 출력
df.describe()
# 5) df의 컬럼별 결측값 개수 출력
df.isnull().sum()
# 6) df의 중복 행이 몇 개인지 출력
df.duplicated().sum()

 

문제 1-2 : 결측치 처리

  1. Defects 열에 이상치로 추정되는 9999라는 값을 발견했습니다.
  2. Temperature 열에 존재하는 결측치(또는 NaN)을 Temperature 열의 평균값으로 대체
# 1) Defects 열에서 9999 -> NaN으로 대체
import numpy as np
df['Defects'] = df['Defects'].replace(9999, np.nan)
# 2) Temperature 열 결측치를 해당 열의 평균값으로 대체
df['Temperature'] = df['Temperature'].fillna(df['Temperature'].mean())
df

 

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

  1. 날짜 데이터 타입 확인문자열(object) 타입인지 확인합니다.
  2. 출력 예시: print("Before:", df['Date'].dtype)
  3. Date 열의 데이터 타입을 출력하세요.
  4. to_datetime 형식으로 변환
  5. pd.to_datetime() 함수를 사용하여 Date 열을 datetime 형식으로 변환하세요.
  6. 변환 후 타입 확인datetime64 타입으로 바뀌었는지 확인합니다.
  7. 출력 예시: print("After:", df['Date'].dtype)
  8. 변환된 Date 열의 데이터 타입을 출력하세요.
  9. 연도, 월, 일 파생 컬럼 생성결과 출력출력 예시: print(df[['Date', 'Year', 'Month', 'Day']].head())
  10. Date, Year, Month, Day 컬럼을 포함한 상위 5개 행을 출력하세요.
  11. Date 열에서 .dt.year, .dt.month, .dt.day를 사용하여 각각 Year, Month, Day 컬럼을 생성하세요.
# 라이브러리 불러오기
import pandas as pd

# CSV 파일 불러오기
df = pd.read_csv('/content/manufacturing_data_400.csv')
# 1) Date 컬럼의 데이터 타입 확인
print("Before:", df['Date'].dtype)
# 2) 문자열을 datetime 타입으로 변환
df['Date'] = pd.to_datetime(df['Date'])
# 3) 변환 후 데이터 타입 확인
print("After conversion:", df['Date'].dtype)
# 4) 연도, 월, 일 파생 컬럼 생성
df['Year'] = df['Date'].dt.year
df['Month'] = df['Date'].dt.month
df['Day'] = df['Date'].dt.day

# 결과 일부 출력
print(df[['Date', 'Year', 'Month', 'Day']].head())

 

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

  1. Defects 열에서 9999를 결측치(NaN)로 처리하세요.
  2. DefectRate라는 새로운 열을 만들고, 결함 수 / 생산량을 계산하여 저장하세요.
  3. Line, Production, Defects, DefectRate 컬럼만 선택하여 앞부분 5개 행을 출력하세요.
# 라이브러리 불러오기
import pandas as pd

# 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']

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

 

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

  • 라인별 그룹화
    • 주어진 데이터에서 라인(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 pandas as pd
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

df = pd.read_csv('/content/manufacturing_data_400.csv')
df['Defects'] = df['Defects'].replace(9999,np.nan)

line_sum = df.groupby('Line')[['Production', 'Defects']].sum().reset_index()
x = np.arange(len(line_sum))
width = 0.3
plt.figure(figsize=(8, 6))
plt.bar(x - width/2, line_sum['Production'], width, label='Production')
plt.bar(x + width/2, line_sum['Defects'], width, label='Defects')


#빈칸을 작성하세요
plt.title('Total Production and Defects by Line')
plt.xlabel('Line')
plt.ylabel('Count')
labels = df['Line'].unique()
plt.xticks(x, labels, rotation=0)
plt.legend(['Production', 'Defects'])
plt.grid(axis='y')
plt.show()

 

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

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

df = pd.read_csv('/content/manufacturing_data_400.csv')

sizes = [33, 33.7, 33.3]
labels = ['Line A', 'Line B', 'Line C']

plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90)
plt.title('Percentage of Production by Line')
plt.show()

 

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

  • 날짜별 집계
    • 주어진 데이터에서 “일자(Date)”, “생산량(Production)”, “불량(Defects)”을 날짜별로 그룹화하여 총합(또는 평균)으로 집계하세요.
  • Line Chart 작성
    • X축에는 날짜(Date)를, Y축에는 “생산량(Production)”과 “불량(Defects)” 수치를 배치합니다.
    • 날짜별 “Production”을 나타내는 선과 “Defects”를 나타내는 선을 같은 그래프에 그립니다.
  • 그래프 꾸미기
    • 그래프의 제목(title) 을 적절히 설정하세요.
    • X축 라벨(xlabel)과 Y축 라벨(ylabel)을 설정합니다.
    • 범례(legend)를 통해 두 선이 어떤 값(Production/Defects)인지 명확히 구분되도록 합니다.
    • 그래프에 격자(grid)를 추가하여 가독성을 높이세요.
# 1) 날짜별 집계
# your code here
import pandas as pd
import matplotlib.pyplot as plt
daily_sum = df.groupby('Date')[['Production','Defects']].sum()

# 2) 선 그래프(Line Chart) 작성
plt.figure(figsize=(14, 6))
plt.plot(daily_sum.index, daily_sum['Production'], marker='o', label='Production')
plt.plot(daily_sum.index, daily_sum['Defects'], marker='x', label='Defects')

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

 

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

  • 라인별 그룹화
    • 주어진 데이터에서 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

df = pd.read_csv('/content/manufacturing_data_400.csv')

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

plt.title('Temperature Distribution by Line(Boxplot)')      
plt.xlabel('Production Line')      
plt.ylabel('Temperature')      
plt.grid(True)

# 그래프 표시
plt.show()

 

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

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

df = pd.read_csv('/content/manufacturing_data_400.csv')

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

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

# 그래프 표시
plt.show()

 

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

  • 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 = pd.read_csv('/content/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('Correlation Heatmap of Defects and Related Variables')         
plt.xlabel('Features')        
plt.ylabel('Features')       
plt.show()

 

앞에서 데이터를 불러오거나 pandas나 matplotlib을 불러오고 시간이 지나서 런타임이 끊기면 다시 실행을 했을 때 오류가 나는 데 바로바로 찾기가 어려워서 코드를 잘 짜놓고도 살짝 헤맸어요...ㅎ.ㅎ

이제는 앞으로 처음 불러오는 것 처럼 앞에 꼭 불러와야겠어요!!

 

오늘도 무사히 잘 마쳤습니다~!~! 수고하셨어요!!! 내일 푹 쉬고 모레 뵐게요 ◠‿◠