Do it! - 데이터 분석을 위한 판다스 입문 요약 1
2025. 2. 26. 18:09ㆍDA 서적 정리
# csv 파일을 불러오는 함수, sep 인수를 설정해 tsv같은 파일을 불러올 수도 있다
df = pd.read_csv('data/gapminder.tsv', sep = '\t')
데이터 불러오기 및 확인
데이터 불러오기 및 확인
# 데이터의 타입 확인
type(df)
# 데이터의 크기 확인
df.shape
# 데이터의 변수 명 확인
df.columns
# 데이터의 변수 별 타입 확인
df.dtypes
# 데이터 프레임의 전반적인 정보 확인
df.info()
# 데이터 프레임의 주요 속성 (행이름, 열이름, 데이터 값)
df.index
df.columns
df.values
'''
df.shape 처럼 객체에 붙여서 쓰지만 괄호가 없으면 해당 객체의 '속성'이다
df.info() 처럼 객체에 붙여서 쓰고 괄호가 있으면 '메서드' 이다
type() 처럼 독립적으로 존재하고 괄호도 있으면 '함수' 이다
'''
데이터 프레임에서 데이터 추출
# 데이터 프레임에서 데이터 추출
# 6. 데이터 프레임 상단, 하단 5개의 케이스 출력
df.head(5)
df.tail(5)
# 7. 대괄호 추출법으로 특정 열 추출
country_df = df['country']
# 8. loc 메서드로 특정 행과 열 추출
df.loc[0]
df.loc[:,['year', 'pop']]
# 9. iloc 메서드로 특정 행과 열 추출
df.iloc[0]
df.iloc[3, [2,4,-1]]
df.iloc[2, list(range(4)]
# 조건부 추출 (Series인 ages에서 ages의 평균보다 큰값만 추출)
ages[ages > ages.mean()]
'''
iloc에서 -1은 뒤에서 첫번째를 뜻한다
특정 열을 추출할 때, df.country 처럼 점표기법으로도 추출 가능
df[['country']] 처럼 두개의 괄호를 사용하면 Series가 아니라 Data Frame으로 추출
loc는 이름 기준으로 추출하기 때문에 loc[2:4, :] 는 2,3,4 행을 추출
iloc는 인덱스(위치) 기준으로 추출하기 때문에 iloc[2:4, :] 는 2,3 행을 추출
'''
데이터 프레임 그룹 별 연산
# 그룹 별 연산
# 10. 그룹 별 계산
df.groupby('year')['lifeExp'].mean()
df.groupby(['year', 'continent'])[['lifeExp', 'gdpPercap']].mean()
# 11. 인덱스 초기화
group1 = df.groupby('year')['lifeExp'].mean()
flat = group1.reset_index()
# 12. 고유값 개수 세기
df['country'].nuique()
df.groupby('year')['lifeExp'].nunique()
# 13. 고유값 별 케이스 수 세기
df['country'].value_counts()
df.groupby('year')['lifeExp'].value_counts()
# 14. 기본 그래프로 그룹 별 연산 결과를 시각화
lifeExp_mean = df.groupby('year')['lifeExp'].mean()
lifeExp_mean.plot()
'''
코드가 길어진다면 역슬래시 \ 를 사용하고 줄바꿈으로 하거나
코드를 소괄호로 감싸면 된다.
matplotlib inline 은 같은 화면에 그래프를,
matplotlib tk 는 새 화면에 그래프를 그리는 설정 코드이다.
'''
자료 구조
# 자료구조
# 15. Series 만들기
s = pd.Series(data = ['Wes McKinney', 'Creater of Pandas'],
index = ['Person', 'Who'])
# 16. Data Frame 만들기
scientists_df = pd.DataFrame(
data = {
'name' : ['Rosaline Franklin', 'William gosset'],
'Occupation' : ['Chemist', 'Statistician']
},
index = ['index_1', 'index_2'],
columns = ['col_1', 'col_2']
)
# 17. 시리즈의 인덱스
s.index
s.keys()
# 18. 시리즈의 데이터 값
s.values
'''
속성은 대괄호를, 메서드는 소괄호를 쓴다 (ex: s.index[0], s.keys())
데이터, 인덱스 열이름까지 지정하는 코드는 보기 불편해보인다
들여쓰기를 사용하는 것이 가독성이 좋은 것 같다
'''
자주 쓰이는 메서드들
# 자주 쓰이는 메서드들
# s 는 시리즈 객체!
# 19. 각 사용가능한 메서드들
s.mean() # 평균 반환
s.min() # 최솟값 반환
s.max() # 최댓값 반환
s.std() # 표준편차 반환
s.corr(other) # 다른 시리즈와의 상관계수 계산
s.cov(other) # 다른 시리즈와의 공분산 계산
s.describe() # 요약 통계량 계산
s.equals(other) # 두 시리즈가 같은지 확인
s.hist() # 히스토그램 그리기
s.isin(values) # 값이 특정 리스트 내에 있는지 확인 (불리언 Series 반환)
s.mode() # 최빈값 반환
s.median() # 중앙값 계산
s.quantile(q) # 분위수(q) 계산 (예: 0.25는 1사분위수)
s.replace(old, new) # 특정 값을 다른 값으로 변경
s.sample(n) # 무작위로 n개의 샘플 추출
s.sort_values() # 값을 기준으로 정렬 (ascending=False 설정하면 내림차순 정렬)
s.to_frame() # 시리즈를 데이터프레임으로 변환
s.transpose() # 전치 (Series에서는 영향 없음)
s.unique() # 유일한 값들을 반환
스칼라, 시리즈, 데이터 프레임 연산
# 벡터, 시리즈, 데이터 프레임 연산
# 벡터와 벡터 연산 (시리즈 간 길이가 다르면 계산되지 않는 부분은 Nan 처리!)
s1 + s1
s1 * s1
# 벡터와 스칼라 연산
s1 + 100
s1 * 100
# 데이터 프레임 연산
df * 2 # 숫자는 2배, 문자는 2번 반복된다
df1.add(df2) # 모든 셀값이 숫자고, 같은 셀 위치끼리 더할때 사용
datetime 타입 데이터 다루기
# datetime 타입 데이터 다루기
'데이터를 datetime 타입으로 만들기'
# 기존 데이터가 정수일 때 (정수 19550505 라면 str() 함수로 문자로 변환 필요)
pd.to_datetime(str(df['datetime_col']), format = '%Y%m%d')
# 기존 데이터가 문자열 '1955-05-05'일 때
pd.to_datetime(df['datetime_col'), format = '%Y-%m-%d')
# 기존 데이터가 문자열 '1955.05.05'일 때
pd.to_datetime(df['datetime_col'), format = '%Y.%m.%d')
'원하는 연도,월,일,요일 등 추출하기'
df['dt_col'].dt.year # 연도 추출
df['dt_col'].dt.month # 월 추출
df['dt_col'].dt.day # 일 추출
df['dt_col'].dt.hour # 시 추출
df['dt_col'].dt.minute # 분 추출
df['dt_col'].dt.second # 초 추출
df['dt_col'].dt.weekday # 요일 숫자 (월:0 ~ 일:6)
df['dt_col'].dt.day_name() # 요일 이름 (Monday, Tuesday 등)
df['dt_col'].dt.month_name() # 월 이름 (January, February 등)
df['dt_col'].dt.quarter # 분기 추출
df['dt_col'].dt.isocalendar().week # 연중 몇 번째 주인지 (1~53)
df['dt_col'].dt.date # 날짜만 추출 (YYYY-MM-DD)
df['dt_col'].dt.time # 시간만 추출 (HH:MM:SS)
assign 메서드를 활용한 메서드 체이닝
'데이터 프레임에 한번에 여러 열 추가'
new_df = df.assign(
new_col1 = df['col1'] - df['col2'],
new_col2 = df['col3'] + df['col4'])
'메서드 체이닝을 활용'
# 메서드 체이닝을 활용해서 한 데이터 프레임에 여러 메서드를 한번에 적용 가능하다
new_df = (
df.assign(
new_col1 = df['col1'] - df['col2'],
new_col2 = df['col3'] + df['col4'])
.sort_values("new_col2", ascending=False) # new_col2 기준 정렬
.rename(columns={"new_col1": "diff_col"}) # 컬럼명 변경
)
데이터 생성하기, 읽어오기
# 데이터 생성하기, 읽어오기
# CSV 파일 생성하기, 읽어오기
df.to_csv('경로/파일이름.csv', index=False)
csv_df = pd.read_csv('경로/파일이름.csv')
# Pickle 파일 생성하기, 읽어오기
df.to_pickle('경로/파일이름.pickle')
pick_df = pd.read_pickle('경로/파일이름.pickle')
# CSV 파일 생성하기, 읽어오기
df.to_csv('경로/파일이름.csv', index=False)
csv_df = pd.read_csv('경로/파일이름.csv')
# Pickle 파일 생성하기, 읽어오기
df.to_pickle('경로/파일이름.pickle')
pick_df = pd.read_pickle('경로/파일이름.pickle')
# Excel 파일 생성하기, 읽어오기(openpyxl 설치 필요)
df.to_excel('경로/파일이름.xlsx', index=False)
excel_df = pd.read_excel('경로/파일이름.xlsx')
# Feather 파일 생성하기, 읽어오기 (pyarrow 설치 필요)
df.to_feather('경로/파일이름.feather')
feather_df = pd.read_feather('경로/파일이름.feather')
# JSON 파일 생성하기, 읽어오기
df.to_json('경로/파일이름.json', orient='records')
json_df = pd.read_json('경로/파일이름.json')
# DataFrame 변환하기 (Series → DataFrame)
df_new = df.to_frame()
# Dictionary 변환하기 (DataFrame → Dictionary)
dict_data = df.to_dict()
df.to_feather('경로/파일이름.feather')
feather_df = pd.read_feather('경로/파일이름.feather')
# JSON 파일 생성하기, 읽어오기
# (orient = records 설정을 하면 각 행을 하나의 Json로 만들기 때문에 다루기가 용이하게된다)
# (indent= 2 는 들여쓰기의 수준을 정하며 2로 설정하면 2칸 들여쓰기로 설정된다)
df.to_json('경로/파일이름.json', orient='records', indent=2)
json_df = pd.read_json('경로/파일이름.json')
# DataFrame 변환하기 (Series → DataFrame)
df_new = df.to_frame()
# Dictionary 변환하기 (DataFrame → Dictionary)
dict_data = df.to_dict()
matplotlib 데이터 시각화 기초
# matplotlib 시각화
# =================================시각화 준비===================================
# 필요 라이브러리
import matplotlib.pyplot as plt
import seaborn as sns
# 그래프에서 한글 글씨체가 깨지지 않도록 설정
plt.rc('font', family = 'Malgun Gothic')
# =========================== 그림 하나 그리기 =================================
# 박스플롯으로 그림 하나 그려보기
plt.boxplot(data = dataframe_name, x = 'x_col', y = 'y_col')
# 그래프 종류와 무관한 공통 옵션
plt.title("그래프 제목") # 그래프 제목 설정
plt.xlabel("X축 라벨") # X축 제목 설정
plt.ylabel("Y축 라벨") # Y축 제목 설정
plt.legend(["범례1", "범례2"]) # 범례 추가
plt.grid(True) # 격자 추가
plt.xticks(rotation=45) # X축 라벨 회전
plt.yticks(rotation=45) # Y축 라벨 회전
plt.show() # 그래프 표시
# ======================== 그림 한번에 여러개 그리기 ============================
# 전체그림영역 fig와 하위그림영역 ax를 한번에 생성
# 2행 2열 서브플롯 생성, 전체 그림 크기 8x6 인치
fig, ax = plt.subplots(2, 2, figsize=(8, 6))
# 1행 1열 위치의 그래프 (산점도)
ax[0, 0].scatter(data=dataframe_name, x='x_col', y='y_col')
'그림을 여러개 그릴 수 있는 서브플롯은 레이아웃 설정 메서드가 다르다'
ax[0, 0].set_title("산점도") # 그래프 제목 설정
ax[0, 0].set_xlabel("X축 라벨") # X축 라벨 설정
ax[0, 0].set_ylabel("Y축 라벨") # Y축 라벨 설정
ax[0, 0].grid(True) # 격자 추가
# 1행 2열 위치의 그래프 (박스플롯)
ax[0, 1].boxplot(dataframe_name[['x_col']]) # Boxplot은 x, y 인수 사용 불가
# 2행 1열 위치의 그래프 (선 그래프)
ax[1, 0].plot(dataframe_name['x_col'], dataframe_name['y_col'])
# 2행 2열 위치의 그래프 (히스토그램)
ax[1, 1].hist(dataframe_name['x_col'], bins=10)
# =========================== 서브플롯 레이아웃 조정 ===============================
fig.suptitle("2x2 서브플롯 예제") # 전체 그림 제목 설정
plt.tight_layout() # 서브플롯 간 간격 자동 조정
plt.show() # 그래프 출력
matplotlib 그래프 종류 및 사용법
# ======================== matplotlib 그래프 종류 및 인수 설명 ============================
# Histogram (히스토그램)
plt.hist(
x = dataframe_name['col'], # 히스토그램을 만들 데이터
bins = 10, # 구간 개수 (빈 개수, 기본값 10)
color = 'blue', # 막대 색상
alpha = 0.8, # 투명도 (0: 투명, 1: 불투명)
)
# Scatter plot (산점도)
plt.scatter(
x = dataframe_name['x_col'], # X축 값
y = dataframe_name['y_col'], # Y축 값
c = 'red', # 점의 색
s = 50, # 점의 크기
alpha = 0.7, # 투명도 (0: 투명, 1: 불투명)
)
# Boxplot (박스플롯)
plt.boxplot(x = dataframe_name[['col']])
'''
matplotlib 에는 훨씬 많은 그래프가 있지만
이 교재에서는 이상하게 3개밖에 안나온다
'''
seaborn 시각화 기초
# ========================================시각화 준비===========================
import seaborn as sns
# 컨텍스트는 글자크기, 선 굵기, 축 눈금 크기 등을 한번에 설정할 수 있다
# 컨텍스트 종류는 notebook paper, talk, poster가 있으며 기본값은 notebook 이다
sns.set_context('paper')
# -============================= 그림 하나 그리기 ============================
# 대부분 matplotlib과 비슷하며 plt.show() 를 사용하는 것처럼
# matplotlib과 같이 사용해야하는 것이 좋은 듯 하다
sns.histplot(data = dataframe_name, x = 'x_col')
plt.show()
# ============================= 그림 여러개 그리기 ==========================
# matplotlib 에서는 ax[0,0].hist() 이렇게 위치를 지정했지만
# sns를 사용할 때는 sns.histplot(....ax = ax[0,0]) 이렇게 인수로 넣어주어야한다
fig, ax = plt.subplot(2,2, figsize = (2,2) )
sns.histplot(data = dataframe_name, x = 'x_col', ax = ax[0,0])
sns.histplot(data = dataframe_name, x = 'x_col', ax = ax[0,1])
sns.boxplot(data = dataframe_name, x = 'x_col', y = 'y_col', ax = ax[1,0])
sns.boxplot(data = dataframe_name, x = 'x_col', y = 'y_col', ax = ax[1,1])
plt.show
seaborn 그래프 종류 및 사용법
# =========================== Seaborn 그래프 종류 및 기본 인수 설명 ===============================
# 히스토그램 (Histogram) - 연속형 데이터의 분포를 시각화
sns.histplot(data=dataframe_name, x='col')
# 커널 밀도 그래프
sns.kdeplot(data=dataframe_name, x='col')
# 러그플롯 (다른 그래프와 함께 사용)
sns.histplot(data = dataframe_name, = x = 'col')
sns.rugplot(data=dataframe_name, x='col')
# 분포 그래프 (일변량 그래프를 하나의 그림에 올인원)
sns.displot(data=dataframe_name, x='col')
# 카운트 플롯
sns.countplot(data=dataframe_name, x='col')
# 산점도
sns.scatterplot(data=dataframe_name, x='x_col', y='y_col')
# 회귀선 포함 산점도
sns.regplot(data=dataframe_name, x='x_col', y='y_col')
# 선형 회귀 모델 플롯
sns.lmplot(data=dataframe_name, x='x_col', y='y_col')
# 조인트 플롯
sns.jointplot(data=dataframe_name, x='x_col', y='y_col')
# 막대 플롯
sns.barplot(data=dataframe_name, x='x_col', y='y_col')
# 박스플롯
sns.boxplot(data=dataframe_name, x='x_col', y='y_col')
# 바이올린 플롯
sns.violinplot(data=dataframe_name, x='x_col', y='y_col')
# 페어플롯
sns.pairplot(data=dataframe_name)
밑의 그래프들은 위의 코드로 작성한 것이 아니며
단순히 각 그래프의 생김새를 보여주기 위해 그림만 가져온 것이다
lmplot, jointplot, displot, pairplot은 FacetGrid 객체를 반환하기 때문에
서브플롯에 사용할 수 없어 따로 그린다
seaborn 시각화 응용
# 2차원 밀도 그래프
sns.kdeplot(data= tips, x = 'total_bill', y = 'tip', fill = True)
# 육각 그래프 (데이터가 많을 때 사용)
sns.jointplot(data= tips, x = 'total_bill', y = 'tip', kind = 'hex')
# pairplot 응용
# (diag_sharey = False 는 각 영역의 그래프를 서로 다른 눈금 비율로 그린다)
pair_grid = sns.PairGrid(tips, diag_sharey = False)
# 두 변수간 관계 그래프를 따로 설정하는 법
pair_grid = pair_grid.map_upper(sns.regplot) # 대각 위의 그래프 설정
pair_grid = pair_grid.map_lower(sns.kdeplot) # 대각 아래의 그래프 설정
pair_grid = pair_grid.map_diag(sns.histplot) # 대각 위치의 그래프 설정
plt.show()
# 그래프에 색상 입히기
# hue는 시각화 할때 hue에 설정한 변수를 기준으로 색상을 달리하여 그리겠다는 것이다
sns.histplot(
data=tips,
x='total_bill',
hue='smoker',
palette='viridis',
ax=ax[0]
)
# 색상 직접 지정
custom_palette = {'Yes': '#FF5733', 'No': '#335BFF'}
# lmplot 그리기
sns.histplot(
data=tips,
x='total_bill',
hue='smoker',
palette=custom_palette,
ax=ax[1]
)
plt.tight_layout()
plt.show()
FacetGrid 로 그래프 나눠 그리기
# relplot으로 그래프 나눠 그리기
facet = sns.relplot(
data=tips,
x='total_bill',
y='tip',
hue='smoker', # smoker 별로 색 구분
style='sex', # sex 별로 스타일 구분
kind='scatter', # 산점도 사용
col='day', # day 별로 열 구분
row='time', # time 별로 행 구분
palette='viridis', # 색상 설정
height=1.7 # 각 그림 높이 설정
)
# 그림 제목 설정
facet.set_titles(
row_template='{row_name}', # 행 이름 자동 설정
col_template='{col_name}' # 열 이름 자동 설정
)
# 범례 설정
sns.move_legend(
facet,
loc='lower center', # 범례 위치를 중앙 아래로
bbox_to_anchor=(0.5, 1), # 범례 위치 중앙 정렬
ncol=2, # 범례 열 개수 설정
title=None, # 범례 제목 삭제
frameon=False # 범례 테두리 삭제
)
# 레이아웃 최적화 및 출력
facet.figure.set_in_layout(True)
plt.show()
각 그래프 함수의 인수를 모두 외울 순 없으니
이렇게 할 수만 있다는 것만 기억하고 필요할 때 다시 찾아보는 것이
좋을 것 같다
'DA 서적 정리' 카테고리의 다른 글
웹 크롤링 & 데이터 분석 with 파이썬 요약 1 (1) | 2025.03.12 |
---|---|
혼자 공부하는 데이터 분석 with 파이썬 요약 2 (0) | 2025.03.08 |
혼자 공부하는 데이터 분석 with 파이썬 요약 1 (0) | 2025.03.08 |
Do it! - 데이터 분석을 위한 판다스 입문 요약 2 (0) | 2025.02.27 |