빅데이터 QAQC_3기/빅데이터 QAQC_3기 TIL

TIL_251001

usungusung 2025. 10. 1. 22:09

Today I learned

 

1. QAQC 문제풀이 가이드

1) x-y1, x-y2, x-y3, x-y4

import pandas as pd
import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y1 = [1, 2, 3, 4, 5]
y2 = [2, 4, 6, 8, 10]
y3 = [1, 4, 9, 16, 25]
y4 = [5, 4, 3, 2, 1]

# 요런 데이터가 있다.

fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10,10))

#먼저 fig.axes를 이용해 subplot을 만들고 행 두개, 열 두개를 만들어준다.

axes[0,0].plot(x,y1, marker ='o')
axes[0,0].set_title('1')
axes[0,0].set_xlabel('X')
axes[0,0].set_ylabel('Y')

axes[0,1].plot(x,y2, marker ='o')
axes[0,1].set_title('2')
axes[0,1].set_xlabel('X')
axes[0,1].set_ylabel('Y')

axes[1,0].plot(x,y3, marker ='o')
axes[1,0].set_title('3')
axes[1,0].set_xlabel('X')
axes[1,0].set_ylabel('Y')

axes[1,1].plot(x,y4, marker ='o')
axes[1,1].set_title('4')
axes[1,1].set_xlabel('X')
axes[1,1].set_ylabel('Y')

#각 순서에 맞게 배치해준다. 참고로 plot(A,B)에서 A는 X 좌표, B는 Y좌표를 의미한다.

plt.tight_layout()
plt.show

# 레이아웃을 정리하고, 결과를 확인한다.

 

2) Groupby를 활용한 지역별 매출 합계 구하기

import pandas as pd

simple_data = {
'region': ['Seoul', 'Seoul', 'Busan', 'Seoul', 'Busan', 'Busan'],
'product': ['A', 'B', 'A', 'A', 'B', 'A'],
'sales': [100, 150, 80, 120, 110, 90]
}

df = pd.DataFrame(simple_data)

# 데이터프레임을 먼저 만들어준다.

region_sum = df.groupby('region')['sales'].sum()

print(region_sum['Busan'])
 
280

#regin_sum 변수를 만들고, groupby를 적용시켜 region에 따라 데이터를 묶는다. (ex. Seoul별, Busan 별)

#['sales']를 적용했기에, 묶은 그룹 내에서 sales 컬럼만 선택한 후,

#.sum으로 합계를 계산한다.

 

3) 월별 매출 트렌드 집계 후 개수 출력하기

import pandas as pd
import numpy as np

np.random.seed(42)

dates = pd.date_range('2024-01-01', periods=90, freq='D')
regions = ['Seoul', 'Busan', 'Daegu', 'Incheon']
products = ['Laptop', 'Phone', 'Tablet', 'Watch']

data = []
for i in range(300):
    data.append({
    'date': np.random.choice(dates),
    'region': np.random.choice(regions),
    'product': np.random.choice(products),
    'sales_amount': np.random.randint(50000, 500000),
    'quantity': np.random.randint(1, 10),
    'customer_age': np.random.randint(20, 60)
})

sales_df = pd.DataFrame(data)

# 데이터를 생성하고 그에 따른 데이터프레임 생성

sales_df['month'] = sales_df['date'].dt.month

#.dt.month로 날짜 데이터에서 월만 추출하여 month 칼럼을 만듦

salesmonth = sales_df.groupby('month')['sales_amount'].sum()
print(len(salesmonth))
 
3

#groupby 로 month 별로 묶고, 월별 sales_amount의 합계를 계산한 값을 변수 salesmonth에 저장★

#salesamount에는 1월별, 2월별, 3월별 그룹이 있으므로 총 3개

 

4) concat 세로 연결 및 출력

import pandas as pd

df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})

#두개의 데이터프레임을 만들었어요!

koshot = pd.concat([df1, df2], axis = 0)

print(koshot)
 
   A B
0 1 3
1 2 4
0 5 7
1 6 8

#df1과 df2를 concat을 이용해 연결하는데, axis = 0이니까 세로로 연결함, 1일 경우는 가로연결

 

5) merge INNER JOIN

import pandas as pd


# 매출 샘플 데이터
data1 = {
'product': ['Laptop', 'Phone', 'Speaker'],
'sales': [1000, 800, 300]
}
sales_sample = pd.DataFrame(data1)

# 제품 수량 데이터
data2 = {
'product': ['Laptop', 'Phone', 'Tablet'],
'number': [1500, 900, 600]
}
product_sample = pd.DataFrame(data2)

