1. 결측값(Null, NaN)
결측값은 데이터에서 값이 누락되거나 측정되지 않은 상태를 나타냅니다. 판다스에서는 NaN(Not a Number)로 표기된 것은 모두 결측값으로 취급합니다. 결측값은 데이터 분석 및 통계 모델링에서 문제를 일으킬 수 있으며, 이를 처리하는 방법은 중요합니다. 일반적인 접근법은 결측값을 다른 값으로 대체하거나 해당 행 또는 열을 삭제하는 것입니다. 또는 결측값을 예측하는 모델을 사용하여 대체할 수도 있습니다. 처리 방법은 데이터의 특성과 분석 목적에 따라 다를 수 있습니다.
- isna() / isnull() : 각 요소가 결측값인지 여부를 불리언으로 반환합니다.
df.isna()
df.isnull()
name group company gender birthday height blood brand
0 False False False False False False False False
1 False False False False False False False False
2 False True False False False False False False
3 False False False False False False False False
4 False False False False False False False False
5 False False False False False False False False
6 False False False False False False False False
7 False False False False False True False False
8 False False False False False False False False
9 False False False False False False False False
10 False False False False False True False False
11 False False False False False False False False
12 False False False False False False False False
13 False False False False False False False False
14 False False False False False False False False
한 행의 결측값만 볼 때
df['group'].isna()
0 False
1 False
2 True
3 False
4 False
5 False
6 False
7 False
8 False
9 False
10 False
11 False
12 False
13 False
14 False
Name: group, dtype: bool
df['name'][df['group'].isna()]
# 'group'이 NaN 값인 'name'열의 행
2 강다니엘
Name: name, dtype: object
df[df['group'].notnull()]
# 'group'이 notull인 행들만 출력
name group company gender birthday height blood brand
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
3 뷔 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
8 진 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442
df.loc[df['group'].notnull(), ['name', 'height', 'blood']]
=> 'group'열이 null이 아닌 행들, ['name', 'height', 'blood']열들만 출력
name height blood
0 지민 173.6 A
1 지드래곤 177.0 A
3 뷔 178.0 AB
4 화사 162.1 A
5 정국 178.0 A
6 민현 182.3 O
7 소연 NaN B
8 진 179.2 O
9 하성운 167.1 A
10 태연 NaN A
11 차은우 183.0 B
12 백호 175.0 AB
13 JR 176.0 O
14 슈가 174.0 O
2. Null값 처리하기
- Null인 정보 모두 없애기
- 평균값으로 대체해서 넣기
- 50%값으로 대체해서 넣기
평균값은 데이터가 정규분포에 가까울 때 또는 이상치가 크게 영향을 미치지 않을 때 유용하며, 중앙값은 데이터가 비대칭이거나 이상치에 민감할 때 유용합니다.
- fillna() : 결측값을 채워주는 함수. 괄호 안의 값으로 대체함. 인플레이스 연산이 아님.
- fillna(0, inplace = True) 할 경우 인플레이스 연산이 된다.
df['height'].fillna(0)
0 173.6
1 177.0
2 180.0
3 178.0
4 162.1
5 178.0
6 182.3
7 0.0
8 179.2
9 167.1
10 0.0
11 183.0
12 175.0
13 176.0
14 174.0
Name: height, dtype: float64
height = df2['height'].mean() # 175.7923076923077
df2['height'] = df2['height'].fillna(height) # 평균값 채워넣음
print(df2['height'])
0 173.600000
1 177.000000
2 180.000000
3 178.000000
4 162.100000
5 178.000000
6 182.300000
7 175.792308
8 179.200000
9 167.100000
10 175.792308
11 183.000000
12 175.000000
13 176.000000
14 174.000000
Name: height, dtype: float64
height = df2['height'].median() # 중앙값
df2['height'] = df2['height'].fillna(height)
print(df2['height'])
0 173.6
1 177.0
2 180.0
3 178.0
4 162.1
5 178.0
6 182.3
7 177.0
8 179.2
9 167.1
10 177.0
11 183.0
12 175.0
13 176.0
14 174.0
Name: height, dtype: float64
- dropna() : 결측값이 있는 행, 열 제거. 결측값이 한개라도 있는 경우 삭제. inplace 연산 아님
- dropna(axis = 1) : 결측값이 있는 열을 제거. 기본값은 axis = 0으로 생략할 경우 행 제거
df2.dropna()
name group company gender birthday height blood brand
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
3 뷔 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
8 진 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442
df2.dropna(axis=1)
name company gender birthday blood brand
0 지민 빅히트 남자 1995-10-13 A 10523260
1 지드래곤 YG 남자 1988-08-18 A 9916947
2 강다니엘 커넥트 남자 1996-12-10 A 8273745
3 뷔 빅히트 남자 1995-12-30 AB 8073501
4 화사 RBW 여자 1995-07-23 A 7650928
5 정국 빅히트 남자 1997-09-01 A 5208335
6 민현 플레디스 남자 1995-08-09 O 4989792
7 소연 큐브 여자 1998-08-26 B 4668615
8 진 빅히트 남자 1992-12-04 O 4570308
9 하성운 스타크루이엔티 남자 1994-03-22 A 4036489
10 태연 SM 여자 1989-03-09 A 3918661
11 차은우 판타지오 남자 1997-03-30 B 3506027
12 백호 플레디스 남자 1995-07-21 AB 3301654
13 JR 플레디스 남자 1995-06-08 O 3274137
14 슈가 빅히트 남자 1993-03-09 O 2925442
3. 행, 열 추가 및 삭제
- 행을 추가할 때 딕셔너리 형태의 데이터를 만들고 append()함수를 사용하여 데이터를 추가합니다.
ignore_index = True 옵션을 추가해야 에러가 발생하지 않습니다.
dic1 = {
'name' : '김사과',
'group': '과수원',
'company': 'apple',
'gender':'여자',
'birthday': '2000-01-01',
'height': 160,
'blood' : 'A',
'brand' : 12345678
}
df = df.append(dic1, ignore_index=True)
- 열을 추가할 때는 df['nation] = '대한민국' 으로 없는 열의 이름을 정의해주면 해당 열을 생성합니다.
df['nation'] = '대한민국'
df.loc[df['name']=='김사과', 'nation'] = '미국'
0 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661 대한민국
1 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027 대한민국
2 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654 대한민국
3 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137 대한민국
4 김사과 과수원 apple 여자 2000-01-01 160.0 A 12345678 미국
- 열 제거하기 drop( 열 이름 , axis = 1)
- 행 제거하기 drop( 행 인덱스 , axis = 0)
df.drop(['group','company'], axis = 1)
name gender birthday height blood brand nation
0 지민 남자 1995-10-13 173.6 A 10523260 대한민국
1 지드래곤 남자 1988-08-18 177.0 A 9916947 대한민국
2 강다니엘 남자 1996-12-10 180.0 A 8273745 대한민국
3 뷔 남자 1995-12-30 178.0 AB 8073501 대한민국
4 화사 여자 1995-07-23 162.1 A 7650928 대한민국
5 정국 남자 1997-09-01 178.0 A 5208335 대한민국
6 민현 남자 1995-08-09 182.3 O 4989792 대한민국
7 소연 여자 1998-08-26 NaN B 4668615 대한민국
8 진 남자 1992-12-04 179.2 O 4570308 대한민국
9 하성운 남자 1994-03-22 167.1 A 4036489 대한민국
10 태연 여자 1989-03-09 NaN A 3918661 대한민국
11 차은우 남자 1997-03-30 183.0 B 3506027 대한민국
12 백호 남자 1995-07-21 175.0 AB 3301654 대한민국
13 JR 남자 1995-06-08 176.0 O 3274137 대한민국
14 슈가 남자 1993-03-09 174.0 O 2925442 대한민국
15 김사과 여자 2000-01-01 160.0 A 12345678 미국
df.drop([1,3,5,15], axis = 0)
name group company gender birthday height blood brand nation
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260대한민국
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 대한민국
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 대한민국
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792 대한민국
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615 대한민국
8 진 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308 대한민국
9 하성운 핫샷 스타크루남자 1994-03-22 167.1 A 4036489 대한민국
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661 대한민국
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027 대한민국
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654 대한민국
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137 대한민국
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442 대한민국
4. 통계함수
- descibe()
describe() 함수는 판다스 데이터프레임 또는 시리즈의 간단한 통계 요약 정보를 제공하는 함수입니다. 주로 수치형 데이터의 특성을 살펴보기 위해 사용됩니다. 이 함수의 출력은 다음과 같은 통계적인 정보를 제공합니다:
- 개수(count): 데이터의 총 개수
- 평균(mean): 데이터의 평균값
- 표준편차(std): 데이터의 표준편차 (변량의 정도를 나타내는 지표)
- 최소값(min): 데이터의 최솟값
- 25%, 50%, 75% 지점의 백분위수(25%, 50%, 75%): 데이터의 분포를 나타내는 백분위수 값
- 최대값(max): 데이터의 최댓값
df.describe()
height brand
count 14.000000 1.600000e+01
mean 174.664286 6.073970e+06
std 7.006218 2.968869e+06
min 160.000000 2.925442e+06
25% 173.700000 3.815502e+06
50% 176.500000 4.829204e+06
75% 178.900000 8.123562e+06
max 183.000000 1.234568e+07
df['height'].sum() # 합계
df['height'].count() # NaN을 포함하지 않음
df['height'].mean() # 평균
df['height'].median() # 중앙값
df['height'].max() # 최대값
df['height'].min() # 최소값
df['height'].var() # 분산: 데이터가 평균으로부터 퍼져있는 정도
df['height'].std() # 표준편차 : 분산에 루트를 씌움
5. 그룹으로 묶기
- groupby() : 데이터를 그룹으로 묶어 분석할 때 사용
df.groupby('group').count()
name company gender birthdayheight blood brand nation
group
과수원 1 1 1 1 1 1 1 1
뉴이스트 3 3 3 3 3 3 3 3
마마무 1 1 1 1 1 1 1 1
방탄소년단 5 5 5 5 5 5 5 5
빅뱅 1 1 1 1 1 1 1 1
소녀시대 1 1 1 1 0 1 1 1
아스트로 1 1 1 1 1 1 1 1
아이들 1 1 1 1 0 1 1 1
핫샷 1 1 1 1 1 1 1 1
df.groupby('group').mean()
height brand
group
과수원 160.000000 1.234568e+07
뉴이스트 177.766667 3.855194e+06
마마무 162.100000 7.650928e+06
방탄소년단 176.560000 6.260169e+06
빅뱅 177.000000 9.916947e+06
소녀시대 NaN 3.918661e+06
아스트로 183.000000 3.506027e+06
아이들 NaN 4.668615e+06
핫샷 167.100000 4.036489e+06
df.groupby('gender').mean()
height brand
gender
남자 176.933333 5.716636e+06
여자 161.050000 7.145970e+06
df.groupby('group').sum()
height brand
group
과수원 160.0 12345678
뉴이스트 533.3 11565583
마마무 162.1 7650928
방탄소년단 882.8 31300846
빅뱅 177.0 9916947
소녀시대 0.0 3918661
아스트로 183.0 3506027
아이들 0.0 4668615
핫샷 167.1 4036489
✔ 혈액형별로 그룹을 맺어, 키의 평균값을 확인
df.groupby('blood')['height'].mean()
blood
A 171.114286
AB 176.500000
B 183.000000
O 177.875000
Name: height, dtype: float64
✔ 혈액형별로 그룹을 맺고, 성별로 또 그룹을 나눈 후, 키의 평균값을 확인
df.groupby(['blood', 'gender'])['height'].mean()
blood gender
A 남자 175.140
여자 161.050
AB 남자 176.500
B 남자 183.000
여자 NaN
O 남자 177.875
Name: height, dtype: float64
🔔 AB형, O형은 여자 데이터가 없고, B형에는 height가 NaN인 여자가 있음
6. 중복값 제거하기
- drop_duplicates() : 중복된 데이터를 제거 (index 값은 해당 값이 제일 처음 등장한 순서값)
- drop_duplicates(keep='last') : index 값이 해당 값이 제일 마지막에 있던 순서값
df['blood'].drop_duplicates()
0 A
3 AB
6 O
7 B
Name: blood, dtype: object
df['blood'].drop_duplicates(keep='last')
11 B
12 AB
14 O
15 A
Name: blood, dtype: object
- value_counts() : 열의 각 값에 대한 데이터의 개수를 반환. NaN은 생략
- value_counts( dropna = False) : NaN 생략하지 않고 count 함.
df['group'].value_counts()
방탄소년단 5
뉴이스트 3
빅뱅 1
마마무 1
아이들 1
핫샷 1
소녀시대 1
아스트로 1
과수원 1
Name: group, dtype: int64
df['group'].value_counts(dropna = False)
방탄소년단 5
뉴이스트 3
빅뱅 1
NaN 1
마마무 1
아이들 1
핫샷 1
소녀시대 1
아스트로 1
과수원 1
Name: group, dtype: int64
'데이터 분석' 카테고리의 다른 글
가상 쇼핑몰 데이터 예제 (0) | 2023.12.16 |
---|---|
Matplotlib (0) | 2023.12.10 |
판다스3 (0) | 2023.12.08 |
판다스1 (0) | 2023.12.05 |
넘파이 (0) | 2023.11.28 |