๐ŸŒธํŒŒ์ด์ฌ ์‹œ๊ฐํ™” ์ด์ •๋ฆฌ๐ŸŒธ

Leehyunยท2025๋…„ 3์›” 31์ผ
0

๋‚ด์ผ๋ฐฐ์›€์บ ํ”„

๋ชฉ๋ก ๋ณด๊ธฐ
11/14
post-thumbnail

1์ฃผ์ฐจ & 2์ฃผ์ฐจ

01. Python ์—์„œ์˜ Library๋ž€?

  • Library ํ˜ธ์ถœํ•˜๊ธฐ

import pandas as pd ์˜ ํ•ด์„
= pandas ๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(๋ชจ๋“ˆ)๋ฅผ ํ˜ธ์ถœ(import) ํ•˜๊ณ  ๊ทธ ์ด๋ฆ„์„ pd ๋กœ ์ค„์—ฌ์„œ ๋ช…๋ช…ํ•˜๊ฒ ๋‹ค
์ฆ‰, pandas ๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด ๋ชจ๋“  ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ๋จ.
ํ•˜์ง€๋งŒ ๊ฐ€๋”์”ฉ ์šฐ๋ฆฌ๋Š” from ์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ตฌ๋ฌธ์„ ๋งˆ์ฃผํ•˜๊ฒŒ ๋˜๋Š”๋ฐ,
์ด๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ํŠน์ • ํ•จ์ˆ˜๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ๋จ
from matplotlib.pyplot as plt
= matplotlib ์˜ pyplot ํ•จ์ˆ˜๋งŒ ๊ฐ€์ ธ์˜ค๊ณ  ์ด๋ฆ„์„ plt ๋กœ ์ค„์—ฌ์„œ ๋ช…๋ช…ํ•˜๊ฒ ๋‹ค

import pandas as pd (pandas ๋Š” 6 ๊ธ€์ž๋ผ์„œ pd ๋กœ ์ค„์—ฌ ๋ช…๋ น)
import numpy as np
import time
from matplotlib.pyplot as plt

02. Pandas ๋ž€?

  • ์‚ฌ์šฉ ๋ชฉ์ 
    ์„œ๋กœ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฅผย ์‹œ๋ฆฌ์ฆˆ์™€ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์ด๋ผ๋Š” ๊ณตํ†ต์˜ ํฌ๋งท์œผ๋กœ ์ •๋ฆฌํ•˜์—ฌ ์‰ฝ๊ณ  ๋น ๋ฅธ ์—ฐ์‚ฐ ๋ฐ ๋ถ„์„์„ ์œ„ํ•œ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•จ!
    ์ฆ‰, json, html, csv, hdf5, sql ๋ชจ๋‘ DataFrame์œผ๋กœ ํ†ต์ผํ•ด์„œ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Œ. ๐Ÿ™‚

  • ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„
    ํ†ต๊ณ„์™€ ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š”(์Šคํ”„๋ ˆ๋“œ์‹œํŠธ์™€ ๊ฐ™์€) ํ…Œ์ด๋ธ” ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
    -> ๊ธฐ๋ณธ์ ์œผ๋กœ ํ–‰๊ณผ ์—ด๋กœ ๊ตฌ์„ฑ๋œ ์ด์ฐจ์›์˜ ํ–‰๋ ฌ์„ ๋œปํ•จ
    ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์ด๋ž€, ํŒŒ์ด์ฌ ๋ฐ R ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ ํฌ๋งท์ž„.

๐Ÿซต๐Ÿป ๋†“์น˜๋ฉด ์•ˆ ๋  ๋ถ€๋ถ„! Series ์˜ ๊ฐœ๋…

-> Pandas Series๋Š” ํ…Œ์ด๋ธ”์˜ ์—ด๊ณผ ๊ฐ™์œผ๋ฉฐ, ๋ชจ๋“  ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์œ ํ•˜๋Š” 1์ฐจ์› ๋ฐฐ์—ด

03. Data EDA ํ•˜๋Ÿฌ ์ถœ๋ฐœ!

  • ์‹คํ–‰ ์‹œ๊ฐ„ ํ™•์ธํ•˜๊ธฐ(Magic command)
    -> ์ฃผํ”ผํ„ฐ ๋…ธํŠธ๋ถ ๊ธฐ๋Šฅ์œผ๋กœ, ์…€ ๊ฐ€์žฅ ์œ„์ชฝ์— ์ž‘์„ฑํ•ด์•ผ ํ•จ!!!

๐Ÿ€

  • CPU time: CPU ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„
  • Wall clock time ์€ ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„
  • %time ๋’ค์— ๋‚˜์˜ค๋Š” ํ•œ์ค„ ์ปค๋งจ๋“œ ์†Œ์š”์‹œ๊ฐ„
  • %timeit ๋’ค์— ๋‚˜์˜ค๋Š” ํ•œ์ค„ ์ปค๋งจ๋“œ ๋ฐ˜๋ณต์ˆ˜ํ–‰ํ›„ (iteration) ํ‰๊ท  ์†Œ์š”์‹œ๊ฐ„
  • %%time ๋’ค์— ๋‚˜์˜ค๋Š” ์…€ ์ „์ฒด ์ˆ˜ํ–‰ ํ›„ ์†Œ์š”์‹œ๊ฐ„
  • %%timeit ๋’ค์— ๋‚˜์˜ค๋Š” ์…€ ์ „์ฒด ์ˆ˜ํ–‰ ํ›„ ํ‰๊ท  ์†Œ์š”์‹œ๊ฐ„
%%time 
sum=0
for x in range(10000000) :
    sum=sum+x

print("1๋ถ€ํ„ฐ 1000๋งŒ๊นŒ์ง€ ํ•ฉ :",sum)
  • ์ฃผ์š” ์ฝ”๋“œ ํ•ต์‹ฌ ์š”์•ฝ
# pandas ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•œ csv ํŒŒ์ผ ์ฝ๊ธฐ 
df = pd.read_csv("xxxx.csv")

# ํ…Œ์ด๋ธ” ํ™•์ธํ•˜๊ธฐ 
display(df, df2, df3)

# ์ฒ˜์Œ 5 ์ค„๋งŒ ์ถœ๋ ฅํ•˜๊ธฐ 
#df2.head()

# ๋งˆ์ง€๋ง‰ 5 ์ค„๋งŒ ์ถœ๋ ฅํ•˜๊ธฐ 
#df2.tail()

# ๊ฐ ํ…Œ์ด๋ธ”์˜ ํ–‰(๊ฐ€๋กœ) ๊ธธ์ด ํŒŒ์•…ํ•˜๊ธฐ
len(df)

# shape: ํ…Œ์ด๋ธ”์˜ ํ–‰๊ณผ ์—ด์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ 
df.shape

# dtypes: ํ…Œ์ด๋ธ” ๋‚ด ์ปฌ๋Ÿผํƒ€์ž…(๋ฌธ์žํ˜•, ์ˆซ์žํ˜•, ๋ฐฐ์—ด ๋“ฑ) ํ™•์ธ
df.dtypes

