데이터 탐색과 시각화
데이터 탐색과 시각화
탐색적 데이터 분석 (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()