마케팅/데이터 분석

[파이썬] 숫자 데이터 가공하기

퍼포마첼라 2025. 3. 14. 09:55

 

새로운 값 계산하기

 

기존 데이터 불러오기

 

허리둘레/엉덩이 둘레로 비만도를 계산한다.

 

round()

함수를 사용해 소수점 2번째 자리까지 표시되게 만든다.

 

새로운 컬럼을 만들어 저장해준다.

 

이런 새로운 데이터로 비만도와 당뇨(diabetes) 사이에 어떤 상관관계가 있는지도 알아볼 수 있겠다.

 

실습 1 

import pandas as pd

patient_df = pd.read_csv('data/patient.csv')

# 여기에 코드를 작성하세요.
bmi = round(patient_df['weight'] / (patient_df['height'] *  patient_df['height']), 1)

patient_df['bmi'] = bmi
patient_df

 

제곱을 **2라고 표현하는 방법을 몰랐다. 기억해둬야지.

 

# 모범답안
import pandas as pd

patient_df = pd.read_csv('data/patient.csv')

patient_df['bmi'] = round(patient_df['weight'] / patient_df['height']**2, 1)
patient_df

 


정규화

 

스케일링

 

스케일링 방법

1. 정규화

2. 표준화

 

정규화 방법

 

앞에 써있는대로 식을 작성해주다가 너무 길어서 엔터를 치니 오류가 난다

 

 

\

역슬래시를 써주니 에러가 사라진다.

 

정규화한 값을 저장해주고 확인해본다.

 

 

실습 1

import pandas as pd

patient_df = pd.read_csv('data/patient.csv')

# 여기에 코드를 작성하세요.
patient_df['weight'] = (patient_df['weight'] - patient_df['weight'].min()) / \
(patient_df['weight'].max() - patient_df['weight'].min())

patient_df

 


표준화

 

 

기본 데이터

 

평균값 / 표준편차

 

계산한 값을 저장해주고 확인

 

표준화가 제대로 되었다면, 평균은 0, 표준편차는 1이 된다.

https://www.codeit.kr/tutorials/143/scientific-notation-and-fixed-point-notation

 

과학적 표기법과 고정 소수점 표기법 | 코드잇

| pandas를 사용하다 보면 숫자가 `2.424625e-17`, `6.974262e-01`... 이런 식으로 출력될 때가 있습니다. 이건 '과학적 표기법(Scientific Notation)'이라는 방법으로 숫자를 표현한 겁니다. 과학적 표기법은 숫자

www.codeit.kr

 

정리

 

실습 1

import pandas as pd

patient_df = pd.read_csv('data/patient.csv')

# 여기에 코드를 작성하세요.
patient_df['weight'] = (patient_df['weight'] - patient_df['weight'].mean()) / \
patient_df['weight'].std()

patient_df

 


cut()함수로 데이터 구간화하기

 

 

기본 데이터

 

나이 구간을 지정하기 위해 최소값과 최대값을 확인한다.

 

pd.cut()

판다스의 cut 함수를 이용해 구간을 지정해준다.

그럼 20-30, 30-40 .. 이렇게 나누어진 걸 확인할 수 있다.

 

새로운 컬럼에 저장해준다. 

 

결과를 확인해보면 NaN값이 있다.

(40.0, 50.0] 을 볼 때 괄호의 의미는 40은 포함하지 않고 50은 포함한다는 의미이다.

'(' 소괄호는 미만/초과, ']'대괄호는 이하/이상이라는 뜻이다.

그래서 20살인 환자의 나이 그룹이 NaN이 나오게 된 것이다.

 

right = False

right 파라미터의 기본값은 True고, 그 경우 위처럼 나온다. 이를 False로 바꿔주면 50이상 60미만으로 변경된다.

 

labels

labels 파라미터를 이용해서 보기 좋게 만들어줄 수도 있다.

 

실습 1

import pandas as pd
import numpy as np

patient_df = pd.read_csv('data/patient.csv')
patient_df['bmi'] = round(patient_df['weight'] / patient_df['height']**2, 1)

# 여기에 코드를 작성하세요.
bmi_max = patient_df['bmi'].max() + 1 #BMI 끝점
patient_df['obesity'] = pd.cut(patient_df['bmi'], bins=[0, 18.5, 25, 30, bmi_max], right=False, labels=['under','healthy','over','obese'])
patient_df

 


apply()

import pandas as pd

df = pd.DataFrame([[1, 9], [4, 16]], columns=['column1', 'column2'])
df

import numpy as np

np.sqrt(9)  # 출력 내용 -> 3.0

df['column2'].apply(np.sqrt)

0    3.0
1    4.0
Name: column2, dtype: float64

 

실습

patient_df = pd.read_csv('data/patient.csv')
patient_df.head()

def group_age(x):
    if x >= 10 and x < 20:
        return '10s'
    elif x >= 20 and x < 30:
        return '20s'
    elif x >= 30 and x < 40:
        return '30s'
    elif x >= 40 and x < 50:
        return '40s'
    elif x >= 50 and x < 60:
        return '50s'
    else:
        return '60s'

patient_df['age_group'] = patient_df['age'].apply(group_age)


코드잇 16. 숫자데이터 가공하기