# columns: ํ…Œ์ด๋ธ” ๋‚ด ์ปฌ๋Ÿผ ํ™•์ธ
df.columns

# values: ํ…Œ์ด๋ธ” ๋‚ด ๊ฐ ํ–‰๋“ค์„ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ํ™•์ธ
df.values

# ํ…Œ์ด๋ธ” ๊ธฐ๋ณธ ๊ตฌ์กฐ ํ•œ๋ˆˆ์— ํ™•์ธํ•˜๊ธฐ
df.info()

# ์ „์ฒด ํ–‰ ๊ฐฏ์ˆ˜, ํ‰๊ท , ํ‘œ์ค€ํŽธ์ฐจ, ์ตœ์†Ÿ๊ฐ’, ์‚ฌ๋ถ„์œ„์ˆ˜, ์ตœ๋Œ“๊ฐ’ ํ™•์ธ 
df2.describe()

#์ปฌ๋Ÿผ๋ณ„๋กœ ๊ฒฐ์ธก์น˜(๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š”) ํ™•์ธํ•˜๊ธฐ 
df.isnull().sum()

# ํŠน์ • ์ปฌ๋Ÿผ 1๊ฐœ ๊ฐ€์ ธ์˜ค๊ธฐ
	#๋ฐฉ๋ฒ•1: ์†์„ฑ. ์‚ฌ์šฉ
	df.Category
	
	#๋ฐฉ๋ฒ•2: [] ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ
	df['Category']
	
	#๋ฐฉ๋ฒ•3: iloc ์‚ฌ์šฉ
	# : ์€ ๋ชจ๋“  ํ–‰์„ ๊ฐ€์ ธ์˜ค๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฉฐ dataframe ์˜ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ 4๋ฒˆ(์นดํ…Œ๊ณ ๋ฆฌ)์ปฌ๋Ÿผ์„ ๊ฐ€์ ธ์˜ค๊ฒ ๋‹ค๋Š” ํฌ๋ฏธ
	df.iloc[:,4]

# ํŠน์ • ์ปฌ๋Ÿผ ์—ฌ๋Ÿฌ๊ฐœ ๊ฐ€์ ธ์˜ค๊ธฐ 
	#๋ฐฉ๋ฒ•1: [[]] ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ
	# []๋ฅผ ํ•˜๋‚˜ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฐ๊ณผ๊ฐ’์ด series ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜๋˜์–ด key error ๊ฐ€๋ฐœ์ƒ๋˜๋ฉฐ, [[]] ๋Š” dataframe ์œผ๋กœ ๋ฐ˜ํ™˜๋˜์–ด ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 
	df[['Category','Selling Price']]
	
	#๋ฐฉ๋ฒ•2: iloc ์‚ฌ์šฉ
	# : ์€ ๋ชจ๋“  ํ–‰์„ ๊ฐ€์ ธ์˜ค๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฉฐ dataframe ์˜ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ 4๋ฒˆ,7๋ฒˆ ์ปฌ๋Ÿผ์„ ๊ฐ€์ ธ์˜ค๊ฒ ๋‹ค๋Š” ํฌ๋ฏธ
	df.iloc[:,[4,7]]
	
# ํŠน์ • ์ปฌ๋Ÿผ ๋ฒ„๋ฆฌ๊ธฐ
# axis=0 ์€ ์ธ๋ฑ์Šค ๊ธฐ์ค€, 1์€ ์ปฌ๋Ÿผ ๊ธฐ์ค€ ์‚ญ์ œ๋ฅผ ์˜๋ฏธ 
# inplace=True ๋Š” ์›๋ณธ์„ ๋ณ€๊ฒฝํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ, False ์˜ ๊ฒฝ์šฐ ์›๋ณธํ…Œ์ด๋ธ”์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ
df3.drop('Interaction type', axis=1, inplace=True)

# ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ1
# ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜๋Š” ํ–‰์€ ์ •์ƒ์ถœ๋ ฅ ,์•„๋‹Œ ํ–‰์€ NaN ์œผ๋กœ ๋ฐ˜ํ™˜ 
df2.where(df2['Age']>50)

# ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ2
# true, false์˜ ๊ฐœ๋…์ด ์•„๋‹Œ ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์Šฌ๋ผ์ด์‹ฑํ•˜์—ฌ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์„ ๋•Œ 
# mask ๋ฉ”์„œ๋“œ๋กœ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค. ์ด๋ฆ„์€ ๋ฐ˜๋“œ์‹œ mask ์ผ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. 
mask = ((df2['Age']>50) & (df2['Gender']=='Male'))
df2[mask]

# ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ3
# ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„๋ช…[์กฐ๊ฑด] ์„ ์‚ฌ์šฉํ•˜๋ฉด ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ–‰๋งŒ ํ•„ํ„ฐ๋ง๋ฉ๋‹ˆ๋‹ค.
df2 = df2[df2['Age']>50] 

# ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ4
# loc[]์„ ํ™œ์šฉํ•œ ์กฐ๊ฑด ํ•„ํ„ฐ๋ง
df2 = df2.loc[df2['Age']>50]

# ๋ฐ์ดํ„ฐ ๊ทธ๋ฃจํ•‘- ๊ธฐ์ค€ 1๊ฐœ
df2.groupby('Gender')['Customer ID'].count()

# ๋ฐ์ดํ„ฐ ๊ทธ๋ฃจํ•‘- ๊ธฐ์ค€ ์—ฌ๋Ÿฌ๊ฐœ
df2.groupby(['Gender','Location'])['Customer ID'].count()

# ๋ฐ์ดํ„ฐ count ์™€ nunique(distinct, ์ค‘๋ณต์ œ๊ฑฐ) ์ฐจ์ด 
df2.groupby('Location')['Age'].count()
df2.groupby('Location')['Age'].nunique()

3์ฃผ์ฐจ & 4์ฃผ์ฐจ

01. Python ๋ฐ์ดํ„ฐ ๊ฒฐํ•ฉ

  • Merge
    pandas ์˜ ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋กœ, ๊ณตํ†ต์ปฌ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ ํ…Œ์ด๋ธ”์„ ๋ณ‘ํ•ฉํ•˜์—ฌ, SQL ๊ตฌ๋ฌธ์˜ JOIN ๊ณผ ๊ฐ€์žฅ ์œ ์‚ฌํ•จ

