데이터분석 기록일지

문제풀이/스파르타 - 파이썬 문제

[Python] 데이터 전처리 & 시각화 | 실습 문제(Pandas)

야하루 2024. 7. 22. 11:58
<문제에서 사용되는 csv 파일>

 

 


문제1

user_purchase_data.csv 파일에는 결측치가 포함되어 있습니다.
모든 결측치를 확인하고, 결측치가 있는 행을 제거하세요.

 

# 내풀이
df = pd.read_csv("user_purchase_data.csv")
df.isna()
df=df.dropna()

df.isna()로 확인한 결과

 

df.dropna()로 결측치를 제거한 결과

 

 

정답
import pandas as pd

# 데이터 로드
data = pd.read_csv('./user_purchase_data.csv')

# 결측치 확인
missing_data = data.isnull().sum()
print("Missing data before cleaning:")
print(missing_data)

# 결측치 제거
data_cleaned = data.dropna()

# 결과 출력
print("Missing data after cleaning:")
print(data_cleaned.isnull().sum())

나는 아까  df.isna()로 확인하니까 데이터프레임 형태로 T/F가 나와서 결측값을 확인하기 어려웠었는데,

저렇게 df.isnull().sum() 하니까 보기 편해서 좋네.

실행결과

 

 

 

 


문제2

purchase_date 컬럼의 데이터 타입을 문자열에서 datetime으로 변환하고,
total_spent 컬럼의 데이터 타입을 정수로 변환하세요.

 

# 내풀이
df.info()
df['purchase_date']=pd.to_datetime(df['purchase_date'])
df['total_spent'] = df['total_spent'].astype(int)
df.info()

datetime으로 변경할때는 astype이 아니라 to_datetime을 사용한다.

 

초기 df의 정보

 

dtype을 변경한 df

 

 

정답
# 데이터 로드
data = pd.read_csv('./user_purchase_data.csv')

# 데이터 타입 변환
data['purchase_date'] = pd.to_datetime(data['purchase_date'])
data['total_spent'] = data['total_spent'].astype(int)

# 결과 출력
print(data.dtypes)

데이터 타입만 확인할거면 df.dtypes 함수도 있다.

 

 

 

 


문제3

중복된 구매 데이터를 확인하고 제거하세요.
중복의 기준은 user_id, purchase_date, product_id가 동일한 행으로 합니다.

 

# 내풀이
df_distinct=df.drop_duplicates(['user_id','purchase_date','product_id'])

 

중복된 데이터 제거한 df

 

 

정답
# 데이터 로드
data = pd.read_csv('./user_purchase_data.csv')

# 중복 데이터 확인
duplicates = data.duplicated(subset=['user_id', 'purchase_date', 'product_id'])
print("Number of duplicates:", duplicates.sum())
print(duplicates)


# 중복 데이터 제거
data_no_duplicates = data.drop_duplicates(subset=['user_id', 'purchase_date', 'product_id'])

# 결과 출력
print("Number of duplicates after cleaning:", data_no_duplicates.duplicated(subset=['user_id', 'purchase_date', 'product_id']).sum())
data_no_duplicates

 

 

 

중복행 확인: duplicated()
 중복되는 행을 확인하는 메서드, 행의 요소가 동일한 행이 이미 존재할경우 해당 행은  True로 반환된다.

df.duplicated(subset=None, keep='first')
subset : 특정 열만을 대상으로 할 수 있다. 
keep : {first : 위부터 검사 / last : 아래부터 검사 /False: 중복되는 행들은 모두 True를 반환}

중복행 제거: drop_duplicates()
 내용이 중복되는 행을 제거하는 메서드

df.drop_duplicates(subset=None, keep='first', inplace=False, ignore_index=False)
subset : 중복값을 검사할 열 지정. 기본값은 전체 열이다.
keep : {first / last} 기본값은 first.
inplace: 원본을 변경할지의 여부.
ignore_index: 원래 index를 무시할지 여부. 



문제4

price컬럼에 이상치가 존재합니다.
IQR (Interquartile Range) 방법을 사용하여 이상치를 찾아 제거하세요.

 

# 내풀이
df['price'].describe()
IQR = df['price'].describe()['75%'] - df['price'].describe()['25%']
# IQR: 148.18249999999998
upper =df['price'].describe()['75%'] + 1.5*IQR
# upper: 452.22874999999993
lower =df['price'].describe()['25%'] - 1.5*IQR
# lower: -140.50124999999994
df_no_outlier=df[(lower< df['price'])&(df['price']<upper)]

사분위수 계산하는 함수가 떠오르지 않아서 이렇게 풀었다.

df['price'].describe()
price 컬럼의 이상치를 제거한 df

 

 

정답
# 데이터 로드
data = pd.read_csv('./user_purchase_data.csv')

# IQR 계산
Q1 = data['price'].quantile(0.25)
Q3 = data['price'].quantile(0.75)
IQR = Q3 - Q1

# 이상치 기준 설정
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

# 이상치 제거
data_no_outliers = data[(data['price'] >= lower_bound) & (data['price'] <= upper_bound)]

# 결과 출력
print("Number of rows after removing outliers:", data_no_outliers.shape[0])

사분위수를 바로 계산하는 함수는 quantile()

실행결과

데이터 프레임 결과는 위와 동일하다.

 

 


문제5

total_spent 컬럼을 Min-Max 정규화를 사용하여 0과 1 사이의 값으로 변환하세요.
정규화의 목표는 값 범위의 차이를 왜곡하지 않고 데이터 세트의 숫자 열 값을 공통된 척도로 변경하는 것

정규화는 특히 모델링 전에 데이터를 일정한 범위로 조정해야 할 때 유용하며, 모델의 학습 속도와 성능을 향상시키는 데 도움이 된다.

정규화 공식

# 내풀이 : 정규화 공식을 이용
t_max=df['total_spent'].max()
# 7426
t_min=df['total_spent'].min()
# 5
(df['total_spent']- t_min) / (t_max - t_min)

 

 

 

정답 : 데이터 전처리에 대한 모듈 사용
# sklearn.preprocessing: Scikit-learn 라이브러리의 하위 모듈로, 
# 			데이터 전처리와 관련된 다양한 기능을 제공.
# MinMaxScaler: 데이터를 0과 1 사이로 정규화하는 변환기. 
# 		 각 특성(feature)의 최소값과 최대값을 이용하여 값을 재조정.
from sklearn.preprocessing import MinMaxScaler

# 데이터 로드
data = pd.read_csv('./user_purchase_data.csv')

# Min-Max 정규화
scaler = MinMaxScaler() # MinMaxScaler 객체를 생성
data['total_spent_normalized'] = scaler.fit_transform(data[['total_spent']])
# fit_transform 메서드는 data[['total_spent']]에 대해 Min-Max 정규화를 수행

# 결과 출력
print(data[['total_spent', 'total_spent_normalized']].head())

 

값이 내 풀이와 소수점 네번째부터는 조금 다른데, 사용 방법의 차이에 따른 오차 같아서 문제는 없어보인다.

 

 

 

 

 

 

 

 

 

 

 


강의에서 안알려줬으면서 문제로 낸게 많아서 조금 억울...

모듈도 냅다 쓸거면 알려주등가..