홍동이의 성장일기

[👩‍💻TIL 3일차 ] 유데미 스타터스 취업 부트캠프 4기 본문

교육/유데미 스타터스 4기

[👩‍💻TIL 3일차 ] 유데미 스타터스 취업 부트캠프 4기

홍동2 2023. 2. 8. 17:35

 

목차

 

[32차시] 인덱스, 컬럼명으로 데이터 추출하기

[33차시] 행번호, 열번호로 데이터 추출하기

[34차시] 기본 그래프 그리기

[35차시] 열 변경하기

[36차시] 행 변경하기

[37차시] 데이터에 함수 적용하기

[38차시] 결측치 처리하기

[39차시] 자료형 변환하기

[40차시] 카테고리형 자료 다루기

[41차시] 시계열 자료 다루기

[42차시] 데이터프레임 연결하기(concat, merge)

[43차시] 행과 열의 형태 변경하기(melt, pivot)

[44차시] 피봇테이블로 데이터 집계하기(pivot_table)

[45차시] 그룹별 데이터 집계하기(groupby)

 

[서울시 코로나19 현황분석]

[46차시] 데이터 준비하기

[47차시] 데이터 확인 및 전처리

 


[32차시] 인덱스, 컬럼명으로 데이터 추출하기

인덱스

숫자나 문자로 이루어진다

인덱스를 별도로 지정하지 않으면 0부터 1씩 증가하는 정수로 자동 지정된다

 

 

인덱스로 행 추출하기

→ 시리즈 형태로 추출 / 하나의 인덱스만 사용 가능

df.loc['i3']

 

→ 데이터프레임 형태로 추출 / 한 개 이상의 인덱스 사용 가능

df.loc[['i1','i3','i5']]

# 인덱스가 i3인 행을 데이터프레임 형태로 추출하기
df.loc[['i3']]

 

인덱스로 행, 열 추출하기

→ 한 개의 데이터

# 인덱스 i1의 kor점수
df.loc['i1','kor'] # 90.0

➡️ type: float64

 

 한 개의 행, 여러 컬럼

# 인덱스 i1 name, kor
df.loc['i1',['name','kor']]

➡️ type: Series

 

 여러 행, 한 개의 컬럼

# 인덱스 i1,i3,i5의 name
df.loc[['i1','i3','i5'],'name']

➡️ type: Series

 

 여러 행, 여러 컬럼

# 인덱스 i1,i3,i5의 name, kor
df.loc[['i1','i3','i5'],['name', 'kor']]

 

모든 행, 특정 열 추출하기

→ 한 개의 열

# 모든 행에서 'name' 가져오기
df.loc[:,'name']

# 모든 행에서 'name' 가져오기(데이터프레임)
df.loc[:,['name']]

 

→ 여러 열

# 모든 행에서 'name','math' 가져오기
df.loc[:,['name','math']]

[33차시] 행번호, 열번호로 데이터 추출하기

행번호로 행 추출하기

➡️ 시리즈 형태로 추출

df.iloc[0]

# 첫번째 행 추출하기(데이터프레임)
df.iloc[[0]]

df.iloc[[1,3,5]]

# 1~3행 추출하기
df.iloc[1:4]

# 1,3,5행 슬라이스
df.iloc[1:6:2]

# 1행 추출하기
df.iloc[1:2]

# 짝수 행번호의 데이터 추출하기
df.iloc[::2]

# 홀수 행번호의 데이터 추출하기
df.iloc[1::2]

➡️ 데이터프레임 형태로 추출

 

※ 음수를 사용하면 행번호를 뒤에서부터 센다.

# 마지막행 추출하기
df.iloc[-1]

# 마지막 2개 행 추출하기(리스트)
df.iloc[[-2,-1]]

# 마지막 2개 행 추출하기(슬라이스)
df.iloc[-2:]

 

행번호, 열번호로 행,열 추출하기

→ 한 개의 데이터

df.iloc[0,0]

 

→ 한 개의 행, 여러 열

df.iloc[0,[1,2]]

 

→ 여러 행, 한 개의 열

df.iloc[[1,3,4],1]

 

df.iloc[[1,3,4],[0,2]]

# 0,1번째 행 0,1번째 열 슬라이싱
df.iloc[:2, :2]

# 1,3,5번째 행 0,2번째 열 슬라이싱
df.iloc[1:6:2, :3:2]

# 마지막행 1,3열 슬라이싱
df.iloc[-1,1:4:2]

# 모든행, 1열 
df.iloc[:,1]

# 모든행, 1,2열 
df.iloc[:,[1,2]]

→ 여러 행, 여러 열


