본문 바로가기
독서

데이터분석 연습

by _><- 2022. 6. 6.
반응형
# 한글이 포함된 경우 오류발생 시 인코딩 설정
 
x_train = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/x_train.csv', encoding='CP949')
y_train = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/y_train.csv', encoding='CP949')
x_test = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/x_test.csv', encoding='CP949')


# 컬럼명 확인
컬럼이 많은 경우 transpose(), T 함수를 활용하여 컬럼을 가로/세로 변경 후 조회
또는 pandas 옵션 설정
pd.options.display.max_columns = None

# 행/열 확인
shape 명령어 사용

# 요약정보 확인
info() 함수 사용
- 데이터 중 결측치가 있는지 체크
- 숫자형인지 범주형인지 타입 확인

# 기초통계량 확인
describe() 함수 사용
- 데이터의 범위 확인을 통해 데이터 스케일링이 필요한지 파악
특정 데이터가 왜곡되지 않도록 동일한 범위로 변환 필요

# 불필요한 컬럼 삭제
drop() 함수 이용

x_test_cust_id = x_test['cust_id']
x_train = x_train.drop(columns = ['cust_id'])
y_train = y_train.drop(columns = ['cust_id'])
x_test = x_test.drop(columns = ['cust_id'])
 
 
 
# 결측치 제거
 