๐Ÿ“Œ ์ฃผ์š”์˜ต์…˜ (ํŒŒ๋ผ๋ฏธํ„ฐ ๋ผ๊ณ ๋„ ๋ถ€๋ฆ…๋‹ˆ๋‹ค.)

  • on: ์กฐ๊ฑด ์ปฌ๋Ÿผ์ด ํ•œ๊ฐœ์ธ์ง€ ์—ฌ๋Ÿฌ๊ฐœ์ธ์ง€
  • how: ์–ด๋–ค ์กฐ์ธ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ (inner, outer, left, right)
  • left on / right onย : ์—ด๊ธฐ์ค€ ๋ณ‘ํ•ฉ ์‹œ ๊ธฐ์ค€์œผ๋กœ ํ•  ์—ด์˜ ์–‘์ธก ์ด๋ฆ„์ด ๋‹ค๋ฅด๋‹ค๋ฉด, ๊ฐ๊ฐ ์–ด๋–ค ์—ด์„ ๊ธฐ์ค€์œผ๋กœ ํ•  ์ง€ ์ง€์ •
  • sort: ๋ณ‘ํ•ฉ ํ›„ ์ธ๋ฑ์Šค ์ •๋ ฌ ์—ฌ๋ถ€ (True/False)
  • suffixes: ์ค‘๋ณต๋œ ์ปฌ๋Ÿผ ์ด๋ฆ„์˜ ์ฒ˜๋ฆฌ
  • indicator: True ๋กœ ํ•  ๊ฒฝ์šฐ, ๋งˆ์ง€๋ง‰ ์—ด์— ๋ณ‘ํ•ฉ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•จ
# ์ปฌ๋Ÿผ๋ช…์ด ๊ฐ™์€ ๊ฒฝ์šฐ์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์ปฌ๋Ÿผ๋ช…์„ ์ž„์˜๋กœ ๋ณ€๊ฒฝํ•ด ์คŒ
df3['Customer ID']=df3['user id']

# ๊ธฐ๋ณธ ์ž‘์„ฑ๊ตฌ๋ฌธ์œผ๋กœ, ๋””ํดํŠธ๊ฐ’์€ inner join
# ๊ณตํ†ต์ปฌ๋Ÿผ๊ฐ’์€ ํ•ฉ์ณ์ ธ ํ•˜๋‚˜์˜ ์ปฌ๋Ÿผ์œผ๋กœ ์ถœ๋ ฅ
merge_df = pd.merge(df2,df3)

# ์œ„ ์ฝ”๋“œ์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. on ์ ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. 
merge_df = pd.merge(df2,df3, how='inner', on='Customer ID')

# ๊ณตํ†ต์ปฌ๋Ÿผ์ด 2๊ฐœ ์ด์ƒ์ผ ๋•Œ
merge_df = pd.merge(df2, df3, how='inner', on=['๊ณตํ†ต์ปฌ๋Ÿผ1','๊ณตํ†ต์ปฌ๋Ÿผ2'])

# ๊ธฐ์ค€์—ด ์ด๋ฆ„์ด ๋‹ค๋ฅผ ๋•Œ
merge_df = pd.merge(df2,df3, how='inner', left_on = 'Customer ID', right_on = 'user id')

# ๊ณตํ†ต์ปฌ๋Ÿผ์„ ๊ฐœ๋ณ„๋กœ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ
merge_df = pd.merge(df2,df3, how='inner', on='Customer ID', suffixes=('_left','_rihgt'))
  • Join
    pandas ์˜ ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋กœ Join์€ ์ธ๋ฑ์Šค ๊ธฐ์ค€์œผ๋กœ ํ…Œ์ด๋ธ”์„ ๋ณ‘ํ•ฉ

๐Ÿ“Œ ์ฃผ์š”์˜ต์…˜

  • how: ์–ด๋–ค ์กฐ์ธ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ (inner, outer, left, right)
  • lsuffix / rsuffix: ์ด๋ฆ„์ด ๊ฐ™์€ ์ปฌ๋Ÿผ์ด ์žˆ์„ ๊ฒฝ์šฐ, ๋ฌธ์ž์—ด ์ง€์ •ํ•˜์—ฌ ๋ถ€์—ฌ
  • sort: ์ธ๋ฑ์Šค ์ •๋ ฌ์—ฌ๋ถ€ (True / False)
# ๋‹จ์ˆœ ์กฐ์ธ
df2.join(df3)

# join ๋ฐฉ์‹ ์„ค์ •
df2.join(df3, how='right')

# join์‹œ ์ด๋ฆ„์ด ๊ฐ™์€ ์ปฌ๋Ÿผ์ด ์žˆ์„ ๊ฒฝ์šฐ, ์˜ต์…˜์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ์กฐ์ธ ๊ฐ€๋Šฅ
# ์•„๋ž˜ ์ฝ”๋“œ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋‚จ
# df.join(df2)
df.join(df2,how='left', lsuffix='1', rsuffix='2')

# join ์ดํ›„, ์ธ๋ฑ์Šค ์ •๋ ฌํ•˜๊ธฐ
df.join(df2,how='left', lsuffix='1', rsuffix='2', sort=True)
  • Concat
    pandas ์˜ ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋กœ, ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ๋˜๋Š” ์‹œ๋ฆฌ์ฆˆ๋ฅผ ํŠน์ • ์ถ•์„ ๋”ฐ๋ผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ

๐Ÿ“Œ ์ฃผ์š”์˜ต์…˜

  • axis: ์ˆ˜์ง๊ฒฐํ•ฉ์ธ์ง€, ์ˆ˜ํ‰๊ฒฐํ•ฉ์ธ์ง€ (axis=0: ์ˆ˜์ง๊ฒฐํ•ฉ(๊ธฐ๋ณธ๊ฐ’) / axis=1: ์ˆ˜ํ‰๊ฒฐํ•ฉ)
  • join: ์–ด๋–ค ์กฐ์ธ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ (inner, outer, left, right)
  • join_axesย : ์กฐ์ธ ์ถ• ์ง€์ •
  • keys: ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ์ถ•์ด๋ฆ„ ์ง€์ •
  • ignore_index=True : ์ธ๋ฑ์Šค ์žฌ๋ฐฐ์—ด
# ๊ธฐ๋ณธ ์ž‘์„ฑ๊ตฌ๋ฌธ
pd.concat([df2, df3])

# ์„ธ๋กœ๋กœ ๊ฒฐํ•ฉ
pd.concat([df2, df3], axis=0, ignore_index=True, join='inner')

# ๊ฐ€๋กœ๋กœ ๊ฒฐํ•ฉ
pd.concat([df2, df3], axis=1, ignore_index=True, join='inner')
  • append

pandas ์˜ ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜. ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์— ํ–‰์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋กœ, ๋‘ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ํ–‰ ๊ธฐ์ค€์œผ๋กœ ๊ฒฐํ•ฉ

๐Ÿ“Œ ์ฃผ์š”์˜ต์…˜

  • ignore_index: ๊ธฐ์กด ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ• ์ง€ ์—ฌ๋ถ€. False๋กœ ํ•  ๊ฒฝ์šฐ 0,1,2,..,n ์ด ๋ถ€์—ฌ
  • sortย : ์—ด์„ ์‚ฌ์ „์ ์œผ๋กœ ์ •๋ ฌํ•  ์ง€ ์—ฌ๋ถ€
# ๊ธฐ๋Šฅ์ด ์—†์–ด์งˆ ์˜ˆ์ •์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด concat ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์‹คํ–‰ํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. 
# ์—๋Ÿฌ๊ฐ€ ์•„๋‹Œ ๊ฒฝ๊ณ ๋ฉ”์‹œ์ง€๋กœ, ์ด๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
# import warnings
# warnings.filterwarnings('ignore')
# ๋‹จ์ˆœ ๊ฒฐํ•ฉ, ์—†๋Š” ๊ฑด NaN์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ณ  ๊ฒฐํ•ฉ
# df2 ๊ฐ€ df ์˜ ์•„๋ž˜๋กœ ๋ถ™์Œ

