5 Tue
Review and TIL
Review about AI School
한달이 조금 넘게 진행해온 AI School. 오늘은 이에대한 전반적인 리뷰를 남기고 싶다. 솔직하게 표현한 것이며 그래서 교육자님이 불편할 수는 있다. 하지만 그런 의사를 보내려는 의도는 전혀 없다.
선형대수 김준호 교수님
난 듣기 좋았다. 후반에 갈수록 조금 어렵긴 했는데, 각각의 설명이 등장하는 방식이 어떠한 원리에서 전개되어 발전하는 과정이어서 재미있었다. 비유하자 마치 위인전의 서사까. 아쉬운 점은 AI와의 관련성은 그다지 많지 않았다는 점. 난 이 지식이 무엇인지도 궁금하지만 어떻게 쓰이는 지도 궁금하다. 그게 더 흥미롭고 내가 나중에 해당 지식을 쓸 때도 더 기억에 남을 것 같다. 어쨋든, 내가 대학생 때 배운 수학 수업이 이정도였다면 수학을 좀 더 잘했을지도 모르겠다.
통계학 이상환 교수님
이 때는 좀 주춤했다. 보통 학생들은 나열식 설명에 지루함을 느끼는데, 그런 느낌이었다. "AI에서 다루는 수학 지식은 이정도이고 이 정도만 커버하면 될거야" 라는 느낌으로 배운 나열식 수업. 초반 내용은 쉬워서 들을만 했는데 중후반 내용부터 좀 많이 지루하고 어려웠다.
데이터 분석 이호준 멘토님
상당히 만족스러웠다. 나뿐만 아니고 다들 그럴듯. 쥬피터를 사용한 점, 모든 코드에 대해 알기 쉽게 설명하는 점, 단골만 웃는다는 개그. 물론 교육에 있어서 코드를 사용하니까 좀 더 재미있지만 그래도 난 되게 이해하려고 노력하면서 들었다. 3주차 수업은 재미도 있었고 제일 기억에 남고 제일 내것으로 만든 강의인 것 같다.
4주차 수업은 난이도가 어려웠다. 아무래도 좀 내 수준이 평균 아니면 그 이하여서 그런걸까. 심지어 보너스 과제는 너무 어려워서 좀 곤혹을 겪었다. 원래 보너스 과제도 과제라고 생각하고 하는편인데 일주일 넘게 못해서 그냥 포기했다. 전반적으로 기본을 충실히 쌓는 배움 방식을 추구하는 나로써는 궁금한게 너무 많고 찾는 시간도 꽤 많아서, 가볍게 배운 것에 대해 과제를 해결하는게 마음이 여간 불편하기도 했다. 보너스 과제만 제외하면 재미있는 수업이었다.
AWS 오성우 멘토님
좀 힘들었던 강의이다. 아직도 수강도 다 못했다. 강의 자료는 잘 안보여서 그림판에 캡쳐해서 확대해가면서 진행했고 소리도 너무 작았다. 그리고 제일 불편한 건 강의 진행이 너무 간단하고 생략이 많았다. "이 버튼은 어디쪽에 어디 항목에 있고" 의 설명이 아닌 "그리고 이 버튼을 누르시면 여기로 가집니다" 의 설명이라서 중간에 강의를 되게 많이 멈추고 다시 돌려보았다. 그리고 코드 진행하면서 문제가 너무 많이 발생해서 구글링 하는 시간이 너무 많았다. 원래 이럴 때 제일 졸리고 답답한 사실. (마치 수학문제가 안풀리는 느낌이랄까) 그러다가 git clone도 안되는 사태가 벌어졌다. (아니 이 간단한게 도대체 왜 안되지) AWS에서도 막혀가지고 검색도 해보고 멘토님께 질문도 하면서 새로 EC2를 다 만들고 진행했는데도 되지 않아서 다음 장으로 못넘어갔다. 내가 수업 진도를 나갔냐 못나갔냐도 중요하겠지만 수업이 만족스럽지는 않았다. 여러 가지 에러처리를 좀 다뤄주고 지시 사항이 좀 더 자세하면 좋을 것 같다.
좀 부정적인 강의로 인상이 남은 건 실제 비용이 발생해서이다. 나는 AWS를 처음 사용했고 AWS가 너무 활용하기 어려웠는데(너무 난잡한 인터페이스라고 생각), 비용이 발생해서 놀랐고 이걸 왜 강의 초반에 언급해주지 않았을까 하는 언짢음이 올라왔다. 검색해가면서 인스턴스를 취소하고 리소스 취소하고 했는데도 하루하루 지날 때 마다 비용이 늘어나서 계속 기분이 안좋았다. 1주일 동안 계속 없애도 비용이 계속 발생해서 여러 지인에게 도움을 요청했고 그래도 해결하지 못한채 비용이 발생해서 고객센터에 문의했다. 정상적으로 환불 처리가 되었고 기분은 좋지 않았다. 이 강의를 듣고 AWS에 대한 이미지도 좀 부정적으로 된 것 같다. 좀 아쉬운 강의이다.
ML 기초 강창성교수님
머신러닝의 전반적인 이야기가 수학에 가려질까 수학을 빼고 쉽게 설명해주는 책이 있다. 그리고 강의에서 하신 이야기처럼 머신러닝에서 수학이 중요하기에 빼고 설명하는 것을 추천하지는 않는다라는 말도 공감한다. 근데, "이 수학이 어떻게 어떤 모델에서 어떻게 쓰이며, 이 지식은 어떻게 활용할 수 있다" 를 강의해주지 않아서 아쉬운 것 같다. 단편적이고 성급한 평가일 지 모르지만, 대개 교육자의 교육 방식은 모든 수업에서 거의 동일하기에 앞으로의 수업이 지루할 것 같고 무섭다. 오늘 배운 이 지식들을 잘 담아놓은 학생이 몇이나 있을까. 좀 지루하구 난해했다.
수학 공부가 아니라 머신 러닝을 위한 수학 공부라면(난 그래도 수학 공부도 마찬가지라고 생각한다) 좀 더 서로간에 연결성을 언급하면서 쉬운 설명이 필요했다고 생각한다. 오늘 강의는 페이지1장 설명, 페이지2장 설명에 그치지 않았던 것 같다.
ML 강의도 수학처럼 비슷한 분위기가 나지 않을까 걱정되지만 기대는 한다.
+ (01 / 08 추가)
아아.. 수업을 다 듣고 후기를 남겨본다.
첫번째. 일단 교육자의 교육 방식은 모든 수업에서 거의 동일하다는 불변이다. 첫수업은 난해하고 지루했는데 그 기류가 마지막 수업까지 이어졌다.
두번째. 강사님만 전문적이라고 생각한다. 전문적인 지식 전달에 있어서 적어도 내 수준으로는 굉장히 어렵다. 어려운 이유는 배경 지식이 부족해서 일수도 있겠지만 설명에 생략이 많고 좀 더 어려운 지식이 등장하더라도 추가적인 설명이 많이 없다. 또, 쥬피터를 통한 실습에서는 이 코드를 치면 됩니다 하고 넘어가니. 영상을 멈춰놓고 코드를 작성하면서도 모르는 코드도 많아서 일일이 검색하면서 실습했다. (누구는 이것이 공부라고 하겠지만, 전반적인 수업 내용을 다 검색해야 한다고?)
세번째. 머신러닝 강의에 첫주를 온통 수학으로 보낸걸 보면 그래도 수학이 꽤 중요하구나 라는 걸 강조하시는 것 같다. 나는 지금까지 수학을 다루는 책들을 많이 읽어보았지만 도중에 읽지 못하고 포기를 많이 했는데, 다시 한번 수학을 배워야 될 것 같다는 다짐을 했음.
스쿨 리뷰
대체로 코드 수업을 할 때는 그렇지 않은데. 수학 수업을 할 때에는 필기가 너무 오래걸린다. AI 스쿨에 대해 TIL을 쓰기를 권장하면서 저작권 때문에 단순한 수학 식정도도 캡쳐하지 못하게 한다면 적어도 강의에서 사용되는 수식에 대한 Free-Image나 마크다운 정도는 제공해줘야 된다고 생각한다. 굉장히 많은 수식을 적으려고 모든 학생들이 다 오랜시간 노동하지 않겠는가. (아 그냥 수식을 안적으려나...)
또, 코드 리뷰나 질문이 생각보다 답변이 늦는 점이 아쉬웠다. 다들 현업에 있어서 그런가 보다 하고 주말을 기다렸는데도 피드백이 없어서 아쉬웠다.(그래도 호준 멘토님이 너무 피드백을 잘해주셔서 감사하다) 요즘은 질문보다는 구글링으로 거의 해결하려고 하고 진짜 모르겠으면 슬랙에 물어보긴 한다. 전반적으로 세션때도 분위기를 잘 이끌어주고 소통을 굉장히 잘해주셔서 좋다. 그리고 다들 적극적으로 도와주려는 눈빛이어서 감사하다. 아쉬운 점만 말해서 그렇지, 만족도는 7-8점 이상이다. 너무 불평불만으로 보였으려나. 징징.. 징징..
또 생각난 것이 있는데, 배움 기록 카드는 멘토가 추천하는 것이 맞다고 생각한다. 현재 추천 방식이 모든 인원이 참여하지 않고, 또 모든 인원이 다른 이의 배움 기록 카드를 일일이 다 보지 않을 것이다. 난 "이수진"님이 제일 잘 했다고 생각하는데(나도 모든 인원의 배움 기록 카드를 본 것은 아니지만 그래도 대체로 봤을 때 제일 잘썻고 노력이 보인다) 이 분이 상위권에 올라가지 않는게 이상할 정도.
[인프런] 단 두 장의 문서로 데이터 분석과 시각화 뽀개기
시계열 데이터(Time Series Data) 분석을 위한 판다스 Expanding and Rolling 이해하기 - Windows
df.expanding()
Return an Expanding object allowing summary functions to be
applied cumulatively.
df.rolling(n)
Return a Rolling object allowing summary functions to be
applied to windows of length n.
import pandas as pd
import numpy as np
s = pd.Series(
np.random.randn(1000),
index=pd.date_range("2020-01-01", periods=1000))
s.plot()
# 이전에는 %matplotlib inline을 써주지 않으면
# 그래프가 보이지 않았다. 현재는 defualt로 적용된다.
<matplotlib.axes._subplots.AxesSubplot at 0x17adf475548>