[34차시] 기본 그래프 그리기

matplotlib.pyplot

import matplotlib.pyplot as plt

  • matplotlib 패키지의 pyplot 모듈 사용
  • 관용적으로 plt라는 별칭 사용

 

  1. 데이터 준비하기
    x축, y축에 들어갈 데이터를 준비한다.

  2. 모듈의 메소드를 이용하여 그래프 그리기
    여러 그래프를 겹쳐서 그릴 수 있다.

    - 선그래프: plt.plot(x, y)
    - 막대그래프: plt.bar(x, y)
    - 가로 막대그래프: plt.barh(x, y)
    - 산점도: plt.scatter(x, y, label='라벨')

    plt.legend(): 범례표시
    plt.show()

    [옵션]
    plt.title('제목', size=)
    plt.xlabel('x축이름')
    plt.ylabel('y축이름')
# 세가지 그래프를 한번에 그리고 옵션 추가하기
plt.scatter(x,y,label='scatter')
plt.bar(x,y,label='bar')
plt.plot(x,y,label='plot')

plt.title('Test Graph', size=15)
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

# kor을 막대그래프로 비교하기
df = pd.read_csv('data/scores.csv')
df.head()

x = df['name']
y = df['kor']

plt.bar(x,y)
plt.xticks(rotation=90)
plt.title('Scores', size=20)
plt.xlabel('name')
plt.ylabel('kor_score')
plt.show()


[35차시] 열 변경하기

열 추가/수정하기

컬럼이 존재하면 수정, 존재하지 않으면 추가된다.

# 학생 번호 추가하기 (1부터 시작하여 1씩 증가)
df['no'] = range(1,len(df)+1)

# 학생 번호 수정하기 (100부터 시작하여 1씩 증가)
df['no']  = df['no']+99

 

열 삭제하기

inplace = True: 삭제된 결과 데이터프레임에 적용

# no, sum 컬럼 삭제하기
df.drop(columns=['no','sum'], inplace=True)
#df = df.drop(columns=['no','sum'])

 

전체 컬럼명 변경하기

컬럼리스트의 항목수는 컬럼 개수와 동일해야 한다.

# name, kor, eng, math를 한글로 컬럼명 변경
df.columns=['이름','국어','영어','수학']

 

 

특정 컬럼명 변경하기

# 이름-->성명
df = df.rename(columns={'이름':'성명'})

[36차시] 행 변경하기

행 추가하기

  • ignore_index = True: 기존 인덱스는 무시하고 새로운 인덱스가 생성된다.
  • 데이터프레임의 끝에 행 추가
  • 추가할 데이터는 딕셔너리 형태로 전달
df = df.append({'name':'Python','kor':80,'eng':90,'math':100},  ignore_index=True)

 

 

인덱스 지정하여 행 추가/수정

  • 인덱스가 존재하면 해당 인덱스의 데이터 수정
  • 인덱스가 존재하지 않으면 데이터프레임의 에 행 추가
# 인덱스 35에 추가
df.loc[35] = ['aaa',70,80,90]

 

 

행 삭제하기

# 30,34,35 삭제
df.drop(index=[30,34,35], inplace=True)

 

 

전체 컬럼명, 인덱스명 변경하기

df.index = range(100,3100,100)

 

 

특정 컬럼명, 인덱스명 변경하기

# 100-->'a', 200-->'b'
df.rename(index={100:'a',200:'b'}, inplace=True)

[37차시] 데이터에 함수 적용하기

함수로 컬럼의 데이터 변경하기

[함수 정의]

def 함수명(매개변수)
	함수내용
    return 결과값

[함수 적용]

  • 컬럼.apply(함수명)
  • 컬럼.apply(함수명, 매개변수명=매개변수값)
    매개변수명을 명시해주어야 한다.
  • 적용할 함수가 미리 정의되어 있어야 한다.
#df['math']의 모든점수에 5점 더하기. 100점이 넘을 수 없다.
def plus5(x):
    score = x+5
    if score>=100:
        score=100
    return score

df_copy['math'] = df['math'].apply(plus5)

# 모든 점수에 n점 더하기. 100점이 넘을 수 없다.
def plusn(x,n):
    score = x+n
    if score>=100:
        score=100
    return score

# df['eng']의 모든 점수에 1점 더하기. 100점이 넘을 수 없다.
df_copy['eng'] = df['eng'].apply(plusn, n=1)

 

 

함수로 행/열의 데이터 집계하기

 

→ 열 단위⬇️로 함수를 적용하여 데이터를 집계한다.

# 과목 별 점수 합계
df_copy.loc['sum'] = df.apply(get_sum, axis=0)

 