df.append(df2)
  • Merge ์™€ Join ์˜ ์ฐจ์ด์  / Concat ๊ณผ Append์˜ ์ฐจ์ด์ 

02. Pivot Table

  • ๋ฐ์ดํ„ฐ์˜ ์—ด์„ ๊ธฐ์ค€์œผ๋กœ ํ”ผ๋ฒ—ํ…Œ์ด๋ธ”๋กœ ๋ณ€ํ™˜์‹œํ‚ค๋Š” ํ•จ์ˆ˜

-> ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต ๋ฐ ์‹œ๊ฐํ™”๋ฅผ ์œ„ํ•ด, ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ์ž์œ ๋กญ๊ฒŒ ๋ณ€ํ™˜ํ•˜๋Š” pivot table ์€ ํ•„์ˆ˜๐Ÿ˜ƒ

๐Ÿ“Œ ์ฃผ์š”์˜ต์…˜

  • index: ์ธ๋ฑ์Šค(์ถ•) ์œผ๋กœ ์‚ฌ์šฉ๋  ์—ด
  • columns: ์—ด๋กœ ์‚ฌ์šฉ๋  ์—ด
  • values: ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋  ์—ด
  • โญ index ๋ฐ columns์— ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋ฅผ ์ž…๋ ฅํ•  ๊ฒฝ์šฐ โ†’ ๋ฉ€ํ‹ฐ ์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜ ํ”ผ๋ฒ—ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ
  • โญ values ์— ๋ฆฌ์ŠคํŠธ๋ฅผ ์ž…๋ ฅ ํ•  ๊ฒฝ์šฐ โ†’ ๊ฐ ๊ฐ’์— ๋Œ€ํ•œ ํ…Œ์ด๋ธ”์ด ์—ฐ์†์ ์œผ๋กœ ์ƒ์„ฑ
  • โญ aggfunc: ์–ด๋– ํ•œ ๊ณ„์‚ฐ์„ ํ•  ์ง€
  • fill_value: NaN ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ, fill_value=0 ์ด ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋จ
  • dropna: ๊ฒฐ์ธก์น˜(na)์‚ญ์ œ ์—ฌ๋ถ€ ๊ฒฐ์ •
  • sort: index or columns ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ
# age ๋ผ๋Š” ์ถ•์„ ๊ธฐ์ค€์œผ๋กœ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๊ณ ๊ฐid ์นด์šดํŠธ 
pd.pivot_table(df2, index='Age', columns='Category', values='Customer ID', aggfunc='count')

# age, Category ๋ผ๋Š” ์ถ•์„ ๊ธฐ์ค€์œผ๋กœ ์„ฑ๋ณ„ Previous Purchases ์ตœ์†Œ, ์ตœ๋Œ€๊ฐ’ ๊ตฌํ•˜๊ธฐ 
pd.pivot_table(df2, index=['Age','Category'],columns='Gender', values='Previous Purchases', aggfunc=['min','max'])

# ์„ฑ๋ณ„์„ ์ถ•์œผ๋กœ ํ•˜๊ณ , ์‚ฌ์ด์ฆˆ, ๋‚˜์ด๋ณ„ ๊ณ ๊ฐid ๊ณ ์œ ํ•˜๊ฒŒ ์นด์šดํŠธ 
pd.pivot_table(df2, index=['Gender'],columns=['Size','Age'], values='Customer ID', aggfunc='nunique')

03. ๊ทธ ์™ธ ์œ ์šฉํ•œ ๋ฉ”์„œ๋“œ

ํ•จ์ˆ˜ vs ๋ฉ”์„œ๋“œ
ํ•จ์ˆ˜ : str(), int() ๊ฐ™์€ ๋…๋ฆฝ์ ์ธ ์•„์ด๋“ค
๋ฉ”์„œ๋“œ : df.split(), df.append() ์™€ ๊ฐ™์ด ๊ฐ์ฒด ์ข…์†์ ์ธ ์•„์ด๋“ค (. ํ•„์š”)

  • lambda(์ด๋ฆ„์ด ์—†๋Š” ํ•จ์ˆ˜): ํ•จ์ˆ˜๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ๋งค์šฐ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ
# lambda ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ํ™€์ˆ˜ ์ถœ๋ ฅํ•˜๊ธฐ 
mylist = [1, 2, 3, 4, 5]

mylist2 = list(filter(lambda x: x % 2 == 1, mylist))
print(mylist2)

# lambda ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ์ •๋ ฌ
mylist = ['apple', 'banana', 'cherry']
mylist2 = sorted(mylist, key=lambda x: len(x))
print(mylist2)
  • split : ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ ๋ฌถ์—ฌ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌธ์ž์—ด ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆŒ ๋•Œ ์‚ฌ์šฉ

๐Ÿ“Œ ์ฃผ์š”์˜ต์…˜

  • sep: ๋ฌธ์ž์—ด์„ ๋‚˜๋ˆŒ ๊ตฌ๋ถ„์ž ๊ธฐ์ž…
  • maxsplit: ์ตœ๋Œ€ split ํšŸ์ˆ˜ (๋””ํดํŠธ: ๋ชจ๋‘ ๋‹ค ๋‚˜๋ˆ”)
# ์˜ˆ์‹œ ๋ฌธ์ž์—ด ์„ ์–ธ 
s = "aa.bb.cc.dd.ee.ff.gg"

# '.' ๊ตฌ๋ถ„์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜๋ˆ” 
# ์•„๋ž˜ ๋‘ ์ฝ”๋“œ ๊ฒฐ๊ณผ ๋™์ผ 
s.split('.')
s.split(sep='.')

# df ์— x ์ปฌ๋Ÿผ์ถ”๊ฐ€
df2['x']="aa.bb.cc.dd.ee.ff.gg"

# '.' ๊ตฌ๋ถ„์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜๋ˆ„๊ณ  ์ปฌ๋Ÿผ์œผ๋กœ ๋ฐ›์Œ 
# lambda ํ•จ์ˆ˜์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ 
# 7๋ฒˆ ๋ฐ˜๋ณต, a ๋ฅผ ์ปฌ๋Ÿผ ๊ตฌ๋ถ„์ž๋กœ ๋ฐ›์•„์ฃผ๊ณ , format ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด a0, a1, a2 ... ๋กœ ํ‘œ๊ธฐ
# lambda ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด '.' ๋กœ ๊ตฌ๋ถ„. ๋‹จ, len(x.split('.') ์ฆ‰ 7 ๋ณด๋‹ค i ๊ฐ€ ์ž‘์„ ๋•Œ ์ˆ˜ํ–‰
# ์ค‘์š”
for i in range(i):
    df2["a{}".format(i)] = df2['x'].apply(lambda x: x.split('.')[i] if len(x.split('.'))>i else None)
  • rrule : dateutil ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์†ํ•œ ํ•จ์ˆ˜๋กœ, ๋‚ ์งœ ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ๊ธฐ์ค€์— ๋”ฐ๋ผ output ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ

