#3. 주어진 데이터에서 결측치가 80%이상 되는 컬럼은(변수는) 삭제하고, 80% 미만인 결측치가 있는 컬럼은 'city'별 중앙값으로 값을 대체하고 'f1'컬럼의 평균값을 출력하시오.
# 라이브러리 및 데이터 불러오기
import pandas as pd
import numpy as np
df = pd.read_csv('../input/bigdatacertificationkr/basic1.csv')
df.head()
# EDA - 결측값 확인
print(df.shape)
print(df.isnull().sum())
print(df.isnull().sum()/df.shape[0])
# f3 컬럼 삭제
print("삭제 전:", df.shape)
df = df.drop(['f3'], axis=1) # df.drop(columns=['f3'])
print("삭제 후:", df.shape)
# 도시 확인
df['city'].unique()
# 도시별 중앙값 계산
s=df[df['city']=='서울']['f1'].median()
k=df[df['city']=='경기']['f1'].median()
b=df[df['city']=='부산']['f1'].median()
d=df[df['city']=='대구']['f1'].median()
s, k, b, d
# k, d, b, s = df.groupby('city')['f1'].median()
# 대체 전 데이터 샘플 출력
df[18:21]
# f1결측치 city별 중앙값으로 대체
df['f1'] = df['f1'].fillna(df['city'].map({'서울':s,'경기':k,'부산':b,'대구':d}))
# 만약 그냥 f1 중앙값으로 대체 한다면
# df['f1'] = df['f1'].fillna(df['f1'].median())
# 대체 후 데이터 샘플 출력
df[18:21]
# 최종 결과 출력
print(df['f1'].mean())
1. pd.read_csv로 데이터를 불러옵니다.
2. isnull 함수와 shape 함수로 결측 비율을 확인합니다.
3. 결측치가 80% 이상인 f3 컬럼을 삭제합니다.
4. median 함수로 도시별 f1 컬럼의 중앙값을 계산합니다.
5. f1 결측치를 city별 중앙값으로 대체합니다.
6. f1 컬럼의 평균을 구합니다.
+) map 함수
Series.map(dict) 형식:
- Series 객체의 map 메서드를 사용하여, 매핑할 값들이 담긴 사전(dict)을 전달합니다.
- 이 경우에는 Series 객체의 각 요소가 dict의 키로 사용되며, 해당 키에 대응하는 값이 적용됩니다.
- 예시: df['city'].map({'서울':s, '경기':k, '부산':b, '대구':d})
map(funciton, iterable, ...) 형식:
- function: 각 요소에 적용할 함수.
- iterable: 함수가 적용될 반복 가능한 객체. 여러 개의 이터러블을 입력으로 받을 수 있습니다.
- 예시: map(lambda x: x**2, numbers)
#4. 주어진 데이터 중 train.csv에서 'SalePrice'컬럼의 왜도와 첨도를 구한 값과, 'SalePrice'컬럼을 스케일링(log1p)로 변환한 이후 왜도와 첨도를 구해 모두 더한 다음 소수점 2째자리까지 출력하시오.
# 라이브러리 불러오기
import pandas as pd
import numpy as np
# 데이터 불러오기
df = pd.read_csv("../input/house-prices-advanced-regression-techniques/train.csv")
df['SalePrice'].head()
# EDA (시험에서는 시각화 불가)
df['SalePrice'].hist()
# 'SalePrice'컬럼 왜도와 첨도계산
s1 = df['SalePrice'].skew()
k1 = df['SalePrice'].kurt()
print("왜도:" ,s1)
print("첨도:" ,k1)
# 'SalePrice'컬럼 로그변환
df['SalePrice'] = np.log1p(df['SalePrice'])
# EDA (시험에서는 시각화 불가)
df['SalePrice'].hist()
# EDA (시험에서는 시각화 불가)
df['SalePrice'].hist()
# 'SalePrice'컬럼 왜도와 첨도계산
s2 = df['SalePrice'].skew()
k2 = df['SalePrice'].kurt()
print("왜도:" ,s2)
print("첨도:" ,k2)
# 모두 더한 다음 출력
print(round(s1+s2+k1+k2,2))
- 로그 변환 전 'SalePrice'컬럼의 분포는 왜도 1.88, 첨도 6.54로 오른쪽으로 치우쳐져 있고, 극단값이 많은 분포였습니다.
- 로그 변환 후 'SalePrice'컬럼의 분포는 왜도 0.12 첨도 0.81로 대칭에 가까워지고 극단값이 거의 없습니다.
+) 왜도와 첨도
왜도 (Skewness)
- 정의: 왜도는 데이터 분포의 비대칭성을 측정합니다.
- 해석:
- 왜도 = 0: 완전히 대칭인 분포 (예: 정규 분포)
- 양의 왜도 (> 0): 오른쪽으로 꼬리가 길게 늘어진 분포 (오른쪽으로 비대칭)
- 음의 왜도 (< 0): 왼쪽으로 꼬리가 길게 늘어진 분포 (왼쪽으로 비대칭)
첨도 (Kurtosis)
- 정의: 첨도는 분포의 꼬리 두께와 극단값(outliers)의 빈도를 측정합니다.
- 해석:
- 첨도 = 3: 정규 분포와 동일한 형태 (기준: Fisher의 정의)
- 첨도 > 3: 꼬리가 두껍고, 극단값이 많은 분포 (leptokurtic, 뾰족한 분포)
- 첨도 < 3: 꼬리가 얇고, 극단값이 적은 분포 (platykurtic, 평평한 분포)
#5. 주어진 데이터에서 'f4'컬럼 값이 'ENFJ'와 'INFP'인 'f1'의 표준편차 차이를 절대값으로 구하시오
# 라이브러리 및 데이터 불러오기
import pandas as pd
import numpy as np
df = pd.read_csv('../input/bigdatacertificationkr/basic1.csv')
df.head()
# 조건에 맞는 데이터 (ENFJ, INFP)
df = df[(df['f4'] == 'ENFJ')|(df['f4'] == 'INFP')]
# 조건에 맞는 f1의 표준편차 (ENFJ, INFP)
std1 = df['f1'][df['f4'] == 'ENFJ'].std()
std2 = df['f1'][df['f4'] == 'INFP'].std()
std1, std2
# 두 표준편차 차이 절대값 출력
print(np.abs(std1-std2))
+) 사용된 통계함수 정리
왜도함수: df.skew()
첨도함수: df.kurt()
표준편차 함수: df.std()
중앙값 함수: df.median()
절대값 함수: np.abs()
참고링크
https://www.kaggle.com/code/agileteam/py-t1-3-map-expected-questions
[py] T1-3. 결측치 처리(map 활용) Expected Questions
Explore and run machine learning code with Kaggle Notebooks | Using data from Big Data Certification KR
www.kaggle.com
https://www.kaggle.com/code/agileteam/py-t1-4-expected-questions
[py] T1-4. 왜도와 첨도 구하기 (로그스케일) Expected Questions
Explore and run machine learning code with Kaggle Notebooks | Using data from multiple data sources
www.kaggle.com
https://www.kaggle.com/code/agileteam/py-t1-5-expected-questions
[py] T1-5. 조건에 맞는 데이터 표준편차 구하기 Expected Questions
Explore and run machine learning code with Kaggle Notebooks | Using data from Big Data Certification KR
www.kaggle.com
참고 링크에서 직접 문제를 풀어보실 수 있습니다.
감사합니다.
'빅데이터 분석기사' 카테고리의 다른 글
[빅데이터 분석기사] 작업형 1유형(T12~14) - 정렬, 상관계수, 다중인덱스 (0) | 2024.06.14 |
---|---|
[빅데이터 분석기사] 작업형 1유형(T9~11) - 표준화, 데이터 변환 (0) | 2024.06.14 |
[빅데이터 분석기사] 작업형 1유형(T6~8) - 값 대체, 누적합 (2) | 2024.06.13 |
[빅데이터 분석기사] 작업형 1유형(T1~2) - 이상치 (0) | 2024.06.13 |
[빅데이터 분석기사] 작업형 1유형_test (0) | 2024.06.11 |