s = s.cumsum()
s.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x17adf536408>

r = s.rolling(window=60)
r
# 앞쪽에서 60개는 비어있다
Rolling [window=60,center=False,axis=0]
r.mean()
2020-01-01 NaN
2020-01-02 NaN
2020-01-03 NaN
2020-01-04 NaN
2020-01-05 NaN
...
2022-09-22 -29.150736
2022-09-23 -29.142874
2022-09-24 -29.154502
2022-09-25 -29.175149
2022-09-26 -29.231764
Freq: D, Length: 1000, dtype: float64
r = s.rolling(window=30)
s.plot(style='k--')
r.mean().plot(style='k')
<matplotlib.axes._subplots.AxesSubplot at 0x17ae0411508>

plot은 보통 이동평균을 구할 때 사용한다. (moving average)
df = pd.DataFrame(
....: np.random.randn(1000, 4),
....: index=pd.date_range("2020-01-01", periods=1000),
....: columns=["A", "B", "C", "D"])
df
A
B
C
D
2020-01-01
-1.018892
0.842255
-0.987166
-0.597796
2020-01-02
0.109856
-0.017367
-0.120858
-0.263876
2020-01-03
-0.664397
0.611548
0.562033
-0.564003
2020-01-04
-0.159660
0.130362
1.087226
1.136409
2020-01-05
-0.236306
0.901542
0.642744
-1.831807
...
...
...
...
...
2022-09-22
0.475307
-0.239127
0.852104
-0.170865
2022-09-23
0.000562
0.120297
0.885682
-0.085760
2022-09-24
-0.040042
-0.339307
-0.082087
0.848679
2022-09-25
-0.272293
-1.296961
0.230514
-0.849387
2022-09-26
-0.229110
-0.066247
0.093493
-0.149113
1000 rows × 4 columns
df = df.cumsum()
df
A
B
C
D
2020-01-01
-1.018892
0.842255
-0.987166
-0.597796
2020-01-02
-0.909036
0.824888
-1.108024
-0.861672
2020-01-03
-1.573433
1.436436
-0.545991
-1.425675
2020-01-04
-1.733093
1.566798
0.541234
-0.289266
2020-01-05
-1.969399
2.468341
1.183978
-2.121073
...
...
...
...
...
2022-09-22
-55.677922
-53.406551
64.343770
6.064137
2022-09-23
-55.677360
-53.286254
65.229452
5.978377
2022-09-24
-55.717402
-53.625562
65.147365
6.827056
2022-09-25
-55.989695
-54.922523
65.377879
5.977669
2022-09-26
-56.218805
-54.988770
65.471372
5.828556
1000 rows × 4 columns
df.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x17adf8b32c8>