๐Ÿ“Œ ์ฃผ์š”์˜ต์…˜

  • freqย : ๋ฐ˜๋ณต ์ฃผ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ, SECONDLY, MINUTELY, HOURLY, DAILY, WEEKLY, MONTHLY, YEARLY
  • dtstart: ๋ฐ˜๋ณต์ด ์‹œ์ž‘ํ•˜๋Š” ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋ƒ„.
  • interval: ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฐ˜๋ณต๋˜๋Š” ๊ฐ„๊ฒฉ์„ ๋‚˜ํƒ€๋ƒ„.
  • count: ์ƒ์„ฑํ•  ๋‚ ์งœ์˜ ์ตœ๋Œ€ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋ƒ„.
  • until: ๋ฐ˜๋ณต์ด ๋๋‚˜๋Š” ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋ƒ„.
# ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
from datetime import datetime
from dateutil.rrule import rrule, DAILY, TU

# ์‹œ์ž‘ ๋‚ ์งœ, ์ข…๋ฃŒ๋‚ ์งœ
start_date = datetime(2024, 2, 1)
end_date = datetime(2024, 3, 1)

# 2024-02-01 ๋ถ€ํ„ฐ 2024-03-01 ๊นŒ์ง€ strf ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅ.
weekly_rule = rrule(DAILY, dtstart=start_date, until=end_date)

for date in weekly_rule:
    print(date.strftime('%Y-%m-%d'))

# ๋นˆ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ ํ›„ ๋‚ ์งœ๋ฅผ ๋‹ด์•„์ฃผ๊ธฐ
a=[]
for date in weekly_rule:
    a.append(date.strftime('%Y-%m-%d'))
    
# 2023-02-01 ๋ถ€ํ„ฐ 2023-03-01 ๊นŒ์ง€ strf ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅ
weekly_rule = rrule(DAILY, dtstart=start_date, until=end_date)

# ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์—์„œ ํŠน์ • ๋‚ ์งœ๊ธฐ๊ฐ„์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์Šฌ๋ผ์ด์‹ฑ ํ•˜๊ธฐ 
# ๋นˆ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ ํ›„ ๋‚ ์งœ๋ฅผ ๋‹ด์•„์ฃผ๊ธฐ
a=[]
for date in weekly_rule:
    a.append(date.strftime('%Y-%m-%d'))
    
# df3 ์— ์žˆ๋Š” ๋‚ ์งœ ๋ฐ์ดํ„ฐ๋Š” string 
# string -> datetimd -> string ์˜ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜
# ์œ„์—์„œ ๋ฐ›์€ ๋ฆฌ์ŠคํŠธ์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ํ•„ํ„ฐ๋งํ•˜๊ธฐ ์œ„ํ•จ 
df3['Time stamp2'] = pd.to_datetime(df3['Time stamp']).dt.strftime('%Y-%m-%d')

mask =(df3['Time stamp2'].isin(a))
df3[mask]

5์ฃผ์ฐจ & 6์ฃผ์ฐจ

01. ์ด์ƒ์น˜, ๊ฒฐ์ธก์น˜๋ž€?

  • ์ด์ƒ์น˜: ์ „์ฒด ๋ฐ์ดํ„ฐ ๋ฒ”์œ„์—์„œ ๋ฒ—์–ด๋‚œ ์•„์ฃผ ์ž‘์€ ๊ฐ’์ด๋‚˜ ํฐ ๊ฐ’
  • ๊ฒฐ์ธก์น˜: ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๊ณผ์ •์—์„œ ์ธก์ •๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋œ ๋ฐ์ดํ„ฐ
    <์ด์ƒ์น˜ ์˜ˆ์‹œ>

    -> 1000์  ๋•Œ๋ฌธ์— ์ „์ฒด ํ‰๊ท ์ด 240์ ์ด ๋‚˜์˜ด ใ…ก.ใ…ก

02. ๊ฒฐ์ธก์น˜ ํŒŒํ—ค์ณ๋ณด๊ธฐ

  • 1. ๊ฒฐ์ธก์น˜ ์ฒ˜๋ฆฌ(์ œ๊ฑฐ) : ๊ฒฐ์ธก์น˜๊ฐ€ ์กด์žฌํ•˜๋Š” ํ–‰ ๋˜๋Š” ์—ด์„ ์ œ๊ฑฐ
# ์ปฌ๋Ÿผ๋ณ„ ๊ฒฐ์ธก์น˜ ์‹๋ณ„ 
df3.isnull().sum()

# ๊ฒฐ์ธก์น˜ ์ œ๊ฑฐ1 - ์—ด ์ œ๊ฑฐํ•˜๊ธฐ 
df3 = df3.drop('Unnamed: 4', axis=1)


# ๊ฒฐ์ธก์น˜ ์ œ๊ฑฐ2 - ๊ฒฐ์ธก์น˜๊ฐ€ ์žˆ๋Š” ํ–‰๋“ค์€ ๋ชจ๋‘ ์ œ๊ฑฐ
df3.dropna()
# ๊ฐ™์€ ํ‘œํ˜„
df3.dropna(axis=0, how='any')

# ๊ฒฐ์ธก์น˜ ์ œ๊ฑฐ3 - ๊ฒฐ์ธก์น˜๊ฐ€ ์žˆ๋Š” ์—ด์„ ๋ชจ๋‘ ์ œ๊ฑฐ 
# ์—ด๋กœ ์ œ๊ฑฐํ•˜๋ฉด ์ปฌ๋Ÿผ์ด ์ œ๊ฑฐ๋˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ๋งค์šฐ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค.  
# df3.dropna(axis=1)

# ๊ฒฐ์ธก์น˜ ์ œ๊ฑฐ4 - ์ „์ฒด ํ–‰์ด ๊ฒฐ์ธก๊ฐ’์ธ ๊ฒฝ์šฐ๋งŒ ์‚ญ์ œํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ
# how='all'์„ ์‚ฌ์šฉํ•ด์ค๋‹ˆ๋‹ค. 
df3.dropna(how='all')

# ๊ฒฐ์ธก์น˜ ์ œ๊ฑฐ5 - ๊ฒฐ์ธก์น˜ ์ œ๊ฑฐ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๋กœ ์ €์žฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ
# inplace=True ์กฐ๊ฑด์„ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค. 
df3.dropna(inplace=True)

