Just Fighting

[EDA] 데이터 내용 살펴보기 본문

Python

[EDA] 데이터 내용 살펴보기

yennle 2022. 7. 17. 14:35
728x90

https://kevinprinsloo.medium.com/advanced-eda-e6fea0193dbd

 

Advanced_EDA

Becoming inherently familiar with a new dataset can be challenging and time consuming. However, an in-depth and broad exploratory data analysis (EDA) can help a lot to understand your dataset, get a…

kevinprinsloo.medium.com

 

 

2022.07.17 - [Python] - [EDA] 데이터 정제하기

데이터를 정제한 뒤 완성된 데이터를 이제 살펴보자.

 

 

모든 수치형 컬럼의 히스토그램을 한번에 그릴 수 있다.

# 수치형 피쳐의 히스토그램 그리기
df_X.hist(bins=25, figsize=(15, 25), layout=(-1, 5), edgecolor="black")
plt.tight_layout()

 

 

각 컬럼마다 가장 많이 나오는 값을 구하고, 그 값의 비율을 구한 뒤

테이블로 시각화를 할 수 있다.

# 각 컬럼에서 가장 많이 나오는 값을 리턴. mode()
most_frequent_entry = df_X.mode()

# mode()를 통해 얻은 값과 같은지 확인 eq()
df_freq = df_X.eq(most_frequent_entry.values, axis=1)

# 같은 값이 얼마나 있는지 비율 확인
df_freq = df_freq.mean().sort_values(ascending=False)

# 상위 5개 출력
display(df_freq.head())

# 테이블 시각화
df_freq.plot.bar(figsize=(15, 4));

 

 

시각화를 통해 데이터의 특징을 식별할 수 있다.

아래 4개의 컬럼을 시각화했다. 

위에 두 컬럼은 값의 변동이 있는 것으로 보아 연속적인 값을 가진 컬럼이라고 볼 수 있고,

아래 두 컬럼은 이산적인 값을 가지는 컬럼인 것을 확인할 수 있다.

df_X[["Location_Northing_OSGR", "1st_Road_Number",
      "Journey_Purpose_of_Driver", "Pedestrian_Crossing-Physical_Facilities"]].plot(
    lw=0, marker=".", subplots=True, layout=(-1, 2), markersize=0.1, figsize=(15, 6));

 

 

이번에는 연속적인 값을 가지는 컬럼만 필터링해

각 컬럼들 사이에 어떤 관계가 있는지 확인해보자.

# 수치형 컬럼 중에 다른 값이 25개 이상인 컬럼
cols_continuous = df_X.select_dtypes(include="number").nunique() >= 25

# 수치형 컬럼만 따로 추출
df_continuous = df_X[cols_continuous[cols_continuous].index]
df_continuous.shape

sns.pairplot(df_continuous, height=1.5, plot_kws={"s": 2, "alpha": 0.2});

 

 

이번엔 3가지의 변수의 관계를 한번에 볼 수 있는 그래프를 그려보자.

y는 Latitude로 고정하고 3개의 변수에 대해 각각의 그래프를 그릴 수 있다.

이 때, hue를 'Police_Force'로 설정하여 변수들 사이에 어떤 관계가 있는지 확인할 수 있다.

(첫번째 그래프가 안그려진다,,,,)

g = sns.pairplot(
    df_X, plot_kws={'s': 3, 'alpha': 0.2}, hue='Police_Force', palette='Spectral',
    x_vars=['Location_Easting_OSGR', 'Location_Northing_OSGR', 'Longitude'],
    y_vars='Latitude');
g.fig.set_size_inches(15,8)

 

 

또한, 연속형 컬럼과 범주형 컬럼들의 관계도 그려볼 수 있다.

몇개의 컬럼만 선택해서 그림을 그려보았다.

# 원하는 피쳐만 시각화
selected_features = ["Vehicle_Reference_df_res", "Towing_and_Articulation",
                     "Skidding_and_Overturning", "Bus_or_Coach_Passenger",
                     "Pedestrian_Road_Maintenance_Worker", "Age_Band_of_Driver"]

# Create a figure with 3 x 2 subplots
fig, axes = plt.subplots(ncols=3, nrows=2, figsize=(16, 8))

# Loop through these features and plot entries from each feature against `Latitude`
for col, ax in zip(selected_features, axes.ravel()):
    sns.stripplot(data=df_X, x=col, y=df_X["Latitude"], ax=ax,
                  palette="tab10", size=2, alpha=0.5)
plt.tight_layout();

 

 

그리고 명목형 변수를 하나 더 추가하여 바이올린 플랏도 그려볼 수 있다.

# Create a figure with 3 x 2 subplots
fig, axes = plt.subplots(ncols=3, nrows=2, figsize=(16, 8))

# Loop through these features and plot entries from each feature against `Latitude`
for col, ax in zip(selected_features, axes.ravel()):
    sns.violinplot(data=df_X, x=col, y=df_X["Latitude"], palette="Set2",
                   split=True, hue="Urban_or_Rural_Area", ax=ax)
plt.tight_layout();

 

 

마지막으로 변수들 사이의 상관관계를 알아볼 수 있는 그림을 그려보자.

먼저 상관계수를 구하고, 그것을 표현하면 된다.

# 피어슨 상관계수
df_corr = df_X.corr(method="pearson")


# Create labels for the correlation matrix
labels = np.where(np.abs(df_corr)>0.75, "S",
                  np.where(np.abs(df_corr)>0.5, "M",
                           np.where(np.abs(df_corr)>0.25, "W", "")))

# Plot correlation matrix
plt.figure(figsize=(15, 15))
sns.heatmap(df_corr, mask=np.eye(len(df_corr)), square=True,
            center=0, annot=labels, fmt='', linewidths=.5,
            cmap="vlag", cbar_kws={"shrink": 0.8});

 

 

728x90

'Python' 카테고리의 다른 글

datetime 함수 정리  (0) 2022.10.20
[Python] Joblib으로 객체 저장하기  (0) 2022.09.29
[EDA] 데이터 정제하기  (0) 2022.07.17
[EDA] 데이터 구조 살펴보기  (0) 2022.07.17
[Flask] API 서버 구축하기 & httpie 사용하기  (0) 2022.07.01
Comments