df.rolling(window=60).sum().plot(subplots=True)
array([<matplotlib.axes._subplots.AxesSubplot object at 0x0000017ADFDB1888>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000017ADFDFB1C8>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000017ADFE43708>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000017ADFE8D8C8>],
dtype=object)

df.rolling(window=len(df), min_periods=1).mean().plot()
<matplotlib.axes._subplots.AxesSubplot at 0x17ad47a9348>

df.expanding(min_periods=1).mean().plot()
<matplotlib.axes._subplots.AxesSubplot at 0x17ae1681fc8>

df.expanding?
dfe = pd.DataFrame({"B": [0, 1, 2, np.nan, 4]})
dfe
B
0
0.0
1
1.0
2
2.0
3
NaN
4
4.0
dfe.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x17ae17cbd08>

중간에 NaN이 있어서 그래프가 끊기는 것을 볼 수 있다 => Expanding이 필요!
dfe.expanding(2).sum()
B
0
NaN
1
1.0
2
3.0
3
3.0
4
7.0
dfe.expanding(2).sum().plot()
<matplotlib.axes._subplots.AxesSubplot at 0x17ae183e688>

dfe.expanding(2).mean().plot()
<matplotlib.axes._subplots.AxesSubplot at 0x17ae189dec8>

파이썬 판다스로 Series 와 DataFrame 데이터 시각화 하기 소개 - Plotting
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
# 한글폰트 사용시 그래프에서 마이너스 폰트 깨지는 문제에 대한 대처
mpl.rcParams['axes.unicode_minus'] = False
df.plot?
plot
kind : str
- 'line' : line plot (default)
- 'bar' : vertical bar plot
- 'barh' : horizontal bar plot
- 'hist' : histogram
- 'box' : boxplot
- 'kde' : Kernel Density Estimation plot
- 'density' : same as 'kde'
- 'area' : area plot
- 'pie' : pie plot
- 'scatter' : scatter plot
- 'hexbin' : hexbin plot.
ts = pd.Series(
np.random.randn(1000),
index=pd.date_range("2020-01-01", periods=1000))
ts
2020-01-01 -0.259357
2020-01-02 0.660092
2020-01-03 -0.759879
2020-01-04 0.158824
2020-01-05 0.008104
...
2022-09-22 -0.705859
2022-09-23 -0.725916
2022-09-24 0.577275
2022-09-25 1.199486
2022-09-26 1.529162
Freq: D, Length: 1000, dtype: float64
ts.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x17ae19f6608>