# drop ์ดํ›„ ๊ฒฐ์ธก์น˜๊ฐ€ ์ž˜ ์ œ๊ฑฐ๋˜์—ˆ๋Š”์ง€ ์ฒดํฌ๊ฐ€ ํ•„์š”ํ•˜๊ฒ ์ฃ ? 
df3.isnull().sum()
  • 2. ๊ฒฐ์ธก์น˜ ์ฒ˜๋ฆฌ(๋Œ€์ฒด) :
    ์ตœ๋นˆ๊ฐ’(๋ฒ”์ฃผํ˜• ๋ณ€์ˆ˜) ๋กœ ๋Œ€์ฒด
    ์ค‘์•™๊ฐ’(์ˆ˜์น˜ํ˜• ๋ณ€์ˆ˜) ๋กœ ๋Œ€์ฒด
    ํ‰๊ท ๊ฐ’(์ˆ˜์น˜ํ˜• ๋ณ€์ˆ˜) ๋กœ ๋Œ€์ฒด
    ํ–‰ ๊ธฐ์ค€์œผ๋กœ ๋ฐ”๋กœ ์œ„๋‚˜ ์•„๋ž˜์˜ ๊ฐ’ ๋กœ ๋Œ€์ฒด
    group by ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ ๋กœ ๋Œ€์ฒด
# ๊ฒฐ์ธก์น˜ ๋Œ€์ฒด: ์ตœ๋นˆ๊ฐ’
# mode ๋Š” ์ตœ๋นˆ๊ฐ’์„ ์˜๋ฏธ
# df3 ์˜ Interaction type ์ปฌ๋Ÿผ์„ fillnaํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฑ„์›Œ์ฃผ๋˜, mode() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ๋นˆ๊ฐ’์œผ๋กœ ๋„ฃ์–ด์คŒ
# mode ํ•จ์ˆ˜๋Š” ์‹œ๋ฆฌ์ฆˆ๋ฅผ output์œผ๋กœ ๊ฐ€์ง‘๋‹ˆ๋‹ค. 
# ๋”ฐ๋ผ์„œ,[0]์„ ํ†ตํ•ด ์‹œ๋ฆฌ์ฆˆ ์ค‘ ๋‹จ์ผ๊ฐ’์„ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. 
df3 = df3['Interaction type'].fillna(df3['Interaction type'].mode()[0])

# ๊ฒฐ์ธก์น˜ ๋Œ€์ฒด: ํ‰๊ท ๊ฐ’
df['sw'] = df['sw'].fillna(df['sw'].mean())
df.isnull().sum()

# ๊ฒฐ์ธก์น˜ ๋Œ€์ฒด: ์ค‘๊ฐ„๊ฐ’
# inplace=True ๋กœ ํ•˜๋ฉด ์›๋ณธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
df['sw'] = df['sw'].fillna(df['sw'].median())
df.isnull().sum()

# ๊ฒฐ์ธก์น˜ ๋Œ€์ฒด: ๋ฐ”๋กœ ์œ„ ๊ฐ’์œผ๋กœ ๋Œ€์ฒด
df['sw'] = df['sw'].fillna(method='ffill')
df.isnull().sum()

# ๊ฒฐ์ธก์น˜ ๋Œ€์ฒด: ๋ฐ”๋กœ ์•„๋ž˜ ๊ฐ’์œผ๋กœ ๋Œ€์ฒด
df['sw'] = df['sw'].fillna(method='bfill')
#df.isnull().sum()

# ๊ฒฐ์ธก์น˜ ๋Œ€์ฒด: group by ๊ฐ’์œผ๋กœ ๋Œ€์ฒด
# ์‚ฌ์ „ ๋ฐ์ดํ„ฐ ํ™•์ธ
df.groupby('Is Amazon Seller')['sw'].median()

# group byํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์˜ ์ปฌ๋Ÿผ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด 
# transform ํ•จ์ˆ˜ ์‚ฌ์šฉ
df['sw'] = df['sw'].fillna(df.groupby('Is Amazon Seller')['sw'].transform('median'))
df.isnull().sum()

03. ์ด์ƒ์น˜ ํŒŒํ—ค์ณ๋ณด๊ธฐ

  • ์ด์ƒ์น˜ ์‹๋ณ„: Z-Score(StandardScaler)
    ํ‰๊ท ์œผ๋กœ๋ถ€ํ„ฐ ์–ผ๋งˆ๋‚˜ ๋–จ์–ด์ ธ ์žˆ๋Š”๊ฐ€? ๋ฅผ ํ†ตํ•œ ์ด์ƒ์น˜ ํŒ๋ณ„
    python์˜ scikit-learn ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ง€์›

๊ฐ ๋ฐ์ดํ„ฐ(ํ–‰) ๋งˆ๋‹ค Z-score ๋ฅผ ๊ตฌํ•จ-> Z ๊ฐ’์€ X์—์„œ ํ‰๊ท ์„ ๋บ€ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์ค€ํŽธ์ฐจ๋กœ ๋‚˜๋ˆˆ ๊ฐ’์ด๋ฉฐ, ํ‘œ์ค€ ์ ์ˆ˜๋ผ๊ณ  ๋ถ€๋ฆ„ -> ์ผ๋ฐ˜์ ์œผ๋กœ -3์—์„œ 3 ์‚ฌ์ด์˜ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ยฑ3 ์ด์ƒ์ด๋ฉด ์ด์ƒ์น˜๋กœ ๊ฐ„์ฃผ

  • Z-Score : 0 ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋Š” ํ‰๊ท ๊ณผ ๊ฐ™์Œ์„ ์˜๋ฏธ (=ํ‰๊ท ์—์„œ ๋–จ์–ด์ง„ ๊ฑฐ๋ฆฌ๊ฐ€ 0)
  • Z-Score > 0 : ํ•ด๋‹น ๋ฐ์ดํ„ฐ ํ‰๊ท ๋ณด๋‹ค ํผ. Z-Score๊ฐ€ 1์ด๋ฉด, ํ•ด๋‹น ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋Š” ํ‰๊ท ๋ณด๋‹ค 1 ํ‘œ์ค€ํŽธ์ฐจ๋งŒํผ ๋” ํฐ ๊ฐ’์ž„์„ ์˜๋ฏธ
  • Z-Score < 0 : ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋Š” ํ‰๊ท ๋ณด๋‹ค ์ž‘์Œ. Z-Score๊ฐ€ -1์ด๋ฉด, ํ•ด๋‹น ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋Š” ํ‰๊ท ๋ณด๋‹ค 1 ํ‘œ์ค€ํŽธ์ฐจ๋งŒํผ ๋” ์ž‘์Œ์„ ์˜๋ฏธ
# df ์˜ Shipping Weight๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‹ค์–‘ํ•œ ์ด์ƒ์น˜ ๊ฐ์ง€ ๊ธฐ๋ฒ•์„ ์ ์šฉ
df = pd.read_csv("p.csv")

# string -> float -> int 
df['sw'] = df['Shipping Weight'].str.split().str[0]
df['sw'] = pd.to_numeric(df['sw'] , errors='coerce').fillna(0.0).astype(int)

# z-score ๋ฅผ ์ ์šฉํ•  ์ปฌ๋Ÿผ ์„ ์ •
df1 = df[['sw']]

