
EDA는 Machine Learning에서 중요한 단계임이 분명하다.
예를 들어, 어떠한 CSV 파일을 회귀 분석을 진행하고자 한다면,
각 변수 별 Correlation이 중요할 때가 분명 존재한다.
(Correlation을 고려하지 않고 분석을 진행한다면, 그 분석은 하나마나한 결과를 보이기 때문이다.)
그리고, 각 Columns, 즉 독립 변수가 몇 개가 존재하는지, 각 독립 변수가 연속형 자료인지 이산형 자료인지, 범주형 자료인지도 중요하고, histogram을 파악하는 것 역시 중요하다.
이렇게 EDA는 데이터 사이언티스트에게 있어서 굉장히 중요한 스텝 중 하나인데,
Pandas Profiling(Github)은 EDA를 한 번에, 단 코드 몇 줄로 어느정도는 해소할 수 있는 python package이다.
pandas profiling은 python package이기 때문에, 손쉽게 설치가 가능하다.
pip install pandas_profiling
💡 단, 위의 코드를 실행하기 전에 package 의존성 문제로 인해
2개의 패키지를 pandas profiling 설치 이전에 install 하는 것을 추천한다.
pip install ruamel-yaml
pip install markupsafe==2.0.1
이렇게 하면 pandas profiling 패키지 설치가 잘 될 것이다.
사용법 역시 쉽다.
jupyter notebook으로 실습해보도록 하자.
(base) bolero is in now ~/dc/ml/Regression $ ls
00_pandas_profiling_test.zip linear_test.py pandas_profiling_test.ipynb pr_report.html
BostonHousing_noNaN_forRegressor.csv ols_test.py pandas_profiling_test.py pr_report.json
(base) bolero is in now ~/dc/ml/Regression $ jupyter notebook
[I 2022-07-08 13:53:38.042 LabApp] JupyterLab extension loaded from /Users/bolero/opt/anaconda3/lib/python3.9/site-packages/jupyterlab
[I 2022-07-08 13:53:38.042 LabApp] JupyterLab application directory is /Users/bolero/opt/anaconda3/share/jupyter/lab
[I 13:53:38.046 NotebookApp] Serving notebooks from local directory: /Users/bolero/dc/ml/Regression
[I 13:53:38.046 NotebookApp] Jupyter Notebook 6.4.8 is running at:
[I 13:53:38.046 NotebookApp] http://localhost:8888/?token=f93f2c0131c92ded124ded86a54d7956b767931f601ffd5c
[I 13:53:38.046 NotebookApp] or http://127.0.0.1:8888/?token=f93f2c0131c92ded124ded86a54d7956b767931f601ffd5c
[I 13:53:38.046 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 13:53:38.054 NotebookApp]
To access the notebook, open this file in a browser:
file:///Users/bolero/Library/Jupyter/runtime/nbserver-1396-open.html
Or copy and paste one of these URLs:
http://localhost:8888/?token=f93f2c0131c92ded124ded86a54d7956b767931f601ffd5c
or http://127.0.0.1:8888/?token=f93f2c0131c92ded124ded86a54d7956b767931f601ffd5c
[W 13:53:39.612 NotebookApp] 404 GET /apple-touch-icon-precomposed.png (::1) 5.920000ms referer=None
[W 13:53:39.617 NotebookApp] 404 GET /apple-touch-icon.png (::1) 1.050000ms referer=None
terminal에 jupyter notebook을 입력하면, 현재 로컬 머신의 python interpreter를 사용하는 주피터 노트북을 켤 수 있다.
(명령어가 인식이 안되는 경우는 jupyter notebook이 설치되지 않은 경우이다.
pip install jupyter jupyter notebook로 주피터 노트북을 설치하다.)

이런 화면이 보이는데, 여기서 ipynb 노트북 파일을 생성하거나, 기존의 노트북 파일을 열어보자.