ts = ts.cumsum()
ts.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x17ae2b3ac88>

df = pd.DataFrame(np.random.randn(1000, 4),
index=ts.index, columns=list('ABCD'))
df
A
B
C
D
2020-01-01
-0.494674
0.168681
0.251175
0.574593
2020-01-02
1.715208
0.956359
0.149570
0.385309
2020-01-03
1.064786
0.482158
0.142449
0.829651
2020-01-04
-1.873236
-1.087397
-1.401830
-0.522738
2020-01-05
2.044977
0.423282
0.132798
0.043316
...
...
...
...
...
2022-09-22
-1.494242
2.286578
0.045736
-0.210665
2022-09-23
-0.922229
-0.520283
0.887929
-0.417726
2022-09-24
-1.244146
0.125490
1.108425
0.116583
2022-09-25
-0.654476
-0.596485
-1.908873
-1.268358
2022-09-26
0.680929
0.989327
-0.790184
1.183248
1000 rows × 4 columns
df.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x17ae2e893c8>

df = df.cumsum()
df.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x17ae2fd7648>

df3 = pd.DataFrame(np.random.randn(1000, 2), columns=['B', 'C']).cumsum()
df3.head()
B
C
0
0.743316
0.712930
1
0.703344
1.902628
2
0.793851
2.953486
3
-0.741258
2.168597
4
-0.241436
3.004576
df3['A'] = pd.Series(list(range(len(df))))
df3.head()
B
C
A
0
0.743316
0.712930
0
1
0.703344
1.902628
1
2
0.793851
2.953486
2
3
-0.741258
2.168597
3
4
-0.241436
3.004576
4
df3.plot(x='A', y='B')
<matplotlib.axes._subplots.AxesSubplot at 0x17ae312f688>

파이썬 데이터 시각화 판다스로 bar plot 막대그래프 그리기 - Plotting
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
ts = pd.Series(np.random.randn(1000),
index=pd.date_range("2020-01-01", periods=1000))
ts.head()
2020-01-01 -0.923483
2020-01-02 1.554615
2020-01-03 -0.850197
2020-01-04 0.607606
2020-01-05 -1.544911
Freq: D, dtype: float64
df = pd.DataFrame(np.random.randn(1000, 4),
index=ts.index, columns=list('ABCD'))
df.head(6)
A
B
C
D
2020-01-01
-0.000248
0.468759
-0.570039
0.922824
2020-01-02
-0.900794
-2.259521
0.328642
0.522356
2020-01-03
-0.478821
1.064958
0.245880
1.558642
2020-01-04
-0.953477
1.419711
1.096004
0.581822
2020-01-05
0.400680
-0.037835
-0.767587
0.150695
2020-01-06
-0.470434
-0.026065
0.629644
0.113024
df.tail(3)
A
B
C
D
2022-09-24
0.779658
-0.688993
0.583472
-0.693562
2022-09-25
0.514137
-0.193501
-0.004432
0.905607
2022-09-26
0.087004
0.291302
2.354743
0.235747
df.iloc[5]
# 5번째 인덱스(2020-01-06)
A -0.470434
B -0.026065
C 0.629644
D 0.113024
Name: 2020-01-06 00:00:00, dtype: float64
df.iloc[5].plot(kind='bar')
<matplotlib.axes._subplots.AxesSubplot at 0x17ae31a01c8>