print(x_train.info())
 
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3500 entries, 0 to 3499
Data columns (total 10 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   cust_id  3500 non-null   int64  
 1   총구매액     3500 non-null   int64  
 2   최대구매액    3500 non-null   int64  
 3   환불금액     1205 non-null   float64
 4   주구매상품    3500 non-null   object 
 5   주구매지점    3500 non-null   object 
 6   내점일수     3500 non-null   int64  
 7   내점당구매건수  3500 non-null   float64
 8   주말방문비율   3500 non-null   float64
 9   구매주기     3500 non-null   int64  
dtypes: float64(3), int64(5), object(2)
memory usage: 273.6+ KB
None


숫자 0으로 결측치 대체 후 isnull() 함수로 확인

x_train['환불금액'] = x_train['환불금액'].fillna(0)
x_test['환불금액'] = x_test['환불금액'].fillna(0)
print(x_train['환불금액'].isnull().sum())
print(x_test['환불금액'].isnull().sum())
 
 

# 범주형 변수 인코딩하기
unique() 함수로 인코딩 전에 데이터의 값과 .siez값으로 개수를 확인

print(x_train['주구매상품'].unique())
print(x_train['주구매상품'].unique().size)
 
 

- 데이터의 종류가 많은 경우에는 라벨 인코딩이 효율적

from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
x_train['주구매상품'] = encoder.fit_transform(x_train['주구매상품'])
print(x_train['주구매상품'])
0        5
1       21
2        6
3        5
4       15
        ..
3495     3
3496    22
3497    32
3498    41
3499     5
Name: 주구매상품, Length: 3500, dtype: int64


- 숫자와 매핑된 값은 classes_ 키워드로 확인

print(encoder.classes_)
['가공식품' '가구' '건강식품' '골프' '구두' '기타' '남성 캐주얼' '남성 트랜디' '남성정장' '농산물' '대형가전'
 '디자이너' '란제리/내의' '명품' '모피/피혁' '보석' '생활잡화' '섬유잡화' '셔츠' '소형가전' '수산품' '스포츠'
 '시티웨어' '식기' '아동' '악기' '액세서리' '육류' '일용잡화' '젓갈/반찬' '주류' '주방가전' '주방용품'
 '차/커피' '축산가공' '침구/수예' '캐주얼' '커리어' '통신/컴퓨터' '트래디셔널' '피혁잡화' '화장품']



# 파생변수 만들기
condition 변수를 활용하여 조건에 맞는 경우와 맞지 않는 경우로 파생변수 생성

condition = x_train['환불금액'] > 0
x_train.loc[condition, '환불금액_new'] = 1
x_train.loc[~condition, '환불금액_new'] = 0
print(x_train[['환불금액','환불금액_new']])
 
           환불금액  환불금액_new
0     6860000.0       1.0
1      300000.0       1.0
2           0.0       0.0
3           0.0       0.0
4           0.0       0.0
...         ...       ...
3495        0.0       0.0
3496  6049600.0       1.0
3497        0.0       0.0
3498        0.0       0.0
3499  5973000.0       1.0

[3500 rows x 2 columns]


# 데이터 범위 표준화 하기
describe()로 데이터의 범위를 확인

	총구매액	최대구매액	환불금액	주구매상품	주구매지점	내점일수	내점당구매건수	주말방문비율	구매주기	환불금액_new
count	3.500000e+03	3.500000e+03	3.500000e+03	3500.000000	3500.000000	3500.000000	3500.000000	3500.000000	3500.000000	3500.000000
mean	9.191925e+07	1.966424e+07	8.289786e+06	14.612000	10.734286	19.253714	2.834963	0.307246	20.958286	0.344286
std	1.635065e+08	3.199235e+07	3.010204e+07	13.019947	5.636480	27.174942	1.912368	0.289752	24.748682	0.475203
min	-5.242152e+07	-2.992000e+06	0.000000e+00	0.000000	0.000000	1.000000	1.000000	0.000000	0.000000	0.000000
25%	4.747050e+06	2.875000e+06	0.000000e+00	5.000000	8.000000	2.000000	1.666667	0.027291	4.000000	0.000000
50%	2.822270e+07	9.837000e+06	0.000000e+00	9.000000	9.000000	8.000000	2.333333	0.256410	13.000000	0.000000
75%	1.065079e+08	2.296250e+07	2.642250e+06	22.000000	15.000000	25.000000	3.375000	0.448980	28.000000	1.000000
max	2.323180e+09	7.066290e+08	5.637530e+08	41.000000	23.000000	285.000000	22.083333	1.000000	166.000000	1.000000


- StandardScaler 함수 호출

from sklearn.preprocessing import StandardScaler 
scaler = StandardScaler()
x_train = pd.DataFrame(scaler.fit_transform(x_train), columns = x_train.columns)
print(x_train)

표준화한 후 값의 타입이 변경되기 때문에 DataFrame으로 변경하고
columns의 값도 다시 설정해 준다.

          총구매액     최대구매액      환불금액     주구매상품     주구매지점      내점일수   내점당구매건수  \
0    -0.144580 -0.262608 -0.047505 -0.738357 -1.904703 -0.009338  0.554247   
1    -0.549190 -0.547967 -0.265461  0.490702  1.466677 -0.635003 -0.698168   
2    -0.542700 -0.563504 -0.275429 -0.661541 -1.727262 -0.635003 -0.436675   
3    -0.463911 -0.460465 -0.275429 -0.738357 -1.549821 -0.046142 -0.204236   
4    -0.384561  0.135544 -0.275429  0.029805 -0.485175 -0.635003 -0.698168   
...        ...       ...       ...       ...       ...       ...       ...   
3495 -0.542833 -0.519615 -0.275429 -0.891990 -0.485175 -0.671807 -0.436675   
3496 -0.381022 -0.389656 -0.074430  0.567518 -0.307733 -0.414180 -0.632794   
3497 -0.561796 -0.612398 -0.275429  1.335680  1.821559 -0.671807 -0.959661   
3498 -0.550786 -0.583480 -0.275429  2.027026 -0.485175 -0.635003 -0.959661   
3499  1.047094  0.467921 -0.076975 -0.738357 -0.485175  0.689936 -0.216470   

        주말방문비율      구매주기  환불금액_new  
0     0.758623 -0.159962  1.380060  
1    -1.060530 -0.806554  1.380060  
2    -1.060530 -0.806554 -0.724606  
3     0.037746 -0.200374 -0.724606  
4    -1.060530  2.588052 -0.724606  
...        ...       ...       ...  
3495  2.391196 -0.846966 -0.724606  
3496  0.532574  0.769513  1.380060  
3497 -1.060530 -0.846966 -0.724606  
3498 -1.060530  0.729101 -0.724606  
3499  0.552777 -0.523670  1.380060  

[3500 rows x 10 columns]


표준화를 하기위해서는 범주형 변수를 먼저 인코딩해야한다.
표준화 후 std값이 1에 가까워진 것을 확인할 수 있다.

           count          mean       std       min       25%       50%  \
총구매액      3500.0 -1.516247e-17  1.000143 -0.882909 -0.533218 -0.389621   
최대구매액     3500.0 -1.766841e-17  1.000143 -0.708278 -0.524864 -0.307219   
환불금액      3500.0 -7.168115e-16  1.000143 -0.275429 -0.275429 -0.275429   
주구매상품     3500.0  8.564578e-19  1.000143 -1.122438 -0.738357 -0.431093   
주구매지점     3500.0 -5.034068e-17  1.000143 -1.904703 -0.485175 -0.307733   
내점일수      3500.0  2.242968e-16  1.000143 -0.671807 -0.635003 -0.414180   
내점당구매건수   3500.0  2.902440e-18  1.000143 -0.959661 -0.611003 -0.262346   
주말방문비율    3500.0  4.038040e-17  1.000143 -1.060530 -0.966329 -0.175472   
구매주기      3500.0 -1.208874e-16  1.000143 -0.846966 -0.685318 -0.321610   
환불금액_new  3500.0  2.988086e-16  1.000143 -0.724606 -0.724606 -0.724606   

               75%        max  
총구매액      0.089237  13.648260  
최대구매액     0.103110  21.475852  
환불금액     -0.187640  18.455314  
주구매상품     0.567518   2.027026  
주구매지점     0.756913   2.176441  
내점일수      0.211486   9.780490  
내점당구매건수   0.282432  10.066639  
주말방문비율    0.489224   2.391196  
구매주기      0.284570   5.861421  
환불금액_new  1.380060   1.380060


# 상관관계 확인
corr() 함수를 활용
금액이라고 표시된 3개의 컬럼간의 관계 확인

print(x_train[['총구매액','최대구매액','환불금액_new']].corr())
 
              총구매액     최대구매액  환불금액_new
총구매액      1.000000  0.700080  0.403357
최대구매액     0.700080  1.000000  0.330687
환불금액_new  0.403357  0.330687  1.000000

총구매액과 최대구매액은 70%의 상관관계를 가지고 있어서 '최대구매액' 칼럼은 삭제 (다중공선성 제거)
60% 이상이면 강한 상관관계를 갖는다는 의미

# 다중공선성
통계학회귀분석에서 독립변수들 간에 강한 상관관계가 나타나는 문제
- 해결법 :

  1. 상관관계가 높은 독립변수중 하나 혹은 일부를 제거한다.
  2. 변수를 변형시키거나 새로운 관측치를 이용한다.
  3. 자료를 수집하는 현장의 상황을 보아 상관관계의 이유를 파악하여 해결한다.
  4. 주성분 분석(PCA,Principle Component Analysis)를 이용한 diagonal matrix의 형태로 공선성을 없애준다.

참고 : https://ko.wikipedia.org/wiki/%EB%8B%A4%EC%A4%91%EA%B3%B5%EC%84%A0%EC%84%B1

다중공선성 - 위키백과, 우리 모두의 백과사전

ko.wikipedia.org

# 데이터 학습시키기
DecisionTreeClassifier 분류기 활용

from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier()
model.fit(x_train, y_train)
y_test_predict = model.predict(x_test)

print(type(y_test_predict))
<class 'numpy.ndarray'>​

학습 후 예측된 predict의 결과는 데이터 프레임 형태가 아님

y_test_predict = pd.DataFrame(y_test_predict)
 
 

# 하이퍼파라미터 튜닝
보다 정확한 성능을 가진 모델 생성을 위해 직접 추가정보 전달하는 방법

from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier(max_depth=10, criterion='entropy', random_state=10)
model.fit(x_train, y_train)
y_test_predict = model.predict(x_test)
y_test_predict = pd.DataFrame(y_test_predict)


- 여러 하이퍼파라미터 중 가장 좋은 성능의 조합을 찾는 경우 GridSearchCV() 함수 사용 가능
//하이퍼 파라미터 튜닝
from sklearn.model_selection import GridSearchCV
// 병렬처리
from sklearn.pipeline import Pipeline
파라미터변수에 여러가지 값들을 저장
파이프라인 모델 생성하고 조합할 파라미터 세트를 주입
모델 학습시키고 최적의 파라미터 추출

# 결과 예측하기
성별은 0 또는 1로 결정이 필요하기 때문에
predict_proba() 함수 이용

y_test_proba = model.predict_proba(x_test)
print(pd.DataFrame(y_test_proba).head())
 
 
          0         1
0  0.000000  1.000000
1  0.921569  0.078431
2  1.000000  0.000000
3  0.473333  0.526667
4  0.517544  0.482456
result = pd.DataFrame(y_test_proba)[1]
print(result)


# 모델 평가하기
분류모델을 roc_auc_score로 평가

y_train_predicted = model.predict(x_train)
from sklearn.metrics import roc_auc_score
print(roc_auc_score(y_train, y_train_predicted))



# 결과 제출
컬럼을 병합하기 위해 concat()함수 사용
axis = 1이면 컬럼, axis = 0은 행 기준 병합

pd.concat([x_test_cust_id, result], axis = 1)
 
cust_id	1
0	3500	1.000000
1	3501	0.078431
2	3502	0.000000
3	3503	0.526667
4	3504	0.482456
...	...	...
2477	5977	0.115385
2478	5978	0.538194
2479	5979	0.000000
2480	5980	0.583333
2481	5981	0.402439
2482 rows × 2 columns

컬럼명 변경

pd.concat([x_test_cust_id, result], axis = 1).rename(columns = {1:'genger'})
 
	cust_id	genger
0	3500	1.000000
1	3501	0.078431
2	3502	0.000000
3	3503	0.526667
4	3504	0.482456
...	...	...
2477	5977	0.115385
2478	5978	0.538194
2479	5979	0.000000
2480	5980	0.583333
2481	5981	0.402439
2482 rows × 2 columns


# 파일로 저장

final = pd.concat([x_test_cust_id, result], axis = 1).rename(columns = {1:'genger'})
final.to_csv('/content/drive/MyDrive/Colab Notebooks/result.csv', index=False)

index는 제외하고 저장


# 파일 검증

final = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/result.csv')
 
print(final)
      cust_id    genger
0        3500  1.000000
1        3501  0.078431
2        3502  0.000000
3        3503  0.526667
4        3504  0.482456
...       ...       ...
2477     5977  0.115385
2478     5978  0.538194
2479     5979  0.000000
2480     5980  0.583333
2481     5981  0.402439

[2482 rows x 2 columns]
반응형

'독서' 카테고리의 다른 글

전처리 연습  (0) 2022.06.18
힘들고 배고픔의 가치  (0) 2022.06.16
유니크한 값 구하기  (0) 2022.06.06
StandardScaler  (0) 2022.06.06
빈도값 구하기  (0) 2022.06.05