ls command로 현재 디렉토리의 파일을 살펴보니, BostonHousing_noNaN_forRegressor.csv 파일이 있다.
해당 파일을 pandas 로 열어보자.
import pandas as pd
data = pd.read_csv('BostonHousing_noNaN_forRegressor.csv')
print(data)
CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX \
0 0.00632 18.0 2.31 0 0.538 6.575 65.2 4.0900 1 296
1 0.02731 0.0 7.07 0 0.469 6.421 78.9 4.9671 2 242
2 0.02729 0.0 7.07 0 0.469 7.185 61.1 4.9671 2 242
3 0.03237 0.0 2.18 0 0.458 6.998 45.8 6.0622 3 222
4 0.02985 0.0 2.18 0 0.458 6.430 58.7 6.0622 3 222
.. ... ... ... ... ... ... ... ... ... ...
389 0.17783 0.0 9.69 0 0.585 5.569 73.5 2.3999 6 391
390 0.22438 0.0 9.69 0 0.585 6.027 79.7 2.4982 6 391
391 0.04527 0.0 11.93 0 0.573 6.120 76.7 2.2875 1 273
392 0.06076 0.0 11.93 0 0.573 6.976 91.0 2.1675 1 273
393 0.10959 0.0 11.93 0 0.573 6.794 89.3 2.3889 1 273
PTRATIO B LSTAT MEDV
0 15.3 396.90 4.98 24.0
1 17.8 396.90 9.14 21.6
2 17.8 392.83 4.03 34.7
3 18.7 394.63 2.94 33.4
4 18.7 394.12 5.21 28.7
.. ... ... ... ...
389 19.2 395.77 15.10 17.5
390 19.2 396.90 14.33 16.8
391 21.0 396.90 9.08 20.6
392 21.0 396.90 5.64 23.9
393 21.0 393.45 6.48 22.0
[394 rows x 14 columns]
CSV 파일이 잘 읽힌다!
이제 Pandas profiling package를 사용해보자.
import pandas_profiling
pr = data.profile_report() # 프로파일링 결과 리포트를 pr에 저장
pr.to_file('./pr_report.html') # pr_report.html 파일로 저장
print(pr)
Summarize dataset: 100%
196/196 [00:08<00:00, 23.64it/s, Completed]
Generate report structure: 100%
1/1 [00:01<00:00, 1.63s/it]
Render HTML: 100%
1/1 [00:01<00:00, 1.72s/it]
Export report to file: 100%
1/1 [00:00<00:00, 60.83it/s]

html이 잘 만들어 진 것 같다.
html 파일을 살펴보자.

(위의 html 파일을 더블클릭하면, 새 브라우저가 열린다.)

그러면 위처럼, Overview 부터 해서 Variables, Interactions, Correlations, Missing values, Sample 등을 살펴볼 수 있다.
위에서 언급한 6개 종류에 대해서 어떤 것들이 있는지 알아보자.

데이터셋의 개요에 해당되는 부분이다.
1) Dataset statistics
| 이름 | 의미 |
|---|---|
| Number of variables | 독립 변수의 개수 (= Columns 개수) |
| Number of observations | 행의 수 (= 관측 가능한 값의 수) |
| Missing cells(%) | 결측치 cell의 개수와 비율 |
| Duplicate rows(%) | 중복되는 행의 개수와 비율(%) |
2) Variable Types
| 이름 | 의미 |
|---|---|
| Numeric | 수치형 자료 |
| Categorical | 범주형 자료 |
그리고 Reproduction 쪽에는 pandas-profiling의 버전과
해당 profile의 생성 시간과 생성에 소요된 시간 등이 적혀있다.

💡 실제 독립 변수에 대한 정보가 나와있다.
왼쪽에 HIGH CORRELATION은 어떤 변수와 상관 정도가 높은지에 대해서 나와있고, 오른쪽에는 Mean, Max, Min, Zero 값의 개수와 비율, 결측치의 개수와 비율 등이 나와있다.
그리고 오른쪽 하단에 Toggle details 를 클릭하면

다음과 같은 정보를 볼 수 있다.
일반적인 Mean, Max, Min 뿐만 아니라,
| 이름 | 의미 |
|---|---|
| median | 중앙값 |
| Q1, Q3 | 제 1 사분위수, 제 3 사분위수 |
| IQR | 사분범위 |
| Sum | 총 합 |
| Variance | 분산 |
| CV(Coefficient of variation |
등이 있다.
CRIM(=범죄율) 변수는 범주형 자료(Categorical)가 아니고 일반적인 수치 자료이기 때문에,
통계학적인 것들(Statistics), 히스토그램(Histogram, 값의 빈도), 공통 값들(Common values), 최소값과 최대값(Extreme values) 등이 나와있다.


💡 scatter plot을 보여준다.
왼쪽이 X-axis, 오른쪽이 Y-axis에 해당된다.
색상은 blue로 되어있는데, 이건 pandas profiling 코드를 보면 아마 수정이 가능할 것이다...?

💡 변수 별 상관계수를 보여준다.
총 4개의 종류가 있다.
우측 상단에 Toggle correlation descriptions를 누르면, 각각의 종류에 대한 간략한 설명이 나와있다.


💡 결측치에 대한 통계이다.
결측치를 처리하는 방법은 2개가 있다.

여기는 그냥 Dataframe의 head 10 과 tail 10 을 보여준다.
이렇게 간략하게 pandas-profiling에 대해서 살펴보았다.
하지만, 가장 큰 문제가 있다.
지금은 독립 변수가 영어라서 잘 나오지만, 독립 변수가 한글로 이루어져 있으면 Correlation과 Missing Values 쪽에서 글자가 깨지게 된다.


이렇게.
하지만, 이건 해결 가능한 문제이다.


이렇게.
해당 정보에 대해서는 다음 포스팅을 살펴보자.