|
1 | 1 | import pandas as pd
|
| 2 | +import numpy as np |
2 | 3 |
|
3 | 4 | data = pd.read_csv("./datasets/housing_data.csv", header=None, sep=',') # if no columns , header = None
|
4 | 5 | column_names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT',
|
5 | 6 | 'MEDV', 'isHighValue']
|
| 7 | + |
6 | 8 | data.columns = column_names
|
7 | 9 |
|
8 | 10 | # print(data.head()) # data.head() dataset 앞부분 확인
|
9 | 11 | # print(data.shape) # data.shape dataset 헹x열 확인
|
10 | 12 | # print(data.info()) # data.info() data 타입, null 값 여부 확인
|
11 |
| -# print(data.describe()) 컬럼별 기본 통계량 확인 |
12 |
| -print(data.isnull().sum()) # 컬럼별 결측치 개수 |
| 13 | +# print(data.describe()) # 컬럼별 기본 통계량 확인 |
| 14 | +# print(data.isnull().sum()) # 컬럼별 결측치 개수 |
| 15 | +# print(data.isnull().sum()/data.shape[0]) # 컬럼별 결측치 비율 확인 |
| 16 | + |
| 17 | +# 결측치 처리 - 중앙값 대치 |
| 18 | +data1 = data.copy() # Pandas의 Dataframe.copy는 기본 deepcopy이다. |
| 19 | +med_val = data['CRIM'].median() |
| 20 | +data1['CRIM'] = data1['CRIM'].fillna(med_val) |
| 21 | + |
| 22 | + |
| 23 | +# print(data1.describe()) |
| 24 | + |
| 25 | +# 결측치 처리 - CRIM column의 행들 중 결측치가 존재하는 행들 제거 |
| 26 | +# data = data.loc[data['CRIM'].notnull(), ] |
| 27 | +# print(data.describe()) |
| 28 | + |
| 29 | +# 결측치 처리 - 결측치가 존재하는 모든 행 제거 |
| 30 | +# data.dropna() # inplace option 사용할시 변경된 데이터프레임 만들지 않고 대체. |
13 | 31 |
|
14 |
| -# 결측치 처리 |
| 32 | +# 이상치 처리 - 판단 기준 IQR ( Interquartile range ) = q3 - q1 |
| 33 | +''' |
| 34 | +def get_iqr_outlier_prop(x): |
| 35 | + Q1, Q3 = data['MEDV'].quantile([0.25, 0.75]) |
| 36 | + IQR = Q3 - Q1 |
| 37 | + upper_bound = Q3 + 1.5 * IQR |
| 38 | + lower_bound = Q1 - 1.5 * IQR |
| 39 | + print(f"IQR : {IQR}") |
| 40 | + print(f"Upper bound : {upper_bound}") |
| 41 | + print(f"Lower bound : {lower_bound}") |
15 | 42 |
|
16 |
| -# 이상치 처리 |
| 43 | + print("Outlier 범위 : %.2f 초과 , %.2f 미만" % (upper_bound, lower_bound)) |
| 44 | + print("Outlier 개수 : %.0f" % len(data[(data['MEDV'] > upper_bound) | (data['MEDV'] < lower_bound)])) |
| 45 | + print("Outlier 비율 : %.2f" % (len(data[(data['MEDV'] > upper_bound) | (data['MEDV'] < lower_bound)]) / len(data))) |
17 | 46 |
|
| 47 | + return |
| 48 | +''' |
| 49 | +print(data['CRIM'].skew()) |
18 | 50 |
|
| 51 | +data['CRIM'] = np.log1p(data['CRIM']) |
| 52 | +print(data['CRIM'].skew()) |
0 commit comments