λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Python/기초 문법

01. 데이터 ν™•μΈν•˜κΈ°(ν–‰κ³Ό μ—΄, λ³€μˆ˜ μžλ£Œν˜•)

by ISLA! 2023. 12. 15.

🧐 잘 λͺ¨λ₯΄λŠ” λΆ„μ•Όμ˜ 데이터λ₯Ό 처음 λ°›μ•„λ“€μ—ˆλ‹€λ©΄?

πŸ‘‰ 데이터에 μ–Όλ§ˆλ‚˜ μ΅μˆ™ν•œμ§€μ™€ λ¬΄κ΄€ν•˜κ²Œ μΌμ •ν•œ 루틴에 따라 데이터λ₯Ό μ΄ν•΄ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€

  1. λ°μ΄ν„°μ˜ 행이 μ–΄λ–»κ²Œ κ³ μœ ν•˜κ²Œ μ‹λ³„λ˜λŠ”κ°€? (λΆ„μ„λ‹¨μœ„κ°€ 무엇인가?)
  2. λ°μ΄ν„°μ…‹μ˜ ν–‰κ³Ό 열은 λͺ‡ κ°œμΈκ°€
  3. μ£Όμš” λ²”μ£Όν˜• λ³€μˆ˜(categorical variable)λŠ” 무엇이고 κ°’μ˜ λΉˆλ„λŠ” μ–΄λ– ν•œκ°€?
  4. μ€‘μš”ν•œ μ—°μ†λ³€μˆ˜(continuous variable)κ°€ μ–΄λ–»κ²Œ λΆ„ν¬ν•˜λŠ”κ°€?
  5. λ³€μˆ˜λ“€μ€ μ„œλ‘œ μ–΄λ–»κ²Œ μ—°κ΄€λ˜λŠ”κ°€?
  6. μ΄μƒμΉ˜μ™€ λˆ„λ½κ°’μ€ μ–΄λ–»κ²Œ λΆ„ν¬ν•˜λŠ”κ°€?

 

데이터 뢈러였고 ν™•μΈν•˜κΈ°

# 인덱슀 μ„€μ •(ν–‰μ˜ κ³ μœ κ°’)
df.set_index('personid', inplace = True)
df.head()

# ν–‰κ³Ό μ—΄ 크기 확인
df.shape

# 인덱슀 κ³ μœ κ°’ 개수 확인
df.index.nunique()

# nullκ°’ 확인
df.info()

 

μ—΄ 선택, μ •λˆν•˜κΈ°

  • 데이터λ₯Ό μ •μ œν•˜κ±°λ‚˜ 탐색적 ν˜Ήμ€ 톡계적 뢄석을 ν•  λ•ŒλŠ” λ‹Ήλ©΄ν•œ μ΄μŠˆλ‚˜ 뢄석에 κ΄€λ ¨λœ λ³€μˆ˜μ— μ§‘μ€‘ν•˜λŠ” 것이 μ’‹λ‹€
  • 열을 싀체적 ν˜Ήμ€ 톡계적 관계에 따라 κ·Έλ£Ήν™”ν•˜κ±°λ‚˜ ν•œ λ²ˆμ— ν•œ μ—΄μ”© 선택해 μ‘°μ‚¬ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€
  • 직관을 μ–»μœΌλ €λ©΄ ν•œ λ²ˆμ— λ‹€λ£¨λŠ” 데이터 양이 μΈμ‹λ²”μœ„λ₯Ό λ„˜μ§€ μ•Šμ•„μ•Ό 함!

[objectλ₯Ό category둜 λ°”κΎΈκΈ°]

# 객체(object) μžλ£Œν˜•μ„ 선택 -> category μžλ£Œν˜•μœΌλ‘œ λ°”κΎΈκΈ°
nls97.loc[:, nls97.dtypes == 'object'] = nls97.select_dtypes(['object']).apply(lambda x: x.astype('category'))

 

 

[컬럼λͺ… ν•„ν„°λ§ν•˜μ—¬ 볡수 μ—΄ μ„ νƒν•˜κΈ°]

# 컬럼λͺ… 필터링
analysiswork = df.filter(like="weeksworked")

 

β–ΆοΈŽ (μ°Έκ³ ) filter μ—°μ‚°μžλŠ” μ •κ·œμ‹μ„ μ·¨ν•  μˆ˜λ„ 있음 : 

# μ˜ˆμ‹œ : 이름에 income이 ν¬ν•¨λœ 열을 λ°˜ν™˜
df.filter(regex = 'income')

 

 

[μžλ£Œν˜•μ„ κΈ°μ€€μœΌλ‘œ μ—΄ μ„ νƒν•˜κΈ°]

# λ²”μ£Όν˜•/μˆ«μžν˜•μΈ μ—΄ λͺ¨λ‘ 선택 =>> μžλ£Œν˜•μ„ κΈ°μ€€μœΌλ‘œ μ—΄ μ„ νƒν•˜λ €λ©΄ select_dtypes()
analysiscats = nls97.select_dtypes(include = ['category'])
analysisnums = nls97.select_dtypes(include = ['number'])

 

 