→ 행 단위➡️로 함수를 적용하여 데이터를 집계한다.

# 행단위 데이터 출력
def print_me(x):
    print(x)

df.apply(print_me, axis=1)


# 합계 구하기
def get_sum(x):
    return x.sum()
    
# 학생 별 점수 합계
df_copy['sum'] = df.apply(get_sum, axis=1)

[38차시] 결측치 처리하기

결측치란

데이터 자체가 없다는 것을 의미한다.

 

 

결측치 확인하기

  • df.isnull(): 결측치면 True, 결측치가 아니면 False 반환
  • True는 1로 계산되어 sum하면 결측치의 개수를 확인할 수 있다.

 

 

결측치 삭제하기

데이터프레임.dropna()

: 결측치가 존재하는 모든 행 삭제

 

데이터프레임.dropna(axis=1)

: 결측치가 존재하는 모든 열 삭제

 

 

결측치 대치하기

데이터프레임의 모든 결측치를 지정한 값으로 대치

  • 이전값으로 채우기 : 데이터프레임.fillna(method='ffill')
  • 다음값으로 채우기 : 데이터프레임.fillna(method='bfill')
  • 컬럼별로 값을 지정하여 치우기 : 데이터프레임.fillna({'컬럼명1':값1, '컬럼명2':값2,...})
# 0으로 채우기
df.fillna(0)

# 평균값으로 채우기(컬럼별 평균값으로 채워진다.)
df.fillna(df.mean())

# 이전값으로 채우기
df.fillna(method='ffill')

# 다음값으로 채우기
df.fillna(method='bfill')

# 컬럼별로 대치할 값을 지정하여 채우기
df.fillna({'A':0,'B':1,'C':2,'D':3})

 

 

결측치와 통계값

결측치는 없는 데이터로 간주한다.

→ 통계값을 구할 때 데이터의 개수에 영향을 끼친다.

 


[39차시] 자료형 변환하기

판다스 자료형
데이터타입 설명
int64 정수형
float64 실수형
bool 부울형
object 문자열
category 카테고리
datetime64 날짜, 시간

 

 

판다스 자료형 확인하기
  • 데이터프레임.dtypes
  • 시리즈.dtype
  • 한 시리즈에 문자열과 숫자, 문자열과 부울 등으로 데이터타입이 혼합되어 있으면 object형(str)으로 결정된다.
  • 한 시리즈에 정수와 실수가 혼합되어 있으면 float64으로 결정된다.

 

판다스 자료형 변환하기
  • 데이터프레임.astype('자료형')
  • 시리즈.astype('자료형')
## 데이터프레임 전체 자료형 변환
# 실수형으로 변환
df = df.astype('float64')

# 정수형으로 변환 -> 바로 int로 불가
df = df.astype('float').astype('int')


## 컬럼의 자료형 변환
# col2의 자료형만 float로변환
df['col2'] = df['col2'].astype('float')
df.dtypes

※ 자료형이 혼합된 컬럼의 자료형을 변환할 때 변경할 수 없는 자료가 섞여있으면 error 발생

 

 

자료형이 혼합된 컬럼을 숫자형으로 변경

1. astype으로 변환

# 모든 값을 숫자로 변경할 수 있음
s1 = pd.Series(['1.0', '2', -3])
s1.astype('float')

# 숫자로 변경할 수 없는 데이터가 섞여있음
s2 = pd.Series(['1.0', '2', -3, 'a'])
s2.astype('float') # 에러 발생

 

2. to_numeric으로 변환

[에러처리옵션]

  • ignore: 숫자로 변경할 수 없는 값이 있으면 작업하지 않음
  • coerce: 숫자로 변경할 수 없는 값은 NaN로 설정
  • raise: 숫자로 변경할 수 없는 값이 있으면 에러 발생 (default)

 

시계열 데이터로 변경

  • astype으로 변환
    : df['컬럼명'].astype('datetime64')
  • to_datetime으로 변환
    : pd.to_datetime(df['컬럼명'])

 


[40차시] 카테고리형 자료 다루기

Category
  • 특정 값들로만 이루어지는 자료형 ex. 성별, 혈액형, 학점
  • 이런 경우 데이터를 문자형으로 관리하기보다는 카테고리 자료형을 사용하는 것이 용량&속도 면에서 더 효율적이다.

 

카테고리형으로 변환하기

df['grade'] = df['grade'].astype('category')

 

카테고리 이름 바꾸기

df['grade'].cat.categories = ['A','B','C','D']

 

누락된 카테고리 추가하기

df['grade'] = df['grade'].cat.set_categories(['A','B','C','D','F'])

[41차시] 시계열 자료 다루기