df.iloc[5].plot.bar()
<matplotlib.axes._subplots.AxesSubplot at 0x17ae43b1c88>

df.iloc[5].plot.bar()
plt.axhline(0, color='k')
<matplotlib.lines.Line2D at 0x17ae45c6d08>

df2 = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df.head(4)
A
B
C
D
2020-01-01
-0.000248
0.468759
-0.570039
0.922824
2020-01-02
-0.900794
-2.259521
0.328642
0.522356
2020-01-03
-0.478821
1.064958
0.245880
1.558642
2020-01-04
-0.953477
1.419711
1.096004
0.581822
df2.plot.bar()
<matplotlib.axes._subplots.AxesSubplot at 0x17ae40b8c08>

df2.plot.bar(stacked=True)
<matplotlib.axes._subplots.AxesSubplot at 0x17ad4e86ac8>

df2.plot.barh(stacked=True)
<matplotlib.axes._subplots.AxesSubplot at 0x17ae4743588>

파이썬 데이터 시각화 히스토그램과 도수분포표 이해하기 - Plotting
Histogram
도수분포표 vs 히스토그램
도수분포표 : 특정 구간에 속하는 자료의 개수를 표현
히스토그램 : 도수분포표를 시각화하여 막대그래프로 표현, 하지만 bar plot과는 다름
막대그래프 vs 히스토그램 (bar plot vs hist plot)
bar plot : 표현 값에 비례하여 높이와 길이를 지닌 직사각형 막대로 범주형 데이터를 표현하는 차트나 그래프, 합계, 평균 등의 수치를 시각화
hist plot : 구간별 빈도수를 표현
히스토그램 vs 정규분포 (hist plot vs density plot)
hist plot : 구간별 빈도수
density plot : 확률 밀도 함수 - 확률 변수의 밀도를 표현
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df4 = pd.DataFrame({'a' : np.random.randn(1000) + 1,
'b' : np.random.randn(1000),
'c' : np.random.randn(1000) - 1},
columns = ['a', 'b', 'c'])
df4.head()
a
b
c
0
0.233627
0.933449
-2.384155
1
2.890279
-0.604678
-1.667775
2
1.490996
-0.958704
-0.533509
3
-0.549594
-1.567981
-2.083608
4
2.881449
2.508202
-4.514146
df4.plot.hist(alpha=0.5)
# alpha는 투명도를 의미
<matplotlib.axes._subplots.AxesSubplot at 0x17ae482a2c8>

df4.plot.hist(stacked=True, bins= 20)
# bin default = 10
# bin값에 따라서 frequency도 달라진다
<matplotlib.axes._subplots.AxesSubplot at 0x17ae4a9ec08>

df4['a'].plot.hist(orientation='horizontal', cumulative=True)
<matplotlib.axes._subplots.AxesSubplot at 0x17ae4a83f08>

df4['a_diff'] = df4['a'].diff()
df4['a_shift'] = df4['a'].shift(1)
df4['a_minus'] = df4['a'] - df4['a_shift']
df4[['a', 'a_shift', 'a_minus', 'a_diff']].head()
# diff는 차분을 의미 : 뒤의 값에서 앞의 값을 빼는 것
a
a_shift
a_minus
a_diff
0
0.233627
NaN
NaN
NaN
1
2.890279
0.233627
2.656652
2.656652
2
1.490996
2.890279
-1.399283
-1.399283
3
-0.549594
1.490996
-2.040590
-2.040590
4
2.881449
-0.549594
3.431044
3.431044
df4['a'].diff().hist()
<matplotlib.axes._subplots.AxesSubplot at 0x17ae5eba208>

df4[['a', 'b', 'c']].diff().hist(color='k', alpha = 0.5, bins = 50)
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x0000017AE61E1B48>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000017AE62C35C8>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x0000017AE62EC808>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000017AE631A648>]],
dtype=object)

data = pd.Series(np.random.randn(1000))
data.hist(by=np.random.randint(0, 4, 1000), figsize=(6, 4))
# category 별로 그릴 수도 있다
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x0000017AD71DDB48>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000017AE6550F48>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x0000017AE65800C8>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000017AE65A6DC8>]],
dtype=object)

