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