: 테이블에서 두 개의 column을 각각 index, column index로 사용하여 데이터를 재정렬 하는 것을 말함.
=> 복잡한 데이터를 요약하고 분석하는데 유용한 테이블
기본 Pivot Table 예제
// 실습 코드
import pandas as pd
df = pd.DataFrame({'State':['CA', 'NY', 'NY', 'CA', 'PA', 'TX', 'PA', 'TX'],
'Gender':['M', 'M', 'F', 'F', 'F', 'F', 'M', 'M'],
'Income':[21, 17, 23, 32, 25, 14, 29, 18],
'Expense':[15, 21, 28, 13, 21, 18, 25, 15]})
print(df)
print(df.pivot(index='Gender', columns='State'))
print(df.pivot(index='Gender', columns='State', values='Income'))
Column이 여러 개인 경우 Pivot Table
// 실습 코드
# column이 2개인 경우
df = pd.DataFrame({
'lev1':[1, 1, 1, 2, 2, 2],
'lev2':[1, 1, 2, 1, 1, 2],
'lev3':[1, 2, 1, 2, 1, 2],
'lev4':[1, 2, 3, 4, 5, 6],
'values':[0, 1, 2, 3, 4, 5]
})
print(df.pivot(index='lev1', columns=['lev2', 'lev3'], values='values'))
: 원자료(raw data)를 보다 쉽게 접근하고 분석할 수 있도록 데이터를 정리하고 통합하는 과정
: 데이터 분포 및 값을 검토함으로써 데이터가 표현하는 현상을 더 잘 이해하고, 데이터에 대한 잠재적인 문제를 발견하는 것
palmer penguins 데이터 불러오기
// 실습 코드
# palmer penguins 데이터 불러오기
!pip install palmerpenguins
import pandas as pd
import seaborn as sns # 통계학으로 그리는 그림
from palmerpenguins import load_penguins
sns.set_style('whitegrid')
penguins = load_penguins()
print(penguins.head())
print(penguins.describe())
print(penguins.info())
특정 컬럼 값 변형
// 실습 코드
# bill_leng_mm 칼럼의 모든 값을 10으로 나누어 새로운 칼럼 bill_length_mm/10 생성하기
penguins['bill_length_mm/10'] = penguins['bill_length_mm'].apply(lambda x : x / 10)
penguins.head()
penguins['bill_length_mm/10'] = penguins.groupby(['bill_length_mm'])
로그 변환 예제
// 실습 코드
pengunis = penguins.rename(columns = {'species' : 'pengunis_species'})
# 부리 길이의 로그 변환
import numpy as np
pengunis['log_bill_length'] = pengunis['bill_length_mm'].apply(lambda x : np.log(x) if pd.notnull(x) and x > 0 else x)
print(pengunis['log_bill_length'])
// 실습 코드
penguins['species'].nunique()
// 실습 코드
penguins.sort_values("body_mass_g", ascending=False)
// 실습 코드
pengunis = penguins.rename(columns = {'species' : 'pengunis_species'})
pengunis
: 데이터 집계 및 분석에 자주 사용되는 강력한 기능
그룹화 후 평균 계산
// 실습 코드
grouppengunis = pengunis.groupby(['pengunis_species']).mean(numeric_only=True)
grouppengunis
그룹화 후 최대값 및 최소값 계산
// 실습 코드
# 종별 최대값과 최소값 계산(bill_length_mm)
species_min_max = pengunis.groupby('pengunis_species').agg({'bill_length_mm':['min', 'max']})
print(species_min_max)
결측값 확인
// 실습 코드
penguins.isnull().sum()
# penguins.isna().sum()
결측값 채우기
// 실습 코드
# bill_length_mm의 결측치를 채워보세요.
penguins['bill_length_mm'].fillna(pengunis['bill_length_mm'].mean(), inplace=True)
결측값 제거
// 실습 코드
# 특정 열의 결측값 제거
penguins_no_na = pengunis.dropna(subset=['flipper_length_mm'])
# 전체 결측값 제거
pengunis_clean = pengunis.dropna()
특정 종 필터링
// 실습 코드
# 특정 종(Adelie)만 필터링
# query 방법
adeliepengunis = pengunis.query('pengunis_species=="Adelie"')
print(adeliepengunis)
# 데이터 필터링 방법
adeliepengunis = pengunis[pengunis['pengunis_species'] == 'Adelie']
print(adeliepengunis)
부리 길이가 40mm 이상인 데이터 필터링
// 실습 코드
# 부리 길이가 40mm 이상인 데이터 필터링
long_bills = pengunis[pengunis["bill_length_mm"] > 40]
print(long_bills)
// 실습 코드
meltedpengunis = pengunis.melt(id_vars=['pengunis_species'], value_vars=['bill_length_mm', 'bill_depth_mm'])
print(meltedpengunis)
: 두 범주형(categorial)간의 관계를 분석하는데 유용함
교차표 생성
// 실습 코드
crosstab = pd.crosstab(pengunis['pengunis_species'], pengunis['sex'])
print(crosstab)
// 실습 코드
pivot = pengunis.pivot_table(index='pengunis_species', columns='sex',
values = 'bill_length_mm', aggfunc = 'mean')
print(pivot)
| 함수 | 설명 |
|---|---|
pivot() | 데이터를 재정렬하여 요약 및 분석하는 데 유용한 테이블 생성 |
pivot_table() | 그룹화된 데이터를 요약하여 데이터 분석에 유용한 테이블 생성 |
fillna() | 결측값을 특정 값으로 대체 |
dropna() | 결측값이 있는 행 또는 열 제거 |
rename() | 데이터프레임의 열 이름 변경 |
describe() | 데이터프레임의 통계 요약 정보 제공 |
info() | 데이터프레임의 구조 및 요약 정보 출력 |
head() | 데이터프레임의 상위 n개의 행 표시 |
apply() | 데이터프레임 또는 시리즈의 각 요소에 함수를 적용 |
nunique() | 열의 고유값 수 계산 |
sort_values() | 특정 열을 기준으로 데이터프레임 정렬 |
groupby() | 데이터를 그룹화하여 계산 수행 |
agg() | 그룹화된 데이터에 대해 여러 집계 함수 적용 |
query() | 조건 기반으로 데이터프레임의 행 필터링 |
melt() | 여러 열을 하나로 녹여 데이터를 세로 형태로 변환 |
crosstab() | 범주형 데이터 간의 관계를 분석하기 위한 교차표 생성 |
// 실습 코드
import matplotlib.pyplot as plt
#%matplotlib inline
#$matplotlib qt
#%matmplotlib notebook
#jupyter notebook 안에 그려달라.
plt.plot([1, 2, 3, 4])
plt.show()
// 실습 코드
data = [10, 50, 20, 60, 70]
plt.plot(data)
plt.show()
// 실습 코드
import numpy as np
x = np.arange(10)
y = x + 10
plt.plot(x, y)
plt.show()
plt.xlim([0, 10])
plt.ylim([0, 20])
plt.plot(x, y)
plt.show()
// 실습 코드
fig, axs = plt.subplots(1, 3, figsize=(9, 3)) # 1행 3열의 axis / figsize : 가로 9cm 세로 3cm
axs[1].set_xticks([0, 2, 4, 6])
axs[1].set_yticks([0, 5, 10])
axs[2].set_xticklabels(['A', 'B', 'C', 'D', 'E'])
axs[2].set_yticks([0, 1, 2])
axs[2].set_yticklabels(['a', 'b', 'c'])
plt.show()
// 실습 코드
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-np.pi, np.pi, 201)
y1 = np.sin(x)
y2 = np.cos(x)
fig, ax = plt.subplots()
ax.plot(x, y1, label='sin')
ax.plot(x, y2, label='cos')
ax.legend(loc='lower right')
plt.show()
// 실습 코드
# !sudo apt-get install -y fonts-nanum
# !sudo fc-cache -fv
# !rm ~/.cache/matplotlib -rf
plt.rc('font', family='NanumBarunGothic') # 한글 패치
x = np.linspace(-np.pi, np.pi, 201)
y1 = np.sin(x)
y2 = np.cos(x)
fig, ax = plt.subplots()
ax.plot(x, y1, label='사인', color = (0.1, 0.3, 0.5)) # RGB
ax.plot(x, y2, label='코사인', color = 'red') # or #32a8a0 (HexColor)
ax.legend(loc='lower right')
plt.show()
// 실습 코드
plt.plot([1, 2, 3, 4], [5, 6, 7, 8], 'bo--') # 파란색 + 점선 + 마커
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
// 실습 코드
# 여러 개의 그래프
# 200ms 간격으로 균일하게 샘플된 시간
t = np.arange(0., 5., 0.2)
# r--: 빨간색 dashed / bs: blue + square / g^: green + triangle
plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')
plt.show()
// 실습 코드
# 여백 주기, 폰트 설정
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4], [2, 3, 4, 10])
plt.xlabel('X-axis', labelpad=50, fontdict={'family':'serif', 'color':'b', 'weight':'bold', 'size':14})
plt.ylabel('Y-axis', labelpad=50, fontdict={'family':'fantasy', 'color':'deeppink', 'weight':'normal', 'size':'xx-large'})
plt.show()
// 실습 코드
# 여백 주기, 폰트 설정(변수 이용)
import matplotlib.pyplot as plt
font1 = {'family':'serif',
'color':'b',
'weight':'bold',
'size':14}
font2 = {'family':'fantasy',
'color':'deeppink',
'weight':'normal',
'size':'xx-large'}
plt.plot([1, 2, 3, 4], [2, 3, 4, 10])
plt.xlabel('X-axis', labelpad=50, fontdict=font1)
plt.ylabel('Y-axis', labelpad=50, fontdict=font2)
plt.show()
// 실습 코드
# Line plot
x = np.arange(-5, 5, 0.5)
y1 = x
y2 = x**2
y3 = np.sin(x)
y4 = np.cos(x)
plt.plot(x, y1)
plt.plot(x, y2, marker = 'D')
plt.plot(x, y3, color = 'r')
plt.plot(x, y4, linestyle='dashed')
plt.show()
// 실습 코드
import matplotlib.pyplot as plt
# bar plot
data = {'사과':21, '바나나':15, '배':5, '키위':20}
names = list(data.keys())
values = list(data.values())
colors = ['y', 'dodgerblue', 'C2', 'r']
fig, ax = plt.subplots()
ax.bar(names, values, align='edge', edgecolor='lightgrey', linewidth=5, color = colors, width=0.4)
plt.show()
fig, ax = plt.subplots()
ax.barh(names, values, align='edge', edgecolor='lightgrey', linewidth=5, color = colors)
plt.show()
// 실습 코드
# histogram
import numpy as np
import matplotlib.pyplot as plt
data = np.random.rand(10000)
fig, ax = plt.subplots()
ax.hist(data, bins=100, facecolor='r') # bin : 몇 개 생성할 지
plt.show()
// 실습 코드
# scatter plot
np.random.seed(42)
n = 50
x = np.random.rand(n)
y = np.random.rand(n)
plt.scatter(x, y)
plt.show()
// 실습 코드
x = np.random.rand(50)
y = np.random.rand(50)
colors = np.random.rand(50)
size = 1000 * np.random.rand(50)
plt.scatter(
x,
y,
c = colors, # 마커 색상을 설정(colors 배열로 전달)
s = size, # 마커 크기를 설정(size 배열로 전달)
alpha = 0.3, # 마커 투명도(0.0은 완전히 투명, 1.0은 불투명)
cmap = 'viridis', # 컬러맵 설정(viridis는 기본적인 컬러맵)
edgecolors = 'red', # 마커 테두리 색상 설정(빨간색)
linewidths = 2 # 마커 테두리의 두께 설정(2픽셀)
)
plt.show()
// 실습 코드
# pie chart
ratio = [34, 32, 16, 18]
labels = ['Apple', 'Banana', 'Melon', 'Grapes']
# autopct : 부채꼴 안에 표시될 숫자의 형식을 나타냄. 소수점 한자리까지 표시.
# startangle : 시작점 / counterclock : 시계방향으로 할 것인지 선택
plt.pie(ratio, labels=labels, autopct='%.1f%%', startangle=260, counterclock=True)
plt.show()
# explode : 구간 사이에 공간을 띄워줌
explode = [0, 0.10, 0, 0.10]
plt.pie(ratio, labels=labels, autopct='%.1f%%', startangle=260, counterclock=True, explode=explode)
plt.show()
// 실습 코드
np.random.seed(42) # 재현성을 위해 시드 고정
data = [np.random.normal(50, 10, 200), # 평균 : 50, 표준편차 : 10인 200개인 데이터
np.random.normal(60, 12, 200), # 평균 : 60, 표준편차 : 12인 200개인 데이터
np.random.normal(70, 20, 200)] # 평균 : 70, 표준편차 : 20인 200개인 데이터
# Boxplot 그리기
plt.boxplot(data,
notch=True, # 중위수에 대한 노치 표시
patch_artist=True, # 상자 책상 채우기 활성화
boxprops=dict(facecolor='lightblue', color='blue'), # 상자 속성 설정
medianprops=dict(color='red', linewidth=2), # 중앙값 속성 설정
whiskerprops=dict(color='blue', linewidth=1.5), # 수염(whisker) 속성
capprops=dict(color='blue', linewidth=1.5)) # 끝부분 캡 속성
plt.xticks([1, 2, 3], ['Dataset1', 'Dataset2', 'Dataset3']) # x축 레이블
plt.ylabel('Values')
plt.title('boxplot example')
plt.show()
// 실습 코드
# 데이터 생성
x = np.linspace(0, 10, 10)
y = x**2
errors = np.random.rand(10) + 5
plt.errorbar(x, y, yerr = errors, fmt='o')
plt.title('Error bar')
plt.show()
// 실습 코드
from scipy.stats import norm
np.random.seed(42)
data = np.random.normal(loc=50, scale=10, size=100)
# 평균과 표준편차 계산
mean = np.mean(data)
std = np.std(data, ddof=1) # 샘플 표준편차
# 신뢰구간 계산(95% 신뢰수준)
confidence_level = 0.95
z = norm.pdf((1 + confidence_level) / 2)
n = len(data)
margin_of_error = z * (std / np.sqrt(n)) # 신뢰구간의 반폭(Margin of Error)
lower_bound = mean - margin_of_error
upper_bound = mean + margin_of_error
# 결과 출력
print(f'Mean : {mean:.2f}')
print(f'Standard Deviation : {std:.2f}')
print(f'95% Confidence Interval : ({lower_bound:.2f}, {upper_bound:.2f})')
# 에러바 플롯
x = [1]
y = [mean]
yerr = [margin_of_error] # 에러바는 신뢰구간의 반폭
plt.errorbar(x, y, yerr = yerr, fmt='o', capsize=5, label="95% Confidence Interval")
plt.title("Error Bar Representing Confidence Interval")
plt.xticks([])
plt.ylabel("Value")
plt.legend()
plt.show()
// 실습 코드
# Seaborn : matplotlib 기반으로 다양한 색 테마, 차트 기등을 추가한 라이브러리(주로 통계용 그래프)
import seaborn as sns
print(sns.__version__)
# Relation Plot
tips = sns.load_dataset("tips")
sns.relplot(x="total_bill", y="tip", hue="smoker", style="smoker", data=tips)
plt.show()
// 실습 코드
# Categorical Plot
sns.catplot(x="day", y="total_bill", hue="smoker", col="time", aspect=0.6, kind="swarm", data=tips)
plt.show()
titanic = sns.load_dataset('titanic')
g = sns.catplot(x='fare', y='survived', row='class', kind='box', orient='h', height=1.5, aspect=4,
data = titanic.query("fare > 0"))
g.set(xscale="log")
plt.show()
catplot을 사용한 막대 그래프
// 실습 코드
tips = sns.load_dataset("tips")
sns.catplot(
x='day', # x축: 요일
y='total_bill', # y축: 총 계산 금액
hue='sex', # 색상을 성별로 구분
data = tips, # 데이터셋 설정
kind = 'bar', # 그래프 유형: 막대그래프
palette='viridis', # 색상 팔레트: viridis
height=6, # 그래프 높이 설정(단위: 인치)
aspect=1.5 # 그래프 가로-세로 비율 설정(1.5는 더 넓게)
)
plt.show()
# 막대 가운대 그려진 검은색 선은 신뢰구간을 나타냄
barplot을 사용한 막대 그래프와 신뢰구간 표시
// 실습 코드
tips = sns.load_dataset("tips")
sns.barplot(
x='day',
y='total_bill',
hue='smoker',
data = tips,
palette='Set2',
capsize=0.2,
errorbar=("ci", 99) # ci(confidence interval) 적용
)
plt.show()
| 라이브러리 | 함수 | 설명 |
|---|---|---|
| Matplotlib | plt.plot(x, y) | x, y 데이터를 이용한 선 그래프 그리기 |
plt.plot(data) | 리스트 데이터를 이용한 선 그래프 그리기 | |
np.arange(start, stop, step) | 주어진 범위에서 일정 간격으로 값 생성 | |
plt.xlim([min, max]), plt.ylim([min, max]) | x, y축의 범위를 설정 | |
plt.xlabel('label') | x축 레이블 추가 | |
plt.ylabel('label') | y축 레이블 추가 | |
plt.title('title') | 그래프에 제목 추가 | |
plt.show() | 그래프 출력 | |
fig, axs = plt.subplots(nrows, ncols) | 서브플롯을 만들고, fig, axs 객체 반환 | |
axs[n].set_xticks([values]) | 특정 서브플롯의 x축 값 설정 | |
axs[n].set_yticks([values]) | 특정 서브플롯의 y축 값 설정 | |
axs[n].set_xticklabels(['labels']) | 특정 서브플롯의 x축 레이블 설정 | |
axs[n].set_yticklabels(['labels']) | 특정 서브플롯의 y축 레이블 설정 | |
plt.rc('font', family='Font Name') | 그래프 폰트 설정 | |
plt.plot(x, y, 'color', marker='marker', linestyle='style') | 그래프 스타일 설정 (색, 마커, 선 스타일) | |
plt.scatter(x, y) | 산점도 그래프 그리기 | |
plt.bar(x, height) | 막대 그래프 그리기 | |
plt.barh(y, width) | 수평 막대 그래프 그리기 | |
plt.hist(data, bins) | 히스토그램 그리기 | |
plt.pie(ratio, labels, autopct='%.1f%%') | 원형 차트 그리기 (비율, 레이블, 퍼센트 표기) | |
plt.boxplot(data) | 박스플롯 그리기 | |
plt.errorbar(x, y, yerr=errors, fmt='o') | 에러바 플롯 (y값에 에러값 추가) | |
plt.xticks([values]) | x축 값 설정 | |
plt.yticks([values]) | y축 값 설정 | |
| Seaborn | sns.relplot(x='x', y='y', hue='hue', style='style', data=df) | 관계형 그래프 |
sns.catplot(x='x', y='y', hue='hue', kind='kind', data=df) | 범주형 데이터 시각화 | |
sns.barplot(x='x', y='y', hue='hue', data=df) | 범주형 막대 그래프 | |
sns.boxplot(x='x', y='y', data=df) | 범주형 박스 플롯 | |
sns.set_style('style') | seaborn 스타일 설정 | |
sns.set_palette('palette') | seaborn 색상 팔레트 설정 | |
sns.set_context('context') | seaborn 컨텍스트 설정 | |
sns.load_dataset('dataset') | seaborn 내장 데이터셋 불러오기 | |
sns.pairplot(df) | 변수 쌍 간의 관계 시각화 | |
sns.heatmap(data) | 히트맵 그래프 | |
sns.jointplot(x='x', y='y', data=df) | 두 변수 간 관계 시각화 | |
sns.violinplot(x='x', y='y', data=df) | 바이올린 플롯 | |
| 기타 | plt.figure(figsize=(width, height)) | 그래프의 크기 설정 (인치 단위) |