Data Analysis/visualization

[python] 데이터프레임에서 수치형 컬럼 자동 선택 후 히스토그램 한 판에 그리기! (feat. seaborn)

Woomii 2022. 4. 26. 23:46
728x90
반응형

안녕하세요, 오늘은 데이터프레임이 주어졌을 때

1. 히스토그램을 그릴 수 있는 수치형 컬럼을 자동으로 선택하고,
2. 변수 갯수에 따라 선택한 컬럼을 사용자가 설정한 배열(ex> (3 by 2) 형태의 그리드) 형태 히스토그램

으로 그릴 수 있는 코드를 공유하고자 합니다.

 

[소스코드]

# libraries & dataset
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

# input df : 여기서는 mpg dataset을 선택해서 그려보았어요
tmp_df = sns.load_dataset('mpg')
tmp_df.head()


# select numerical columns
numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
num_df = tmp_df.select_dtypes(include=numerics)
print(num_df.head(3)) # 7개 열이 선택되었습니다.


# plot multiple histogram by seaborn
sns.set(style="whitegrid")
cols = num_df.columns

# ** 사용자가 그리고자 하는 배열 형태의 열 갯수 지정!
plot_n_cols = 4 

# 사용자가 선택한 열 갯수에 따라 적합한 행 갯수 계산
#### 1) 열의 갯수가 plot_n_cols의 배수인 경우 그 값 그대로
#### 2) 아닐 경우 변수 갯수를 plot_n_cols로 나눈 몫에 1을 더해준 값으로 plot_n_rows 설정
if (len(cols) % plot_n_cols) > 0:
    plot_n_rows = int(len(cols)/plot_n_cols) + 1
else:
    plot_n_rows = int(len(cols)/plot_n_cols)
print(plot_n_rows, plot_n_cols) 

# 히스토그램을 한판에 그릴 형태 설정 (figsize는 여러번 반복 수행을 통해 잘 보이는 값으로 선택)
fig, axs = plt.subplots(plot_n_rows, plot_n_cols, figsize=(18, 7))
i, j = 0, 0
for c in cols:
    print(i, j, c)
    sns.histplot(data=num_df, x=c, kde=True, color="skyblue", ax=axs[i, j])
    if j == plot_n_cols - 1:
        i = i + 1
        j = 0
    else:
        j = j + 1

plt.show()

 

[실행결과]

    mpg  cylinders  displacement  horsepower  weight  acceleration  model_year
0  18.0          8         307.0       130.0    3504          12.0          70
1  15.0          8         350.0       165.0    3693          11.5          70
2  18.0          8         318.0       150.0    3436          11.0          70
2 4
0 0 mpg
0 1 cylinders
0 2 displacement
0 3 horsepower
1 0 weight
1 1 acceleration
1 2 model_year

2 * 4 형태 배열로 7개 변수 분포를 그린 히스토그램

 

[추가] 히스토그램의 배열 형태 바꾸기

추가로! 배열의 형태를 바꿀 경우 아래와 같이 그래프를 출력할 수도 있어요!!

# select numerical columns
numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
num_df = tmp_df.select_dtypes(include=numerics)
print(num_df.head(3))

sns.set(style="whitegrid")
cols = num_df.columns 
plot_n_cols = 3
if (len(cols) % plot_n_cols) > 0:
    plot_n_rows = int(len(cols)/plot_n_cols) + 1
else:
    plot_n_rows = int(len(cols)/plot_n_cols)
print(plot_n_rows, plot_n_cols)

fig, axs = plt.subplots(plot_n_rows, plot_n_cols, figsize=(18, 12))
i, j = 0, 0
for c in cols:
    print(i, j, c)
    sns.histplot(data=num_df, x=c, kde=True, color="skyblue", ax=axs[i, j])
    if j == plot_n_cols - 1:
        i = i + 1
        j = 0
    else:
        j = j + 1

plt.show()

위의 코드에서 바꾼 부분은

격자(그리드)의 열 갯수를 4개에서 3개로, 그에 맞추어 plt.subplots의 figsize를 (18, 12)로 세로 크기를 더 길게 수정한 것입니다.

plot_n_cols = 3
fig, axs = plt.subplots(plot_n_rows, plot_n_cols, figsize=(18, 12))

3 * 3 형태 배열로 7개 변수 분포를 그린 히스토그램

반응형