Post

데이터 탐색과 시각화

데이터 탐색과 시각화

데이터 탐색과 시각화

탐색적 데이터 분석 (EDA)

-EDA란? raw데이터를 있는 그대로 탐색하고 분석하는 기법 -이 과정에서 극단적 해석, 지나친 추론, 자의적 해석 지양 할 것!

-기본적인 EDA 코드 (seaborn, matploylib.pylot , pandas )

1
2
3
4
5
6
7
#기초 통계량 및 간단한 EDA
df = pd.read_csv  # csv 파일 불러오기
df.head()  #5개 sample 확인
df.info()  #각 컬럼의 속성 및 결측치 확인 (R에서는 보통 summary를 사용한다)
df.describe() #각 컬럼의 기초 통계 확인 
df.skew() #각 컬럼의 왜도 확인
df.kurtosis()  각 컬럼의 첨도 확인 

시각화

1
2
3
sns.distplot(df['leadtime']) #특정 변수 분포 시각화
sns.violinplot(x="hotel",y="lead_time , data=df , inner= None, color=".8")
sns.stripplot(x="hotel" , y=lead_time",data=df , size=1) # 바이올린 시각화 

공분산과 상관성 분석

-종속변수(Y)와 독립변수(X)의 관계 , 독립변수와 독립변수들 간의 관계도 확인해야한다.

1
2
3
4
sns.set(front_scale = 1.1) #폰트 크기 설정
sns.set_style('ticks') #축 눈금 설정
sns.pairplot(df,diag_kind='kde') #상관계수가 1이면 분포로 표시
plt.show()

공분산, 상관관계 시각화

1
2
3
df.cov() #공분산 확인 
df.corr(method='pearson') #피어슨 상관계수 확인 ,cov , corr 문자형 변수 제외시켜줌 
sns.heatmap(df.corr(),cmap='viridis') #히트맵으로 상관관계 시각화 

시간 시각화

-시계열 데이터를 표현하는 방법 -연속된 시간은 선그래프로 , 분절된 시간은 막대그래프로 시각화 한다. -추세선을 그릴 떄 이동평균 방법으로 추세선을 그린다

1
2
3
4
df_line['Month'] = df_line[Sales'].rolling(windows=30).mean #30일 이동평균 생성
#선그래프 시각화 
ax=df_line.plot(x='Date2',y='Sales',linewidth="0.5") 
df_line.plot(x='Date2',y='Month',color='#FF7F50,linewidth = "1",ax=ax)

비교 시각화

-히트맵을 사용해 여러 그룹과 비교 요소가 많을 때 효과적으로 시각화 할 수 있다. -히트맵 차트는 까다롭기에, 현재 가지고 있는 데이터의 구조와 자신이 확인하고자 하는 목적을 정확히 파악한 다음 차트를 그려야 함.

  • 방사형 차트도 비교 시각화에 용이함

  • 평행좌표 그래프를 통한 그룹별 요소 비교 시각화(전략 캔버스)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#방사형 차트 - 하나씩 시각화
labels = df.columns[1:]
num_labels = len(labels)
#등분점 생성
angles = [x/float(num_labels)*(2*pi)for x in range(num_labels)]
angles += angles[:1] #시작점 생성
my_palette =plt.cm.get_cmap("Set2",len(df3.index))
fig = plt.figure(figsize=(15,20))
fig.set_facecolor('white')

for i, row in df3.iterrows():
color = my_palette(i)
data= df3.iloc[i].drop('Tm').tolist()
data+=data[:1]

ax=plt.subplot(3,2,i+1,polar=True)

#시작점 설정
ax.set.theta_offset(pi/2)
#시계방향 설정
ax.set_theta_direction(-1)
#각도 축 눈금 생성
plt.xticks(angles[:-1],labels,fontsize=13)
#각 축과 눈금 사이 여백 생성
ax.tick_params(axis='x',which='major',pad=15)
#반지름  축 눈금 라벨 각도 0으로 설정
ax.set_rlable_position(0)
#반지름 축 눈금 설정
plt.yticks([0,5,10,15,20],['0','5','10','15','20'], fontsize=10)
plt.ylim(0,20)

#방사형 차트 출력 
ax.plot(angles,data,color=color , linewidth=2 , linestyle = 'solid')
#도형 안쪽 색상 설정
ax.fill(angles,data,color=color , alpha=0.4)
#각 차트의 제목 생성
plt.title(row.Tm , size = 20 , color = color , x=-0.2 , y=1.2 , ha = 'left')

#차트간 간격 설정
plt.tight_layout(pad=3)
plt.show()

분포 시각화

-데이터를 파악하는데 있어서 변수들이 어떤 요소로 어느 정도의 비율로 구성 되어있는지 확인 하는 단계 -연속형 변수,명목형 변수를 구분해서 그린다 -연속형 변수는 막대그래프, 선그래프, 히스토그램 등을 사용 -명목형 변수는 파이차트나 도넛차트를 사용 -트리맵,와플차트도 사용

관계 시각화

-연속형 변수간의 관계는 산점도로 나타냄 -산점도를 그릴 때, 극단치를 없애는 것이 좋음. 시각화의 효율을 극대화 시키기 위해서 -산점도는 두개의 변수간 관계만 표현 -여러개의 변수간의 관계는 버블 차트 이용. -버블차트에 색상,농도 등 표현가능, 그러나 해석의 어려움이 생길 수도 있음. -버블차트는 원의 면적을 함께 봐야 하기 떄문에 관측치가 너무 많게 되면 정보 전달의 효율이 떨어진다. -버블차트를 해석할 때는 원의 지름이 아닌 면적을 통해 크기를 판단하도록 주의해야한다. 지름이 2배 크면 실제 크기는 4배가 큰 것임.

1
2
3
4
5
#간단한 scatter 코드 
plt.scatter(df[R&D Spend],df['Profit'],s=50, alpha=0.4)
ax=sns.lmplot(x='R&D Spend',y='Profit' , data=df)
plt.show()

1
2
3
4
5
6
#버블 차트 시각화
# 네가지 요소의 정보를 포함한 산점도 시각화 코드 

plt.scatter(df['R&D Spend'],df['Profit'],s=df['Marketing Spend']*0.001,c-df['Administration'],alpha=0.5,cmap='Spectral')
plt.colorbar()
plt.show()

공간 시각화

-공간시각화는 위치 정보인 위도와 경도 데이터를 지도에 매핑하여 시각적으로 표현한다.

-공간시각화의 대표적인 기법으로 도트맵,코로플레스맵,버블맵,컨넥션맵 등이 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#기본 지도 시각화(서울의 위도, 경도 입력)
m=folium.Map(location=[37.541,126.986],zoom_start=12)
m

#지도 형태 변경
m=folium.Map(location[37.541,126.986],tiles='Stamen Toner',zoom_start=12)

#원하는 좌표에 반경(radius) 표시(남산)
folium.CircleMarket([37.5538,126.9810],radius=50)
                        popup='Laurelhurst Park' , 
                        color = '#3246cc',
                        fill_color='#3246cc').add_to(m)
#원하는 좌표에 포인트 표시 (남산)
folium.Marker([37.5538,126.126.9810],popup='The Waterfront').add_to(m)

m

박스 플롯

-상자 수염 그림(Box-and-Whisker Plot)은 양적 척도 데이터의 분포 및 편향성, 평균과 중앙값 등 다양한 수치를 보기 쉽게 정리 해줌

-특히, 두 변수의 값을 비교할 때 효과적

``` #기본 박스 플롯 시각화

#새로 박스 플롯 plt.figure(figsize=(8,6)) sns.boxplot(y=’Profit’,data=df) plt.show()

#가로 박스 플롯 plt.figure(figsize = (8,2)) sns.boxplot(x=’Profit’,data=df) plt.show()

#그룹별 박스 플롯 시각화 plt.figure(figsize=(8,5)) sns.boxplot(x=’state’,y=’Profit’,data=df) plt.show()

#박스플랏에 추가 옵션 적용 #평균,데이터 포인트 포함한 박스 플롯 시각화 sns.boxplot(x=”State”,y=”Profit”,showmeans=True,boxprops={‘facecolor’:’None’}),data=df) sns.stripplot(x=’State,y=’Profit’,data=df,jitter=True,marker=’o’,alpha=0.5,color=’black’) plt.show()

This post is licensed under CC BY 4.0 by the author.