datetime 자료형으로 변환하기

# 출생, 사망 컬럼을 datetime 자료형으로 변경하기
df['출생'] = pd.to_datetime(df['출생'])

 

 

datetime 자료형에서 정보 추출하기
컬럼.dt.year 컬럼.dt.strftime('%a') 요약요일명(Sun, Mon, ...)
컬럼.dt.month 컬럼.dt.strftime('%A') 긴요일명(Sunday, Monday, ...)
컬럼.dt.day 컬럼.dt.strftime('%w') 숫자요일(0: 일, 1: 월, ...)
컬럼.dt.quarter 분기 컬럼.dt.strftime('%b') 요약 월이름(Jan, Feb, ...)
    컬럼.dt.strftime('%B') 긴 월이름(January, February, ...)
# 분기 컬럼 만들기
df['분기']=df['출생'].dt.quarter

# 출생요일 컬럼 
df['출생요일'] = df['출생'].dt.strftime('%a')

 

 

날짜 계산하기

# 생존일수 컬럼 만들기
df['생존일수'] = df['사망']-df['출생']

# 생존기간 컬럼 만들기
df['생존기간'] = df['사망'].dt.year-df['출생'].dt.year

 

datetmie 자료형을 인덱스로 사용하기

해당 연도의 데이터 추출
해당 연도-월의 데이터 추출

# 1955년 출생한 데이터 추출하기
df.loc['1955']

# 1955년 2월 출생한 데이터 추출하기
df.loc['1955-02']

[42차시] 데이터프레임 연결하기(concat, merge)

  데이터프레임 연결하기 (concat)
  • pd.concat(데이터프레임리스트)
    데이터프레임이 동일한 컬럼명 기준으로 으로 연결된다.
  • pd.concat(데이터프레임리스트, axis=1)
    데이터프레임이 동일한 인덱스 기준으로 로 연결된다.

  • join = 'inner': 공통된 컬럼만 남기기
  • ignore_index: 인덱스 재지정
df_rowconcat = pd.concat([df1,df2,df3], join='inner',ignore_index=True)

 

 

공통된 열을 기준으로 연결 (merge)
  • pd.merge(left,right,on=기준컬럼,how=연결방법)
  • 2개의 데이터프레임을 연결한다.

  • how = 'inner': 공통 데이터만으로 연결 (default)
  • how = 'outer': 모든 행 연결
  • how = 'left' / 'right': 왼쪽/오른쪽 데이터프레임 기준으로 연결

 

차이점

concat: 한번에 여러 개의 데이터프레임 연결 가능

            ※ default: outer join

merge: 한번에 두개의 데이터프레임 연결 가능

            ※ default: inner join

 


[43차시] 행과 열의 형태 변경하기(melt, pivot)

행을 열로 보내기 (melt)

모든 열 melt

  • df.melt( )
  • pd.melt(df)

  • id_vars = [열이름리스트]: 고정할 컬럼 지정하여 melt
  • value_vars = [열이름리스트]: 행으로 위치를 변경할 열 지정
    • var_name = 컬럼명: value_vars로 위치를 변경한 열 이름
    • value_name = var_name: 위치를 변경한 열의 데이터를 저장한 열 이름
# name 고정
df.melt(id_vars='name')

# kor, eng 위치 변경
df.melt(id_vars='name', value_vars=['kor','eng'])

# subject, score 컬럼명 변경
df.melt(id_vars='name', value_vars=['kor','eng'], var_name='subject', value_name='score')

 

 

열을 행으로 보내기 (pivot)
  • 데이터프레임.pivot( index=인덱스로 사용할 컬럼, columns=컬럼으로 사용할 컬럼, values=값으로 사용할 컬럼 )
# name, subject, score
df.pivot(index='name', columns='subject',values='score')

 

행, 열 바꾸기
  • 데이터프레임.transpose()

 


[44차시] 피봇테이블로 데이터 집계하기(pivot_table)

  • 피벗테이블은 표의 데이터를 요약하는 통계표이다.
  • df.pivot_table(index=인덱스, columns=컬럼, values=집계할데이터, aggfunc=통계함수)
  • aggrunc의 디폴트는 mean

[옵션]

  • fill_value = 0: 결측값을 0으로 처리
  • margins = True: 각각의 행과 열의 합계 확인 가능
# [item,color], size별 판매,재고 합계
df.pivot_table(index=['item','color'], columns='size', values=['sale','inventory'], aggfunc='sum', fill_value=0)

 


[45차시] 그룹별 데이터 집계하기(groupby)

