티스토리 뷰

728x90

문제 : https://github.com/tjd229/DS/blob/main/Practice/2.ipynb

 


s_mart.csv 데이터 구조

 

 

아래와 같이 csv파일을 읽은 후, data type 및 컬럼 상태를 확인할 수 있다.

 

df = pd.read_csv('../Dataset/s_mart.csv')
print(df.dtypes)
print(df.shape)
df.head()

 

 

shape의 출력값으로 (8043, 5)가 나온다.

 


Q1

q1 = df.copy()

결측값 유무는 isna 함수나 notna 함수를 이용하면 된다.

isna와 sum 함수를 이용하여 결측값이 어느 컬럼에 있는지부터 확인해보자.

 

q1.isna().sum()

purchases 컬럼에만 1389개의 결측값이 있는 것을 확인해 볼 수 있다.

이제 notna를 사용하여 결측값이 아닌 데이터만 추출해보자.

q1 = q1.loc[q1['purchases'].notna()]

만약 다른 컬럼에도 결측값이 있다면, 다른 위 코드에서 컬럼 값만 바꾸어 추가로 호출하면 된다.

문제 조건에 따라 결측값이 제거되었다면, 남은 데이터 수는 6654개인 것을 shape로 알 수 있다.

 

결측값을 제거했으면 이제 피어슨 상관계수를 호출하면 된다.

corr함수를 사용하면 되고, alt+enter나 공식 doc를 보면 default method가 피어슨 상관계수로 되어있는 것을 알 수 있다.

 

q1.loc[:,"goods":"rental_bag"].corr()

goods와 rental_bag의 상관계수 절대값이 가장 높은 것을 알 수 있다.

 

Q1 정답 : 0.5

 


Q2

q2 = df.copy()

 

단계1~3을 읽어보면, date 컬럼에서 날짜 연산이 필요해보인다.

문자열 형태인 date 컬럼을 datetime 형태로 바꾸자

q2['date'] = pd.to_datetime(q2['date'])

 

 

#2-1 : 결측값(Null)이 포함된 모든 행을 제거하시오

 

문제 1과 같이 결측값 제거다.

이번에는 dropna 함수로 제거해보자.

q2=q2.dropna()

Q1과 같이 6654개의 데이터가 남는다.

 

#2-2 : 단계 1을 수행한 데이터에서 결제 총 금액(purchases)이 49710인 날짜 st, 결제 총 금액(purchases)이 96120인 날짜 ed를 구한다.

 

loc와 ==연산자로 쉽게 구할 수 있다.

st=q2.loc[q2['purchases']==49710,'date']
ed=q2.loc[q2['purchases']==96120,'date']

st는 22년 11월 18일, ed는 23년 2월 7일이다.

그런데, 위 방법으로 뽑은 경우 데이터 타입이 Series이다.

다음 단계에서 대소비교 연산을 쉽게 할 수 있도록, 아래와 같이 datetime형태로 값만 가져오자.

st=q2.loc[q2['purchases']==49710,'date'].values[0]
ed=q2.loc[q2['purchases']==96120,'date'].values[0]

 

#2-3 : 단계 2에서 구한 st와 ed 날짜 사이의 결제 총 금액(purchases) 평균을 구하시오(st와 ed 날도 포함한다.)

st와 ed날짜 사이는 아래와 같이 구할 수 있다.

(q2['date']>=st) & (q2['date']<=ed)

 

위 조건문을 이용하여 해당 날짜 사이의 총 구매가격 평균을 다음과 같이 구할 수 있다.

mask = (q2['date']>=st) & (q2['date']<=ed)
print(round(q2.loc[mask,'purchases'].mean(),3))

Q2 정답 : 155362.209

 


Q3

from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import f1_score

q3 = df.copy()

 

#3-1 : 결제 총 금액(purchases)의 결측 값(Null)을 결제 총 금액(purchases)의 평균값으로 대체한다.

 

mean 함수로 평균을 구하고, fillna 함수로 결측값을 원하는 값으로 채울 수 있다.

mean 함수와 같은 산술 연산은 기본적으로 결측값을 제외하고 구하므로 아래와 같이 결측값을 채우면 된다.

q3['purchases'] = q3['purchases'].fillna(q3['purchases'].mean())

 

#3-2 : 장바구니 대여 여부(rental_bag) 컬럼 값을 대여하지 않은 경우는 0, 대여한 경우는 종류에 상관없이 1로 변환한다.

1과 2인 값을 1로 바꾸어주면 된다.(2인 값만 1로 바꾸어줘도 된다.)

 

아래와 같이로 가능하다.

q3.loc[q3['rental_bag']>1,'rental_bag']=1

 

#3-3 : 날짜가 2월이 아닌 데이터를 Train Set으로, 2월인 데이터를 Test Set으로 분할한다.

 

날짜 연산은 datetime으로 변형하면 편리하다.

Q2처럼 pd.to_datetime을 사용하자.

q3['date'] = pd.to_datetime(q3['date'])

 

이제 q3['date'].dt.month로 2월인 데이터와 2월이 아닌 데이터를 쉽게 찾을 수 있다.

tr = q3.loc[q3['date'].dt.month!=2]
tet = q3.loc[q3['date'].dt.month==2]

 

Train Set은 6248개, Test Set은 1795개이다.

 

#3-4 : 상품 구매 수(goods)와 결제 총 금액(purchases) 컬럼에 대해 Train Set을 기준으로 Z-score 표준화(Standardization) 한다.

Z 표준화 클래스인 StandardScaler를 선언하고, fit과 transform을 이용하여 두 컬럼에 대해 표준화를 수행한다.

scaler = StandardScaler()
scaler.fit(X = tr.loc[:,'goods':'purchases'])
tr.loc[:,'goods':'purchases'] = scaler.transform(X = tr.loc[:,'goods':'purchases'])

 

 

#3-5 : Train Set으로 아래 조건에 따라 로지스틱 회귀분석을 학습한다.

독립 변수와 종속 변수, 기타 매개변수를 문제 조건에 따라 세팅하고 학습한다.

model = LogisticRegression(random_state=229)
model.fit(X = tr[['goods','purchases','parking']], y = tr['rental_bag'])

 

#3-6 : 단계 5에서 학습한 모델을 Test Set에 적용하여 장바구니 대여 여부(rental_bag)를 예측한다. Test Set에 주어진 종속 변수를 활용하여 F1-score로 모델을 평가하시오

 

Test Set 모델 예측 전에, Train Set에서 사용한 scaler를 이용하여 Test Set도 표준화를 수행해준다.

분류 모델이 표준화된 데이터를 기반으로 학습되었기 때문이다.scaler 또한 새로 정의하는게 아니라 Train Set으로 fitting한 인스턴스를 사용해야 한다.

tet.loc[:,'goods':'purchases'] = scaler.transform(X = tet.loc[:,'goods':'purchases'])

 

표준화 후, 분류 모델의 predict 함수로 예측값을 뽑을 수 있다.

pred = model.predict(X = tet[['goods','purchases','parking']])

 

F1 score를 아래 함수를 이용하여 계산하자.

score = f1_score(y_true = tet['rental_bag'], y_pred = pred)

Q3 정답 : 0.82

728x90

'Computer Science > Data Science' 카테고리의 다른 글

문제 6) Solution  (9) 2023.03.20
문제 5) Solution  (0) 2023.03.19
문제 4) Solution  (3) 2023.03.19
문제 3) Solution  (6) 2023.03.19
문제 1) Solution  (11) 2023.03.19
댓글
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함