# ํ‘œ์ค€ํ™” ์ง„ํ–‰
# ํ‘œ์ค€ํ™” : ํ‰๊ท ์„ 0์œผ๋กœ, ํ‘œ์ค€ ํŽธ์ฐจ๋ฅผ 1๋กœ 
# ๋ฐ์ดํ„ฐ๋ฅผ 0์„ ์ค‘์‹ฌ์œผ๋กœ ์–‘์ชฝ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„ํฌ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•
# ํ‘œ์ค€ํ™”๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด ๊ฐ ๋ฐ์ดํ„ฐ๋“ค์€ ํ‰๊ท ์„ ๊ธฐ์ค€์œผ๋กœ ์–ผ๋งˆ๋‚˜ ๋–จ์—ฌ์ ธ ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜
scale_df = StandardScaler().fit_transform(df1)

merge_df = pd.concat([df1, pd.DataFrame(StandardScaler().fit_transform(df1))],axis=1)
merge_df.columns = ['Shipping Weight', 'zscore']

# ์ด์ƒ์น˜ ๊ฐ์ง€ 
# Z-SCORE ๊ธฐ๋ฐ˜, -3 ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ 3๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ๋ฅผ ์ด์ƒ์น˜๋กœ ํŒ๋ณ„ 
mask = ((merge_df['zscore']<-3) | (merge_df['zscore']>3))

# mask ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ
strange_df = merge_df[mask]
strange_df.count()
  • ์ด์ƒ์น˜ ์‹๋ณ„: IQR(Interquartile Range)
    ๋ฐ์ดํ„ฐ์˜ ๋ถ„ํฌ๊ฐ€ ์ •๊ทœ ๋ถ„ํฌ๋ฅผ ์ด๋ฃจ์ง€ ์•Š์„ ๋•Œ ์‚ฌ์šฉ

๋ฐ์ดํ„ฐ์˜ 25% ์ง€์ ()๊ณผ 75% ์ง€์ () ์‚ฌ์ด์˜ ๋ฒ”์œ„()๋ฅผ ์‚ฌ์šฉ -> ์ด๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฐ’๋“ค์€ ๋ชจ๋‘ ์ด์ƒ์น˜๋กœ ๊ฐ„์ฃผ
IQR : (์ œ 3์‚ฌ๋ถ„์œ„ ๊ฐ’) - (์ œ 1์‚ฌ๋ถ„์œ„ ๊ฐ’)

# df ์˜ Shipping Weight๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‹ค์–‘ํ•œ ์ด์ƒ์น˜ ๊ฐ์ง€ ๊ธฐ๋ฒ•์„ ์ ์šฉ 
df = pd.read_csv("p.csv")

# string -> float -> int 
df['sw'] = df['Shipping Weight'].str.split().str[0]
df['sw'] = pd.to_numeric(df['sw'] , errors='coerce').fillna(0.0).astype(int)

# ์ด์ƒ์น˜๋ฅผ ๊ฐ์ง€ํ•  ์ปฌ๋Ÿผ ์„ ์ •
df1 = df[['sw']]

# Q3, Q1, IQR ๊ฐ’ ๊ตฌํ•˜๊ธฐ
# ๋ฐฑ๋ถ„์œ„์ˆ˜๋ฅผ ๊ตฌํ•ด์ฃผ๋Š” quantile ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ์Œ
# ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ์ „์ฒด ํ˜น์€ ํŠน์ • ์—ด์— ๋Œ€ํ•˜์—ฌ ๋ชจ๋‘ ์ ์šฉ์ด ๊ฐ€๋Šฅ

q3 = df1['sw'].quantile(0.75) 
q1 = df1['sw'].quantile(0.25)

iqr = q3 - q1
q3, q1, iqr

# ์ด์ƒ์น˜ ํŒ๋ณ„ ๋ฐ dataframe ์ €์žฅ 
# Q3 : 100๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋กœ ๊ฐ€์ • ์‹œ, 25๋ฒˆ์งธ๋กœ ๋†’์€ ๊ฐ’์— ํ•ด๋‹น
# Q1 : 100๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋กœ ๊ฐ€์ • ์‹œ, 75๋ฒˆ์งธ๋กœ ๋†’์€ ๊ฐ’์— ํ•ด๋‹น
# IQR : Q3 - Q1์˜ ์ฐจ์ด๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
# ์ด์ƒ์น˜ : Q3 + 1.5 * IQR๋ณด๋‹ค ๋†’๊ฑฐ๋‚˜ Q1 - 1.5 * IQR๋ณด๋‹ค ๋‚ฎ์€ ๊ฐ’์„ ์˜๋ฏธ

def is_outlier(df1):
    score = df1['sw']
    if score > 7 + (1.5 * 6) or score < 1 - (1.5 * 6):
        return '์ด์ƒ์น˜'
    else:
        return '์ด์ƒ์น˜์•„๋‹˜'

# apply ํ•จ์ˆ˜๋ฅผ ํ†ตํ•˜์—ฌ ๊ฐ ๊ฐ’์˜ ์ด์ƒ์น˜ ์—ฌ๋ถ€๋ฅผ ์ฐพ๊ณ  ์ƒˆ๋กœ์šด ์—ด์— ๊ฒฐ๊ณผ ์ €์žฅ
df1['์ด์ƒ์น˜์—ฌ๋ถ€'] = df1.apply(is_outlier, axis = 1) # axis = 1 ์ง€์ • ํ•„์ˆ˜

# IQR ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ•œ ์ด์ƒ์น˜ ๊ฐœ์ˆ˜๋Š” 349 ๊ฐœ 
df1.groupby('์ด์ƒ์น˜์—ฌ๋ถ€').count()
  • ์ด์ƒ์น˜ ์‹๋ณ„: Isolation Forest
    ๋จธ์‹ ๋Ÿฌ๋‹ ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ, ์ปฌ๋Ÿผ ๊ฐฏ์ˆ˜๊ฐ€ ๋งŽ์„ ๋•Œ ์ด์ƒ์น˜๋ฅผ ํŒ๋ณ„ํ•˜๊ธฐ ์šฉ์ด

๋ฐ์ดํ„ฐ์…‹์„ ๊ฒฐ์ •ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ํ‘œํ˜„