그룹화하여 그룹별 데이터 집계하기
데이터프레임.groupby(그룹화 기준칼럼).통계적용컬럼.통계함수()
  • count() : 누락값을 제외한 데이터 수
  • size() : 누락값을 포함한 데이터 수
  • mean() : 평균
  • sum() : 합계
  • std() : 표준편차
  • min() : 최소값
  • max() : 최대값
  • sum() : 전체 합

to.frame(): Series 데이터를 Dataframe으로 바꾸기

# 객실등급(Pclass)별 승선자 수를 구한 결과를 데이터프레임 df1로 만들기
df1 = df.groupby('Pclass').Survived.count().to_frame()

# 객실등급(Pclass)별 생존자 수를 구한 결과를 데이터프레임 df2로 만들기
df2 = df.groupby('Pclass').Survived.sum().to_frame()

 

 

그룹에 사용자정의함수 적용하기
df.groupby(그룹기준컬럼).통계적용컬럼.agg(사용자정의함수,매개변수들)
def my_mean(values):
    return sum(values)/len(values)
    
df.groupby(['Sex','Pclass']).Survived.agg(my_mean)

 

 

그룹 오브젝트 출력하기
  • 데이터프레임.groupby(그룹기준컬럼).groups 그룹별 인덱스:[데이터리스트] 출력
  • 데이터프레임.groupby(그룹기준컬럼).get_group(그룹인덱스) 그룹별 인덱스에 해당하는 데이터프레임 출력

 

 


[서울시 코로나19 현황분석]

[46차시] 데이터 준비하기

그래프를 그리기 위한 설정

# 그래프를 노트북 안에 그리기 위해 설정
%matplotlib inline

# 필요한 패키지와 라이브러리 가져온다.
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# 그래프에서 마이너스 폰트 깨지는 문제에 대한 대처
mpl.rcParams['axes.unicode_minus'] = False

# 폰트 지정하기
plt.rcParams['font.family'] = 'NanumGothic'

 

  • csv파일로 데이터프레임을 만드는 경우 첫번째 행이 컬럼명이어야 한다.
  • csv파일은 ,(콤마)로 구분되기 때문에 값에 ,가 있으면 안된다.

  • csv을 UTF-8로 저장하는 방법
    - [다른 이름으로 저장] - [CSV UTF-8(쉼표로 분리)(* csv)로 저장]
    - [우클릭] - [연결 프로그램] - [메모장] - [다른 이름으로 저장] - [인코딩: UTF/UTF-8(BOM)]

[47차시] 데이터 확인 및 전처리

## 데이터 불러오기
df = pd.read_csv('data/서울시 코로나19 확진자 현황.csv', low_memory=False)

## 데이터 확인 및 전처리
# nan만 있는 컬럼 확인 및 삭제
df['이동경로'].unique()

# 불필요한 컬럼 삭제
df.drop(columns=['환자번호','국적','환자정보','조치사항','이동경로','등록일','수정일','노출여부'], inplace=True)

## 자료형 변환
# 확진일 --> datetime
df['확진일'] = pd.to_datetime(df['확진일'])
print(df['확진일'].head())

# 지역 공백 제거(by 문자열 처리 함수)
df['지역'] = df['지역'].str.strip()

# 지역&상태 --> category
df['지역'] = df['지역'].astype('category')
df['상태'] = df['상태'].astype('category')

## 결측치 분석
#여행력에만 결측값이 있음 but 어쩔수없기 때문에 남겨둠
df.isnull().sum()

 


드디어 본격적인 데이터 분석에 들어간다!

처음보거나 헷갈리는 개념이 많았지만 유용하게 사용할 수 있을 것 같다.

어제의 질문에 대해서는 명확한 해답을 듣지 못했다 ㅜㅜ

오늘 새로운 노트북에 다시 설치해봐야겠다

 

오늘의 질문

concat은 한번에 여러 개의 데이터프레임 연결이 가능하고

merge는 한번에 두 개의 데이터프레임만 연결이 가능하다고 설명해주셨는데,

두가지를 구분하여 사용하는 이유가 궁금합니다.

 

 

해답

사용 방법이 다르다!

concat은 행과 컬럼명을 기준으로 데이터프레임을 연결하고

merge는 열을 기준으로 데이터프레임을 연결하는 것!

 

 

 

내일도 화이팅!!

 


* 유데미 큐레이션 바로가기 : https://bit.ly/3HRWeVL

* STARTERS 취업 부트캠프 공식 블로그 : https://blog.naver.com/udemy-wjtb

📌 본 후기는 유데미-웅진씽크빅 취업 부트캠프 4기 데이터분석/시각화 학습 일지 리뷰로 작성되었습니다.

728x90
Comments