๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Projects/๐Ÿช Convenience Store Location Analysis

[์„ ๋ฐ• ๋Œ€๊ธฐ์‹œ๊ฐ„ ์˜ˆ์ธก] 2์ฐจ ์ „์ฒ˜๋ฆฌ : ์ค‘๋ณต ํ–‰ ์ •๋ฆฌ

by ISLA! 2023. 11. 15.

ํ˜ธ์ถœ๋ถ€ํ˜ธ(์„ ๋ฐ•ID) ๋ณ„๋กœ ์ž…ํ•ญ์ผ์‹œ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์ฐํžˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

์‚ฌ์šฉ๋ชฉ์ (์–‘ํ•˜, ์ ํ•˜, ์ ‘์•ˆ, ์ˆ˜๋ฆฌ ๋“ฑ)์— ๋”ฐ๋ผ ๊ฐ๊ฐ์˜ ์ผ€์ด์Šค๋ฅผ ๊ตฌ๋ถ„ํ•ด์„œ ๋ณ„๋„ Record๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆ˜์ง‘๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์ค‘๋ณต ํ–‰ ํ™•์ธ

๋จผ์ € ํ˜ธ์ถœ๋ถ€ํ˜ธ์™€ ์ž…ํ•ญ์ผ์‹œ ๊ธฐ์ค€์œผ๋กœ ์ค‘๋ณต ์ปฌ๋Ÿผ์„ ๋จผ์ € ํ™•์ธํ•œ๋‹ค.

duplicate = df.duplicated(subset=['ํ˜ธ์ถœ๋ถ€ํ˜ธ', '์ž…ํ•ญ์ผ์‹œ']).sum()
duplicate

-- ๊ฒฐ๊ณผ : 71439

 

์ค‘๋ณต ํ–‰ ํ™•์ธ

'ํ˜ธ์ถœ๋ถ€ํ˜ธ'์™€ '์ž…ํ•ญ์ผ์‹œ' ์—ด์„ ๊ธฐ์ค€์œผ๋กœ ์ค‘๋ณต๋œ ๋ชจ๋“  ํ–‰์„ ์›๋ณธ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์—์„œ ์„ ํƒํ•˜๊ณ , ์ด๋ฅผ duplicated_rows์— ์ €์žฅ

๐Ÿ‘‰ duplicated_rows์—๋Š” ์ค‘๋ณต๋œ ํ–‰๋“ค๋งŒ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ

# ๋ชจ๋“  ์ค‘๋ณต ํ–‰์„ ์„ ํƒ(keep=False)
duplicated_rows = df[df.duplicated(subset=['ํ˜ธ์ถœ๋ถ€ํ˜ธ', '์ž…ํ•ญ์ผ์‹œ'], keep=False)]
duplicated_rows

 

 

 

์ถœํ•ญ๋Œ€๊ธฐ์‹œ๊ฐ„(๋ถ„) ๊ณ„์‚ฐ

(1) ์ถœํ•ญ๋Œ€๊ธฐ๊ฐ€ ์‚ฌ์šฉ๋ชฉ์ ๋ช…์ธ ๊ฒฝ์šฐ, '์ถœํ•ญ๋Œ€๊ธฐ์‹œ๊ฐ„_๋ถ„' ์ปฌ๋Ÿผ ๊ฐ’์— ๋‹ค์Œ์„ ํ• ๋‹น

>> ์ถœํ•ญ๋Œ€๊ธฐ๊ฐ€ ๋ฐœ์ƒํ•œ ์‹œ๊ฐ„์„ ์ง€์ •์ผ์‹œ(FROM ~ TO)๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ณ„์‚ฐ

>> dt.total_seconds() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๊ฐ„๊ฐ„๊ฒฉ์„ '์ดˆ' ๋ณ€ํ™˜

>> ๋‹ค์‹œ ์ด๋ฅผ 60์œผ๋กœ ๋‚˜๋ˆ„์–ด '๋ถ„'์œผ๋กœ ๋ณ€ํ™˜

temp.loc[temp['์‚ฌ์šฉ๋ชฉ์ ๋ช…'] == '์ถœํ•ญ ๋Œ€๊ธฐ', '์ถœํ•ญ๋Œ€๊ธฐ์‹œ๊ฐ„_๋ถ„'] 
	= (pd.to_datetime(temp['์ง€์ •์ผ์‹œ(TO)']) - pd.to_datetime(temp['์ง€์ •์ผ์‹œ(FROM)'])).dt.total_seconds() / 60

 

 

(2) ์ถœํ•ญ๋Œ€๊ธฐ์‹œ๊ฐ„(๋ถ„)์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋Š” ๊ฒฐ์ธก์น˜๋กœ ์ฒ˜๋ฆฌ๋˜์–ด, ์ด๋ฅผ 0์œผ๋กœ ๋Œ€์ฒด

temp['์ถœํ•ญ๋Œ€๊ธฐ์‹œ๊ฐ„_๋ถ„'].fillna(0, inplace = True)

 

