메타코드 M의 '데이터분석가 입문 Python 부트캠프ㅣ마케팅 데이터 매출 분석ㅣ제품 포트폴리오 데이터 시각화' 강의에 관한 글입니다.
두 번째 챕터에서는 데이터 전처리에 대해 다룹니다. 데이터 전처리는 분석에 앞서 데이터를 정리하고 정제하는 과정으로, 데이터 분석의 성패를 좌우할 수 있습니다. 이 챕터에서는 pandas 라이브러리를 사용하여 데이터를 다루는 방법을 학습합니다.
먼저 데이터를 불러옵니다.
import pandas as pd
df = pd.read_csv('/content/drive/MyDrive/메타코드M/Iris.csv')
df.head()
불러온 데이터를 확인해 봅니다.
df.shape # 행, 열 수 표시
df.columns # 열 이름 나열
df.values # 데이터를 배열로 반환
df.index #행 인덱스 반환
데이터 프레임 파악
- Data Type
- Categorical Data(범주형 데이터): 제한된 수의 범주로 나눌 수 있는 데이터. ex) 성별, 혈액형, 학년
- Numerical Data(수치형 데이터): 수치로 표현되며 계산이 가능한 데이터
- Binary data(이진 데이터): '0'과 '1'로만 구성된 데이터. ex) 합격 여부, 물품 구매 여부
- Ratio Data(비율 데이터): 값들 사이의 비율 비교가 가능한 데이터. ex) 키, 몸무게, 가격
# Dictinary
my_dict = {
'key1': 'value1',
'key2': 'value2',
'key3': 'value3'
}
# DataFrame 으로 변경
df = pd.DataFrame(dict)
# .head(): 처음 5줄 보여줌
# .tail(): 마지막 5줄 보여줌
# .info(): 열 정보, 데이터 타입 요약
# .describe(): 숫자형 열 통계 요약
- 예시)
# Column 명 변경: rename()
df.rename(columns = {'sex':'성별','age':'나이'}, inplace = True)
# Column 추가
df['new_col'] = df['sibsp'] + df['survived']
# 데이터 프레임에서 하나의 컬럼만 선택하면 시리즈
type(df['survived'])
# 시리즈는 min, max, sum, mean 등 기본 집계 가능
# unique(): 중복 없는 값들을 나열
# nunique(): 중복 없는 값들 수 세기
df['fare'].value_counts() # 각 고윳값의 갯수 반환
# 큰 값 10개
df['fare'].nlargest(10)
Column 수정하기
- Column 삭제 : drop()
df_iris.drop(labels = 'new', axis = 1, inplace = True) # axis 1 : 행
df_iris
Indexing & Sorting
# Index : 행을 구별하는데 사용되는 고유한 식별자
df.set_index('col1', inplace = True) # index 지정
df.reset_index(inplace = True) # 기본 정수 Index
- 예시)
import seaborn as sns
df = sns.load_dataset('taxis')
df
df.set_index('color', inplace = True)
df.reset_index(inplace = True)
# sort : 특정 기준에 따라 순서대로 나열
sort_values() : 특정 Column 기준
df.sort_values('col1', ascending = False, inplace = True) # ascending : 오름차순
df.sort_index(Inplace = True): index 기준
- 예시 1)
df.sort_values('distance', ascending =False, inplace = True)
df.sort_index(inplace = True)
- 예시 2)
import pandas as pd
# 데이터 프레임 생성
data = {
'ProductID': [101,102,103,104],
'SaleData': ['2021-07-01', '2021-07-03', '2021-07-02', '2021-07-04'],
'Quantity': [3,2,5,4]
}
df = pd.DataFrame(data)
df.set_index('ProductID', inplace = True)
df.sort_values('Quantity', ascending = False)
df.reset_index(inplace = True)
- filtering 조건에 부합 (Bool 값이 True) 하는 row 만 남기는 과정
import pandas as pd
# 데이터 프레임 생성
data = {
'Name': ['철수', '영희', '흥민', '범근'],
'Age': [25,30,35,40],
'City': ['New York', 'Los Angeles', 'New York', 'Chicago']
}
df = pd.DataFrame(data)
# 조건 나이가 30보다 큼
df[df['Age']>30]
# from_n 이상, to_n 이하
df['col'].between(from_n, to_n)
# 특정 열의 값이 주어진 목록(['item1', 'item2'])에 포함되어 있는지 여부
df['col'].isin(['item1','item2'])
# 특정 열의 값이 결측치 인 경우 True, 아닌경우 False 를 반환
df['col'].isna()
- Dates & Times
import pandas as pd
df = pd.read_csv("https://raw.githubusercontent.com/mwaskom/seaborn-data/master/taxis.csv")
df.info()
# Pickup: object 를 datetime으로 변환해야 함.
df['pickup'] = pd.to_datetime(df['pickup'])
df['dropoff'] = pd.to_datetime(df['dropoff'])
# to_period : 날짜/ 시간 데이터를 주어긴 주기('M', 'W', 'Y')로 변환
# Daily(D), Weekly(W), Monthly(M), Yearly(Y)
df['pickup'].dt.to_period('W').dt.strftime('%Y-%m-%d')
df['pickup'].dt.to_period('W') # 시작 ~ 일주
df['pickup_week']= df['pickup'].dt.to_period('W').dt.strftime('%Y-%m-%d') #시작 일만
# timedelta : 두 날짜 또는 시간 사이의 차이를 나타내는데 사용
df['duration'] = (df['end']-df['start']).dt.total_seconds()
df['minute_pickup to dropoff'] = (df['dropoff']-df['pickup']).dt.total_seconds()/60 #분
df['minute_pickup to dropoff'] = (df['dropoff']-df['pickup']).dt.total_seconds()/60/60 #시간
- Grouping
- df.groupby(): 데이터를 특정 기준에 따라 그룹화 하고 이를 바탕으로 집계하는 과정
절차 1) spliting(분할) 2) applying(적용) 3) combining(결합)
df.groupby(by = 'col_group')['col_agg'].agg_func().reset_index()
- 예시)
# splitting : 데이터를 일정한 기분에 따라 여러 그룹으로 나눔
import pandas as pd
df = pd.DataFrame({
'group' : ['A', 'A', 'B', 'B', 'C', 'C'],
'value' : [10,10,30,40,60,60]
})
# Applying(적용) :
print('A:', df[df.group == 'A']['value'].sum())
print('B:', df[df.group == 'B']['value'].sum())
print('C:', df[df.group == 'C']['value'].sum())
# Combining(결합) : 결과를 하나의 데이터 구조로 결합함
df.groupby(by='group')['value'].sum().reset_index()
# reset_index(): index 로 설정된 값은 column으로 만들어줌
- groupby.agg() : 여러 집계 연산을 수행
df.groupby(by = 'group').agg(
col_name1 = ('col1', 'agg_func'),
col_name2 = ('col2', 'agg_func')
).reset_index()
#agg_func -> sum, mean, max, min, ...
df2.groupby(by = 'group').agg(
value_sum = ('value', 'sum'),
value2_nunique = ('value2', 'nunique')
).reset_index()
- Combining
pd.concat([df1, df2, df3], ignore_index= True) # concat 후 새로운 인덱스 생성
import pandas as pd
# 세 개의 예시 데이터프레임 생성
df1 = pd.DataFrame({'Name':['Alice', 'Bob'], 'Age':[25,30]})
df2 = pd.DataFrame({'Name':['Chris', 'David'], 'Age':[22,27]})
df3 = pd.DataFrame({'Name':['Eve', 'Frank'], 'Age':[28,30]})
# merge(): 두 데이터프레임을 가로방향으로 결합. 공통된 열이나 인덱스를 기준으로 데이터를 결합함
merged = pd.merge(left_df, right_df,
left_on = 'left_key', right_on ='right_key', how ='join_type')
# 'join_type' : inner, outer, left, right, cross
- NaN
df.astype() # 데이터 타입을 바꿈
df['A'] = df['A'].astype(int)
df['B'] = df['B'].astype(float)
df['C'] = df['C'].astype(bool)
na : 누락된 데이터
NaN : 부동 소수점 데이터셋에서 누락된 값
None : 객체 타입(ex. 문자열) 데이터셋에서 '값이 없음'을 나타내는 값
dropna(): 누락된 데이터를 포함하는 행을 제거
how 매개변수
how = 'any': 하나라도 None이 있는 행 제거(기본값)
how = 'all': 모든 값이 None인 행만 제거
df.dropna() # 하나라도 NaN 값이 있으면 행 삭제
df.dropna(how = 'all')
df.dropna(subset = ['A', 'B'], how = 'any') # drop 할 레이블 지정
# fillna()
df.fillna(
{
'col_1': value1,
'col_2': value2}, inplace = True
)
df.fillna(
{'A': df['A'].mean(),
'B': df['B'].sum(),
'C': df['C'].max()
}, inplace = True
)
데이터 전처리는 분석의 기초를 다지는 중요한 단계입니다. CSV 파일 데이터를 불러오고 저장하는 방법, 결측치 처리, 중복 데이터 제거, 데이터 형 변환 등의 기본적인 데이터 정제 기법을 통해 데이터의 질을 높일 수 있습니다. 또한, 필터링, 정렬, 그룹화 등의 방법을 통해 데이터 프레임을 효과적으로 다루는 기술을 익힘으로써, 보다 정확하고 유의미한 분석 결과를 도출할 수 있습니다.
후기 및 추천 : 오늘 강의에서는 데이터 전처리에 대해 공부하였습니다. 자세하게 설명해 주시기 때문에 입문자도 잘 이해할 수 있는 강의입니다!
'Data Analytics > Online Course' 카테고리의 다른 글
[메타코드 강의 후기] Python 데이터분석 | 파이썬 기초 (0) | 2024.07.02 |
---|---|
[강의 후기] 파이썬 데이터 분석 | 제품 포트폴리오 분석 (0) | 2024.06.30 |
[강의 후기] 파이썬 데이터 분석 | 데이터 시각화 (7) | 2024.06.29 |
[특강 후기] 데이터 분석가 현직자 특강 후기 (0) | 2024.06.28 |
[강의 후기] 파이썬 데이터 분석 | 파이썬 기초 (0) | 2024.06.20 |