data = pd.DataFrame({'a' : np.random.randn(1000),
'b' : np.random.randint(0, 4, 1000)})
data.head()
a
b
0
0.494461
0
1
0.377023
1
2
0.127343
1
3
0.262922
0
4
0.035662
0
data['a'].hist(by=data['b'], figsize=(6, 4))
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x0000017AE66BEF48>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000017AE66D74C8>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x0000017AE6708148>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000017AE672FF88>]],
dtype=object)

파이썬 시각화 상자 수염 그림(box plot) 그리기 - Plotting
box plot
가공하지 않은 자료 그대로를 이용하여 그린 것이 아니라, 자료로부터 얻어낸 통계량인 5가지 요약 수치로 그린 것.
최솟값
제1 사분위수
제2 사분위수(=중앙값)
제3 사분위수
최대값
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
df
A
B
C
D
E
0
0.370232
0.606418
0.652095
0.492909
0.349718
1
0.112048
0.106915
0.265264
0.728334
0.494577
2
0.004974
0.729390
0.920953
0.773177
0.977718
3
0.934579
0.708746
0.029470
0.329899
0.377750
4
0.856339
0.376554
0.731859
0.703761
0.995195
5
0.635157
0.040028
0.316238
0.307590
0.040899
6
0.017509
0.356093
0.728913
0.297290
0.337541
7
0.128064
0.690733
0.733154
0.523859
0.315686
8
0.115399
0.202518
0.540844
0.667318
0.415735
9
0.645682
0.007744
0.336712
0.230469
0.553611
df.describe()
A
B
C
D
E
count
10.000000
10.000000
10.000000
10.000000
10.000000
mean
0.381998
0.382514
0.525550
0.505461
0.485843
std
0.357076
0.286496
0.277474
0.204475
0.296292
min
0.004974
0.007744
0.029470
0.230469
0.040899
25%
0.112886
0.130816
0.321356
0.313168
0.340585
50%
0.249148
0.366324
0.596469
0.508384
0.396742
75%
0.643050
0.669654
0.731123
0.694650
0.538853
max
0.934579
0.729390
0.920953
0.773177
0.995195
df.plot.box()
<matplotlib.axes._subplots.AxesSubplot at 0x17ae684e288>

color = {
"boxes": "DarkGreen",
"whiskers": "DarkOrange",
"medians": "DarkBlue",
"caps": "Gray",}
df.plot
<pandas.plotting._core.PlotAccessor object at 0x0000017AE6803288>
df.plot.box(color=color, sym="r+")
<matplotlib.axes._subplots.AxesSubplot at 0x17ae68fb488>

df.plot.box(vert=False, positions=[1, 4, 5, 6, 8])
<matplotlib.axes._subplots.AxesSubplot at 0x17ae6a60088>

df = pd.DataFrame(np.random.rand(10, 5))
df.head()
0
1
2
3
4
0
0.929338
0.659756
0.972052
0.521413
0.215369
1
0.450177
0.283452
0.816272
0.466250
0.451954
2
0.877936
0.720482
0.350979
0.020901
0.633757
3
0.445642
0.444882
0.349320
0.321260
0.384497
4
0.404033
0.092795
0.097995
0.723962
0.870682
plt.figure()
bp = df.boxplot()
# 격자 생성

df = pd.DataFrame(np.random.rand(10, 2), columns=["Col1", "Col2"])
df.head()
Col1
Col2
0
0.463268
0.297339
1
0.594417
0.267667
2
0.666147
0.707854
3
0.378402
0.735593
4
0.420503
0.365746
df["X"] = pd.Series(["A", "A", "A", "A", "A", "B", "B", "B", "B", "B"])
df.head()
Col1
Col2
X
0
0.463268
0.297339
A
1
0.594417
0.267667
A
2
0.666147
0.707854
A
3
0.378402
0.735593
A
4
0.420503
0.365746
A
plt.figure()
bp = df.boxplot(by="X")
<Figure size 432x288 with 0 Axes>

np.random.seed(1234)
df_box = pd.DataFrame(np.random.randn(50, 2))
df_box["g"] = np.random.choice(["A", "B"], size=50)
df_box.loc[df_box["g"] == "B", 1] += 3
bp = df_box.boxplot(by="g")

bp = df_box.groupby("g").boxplot()

파이썬 데이터 시각화 Area plot, Grid 옵션으로 그래프 격자 만들기 - Plotting
Area plot
기본적으로 stacked=True인 그래프를 그린다
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.rand(10, 4), columns=["a", "b", "c", "d"])
df
a
b
c
d
0
0.156005
0.052212
0.188224
0.807246
1
0.667732
0.712762
0.537092
0.519210
2
0.034637
0.735852
0.533051
0.258751
3
0.250128
0.011195
0.654490
0.954305
4
0.794724
0.648470
0.988780
0.206013
5
0.656444
0.189838
0.076012
0.627008
6
0.191030
0.520235
0.869168
0.957507
7
0.795974
0.170474
0.791833
0.782586
8
0.980319
0.722360
0.134649
0.879211
9
0.751361
0.697953
0.240086
0.953517
df.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x1e3fcb14a88>