'ํ˜ธ์ถœ๋ถ€ํ˜ธ' & '์ž…ํ•ญ์ผ์‹œ'๊ฐ€ ์ค‘๋ณต๋œ ํ–‰์˜ ๋Œ€ํ‘ฏ๊ฐ’๋งŒ ๋‚จ๊ธฐ๊ธฐ โ–ถ๏ธŽ groupby.agg()

  • ๊ฐ€๊ณต ์ปฌ๋Ÿผ : ํ˜ธ์ถœ๋ถ€ํ˜ธ, ์ž…ํ•ญ์ผ์‹œ, ์ถœํ•ญ์ผ์‹œ, ์ ‘์•ˆ_๋Œ€๊ธฐ์‹œ๊ฐ„_๋ถ„, service_Time_๋ถ„
  • ํ˜ธ์ถœ๋ถ€ํ˜ธ, ์ž…ํ•ญ์ผ์‹œ, ์ถœํ•ญ์ผ์‹œ๋Š” ์ค‘๋ณตํ–‰๋“ค ์ค‘์— ์ฒซ๋ฒˆ์งธ ๊ฐ’๋งŒ ์ž…๋ ฅ
  • 'ํ˜ธ์ถœ๋ถ€ํ˜ธ','์ž…ํ•ญ์ผ์‹œ'๊ฐ€ ์ค‘๋ณต๋œ ํ–‰์ค‘์— '์ ‘์•ˆ_๋Œ€๊ธฐ์‹œ๊ฐ„_๋ถ„' ๊ฐ’์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ new ์˜ '์ ‘์•ˆ_๋Œ€๊ธฐ์‹œ๊ฐ„_๋ถ„'๊ฐ’์— ์ž…๋ ฅ
  • 'ํ˜ธ์ถœ๋ถ€ํ˜ธ','์ž…ํ•ญ์ผ์‹œ'๊ฐ€ ์ค‘๋ณต๋œ ํ–‰์ค‘์— 'Service_Time_Start' ๊ฐ’์ด ์ œ์ผ ํฐ ๊ฐ’์„ new 'Service_Time_Start'๊ฐ’์— ์ž…๋ ฅ
  • 'ํ˜ธ์ถœ๋ถ€ํ˜ธ','์ž…ํ•ญ์ผ์‹œ'๊ฐ€ ์ค‘๋ณต๋œ ํ–‰์ค‘์— 'Service_Time_End' ๊ฐ’์ด ์ œ์ผ ์ž‘์€ ๊ฐ’์„ new 'Service_Time_End'๊ฐ’์— ์ž…๋ ฅ
import pandas as pd

grouped_df = df.groupby(['ํ˜ธ์ถœ๋ถ€ํ˜ธ', '์ž…ํ•ญ์ผ์‹œ']).agg({
    '์ถœํ•ญ์ผ์‹œ': 'first',
    '์ ‘์•ˆ_๋Œ€๊ธฐ์‹œ๊ฐ„_๋ถ„': 'max',
    '์ถœํ•ญ_๋Œ€๊ธฐ์‹œ๊ฐ„_๋ถ„': 'max',
    'Service_Time_Start': 'max',
    'Service_Time_End': 'min',
    '๊ณ„์„ ์žฅ์†Œ_์ฝ”๋“œ': 'first',  # ์ถ”๊ฐ€ํ•œ ์ปฌ๋Ÿผ(ํ•„์ˆ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ ์žˆ์œผ๋ฉด ์ข‹์€)
    '๊ณ„์„ ์žฅ์†Œ_์ˆซ์ž': 'first',  
    '๊ณ„์„ ์žฅ์†Œ๋ช…': 'first'     
}).reset_index()

new_df = pd.DataFrame(grouped_df, columns=['ํ˜ธ์ถœ๋ถ€ํ˜ธ', '์ž…ํ•ญ์ผ์‹œ', '์ถœํ•ญ์ผ์‹œ', '์ ‘์•ˆ_๋Œ€๊ธฐ์‹œ๊ฐ„_๋ถ„', '์ถœํ•ญ_๋Œ€๊ธฐ์‹œ๊ฐ„_๋ถ„', 'Service_Time_Start', 'Service_Time_End', '๊ณ„์„ ์žฅ์†Œ_์ฝ”๋“œ', '๊ณ„์„ ์žฅ์†Œ_์ˆซ์ž', '๊ณ„์„ ์žฅ์†Œ๋ช…'])
df = new_df.copy()

 

 

์„œ๋น„์Šค ์‹œ๊ฐ„๊ณผ ๋Œ€๊ธฐ์œจ ๊ตฌํ•˜๊ธฐ

df['Service_Time_End'] = pd.to_datetime(df['Service_Time_End'])
df['Service_Time_Start'] = pd.to_datetime(df['Service_Time_Start'])

#์„œ๋น„์Šค ์‹œ๊ฐ„
df['Service_Time_๋ถ„'] = (df['Service_Time_End'] - df['Service_Time_Start']).dt.total_seconds() / 60

#๋Œ€๊ธฐ์œจ
df['๋Œ€๊ธฐ์œจ'] = df['์ ‘์•ˆ_๋Œ€๊ธฐ์‹œ๊ฐ„_๋ถ„']/df['Service_Time_๋ถ„']*100

728x90