Definition and Essential Characteristics of Cloud Computing
이번 강의를 통해 클라우드 컴퓨팅을 정의하고, 주요 특징, 발전 과정, buisness case를 알 수 있게 될 것이다. IBM Clouders에 지원하기 위한 기본 과제로써 해당 강의를 알게 되었는데, 클라우드에 관련한 몇몇 세미나를 들은 기억들을, 이 강의로 어느 정도 기초 개념을 확실히 하고자 한다.
IBM Cloud Course는 강의 중/후의 시험으로 통과 여부를 정한다. 이번 코스의 경우 강의 중간 평가 50%, 기말고사 50%로 수료 여부가 정해진다. 100점 만점에 총 70점 이상을 획득하여야 한다.
학습 목표
클라우드 컴퓨팅의 정의
클라우드 컴퓨팅의 주요 특징을 설명
클라우드 컴퓨팅의 역사와 발전에 대한 학습
...등등
Definition and Essential Characteristics of Cloud Computing
클라우드 컴퓨팅
클라우드라고도 칭함
인터넷을 통해 제공되며 사용한 만큼 지불하는 서비스
실시간 연산 자원을 제공한다.
NIST(US National Institute of Standard and Technology)
편의를 제공하는 실시간 네트워크 접속 모델로 적은 노력으로 빠르게 준비(provision)되고 공개(release)될 수 있는, 설정 가능한 공유된(shared pool of) 연산 자원.
ex. 네트워크, 서버, 저장소, 어플리케이션, 서비스 등
5가지 주요 특징
On-demand Self Service : 연산 자원, 저장소 등의 클라우드 자원에 제공자와의 대면(human interaction) 없이 단순하게 접근 가능
Broad Network Access : 클라우드 자원은 스마트폰, 타블렛, 노트북과 같은 표준 플랫폼과 매카니즘을 통해 접근 가능
Resource Pooling : multi-tanent model을 통해 클라우드 자원을 다수의 사용자에게 할당-재할당하고, 클라우드를 cost-efficient하게 하여 클라우드 제공자들에게 규모의 경제를 제공
Rapid Elasticity : 필요할 때는 더 많은 자원을 사용하고, 그렇지 않을 때는 적게 사용
Measured Servic : 사용한 만큼 지불하는 서비스 - 사용 자원은 감시, 측정되어 투명하게 보고됨
Cloud As a Service
연산 자원의 비용 효율성을 높이고,
시장 변화를 더욱 빠르게 만듦
Deployment Model
Public : 클라우드 제공자의 자원을 개방 인터넷을 통해 사용하며, 다른 사용자와 자원을 공유
Private : 클라우드 제공자의 자원은 단독 사용을 위해 할당
Hybrid
Service Model
Infrastructure (IaaS) : 서버, 저장소 등 Infra 및 물리적 자원을 제공
Platform (PaaS) : 개발에 필요한 HW/SW tool을 제공
Application (SaaS) : on-demand SW라고도 하며, 구독에 기반하여 SW 라이센스 등을 제공
History and Evolution of Cloud Computing
1950s
클라우드 컴퓨팅의 개념은 1950년대부터 시작(시분할, resource pooling 등)
Dumb terminal : 다수의 유저가 메인프레임의 동일 자원을 사용을 효율적으로 사용하기 위해 사용
1970s
가상 머신(VM)을 통해 메인프레임 내에서 다수의 VM으로 분리된 컴퓨팅 환경 제공
당시 비싼 HW를 효율적으로 쓰기 위해, 기능적으로 공유 호스팅(Shared Hosting), 가상 개인 서버(Private serer) 등으로 분리
Hypervisor : 다수의 OS가 서로 간섭 없이 동작할 수 있도록 하는 SW layer
Key Considerations for Cloud Computing
클라우드로의 이전을 위한 핵심 요소
민첩성(agility)
유연성(flexivity)
경쟁력(competitiveness)
클라우드를 위한 주요 고려 사항
Infrasturcture and Workload
데이터센터를 직접 짓는데는 천문학적인 비용이 듦
클라우드 컴퓨팅의 낮은 초기 비용 / 사용한 만큼 지불하는 특성은 유의미한 비용 절감을 제공
클라우드의 경우 모든 자원이 항상 준비되어 있지는 않을 수 있음
SaaS and Development Platform
기성(off-the-shelf) SW과 주기적 업그레이드 대신 어플리케이션의 접근(SaaS)을 제공
결정 트리는 여러분에게 어려운 결정을 남겨줍니다. 많은 잎을 갖는 깊은 트리는 각 예측이 적은 집의 데이터에서 온 데이터이기 때문에 오버피팅을 유발할 것입니다. 한편 적은 잎을 갖는 얕은 트리는 raw 데이터에서 많은 특성을 찾지 못해 좋지 못한 성능을 갖게 될 것입니다.
비록 오늘날의 대부분의 모델링 기술이 오버피팅과 언더피팅 사이의 이러한 긴장을 마주하고 있지만, 많은 모델들은 더 나은 성능을 위한 좋은 아이디어를 갖고 있습니다. 우리는 이런 예시로 Random Forest를 알아볼 것입니다.
Random Forest는 많은 트리를 이용하여, 각 구성 트리의 예측을 평균하여 예측합니다. 보통 단일 결정 트리보다 더 나은 예측 정확도를 갖고 기본 파라미터로도 잘 동작합니다. 만약 여러분이 계속해서 모델링한다면, 여러분은 더 좋은 성능을 갖는 모델들에 대해 배우게 되겠지만, 대부분은 적절한 파라미터에 민감하게 반응합니다.
Example
여러분은 이미 데이터를 불러오는 코드를 본 적이 있습니다. 데이터를 불러올 때, 우리는 다음과 같은 변수를 갖게 됩니다.
train_X
val_X
train_y
val_y
우리는 scikit-learn에서 결정 트리를 만든 방식과 유사하게 랜덤 forest model을 만듭니다 - 이번에는 DecisionTreeRegressor 대신 RandomForestRegressor 클래스를 사용합니다.
/opt/conda/lib/python3.6/site-packages/sklearn/ensemble/forest.py:245: FutureWarning: The default value of n_estimators will change from10in version 0.20 to 100in0.22.
"10 in version 0.20 to 100 in 0.22.", FutureWarning)
202888.18157951365
Conclustion
더 개선의 여지가 있지만, 결정 트리의 오차값인 250000을 볼 때 매우 큰 개선이 이루어졌습니다. 우리가 단일 결정 트리의 최대 깊이를 바꾼 것과 같이 랜덤 포레스트의 성능을 여러분이 바꿀 수 있는 파라미터가 존재합니다. 하지만 이러한 튜닝 없이 일반적으로 하는 것이 랜덤 포레스트 모델의 가장 좋은 기능 중 하나라고 할 수 있습니다.
여러분은 곧 튜닝과 적절한 파라미터값일 때 더 좋은 성능을 제공(하지만 파라미터 값을 위해 적당한 기술이 필요한)하는, XGBoost 모델에 대해 배울 것입니다.
이번 수업을 마치고 나면, 여러분은 언더피팅(underfitting)과 오버피팅(overfitting)의 개념에 대해 알고, 이러한 개념을 모델을 더 정확하게 만들기 위해 사용할 수 있을 것입니다.
Experimenting With Different Models
이제 여러분은 모델의 정확도를 측정하는 적절한 방법을 갖고, 다른 모델과 비교하여 어떤 것이 제일 괜찮은 예측을 제공하는지 실험할 수 있습니다. 하지만 모델을 위한 대안은 어떻게 해야 할까요?
여러분은 scikit-learn 문서에서 결정 트리 모델이 (여러분이 오랫동안 원하거나 필요로 하는 것 보다도 많은) 옵션을 제공하는 것을 볼 수 있습니다. 가장 중요한 옵션은 트리의 깊이를 결정하는 것입니다. 이 수업의 가장 첫 단원을 되돌아보면 트리의 깊이는 예측 이전에 얼마나 많은 분류가 이루어지는지에 대한 단위였습니다. 이것은 매우 얇은 트리입니다.
실제로, 트리가 최상단(모든 집)에서 잎까지 10개의 분류를 갖는 것은 매우 흔하지 않은 일입니다. 이것이 깊어질수록, 데이터셋은 더 적은 집의 잎으로 나누어집니다. 만약 트리가 한 개의 분류만을 갖고 있다면, 그 트리는 데이터를 2개의 그룹으로 나눌 것입니다. 만약 한번 더 나누면, 우리는 4개의 집 그룹을 얻게 될 것입니다. 다시 나누면 8개의 그룹이 만들어질 것입니다. 만약 계속해서 그룹의 개수를 두배로 만들면서 각 단계마다 더 많은 분류를 추가한다면, 우리는 10단계에 이르렀을 때 210개의 집의 그룹을 얻게 될 것입니다.
우리가 집들을 매우 많은 잎으로 나누게 될 때, 우리는 각 잎에 매우 적은 집들이 남겨지게 됩니다. 매우 적은 집들을 갖는 잎은 실제 집값과 꽤나 가까운 예측을 하겠지만, 새로운 데이터에 대해서는 매우 적절하지 않은 예측을 하게 될 것입니다(각 예측은 매우 적은 집들에 기반하기 때문입니다).
모델이 학습 데이터에 거의 정확하게 일치하게 되지만, 새로운 데이터나 검증 시에는 그렇지 못한 이 현상을 오버피팅이라고 부릅니다. 반면, 만약 트리가 매우 얕다면, 집들을 분명한 그룹으로 나누지 못할 것입니다.
극단적으로, 만약 트리가 집들을 2~4개의 그룹으로 나눈다면, 각 그룹은 넓은 범위의 집을 갖게 될 것입니다. 예측 결과는 학습 데이터에도 불구하고, 대부분의 집에 대해 동떨어진 결과를 낼 것입니다(같은 이유로 검증 시에도 좋지 않은 결과가 나타날 것입니다). 모델이 중요한 특정이나 패턴을 데이터에서 찾지 못한다면, 학습 데이터일지라도 좋지 못한 성능을 나타낼 것입니다. 이를 언더피팅이라고 부릅니다.
우리는 검증 데이터에서 예측하여야 하는 새로운 데이터에 대한 정확도에 집중하기 때문에, 우리는 언더피팅과 오버피팅 사이의 스위트 스팟을 찾아야 합니다. 시각적으로, 우리는 검증 커브(아래 붉은 색)의 최저점을 원하고 있습니다.
Example
트리 깊이를 조절하기 위한 몇 가지 대안이 있고, 다른 경로보다 일부 경로가 더 깊은 깊이를 갖도록 하는 많은 방법이 있습니다. 하지만 max_leaf_nodes 매개변수는 매우 감각적으로 오버피팅과 언더피팅을 조절할 수 있도록 해줍니다. 모델에 더 많은 잎을 만들수록, 언더피팅 영역에서 오버피팅으로 이동하게 됩니다.
우리는 max_leaf_nodes를 위한 다른 값들로부터 MAE 점수를 비교하기 위한 유틸리티 함수를 사용할 수 있습니다.
from sklearn.tree import DecisionTreeRegressor
defget_mae(max_leaf_nodes, train_X, val_X, train_y, val_y):
model = DecisionTreeRegressor(max_leaf_nodes=max_leaf_nodes, random_state=0)
model.fit(train_X, train_y)
preds_val = model.predict(val_X)
mae = mean_absolute_error(val_y, preds_val)
return(mae)
이 데이타는 여러분이 본(그리고 이미 써본) 코드를 사용하여 train_X, val_X, train_y, val_y로 저장됩니다.
우리는 for-루프를 이용하여 max_leaf_nodes에 따라 다른 값으로 만들어진 모델의 정확도를 비교해볼 수 있습니다.
# compare MAE with differing values of max_leaf_nodesfor max_leaf_nodes in [5, 50, 500, 5000]:
my_mae = get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y)
print("Max leaf nodes: %d \t\t Mean Absolute Error: %d" %(max_leaf_nodes, my_mae))
Max leaf nodes: 5 Mean Absolute Error: 347380
Max leaf nodes: 50 Mean Absolute Error: 258171
Max leaf nodes: 500 Mean Absolute Error: 243495
Max leaf nodes: 5000 Mean Absolute Error: 254983
목록의 옵션에 따르면, 500이 최적화된 잎의 개수임을 알 수 있습니다.
Conclusion
결론적으로:모델은 다음과 같은 문제를 겼을 수 있습니다:
오버피팅 : 앞으로 일어나지 않거나, 덜 정확한 예측으로 이끄는 가짜 패턴을 잡는 경우 혹은
언더피팅 : 연관된 패턴을 잡는데 실패하여, 덜 정확한 예측으로 가는 경우
우리는 모델 학습에 사용되지 않은, 검증 데이터를 사용하여, 후보 모델의 정확도를 측정합니다. 이를 통해 우리가 많은 후보 모델을 시도해보고 가장 좋은 하나를 선택할 수 있습니다.
이번 수업에서는, 여러분은 여러분의 모델의 질을 측정하기 위한 모델 검증(model validation)을 사용하는 법을 배울 것입니다. 모델의 질을 측정하는 것은 여러분의 모델을 반복해서 향상시키기 위한 핵심입니다.
What is Model Validation
여러분은 여러분이 만드는 거의 모든 모델의 가치를 평가하고 싶을 것입니다. 대부분의(비록 모든 것은 아니지만) 어플리케이션의 경우, 모델의 질에 대한 적절한 측정 방법은 예측의 정확도입니다. 다시 말해, 모델의 예측이 실제로 일어나는 것과 유사한가를 보는 것입니다.
많은 사람들은 정확도 예측에 있어 큰 실수를 하곤 합니다. 그들은 그들의 학습 데이터를 이용해 예측을 한 뒤 학습 데이터의 목표값과 비교합니다. 이러한 접근법에 대한 문제점과 해결법은 잠시 후 알게 되겠지만, 먼저 어떻게 해야 할 지에 대해 알아보도록 합시다.
여러분은 먼저 이해할 수 있는 방식으로 모델의 질을 요약할 필요가있습니다. 만약 10000가구에 대한 예측과 실제 집값을 비교한다고 할 때, 여러분은 아마 좋거나 나쁜 예측의 혼합을 보게 될 것입니다. 10000개의 예측과 실제 값을 보는 것에는 핵심을 볼 수 없습니다. 우리는 이것을 하나의 계측값으로 요약할 필요가 있습니다.
모델의 질을 요약하기 위한 많은 계측법이 있지만, 우리는 Mean Absolute Error(평균 절대 오차 - MAE라고도 불리는) 것으로 시작해볼 것입니다. 마지막 단어인, 오차로부터 시작해봅시다.
각 집값의 예측되는 오차는 :
error=actual−predicted
그래서, 만약 집값이 $150000이고, 여러분이 예측이 $100000이라면 오차는 $50000이 됩니다.
MAE 계량을 통해, 우리는 각 오차의 절대값을 얻을 수 있습니다. 이 방법은 각 오차를 양수로 변환해줍니다. 우리는 그 뒷 각 오차의 평균값을 계산합니다. 이 방법이 모델의 질을 측정하기 위한 우리의 계량법입니다. 순수하게 영어로 표현하면,
On average, our predictions are off by about X.
MAE를 계산하기 위해서는, 먼저 모델이 필요합니다.(코드 중략) 일단 모델을 생성하고 나면, 평균절대오차를 계산하는 방법은 다음과 같습니다.
from sklearn.metrics import mean_absolute_error
predicted_home_prices = melbourne_model.predict(X)
mean_absolute_error(y, predicted_home_prices)
434.71594577146544
The Problem with "In-Sample" Scores
우리가 계산한 측정값은 표본 내 성적("In-Sample" Scores)이라고 부를 수 있습니다. 우리는 모델을 구축하고 평가하기 위해 집들에 대한 하나의 "샘플"을 사용했습니다. 이게 왜 좋지 않은가에 대해 알아봅시다.
생각해봅시다, 거대한 부동산 시장에서, 문 색깔은 집값과 그다지 연관이 없습니다.
하지만, 여러분이 모델을 만들때 쓴 샘플에서, 녹색의 문을 갖는 모든 집들은 매우 비싼 것으로 나타났습니다. 이 모델의 역할은 집값을 예측하기 위해 패턴을 찾는 것이고, 그래서 이러한 패턴을 찾아내어, 녹색의 집이 매우 비쌀 것이라는 예측을 할 것입니다.
이러한 패턴이 학습 데이터에서 나타났기 때문에, 학습 데이터에서 이 모델은 정확할 것으로 나타날 것입니다.
하지만 모델이 새 데이터를 볼 때 이러한 패턴이 잡히지 않는다면, 이 모델은 연습때보다 매우 부정확할 것입니다.
모델의 실험값은 새 데이터에 대한 예측에서 오기 때문에, 우리는 모델을 만들 때 쓰이지 않은 데이터를 성능 측정에 사용합니다. 이를 위한 가장 직접적인 방법은 모델 제작 시 일부 데이터를 제외하고, 이전에 보이지 않은 데이터를 정확도 측정 테스트에 사용하는 것입니다. 이 데이터를 검증 데이터(Validation data)라고 부릅니다.
Coding It
scikit-learn 라이브러리는 데이터를 둘로 나누기 위해 train_test_split이라는 함수를 갖고 있습니다. 우리는 이 데이터중 일부를 모델 피팅을 위한 학습 데이터로 사용하고, 나머지 데이터를 mean_absolute_error를 계산하기 위한 검증 데이터로 사용할 것입니다.
코드는 다음과 같습니다:
from sklearn.model_selection import train_test_split
# split data into training and validation data, for both features and target# The split is based on a random number generator. Supplying a numeric value to# the random_state argument guarantees we get the same split every time we# run this script.
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state = 0)
# Define model
melbourne_model = DecisionTreeRegressor()
# Fit model
melbourne_model.fit(train_X, train_y)
# get predicted prices on validation data
val_predictions = melbourne_model.predict(val_X)
print(mean_absolute_error(val_y, val_predictions))
# The Melbourne data has some missing values (some houses for which some variables weren't recorded.)# We'll learn to handle missing values in a later tutorial. # Your Iowa data doesn't have missing values in the columns you use. # So we will take the simplest option for now, and drop houses from our data. # Don't worry about this much for now, though the code is:# dropna drops missing values (think of na as "not available")
melbourne_data = melbourne_data.dropna(axis=0)
데이터의 하위 집합(subset)을 선택하기 위한 여러 가지 방법이 있습니다. Pandas Micro-course는 이런 것들을 더 깊이 다루지만, 우리는 두 가지 접근법에 집중해볼 것입니다.
"예측 타겟"을 선택하는, Dot notation
"특징"을 선택하는, Column list 선택
Selecting The Prediction Target
여러분은 dot-notation으로 변수를 추출할 수 있습니다. 이 하나의 열은 일럴로 저장되며, 1개 열을 갖는 DataFrame과 유사합니다.
우리는 Prediction target이라고 하는, 예측하고자 하는 열을 선택할 때 dot notation을 사용할 것입니다. 편의를 위해, prediction target은 y라고 부릅니다. 그렇기 때문에 멜버른의 데이타에서 집값을 저장하기 위한 코드는 다음과 같습니다.
y = melbourne_data.Price
Choosing "Features"
우리의 모델(나중에는 예측에 사용될)에 입력된 열은 "특성(features)"라고 불립니다. 이 경우, 집값을 판단하기 위해 사용되는 열이 될 것입니다. 때때로, 여러분은 타겟을 제외한 모든 열을 특성으로 활용할 것입니다. 다른 경우 더 적은 특성을 이용하는 것이 더 나을 것입니다.
이번에는, 우리는 몇 가지 특성을 이용하여 모델을 구성할 것입니다. 나중에 어떻게 다른 특성을 갖는 모델을 순회하고 비교하는지에 대해 배우게 될 것입니다.
우리는 브래킷 내에 제공되어 있는 열 이름을 특성으로 선택합니다. 이 리스트 내의 각 아이템은 문자열로 되어 있습니다.
가장 위의 몇 개의 열을 보여주는 describe 메소드와 head 메소드를 이용해서 집값을 예측하기 위해 데이터를 빠르게 확인해봅시다.
X.describe()
X.head()
이 명령어로 시각적으로 데이터를 확인하는 것은 데이터 사이언티스트들의 중요한 업무 중 일부입니다. 여러분은 더 많은 직관을 제공하는 데이터셋에 종종 놀라게 될 것입니다.
Building Your Model
여러분은 모델을 만들기 위해 scikit-learn 라이브러리를 사용하게 될 것입니다. 코딩할 때, 샘플 코드에서 볼 수 있듯 종종 sklearn라고도 쓰입니다. Scikit-learn은 보통 Dataframe에 저장된 데이터들을 모델링하는데 가장 유명한 라이브러리입니다.
모델을 구성하고 사용하는 단계는 다음과 같습니다:
정의 : 어떠한 모델이 될 것인가? 결정 트리? 다른 형태의 모델인지? 모델 타입의 다른 몇몇 파라미터들 역시 명시되어야 합니다.
피팅 : 제공된 데이터에서 패턴을 확인합니다. 이것이 모델링의 핵심입니다.
예측 : 말 그대로의 의미입니다.
가치 판단 : 얼마나 모델이 정확한지 판단합니다.
여기 scikit-learn을 이용한 결정 트리 모델과 특성과 타겟 변수를 이용한 예시가 있습니다.
# Define model. Specify a number for random_state to ensure same results each run
melbourne_model = DecisionTreeRegressor(random_state=1)
# Fit model
melbourne_model.fit(X, y)
DecisionTreeRegressor(criterion='mse', max_depth=None, max_features=None,
max_leaf_nodes=None, min_impurity_decrease=0.0,
min_impurity_split=None, min_samples_leaf=1,
min_samples_split=2, min_weight_fraction_leaf=0.0,
presort=False, random_state=1, splitter='best')
많은 머신 러닝 모델들은 모델 학습에 임의성을 이용합니다. random_state로 숫자를 명시하는 것은 여러분이 각 단계마다 같은 결과를 얻도록 합니다. 이는 좋은 시도일 수 있습니다. 어떠한 숫자를 사용하면, 모델의 질은 어떠한 값을 고르더라도 의미 있게 관련되지는 않을 것입니다.
우리는 이제 결정을 할 수 있는 피팅된 모델을 갖고 있습니다.
실제로, 여러분은 우리가 가격을 이미 알고 있는 집보다는 시장에 나타나는 새로운 집에 대해 결정을 내리고자 할 것입니다.하지만 우리는 얼마나 예측 함수가 잘 동작하는지 보기 위해 처음의 몇 개 열에 대해 결정을 내릴 것입니다.
print("Making predictions for the following 5 houses:")
print(X.head())
print("The predictions are")
print(melbourne_model.predict(X.head()))
Making predictions for the following 5 houses:
Rooms Bathroom Landsize Lattitude Longtitude
121.0156.0-37.8079144.9934232.0134.0-37.8093144.9944441.0120.0-37.8072144.9941632.0245.0-37.8024144.9993721.0256.0-37.8060144.9954
The predictions are
[1035000.1465000.1600000.1876000.1636000.]
어떠한 머신 러닝 프로젝트를 위한 첫 단계는 데이터에 친숙해지는 것입니다. 이를 위해 Pandas 라이브러리를 사용할 것입니다. Pandas는 데이터를 분석하고 조작하기 위해 데이터 사이언티스트들이 사용하는 주된 도구입니다. 대부분의 사람들이 그들의 코드에서 Pandas를 pd.로 줄여 씁니다. 우리는 다음 명령어를 사용합니다.
import pandas as pd
Pandas 라이브러리의 가장 중요한 부분은 DataFrame입니다. 데이터프레임은 여러분이 표로 생각하는 데이터를 다룹니다. 이는 엑셀의 시트나, SQL 데이터베이스의 표와 유사합니다.
판다스는 이러한 종류의 데이터를 다루고자 할 때 강력한 도구가 됩니다.
예를 들어, 우리는 오스트레일리아 멜버른의 집값 데이터를 보고자 합니다. 이번 예시에서, 여러분은 아이오와의 집값을 이용하여 새로운 데이터셋에 같은 절치를 진행하게 될 것입니다.
# save filepath to variable for easier access
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'# read the data and store data in DataFrame titled melbourne_data
melbourne_data = pd.read_csv(melbourne_file_path)
# print a summary of the data in Melbourne data
melbourne_data.describe()
Interpreting Data Description
원래의 데이터셋에서 각 열은 8개의 숫자를 보여줍니다. 첫 번째, Cound는 얼마나 많은 행이 non-missing values를 갖는지 보여줍니다.
Missing Value는 여러 가지 이유로 발생합니다. 예를 들면, 2번째 침실의 크기는 침실이 1개뿐인 집을 조사할 때는 수집되지 않습니다. missing data에 대한 주제는 곧 다시 알아볼 것입니다.
두번째 값은 평균입니다. 여기서, std는 표준편차를 의미하며, 수치적으로 값들이 얼마나 분포했는지를 나타냅니다.
min, 25%, 50%, 75%, 그리고 max값이 의미하는 것은, 각 열을 최저에서 최고값으로 분류하는 것을 생각해보면 됩니다. 첫 번째(최소) 값이 min입니다. 만약 리스트에서 1/4만큼 진행하면 값들 중 25%보다 크고 75%보다 작은 값을 보면 됩니다. 이 값을 25% 값이라고 하며, 50, 75퍼센트 값은 이와 같이 정의되며, max는 가장 큰 값이 됩니다.