ํ•˜์ง€๋งŒ ์ด์ƒ์น˜์˜ ๊ฒฝ์šฐ, ์ด ์–ด๋””์—๋„ ์†ํ•˜์ง€ ์•Š์„ ํ™•๋ฅ ์ด ๋†’์•„ ๊ตฌ๋ถ„๋˜์ง€ ์•Š์Œ
-> ํ•œ ๋ฒˆ ๋ถ„๋ฆฌ๋  ๋•Œ ๋งˆ๋‹ค ๊ฒฝ๋กœ ๊ธธ์ด๊ฐ€ ๋ถ€์—ฌ๋˜๋ฉฐ, ํŠธ๋ฆฌ์—์„œ ๋ช‡ ๋ฒˆ์„ ๋ถ„๋ฆฌํ•ด์•ผ ํ•˜๋Š”์ง€ (๋ฐ์ดํ„ฐ๊นŒ์ง€์˜ ๊ฒฝ๋กœ ๊ธธ์ด)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ด์ƒ์น˜์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ํŒ๋‹จ
-> ๋‹ค๋ฅธ ๊ด€์ธก์น˜์— ๋น„ํ•ดย ์งง์€ ๊ฒฝ๋กœ ๊ธธ์ด์˜ ๋ฐ์ดํ„ฐ = ์ด์ƒ์น˜

  • ๊ฒฝ๋กœ ๊ธธ์ด๋กœ ์ ์ˆ˜๋Š” 0 ์—์„œ 1 ์‚ฌ์ด๋กœ ์‚ฐ์ถœ๋˜๋ฉฐ, ๊ฒฐ๊ณผ๊ฐ€ 1 ์— ๊ฐ€๊นŒ์šธ์ˆ˜๋ก ์ด์ƒ์น˜๋กœ ๊ฐ„์ฃผ
  • ์ด์ƒ์น˜ ์‹๋ณ„: DBScan
    ๋ฐ€๋„ ๊ธฐ๋ฐ˜์˜ ํด๋Ÿฌ์Šคํ„ฐ๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์–ด๋– ํ•œ ํด๋Ÿฌ์Šคํ„ฐ์—๋„ ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ด์ƒ์น˜๋กœ ํƒ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•( ์ง€๋ฆฌ ๋ฐ์ดํ„ฐ ๋ถ„์„, ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ ๋ถ„์„์˜ ์ด์ƒ์น˜ ๊ธฐ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ)

๊ฐ ๋ฐ์ดํ„ฐ์˜ ๋ฐ€๋„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฐ์ง‘์„ ํ˜•์„ฑ์‹œํ‚ค๊ณ , ์„ค์ •๋œ ๊ฑฐ๋ฆฌ ๋‚ด์— ์„ค์ •๋œ ์ตœ์†Œ ๊ฐœ์ˆ˜์˜ ๋‹ค๋ฅธ ํฌ์ธํŠธ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ํ•ด๋‹น ํฌ์ธํŠธ๋Š” ํ•ต์‹ฌ ํฌ์ธํŠธ๋กœ ๊ฐ„์ฃผ
-> ํ•ต์‹ฌ ํฌ์ธํŠธ๋“ค์ด ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ๊ตฐ์ง‘์„ ํ˜•์„ฑํ•˜๋ฉฐ, ์ด์™€ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ํฌ์ธํŠธ๋Š” ์ด์ƒ์น˜๋กœ ๋ถ„๋ฅ˜

  • ์ด์ƒ์น˜ ์ฒ˜๋ฆฌ
  1. ์ œ๊ฑฐ
  • ์ด์ƒ์น˜๊ฐ€ ๋ฐ์ดํ„ฐ ์˜ค๋ฅ˜๋‚˜ ์ ์ ˆํ•˜์ง€ ์•Š์€ ๊ฐ’์ผ ๊ฒฝ์šฐ ์ œ๊ฑฐ
    -> BUT, ์ด ๋ฐฉ์‹์€ ๋ฐ์ดํ„ฐ์˜ ํ‘œ๋ณธ ํฌ๊ธฐ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ฃผ์˜!!!
  1. ๋Œ€์ฒด
  • ๋กœ๊ทธ ๋ณ€ํ™˜: ๋ฐ์ดํ„ฐ์— ๋กœ๊ทธ ๋ณ€ํ™˜์„ ์ ์šฉํ•˜์—ฌ ๊ทน๋‹จ์ ์ธ ๊ฐ’์„ ์™„ํ™”
  • ์ƒํ•œ๊ฐ’๊ณผ ํ•˜ํ•œ๊ฐ’: ํ•˜ํ•œ๊ฐ’๊ณผ ์ƒํ•œ๊ฐ’์„ ๊ฒฐ์ •ํ•œ ํ›„ ํ•˜ํ•œ๊ฐ’๋ณด๋‹ค ์ ์œผ๋ฉด ํ•˜ํ•œ๊ฐ’์œผ๋กœ ๋Œ€์ฒด, ์ƒํ•œ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ์ƒํ•œ๊ฐ’์œผ๋กœ ๋Œ€์ฒด
  • ํ‰๊ท  ์ ˆ๋Œ€ ํŽธ์ฐจ: ์ค‘์œ„์ˆ˜๋กœ๋ถ€ํ„ฐ nํŽธ์ฐจ ํฐ ๊ฐ’์„ ๋Œ€์ฒด(์ž์ฃผ ์‚ฌ์šฉ โŒ)
  1. ๋ถ„๋ฆฌ
  • ์ด์ƒ์น˜๋ฅผ ๋ณ„๋„์˜ ๊ทธ๋ฃน์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด์ƒ์น˜๊ฐ€ ๋ฐ์ดํ„ฐ์— ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์„ ๋•Œ ์œ ์šฉํ•จ.
  • ์ฆ‰, ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ์ƒ์„ฑํ•˜์—ฌ ์ด์ƒ์น˜๋ฅผ ์ €์žฅ

7์ฃผ์ฐจ

01. ๊ธฐ๋ณธ ๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๊ธฐ

  • ์œ ์šฉํ•œ ์‹œ๊ฐํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • ๊ธฐ๋ณธ ๋‚ด์žฅํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๊ธฐ(.plot)
# ๊ธฐ๋ณธ ๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๊ธฐ 
df2.groupby('Gender')['Customer ID'].count().plot.bar()
# ์ปฌ๋Ÿฌ ์ง€์ •
df2.groupby('Gender')['Customer ID'].count().plot.bar(color=['yellow','purple'])

02. ๋‹ค์–‘ํ•œ ๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๊ธฐ

  • Matplotlib
    python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ๊ฐ€์žฅ ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

<์ฃผ์š” ์ง€์› ์˜ต์…˜>

<์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ทธ๋ž˜ํ”„ ๋™์‹œ์— ๊ทธ๋ฆฌ๊ธฐ>

  • seaborn
    Matploblib ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์–‘ํ•œ ์ƒ‰์ƒ ํ…Œ๋งˆ์™€ ํ†ต๊ณ„์šฉ ์ฐจํŠธ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ์‹œ๊ฐํ™” ํŒจ๊ธฐ์ง€

<์ฃผ์š” ์ง€์› ๊ทธ๋ž˜ํ”„>

  • Altair

๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋‹ค๋ฅด๊ฒŒ, ๋ฌธ๋ฒ•์  ์š”์†Œ๊ฐ€ ๊ฐ•ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ๋™์ ๊ทธ๋ž˜ํ”„ ๊ตฌํ˜„!!!!

<์ฃผ์š” ๋ฌธ๋ฒ•>

03. ๊ทธ ์™ธ ๊ฟ€ํŒ

  • pygWalker

    ๊ฐ„๋‹จํ•œ ์„ค์น˜๋กœ EDA ๊ฐ€๋Šฅ
    ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ทธ๋ฆฐ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ฐ”๋กœ PNG FILE๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ ๊ฐ€๋Šฅ

profile
์งฑ๊ตฌ๊ฐ€ ์ฝ”๋”ฉ์„..?

0๊ฐœ์˜ ๋Œ“๊ธ€