# sales_sample과 product_sample 두개의 데이터 프레임을 만들었삼

#INNER
innerinner = sales_sample.merge(product_sample, on = 'product', how = 'inner')

print(innerinner)
   product sales number
0 Laptop 1000 1500
1 Phone  800    900

# merge를 적용하고 inner를 통해 두 데이터 프레임의 교집합만 결과로 도출

 

6) Seaborn Boxplot 시각화

# tips 데이터셋 (샘플 6행)
tips = pd.DataFrame({
'total_bill': [16.99, 10.34, 21.01, 23.68, 24.59, 25.29],
'tip': [1.01, 1.66, 3.50, 3.31, 3.61, 4.71],
'sex': ['Female', 'Male', 'Male', 'Male', 'Female', 'Male'],
'smoker': ['No', 'No', 'No', 'No', 'No', 'No'],
'day': ['Sun', 'Sat', 'Fri', 'Thu', 'Sun', 'Sat'],
'time': ['Dinner', 'Dinner', 'Dinner', 'Dinner', 'Dinner', 'Dinner'],
'size': [2, 3, 3, 2, 4, 4]
})

#데이터프레임을 그려주고

plt.figure(figsize = (10,10))
sns.boxplot(x = "day", y = "total_bill", data = tips, palette = "pastel")
plt.show()

#boxplot!

 

2. 개인 과제 풀이

level 1-1: 데이터 전처리

import pandas as pd

# 1) CSV 파일을 읽어 DataFrame 생성 (Data는 manu)
df = pd.read_csv("manufacturing_data_400.csv")

#데이터 프레임을 쓰기 위해선 판다스 선언이 먼저!

# 2) df의 상위 5개 행을 확인하고 출력
print("2) df의 상위 5개 행을 확인하고 출력")
print(df.head(5))

# 3) df의 기본 정보(컬럼명, 데이터 타입, etc.) 출력")
print("# 3) df의 기본 정보(컬럼명, 데이터 타입, etc.) 출력")
print(df.info())

# 4) df의 기술 통계(평균, 표준편차 등) 출력
print("# 4) df의 기술 통계(평균, 표준편차 등) 출력")
print(df.describe())

#head, info, describe는 반드시 숙지할것!

# 5) df의 컬럼별 결측값 개수 출력
print(df.isnull().sum())
#데이터를 확인했으면 반드시 확인해봐야 할 것들


# 6) df의 중복 행이 몇 개인지 출력
print(df.duplicated().sum())

#데이터를 확인 해 봤으면 반드시 봐야 할 것들.

 

level 1-2: 결측치 처리

import pandas as pd
import numpy as np


# 1) Defects 열에서 9999 -> NaN으로 대체
df['Defects'] = df['Defects'].replace(9999, np.nan)

# np.nan과 pd.NA는 동일한 기능을 수행하지만, 호환성이 전자가 더 좋다.

# replace(old, new)임을 기억하기

# 2) Temperature 열 결측치를 해당 열의 평균값으로 대체
mean_temp = df['Temperature'].mean()
df['Temperature'] = df['Temperature'].fillna(mean_temp)

print(df.head())

# mean_temp 변수에 Temperature 칼럼의 평균을 입력

# fillna() 함수 안에 앞서 만든 mean_temp 변수를 입력하여 NaN값을 전부 평균으로 대체

 

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

# 라이브러리 불러오기
import pandas as pd

# CSV 파일 불러오기
df = pd.read_csv('manufacturing_data_400.csv')

# 1) Date 컬럼의 데이터 타입 확인
print(type(df['Date']))
print(df['Date'].dtype)

#데이터 타입을 출력하여 해당 열이 문자열(object)인지 먼저 확인함. 연산 가능 여부를 먼저 확인하는거임!

# 2) 문자열을 datetime 타입으로 변환
df['Date'] = pd.to_datetime(df['Date'])

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

#문자열을 날짜 데이터로 변환 시 pd.to_datetime

# 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())

#.dt 접근자를 통해 연, 월, 일 정보를 손쉽게 추가

 

level 1-4: 불량률 계산

# 라이브러리 불러오기
import pandas as pd

# CSV 파일 불러오기
df = pd.read_csv('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(5))

 

 

'빅데이터 QAQC_3기 > 빅데이터 QAQC_3기 TIL' 카테고리의 다른 글

TIL_251013  (0) 2025.10.13
TIL_251002  (0) 2025.10.02
TIL_250930  (0) 2025.09.30
TIL_250929  (0) 2025.09.29
TIL_250926  (0) 2025.09.26