df.plot.area()
# 위 그래프와 조금 다른 모습
# stacked 되어 있다
<matplotlib.axes._subplots.AxesSubplot at 0x1e3fcbfed88>

df.plot.area(stacked=False)
<matplotlib.axes._subplots.AxesSubplot at 0x1e3fcc78c08>

df.plot(grid=True)
<matplotlib.axes._subplots.AxesSubplot at 0x1e3fcce2448>

파이썬 데이터 시각화 scatter plot, 산점도 그리기 - Plotting
Scatter plot
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.rand(50, 4), columns=["a", "b", "c", "d"])
df.plot.scatter(x="a", y="b")
<matplotlib.axes._subplots.AxesSubplot at 0x1e3fcd83f48>

df.plot.scatter(x="a", y="b", grid=True)
# 격자 추가
<matplotlib.axes._subplots.AxesSubplot at 0x1e3fcdc7dc8>

df.plot.scatter(x="a", y="b", grid=True, s=50)
# 점 크기 설정
<matplotlib.axes._subplots.AxesSubplot at 0x1e3fcd52888>

ax = df.plot.scatter(x="a", y="b", color="Red", label="Group 1")
df.plot.scatter(x="c", y="d", color="DarkBlue", label="Group 2", ax=ax)
<matplotlib.axes._subplots.AxesSubplot at 0x1e3fdfd7188>

df.plot.scatter(x="a", y="b", c="c", s=60)
<matplotlib.axes._subplots.AxesSubplot at 0x1e3fe113c48>

df.plot.scatter(x="a", y="b", s=df["c"] * 200)
<matplotlib.axes._subplots.AxesSubplot at 0x1e3fe1afac8>

파이썬 데이터 시각화 히스토그램과 산점도를 보완한 Hexbin plot 그리기 - Plotting
데이터가 너무 많을 때 Hexagonal Bin Plot을 사용한다. Scatter plot의 단점을 보완한다
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.randn(1000, 2), columns=["a", "b"])
df["b"] = df["b"] + np.arange(1000) # 각각의 index값을 추가해줌. 뒤로 갈수록 값이 증가
df
a
b
0
0.143530
0.168155
1
0.510635
1.377011
2
-0.440050
2.127910
3
1.717786
1.872928
4
-0.691979
3.942575
...
...
...
995
1.212032
996.148623
996
-1.094107
996.484877
997
1.512110
996.442078
998
-0.523446
999.116458
999
-1.085693
997.781039
1000 rows × 2 columns
df.plot.hexbin(x="a", y="b", gridsize=5)
<matplotlib.axes._subplots.AxesSubplot at 0x1e3ff0e41c8>

df.plot.hexbin(x="a", y="b", gridsize=15)
<matplotlib.axes._subplots.AxesSubplot at 0x1e3ff224508>

df["z"] = np.random.uniform(0, 3, 1000) # 0에서 3까지의 범위로 1000개 생성
df
a
b
z
0
0.143530
0.168155
2.223601
1
0.510635
1.377011
0.424057
2
-0.440050
2.127910
0.388958
3
1.717786
1.872928
0.238032
4
-0.691979
3.942575
1.840137
...
...
...
...
995
1.212032
996.148623
1.041120
996
-1.094107
996.484877
2.818773
997
1.512110
996.442078
1.570454
998
-0.523446
999.116458
1.100353
999
-1.085693
997.781039
0.660611
1000 rows × 3 columns
df.plot.hexbin(x="a", y="b", C="z", gridsize=20)
<matplotlib.axes._subplots.AxesSubplot at 0x1e3ff3ed3c8>

df.plot.hexbin(x="a", y="b", C="z", reduce_C_function=np.max, gridsize=20)
# reduce_C_function
# 기본적으로 각 점 (x, y) 주변의 개수에 대한 히스토그램이 계산된다.
# reduce_C_function 또는 C에 인자를 전달해주면
# 해당 도수 값이 아니라, 최대, 최소, 중앙, 평균 값 등으로 확인할 수 있다
<matplotlib.axes._subplots.AxesSubplot at 0x1e3ff53da88>