[쑰건을 κΈ°μ€€μœΌλ‘œ ν–‰κ³Ό μ—΄ μ„ νƒν•˜κΈ°]

df.loc[(df.nightlyhrssleep <= 4) & (df.childathome >= 3), ['nightlyhrssleep', 'childathome']]

 

 

 

λ²”μ£Όν˜• λ³€μˆ˜ λΉˆλ„ μƒμ„±ν•˜κΈ°

  • λ…Όλ¦¬μ μœΌλ‘œ λ²”μ£Όν˜•μ΄μ§€λ§Œ 객체 μžλ£Œν˜•μœΌλ‘œ 된 데이터λ₯Ό λ‹€λ£° λ•Œμ—λŠ” λ²”μ£Όν˜•μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 것이 타당함
  • value_counts() λ©”μ„œλ“œλ₯Ό ν™œμš©ν•˜λŠ” λ‹€μ–‘ν•œ μ˜ˆλŠ” μ•„λž˜μ™€ κ°™λ‹€.
    • λΉˆλ„μ™€ λΉ„μœ¨ ν‘œμ‹œ, 쑰건을 μ€€ μ—΄μ—μ„œ λΉ„μœ¨ ν‘œμ‹œ λ“±
df.loc[:, df.dtypes == 'object'] = df.select_dtypes(['object']).apply(lambda x : x.astype('category'))

# λΉˆλ„μˆœ μ •λ ¬ ν•΄μ œ
df.maritalstatus.value_counts(sort = False)

# λΉˆλ„λ₯Ό λΉ„μœ¨λ‘œ
df.maritalstatus.value_counts(sort = False, normalize = True)

# μ •λΆ€ μ±…μž„ κ΄€λ ¨ μ—΄ 전체λ₯Ό λΉ„μœ¨λ‘œ ν‘œμ‹œ
df.filter(like='gov').apply(pd.value_counts, normalize = True)

# μ •λΆ€ μ±…μž„ κ΄€λ ¨ μ—΄μ—μ„œ 기혼자만 μ°ΎκΈ°
df[df.maritalstatus == 'Married'].filter(like='gov').apply(pd.value_counts, normalize = True)

 

 

 

 

μ—°μ†ν˜• λ³€μˆ˜μ˜ μš”μ•½ν†΅κ³„ μ‚΄νŽ΄λ³΄κΈ°

  • 쀑심경ν–₯(central tendency), 퍼진 정도(spread), μ™œλ„(skewness)λ₯Ό μ‚΄νŽ΄λ³΄κ³ 
  • 이상값과 μ˜ˆμƒμΉ˜ λͺ»ν•œ κ°’(unexpected value)을 μ‹λ³„ν•˜λŠ”λ°λ„ ν™œμš©ν•œλ‹€.

 

[describe() 확인  πŸ‘‰ 평균과 μ€‘μ•™κ°’μ˜ 차이가 맀우 크면 μœ„ν—˜ μ‹ ν˜Έ]

covidtotals.describe()

 

 

 

[λ°±λΆ„μœ„μˆ˜ ν™•μΈ]

 

  • μ•„λž˜ μ˜ˆμ‹œμ—μ„œλŠ” ν™•μ§„μž μˆ˜μ™€ μ‚¬λ§μž 수의 90번째 λ°±λΆ„μœ„μˆ˜μ™€ 100번째 λ°±λΆ„μœ„μˆ˜ 차이가 상당이 큼
    • 데이터가 μ •κ·œλΆ„ν¬λ₯Ό λ”°λ₯΄μ§€ μ•ŠμŒμ„ λ‚˜νƒ€λ‚΄λŠ” 쒋은 μ§€ν‘œ πŸ‘‰ μΆ”ν›„ 진행할 톡계적 검정에 μ€‘μš”ν•˜λ―€λ‘œ 유의!
  • 총 μ‚¬λ§μž 수 κ°€μš΄λ° 10%κ°€ λ„˜λŠ” 값이 0μ΄λΌλŠ” 점도 톡계적 검정에 μ€‘μš”ν•˜λ―€λ‘œ 유의
totvars = ['location', 'total_cases', 'total_deaths', 'total_cases_pm',
       'total_deaths_pm']

covidtotals[totvars].quantile(np.arange(0.0, 1.1, 0.1))

 

 

 


λ³Έ ν¬μŠ€νŒ…μ€ 파이썬 데이터 클리닝 쿑뢁을 ν•™μŠ΅ν•˜λ©° μ •λ¦¬ν•œ μžλ£Œμž…λ‹ˆλ‹€.

자료 좜처 : https://product.kyobobook.co.kr/detail/S000001766489?utm_source=google&utm_medium=cpc&utm_campaign=googleSearch&gad_source=1&gclid=Cj0KCQiA7OqrBhD9ARIsAK3UXh37MJKyi7r0QfsRc1Ve3imJiGUUZRNthcAxANylKpzhcEYLQl-VYWQaAspvEALw_wcB

728x90