Pandas pie plot, 원 그래프, 왜 seaborn 에는 파이차트가 없을까? - Plotting
Pie plot
seaborn에서는 지원하지 않는다. (앞으로도 지원할 예정이 없음) 이유 : 오해의 소지가 있고, 데이터를 정확하게 표현하지 못할 때가 있다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
series = pd.Series(3 * np.random.rand(4), index=["a", "b", "c", "d"], name="series")
series
a 1.576532
b 2.637146
c 2.704557
d 1.490052
Name: series, dtype: float64
series.plot.pie(figsize=(6, 6));

df = pd.DataFrame({'mass': [0.330, 4.87, 5.97],
'radius': [2439.7, 6051.8, 6378.1]},
index=['Mercury', 'Venus', 'Earth'])
plot = df.plot.pie(y='mass', figsize=(5, 5))

plot = df.plot.pie(subplots=True, figsize=(10, 5))

series.plot.pie(
labels=["AA", "BB", "CC", "DD"],
colors=["r", "g", "b", "c"],
autopct="%.2f",
fontsize=20,
figsize=(6, 6),)
<matplotlib.axes._subplots.AxesSubplot at 0x1e3ff755408>

series = pd.Series([0.1] * 4, index=["a", "b", "c", "d"], name="series2")
series.plot.pie(figsize=(6, 6))
<matplotlib.axes._subplots.AxesSubplot at 0x1e3ff7a1fc8>

Scatter Matrix Plot 산점도와 커널밀도함수를 함께 표현 - Plotting
from pandas.plotting import scatter_matrix
df = pd.DataFrame(np.random.randn(1000, 4), columns=["a", "b", "c", "d"])
df.head()
a
b
c
d
0
0.887408
-0.002276
-1.342932
-0.202530
1
-1.443966
-0.018683
-0.676024
0.478978
2
-0.665443
-0.916739
-0.566526
0.948019
3
-0.621182
-1.709215
-0.375141
-1.305123
4
1.656003
-0.898862
-1.744376
0.926337
scatter_matrix(df, alpha=0.2, figsize=(6, 6), diagonal="kde")
# alpha 투명도, figsize 크기, diagonal 대각선, kde 커널밀도함수(kernal density estimate)
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x000001E389800548>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000001E38AC3E488>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000001E38AC6B6C8>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000001E38AC96BC8>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x000001E38ACC74C8>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000001E38ACC7588>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000001E38ACF7248>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000001E38AD50D48>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x000001E38AD813C8>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000001E38ADAAFC8>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000001E38ADDBD08>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000001E38AE0BA48>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x000001E38AE3E788>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000001E38AE6D4C8>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000001E38AE9E208>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000001E38AEC5F08>]],
dtype=object)

파이썬 시각화 분포도 그리기, Kernel Density Estimate plot 커널밀도함수 - Plotting
KDF
통계에서 커널 밀도 추정은 임의의 변수의 확률 밀도 함수를 추정하는 비모수적 방법이다. 이 함수는 가우스 커널을 사용하며 자동 대역폭 결정을 포함한다.
커널 밀도 추정치는 히스토그램과 밀접한 관련이 있지만 적절한 커널을 사용하고 매끄럽고 연속성과 같은 속성을 부여할 수 있다.
커널 함수는 원점을 중심으로 대칭이며 적분값이 1인 함수이다
비모수 통계법 사용의 조건
자료가 나타내는 모집단의 현상이 정규분포가 아닐 때
자료가 나타내는 모집단의 현상이 정규분포로 적절히 변환되지 못할 때
자료의 표본수가 적을 때
자료들이 서로 독립적일 때
변인의 척도가 명명척도나 서열척도일 때
ser = pd.Series(np.random.randn(1000))
ser
0 0.851606
1 0.012797
2 1.338664
3 0.598750
4 2.415107
...
995 1.056412
996 0.844509
997 0.165994
998 -0.918307
999 -0.441499
Length: 1000, dtype: float64
plt.figure();
ser.plot.hist(alpha=0.5, bins=5)
<matplotlib.axes._subplots.AxesSubplot at 0x1e38b4f7848>

ser.plot.hist(alpha=0.5, bins=10)
<matplotlib.axes._subplots.AxesSubplot at 0x1e38b588688>

ser.plot.hist(alpha=0.5, bins=20)
<matplotlib.axes._subplots.AxesSubplot at 0x1e38b6035c8>

ser.plot.kde()
<matplotlib.axes._subplots.AxesSubplot at 0x1e38b041448>

ser.plot.density()
<matplotlib.axes._subplots.AxesSubplot at 0x1e38b691f08>

커널 밀도 함수는 위 히스토그램을 부드럽게 표현한 것이다 히스토그램은 frequency를 축으로 가지지만 밀도 함수는 density를 축으로 가진다 density == kde
Last updated
Was this helpful?