# 2차시 2편 전체 음성 대본

## 00:00 · 1편에서 2편으로 이어가기

2차시의 두 번째 영상입니다. 첫 번째 영상에서는 이름과 책 수로 표를 만들고 평균을 계산했습니다. 이번에는 기존 웹앱의 매점 가격 실습을 그대로 따라갑니다. 표에서 일부 행을 살펴보고, 열 이름을 확인하고, 한 열을 골라 평균을 구하겠습니다.

```python
import pandas as pd

df = pd.DataFrame({
    'item': ['A', 'B', 'C'],
    'price': [1000, 1500, 2000]
})

print(df)
```

출력 또는 문제 안내:
```text
  item  price
0    A   1000
1    B   1500
2    C   2000
```

## 00:24 · 이번 시간에 완성할 결과

화면에 보이는 매점 상품 A, B, C의 가격은 각각 천 원, 천오백 원, 이천 원입니다. 실제 판매 조사가 아니라 수업용 가상 자료입니다. 목표는 세 가지입니다. 첫째, 앞 두 행만 확인해도 원본 표가 세 행으로 유지된다는 것을 설명합니다. 둘째, 대괄호 한 겹과 두 겹으로 열을 선택했을 때 자료구조가 어떻게 다른지 확인합니다. 셋째, 가격 평균 천오백 점 영을 계산하고 값을 바꾼 뒤 결과를 예측합니다. 여러분의 웹앱에서 2차시를 열고 코드 입력창을 준비하세요.

```python
import pandas as pd

df = pd.DataFrame({
    'item': ['A', 'B', 'C'],
    'price': [1000, 1500, 2000]
})

print(df)
print(df.shape)
```

출력 또는 문제 안내:
```text
  item  price
0    A   1000
1    B   1500
2    C   2000
(3, 2)
```

## 01:11 · 1단계 · pandas 준비

첫 번째 단계는 임포트 판다스 애즈 피디입니다. pandas라는 도구를 불러와서 pd라는 짧은 별칭을 붙입니다. 첫 영상에서 사용한 것과 같은 줄입니다. 앞에 쓴 코드가 화면에서 사라졌다면 이 줄부터 다시 입력해야 합니다. 실행 버튼은 편집기에 있는 전체 코드를 실행하기 때문입니다. 지금은 print가 없으므로 숫자나 표가 나오지 않는 것이 정상입니다. 오류 없이 실행되었는지를 먼저 확인하세요. 아직 자료를 만들기 전이므로 디에프를 출력하려고 하면 이름을 찾지 못하는 오류가 날 수 있습니다.

```python
import pandas as pd
```

출력 또는 문제 안내:
```text

```

## 01:56 · 2단계 · 매점 가격 표 만들기

이제 디에프라는 변수에 표를 만들겠습니다. 피디 점 데이터프레임 괄호를 열고, 중괄호 안에 두 열을 적습니다. item은 상품 이름표이고 A, B, C 세 문자를 담습니다. price는 가격 열이고 천, 천오백, 이천 세 숫자를 담습니다. 문자는 따옴표로 감싸고 계산할 숫자에는 따옴표를 붙이지 않습니다. item 줄 끝의 쉼표는 다음 열이 이어진다는 뜻입니다. 두 열의 리스트 길이가 모두 세 개이므로 같은 위치끼리 짝지을 수 있습니다. 중괄호와 소괄호를 모두 닫아 표를 완성합니다. 출력할 때 상품 A의 가격이 천, 상품 B의 가격이 천오백으로 대응하는지 확인하세요.

```python
import pandas as pd

df = pd.DataFrame({
    'item': ['A', 'B', 'C'],
    'price': [1000, 1500, 2000]
})

print(df)
```

출력 또는 문제 안내:
```text
  item  price
0    A   1000
1    B   1500
2    C   2000
```

## 02:49 · 3단계 · head(2)로 앞 두 행 보기

새 줄에 print, 디에프 점 헤드, 소괄호 이, 소괄호 닫기를 입력합니다. head는 표의 앞부분을 확인할 때 사용하는 메서드입니다. 괄호 안의 2는 앞에서부터 두 행을 돌려달라는 뜻입니다. 실행하면 인덱스 0과 1, 상품 A와 B만 보입니다. 이 화면을 보고 상품 C가 지워졌다고 생각하면 안 됩니다. 지금 명령은 두 행을 골라 보여 주었을 뿐입니다. 원본 변수 디에프에 다시 대입한 줄이 없습니다. 뒤에서 표 전체의 크기를 확인해 이 설명이 맞는지 검증하겠습니다.

```python
import pandas as pd

df = pd.DataFrame({
    'item': ['A', 'B', 'C'],
    'price': [1000, 1500, 2000]
})

print(df.head(2))
```

출력 또는 문제 안내:
```text
  item  price
0    A   1000
1    B   1500
```

## 03:34 · 행을 일부 봐도 원본은 그대로

이번에는 바로 다음 줄에 print, 디에프 점 쉐이프를 입력합니다. shape 뒤에는 소괄호를 붙이지 않습니다. 실행 결과 앞 두 행 아래에 소괄호 삼, 쉼표, 이가 나타납니다. 앞에서 두 행만 출력했지만 원본 디에프는 여전히 세 행 두 열입니다. 다시 print 디에프를 실행하면 상품 C도 남아 있습니다. 표에서 필요한 부분을 읽는 것과 원본을 변경하는 것은 구분해야 합니다. 실행 결과에 보인 행 수를 곧바로 전체 자료의 행 수라고 생각하지 마세요. 큰 CSV를 읽을 때에도 앞부분만 보고 전체 개수를 단정하면 안 됩니다.

```python
import pandas as pd

df = pd.DataFrame({
    'item': ['A', 'B', 'C'],
    'price': [1000, 1500, 2000]
})

print(df.head(2))
print(df.shape)
```

출력 또는 문제 안내:
```text
  item  price
0    A   1000
1    B   1500
(3, 2)
```

## 04:23 · head()와 shape의 문법 차이

head 뒤에는 괄호가 있고 shape 뒤에는 괄호가 없었습니다. head는 앞부분을 돌려주는 일을 실행하는 메서드입니다. 괄호 안에 원하는 행 수를 전달할 수 있습니다. shape는 현재 표의 크기를 알려 주는 속성입니다. 이미 가지고 있는 정보를 읽는 것이므로 괄호를 붙이지 않습니다. head의 괄호를 비워 두면 기본으로 앞 다섯 행을 돌려줍니다. 지금 표에는 세 행뿐이므로 세 행 모두 보입니다. 다섯 행을 새로 만들어 주는 명령이 아닙니다. 직접 head 괄호 이와 빈 괄호를 비교해 보세요.

```python
import pandas as pd

df = pd.DataFrame({
    'item': ['A', 'B', 'C'],
    'price': [1000, 1500, 2000]
})

print(df.head())
print(df.shape)
```

출력 또는 문제 안내:
```text
  item  price
0    A   1000
1    B   1500
2    C   2000
(3, 2)
```

## 05:07 · 4단계 · 실제 열 이름 확인

이번에는 print 안에 디에프 점 컬럼즈 점 투리스트 괄호를 적습니다. columns는 표가 가진 열 이름을 알려 줍니다. tolist는 그 이름들을 파이썬의 리스트 형태로 바꾸어 확인하는 데 사용합니다. 실행하면 item과 price 두 이름이 대괄호 안에 나타납니다. 실제 CSV를 읽었을 때는 내가 예상한 열 이름과 파일의 열 이름이 다를 수 있습니다. 그래서 이름을 외워서 추측하기보다 이 명령으로 실제 이름을 먼저 확인하면 좋습니다. price의 p가 소문자인지, 단어 앞뒤에 공백이 없는지도 살펴보세요. 지금은 두 개의 열 이름을 읽었을 뿐이며 원본 값은 바뀌지 않습니다.

```python
import pandas as pd

df = pd.DataFrame({
    'item': ['A', 'B', 'C'],
    'price': [1000, 1500, 2000]
})

print(df.columns.tolist())
```

출력 또는 문제 안내:
```text
['item', 'price']
```

## 05:58 · 한 열을 고르면 Series

다음 줄에 print, 디에프 대괄호, 따옴표 price, 대괄호 닫기를 적습니다. 문자열 하나로 열을 선택하면 판다스의 시리즈가 됩니다. Series는 하나의 축을 가진 일차원 자료구조입니다. 화면에는 인덱스 0, 1, 2와 가격 값 천, 천오백, 이천이 세로로 나옵니다. 인덱스는 여전히 각 값의 이름표입니다. 아래쪽 Name은 이 Series의 이름이 price라는 설명이고 dtype은 값의 자료형 설명입니다. 이 설명 줄들을 새로운 상품 행으로 세지 않습니다. 한 열의 값 목록에도 인덱스가 붙어 있다는 점을 확인하세요.

```python
import pandas as pd

df = pd.DataFrame({
    'item': ['A', 'B', 'C'],
    'price': [1000, 1500, 2000]
})

print(df['price'])
```

출력 또는 문제 안내:
```text
0    1000
1    1500
2    2000
Name: price, dtype: int64
```

## 06:48 · 대괄호 두 겹이면 DataFrame

같은 price 열을 이번에는 대괄호 두 겹으로 선택하겠습니다. 안쪽 대괄호에는 선택할 열 이름의 리스트가 들어갑니다. 지금은 price 하나뿐이지만 여러 열을 고를 때와 같은 방식입니다. 바깥 대괄호가 그 목록을 사용해 표에서 열을 고릅니다. 결과는 한 열을 가진 DataFrame입니다. 위에 price라는 열 제목이 있고 세 행의 가격이 표처럼 나타납니다. 숫자 값은 앞의 Series와 같지만 자료구조가 다릅니다. 대괄호가 늘었다고 가격이 두 배가 되거나 열이 두 개가 되는 것은 아닙니다. 선택할 열 이름이 price 하나이므로 결과는 세 행 한 열입니다.

```python
import pandas as pd

df = pd.DataFrame({
    'item': ['A', 'B', 'C'],
    'price': [1000, 1500, 2000]
})

print(df[['price']])
print(df[['price']].shape)
```

출력 또는 문제 안내:
```text
   price
0   1000
1   1500
2   2000
(3, 1)
```

## 07:38 · 같은 값과 다른 구조를 비교하기

두 선택을 한 번에 비교하겠습니다. price를 한 겹 대괄호로 고른 결과의 타입 이름은 Series입니다. 두 겹 대괄호로 고른 결과의 타입 이름은 DataFrame입니다. 화면의 타입 확인 코드는 비교를 위한 보충 코드이며 외울 필요는 없습니다. 중요한 것은 무엇을 선택했는지 설명할 수 있는가입니다. 문자열 하나를 주면 한 열의 Series, 열 이름의 리스트를 주면 그 열들로 구성된 DataFrame입니다. NumPy를 먼저 배우지 않아도 됩니다. 두 결과에 담긴 가격 세 값이 같다는 점과, 한 열의 값 묶음인지 한 열을 가진 표인지의 차이를 구분해 두세요.

```python
import pandas as pd

df = pd.DataFrame({
    'item': ['A', 'B', 'C'],
    'price': [1000, 1500, 2000]
})

s = df['price']
t = df[['price']]
print(type(s).__name__)
print(type(t).__name__)
```

출력 또는 문제 안내:
```text
Series
DataFrame
```

## 08:27 · 5단계 · 가격 평균 계산

이제 정규 실습의 다섯 번째 단계입니다. print 안에 디에프에서 price 열을 고르고, 점 mean과 빈 괄호를 붙입니다. 먼저 숫자 열을 선택하고, 그 열에 평균 계산을 실행하는 순서입니다. 천 더하기 천오백 더하기 이천은 사천오백입니다. 가격 값이 세 개 있으므로 셋으로 나누면 천오백입니다. 실제 출력은 천오백 점 영입니다. 평균 계산의 결과가 소수 표현으로 나왔기 때문이며, 값 자체는 천오백과 같습니다. 합계 사천오백을 평균으로 적지 않도록 주의하세요. 여기서 평균은 세 상품 가격의 대표값이지, 특정 상품의 이름이나 판매 개수는 아닙니다.

```python
import pandas as pd

df = pd.DataFrame({
    'item': ['A', 'B', 'C'],
    'price': [1000, 1500, 2000]
})

print(df['price'].mean())
```

출력 또는 문제 안내:
```text
1500.0
```

## 09:19 · head를 본 뒤에도 평균은 전체 기준

이번에는 앞 두 행을 출력한 뒤 평균을 계산하겠습니다. head 괄호 이로 A와 B만 보았더라도, 다음 줄에서 원본 디에프의 price 평균을 구하면 세 값 전체의 평균 천오백이 나옵니다. 앞 두 상품의 가격만 평균내려면 먼저 head 괄호 이로 얻은 표에서 price 열을 고른 뒤 mean을 실행해야 합니다. 그러면 천과 천오백을 둘로 나누어 천이백오십 점 영이 됩니다. 어떤 표를 대상으로 계산하는지가 중요합니다. 코드의 앞에서 무언가를 출력했다는 사실만으로 뒤의 평균 대상이 자동 변경되지는 않습니다.

```python
import pandas as pd

df = pd.DataFrame({
    'item': ['A', 'B', 'C'],
    'price': [1000, 1500, 2000]
})

print(df.head(2))
print(df['price'].mean())
print(df.head(2)['price'].mean())
```

출력 또는 문제 안내:
```text
  item  price
0    A   1000
1    B   1500
1500.0
1250.0
```

## 10:04 · 값을 바꿔 평균 예측하기

이제 C의 가격 이천을 삼천으로 바꿔 보겠습니다. 코드를 실행하기 전에 합계를 계산해 보세요. 천 더하기 천오백 더하기 삼천은 오천오백이고, 세 값으로 나누므로 평균은 약 천팔백삼십삼 점 삼삼입니다. 값 하나가 커졌으므로 전체 평균도 이전의 천오백보다 커져야 합니다. 표의 크기는 여전히 세 행 두 열입니다. 인덱스도 0, 1, 2 그대로입니다. 바뀐 것이 행 수인지, 열 수인지, 실제 데이터 값인지를 구분해 설명하세요. 화면의 긴 소수 마지막 자리는 컴퓨터의 소수 표현 때문에 보이는 것이며, 지금 코드는 반올림을 지정하지 않았습니다.

```python
import pandas as pd

df = pd.DataFrame({
    'item': ['A', 'B', 'C'],
    'price': [1000, 1500, 3000]
})

print(df['price'].mean())
```

출력 또는 문제 안내:
```text
1833.3333333333333
```

## 10:55 · 일시정지 · 다섯 단계 직접 완성

여기서 영상을 멈추세요. 정규 2차시의 첫 단계부터 다섯 단계까지 직접 입력합니다. 앞 단계의 코드를 지우지 말고 다음 줄에 새 명령을 이어 붙입니다. 처음 두 행과 전체 크기, 열 이름과 한 열의 값, 마지막 평균을 차례대로 확인하세요. 기본 자료의 마지막 가격은 이천으로 되돌려 둡니다. 실행 결과가 영상과 다르면 먼저 값이 같은지 확인합니다. 그 다음 괄호와 따옴표, 열 이름을 비교합니다. 완성했다면 head는 원본을 지우지 않는다는 이유를 자신의 말로 한 문장 적어 보세요. 빠르게 끝낸 학생은 Series와 DataFrame 두 선택을 나란히 비교합니다.

```python
import pandas as pd

df = pd.DataFrame({
    'item': ['A', 'B', 'C'],
    'price': [1000, 1500, 2000]
})

print(df.head(2))
print(df.shape)
print(df.columns.tolist())
print(df['price'])
print(df['price'].mean())
```

출력 또는 문제 안내:
```text
[출력의 마지막 8줄]
1    B   1500
(3, 2)
['item', 'price']
0    1000
1    1500
2    2000
Name: price, dtype: int64
1500.0
```

## 12:10 · 오류 해결 · 열 이름 대소문자

price의 p를 대문자로 적으면 어떻게 될까요? 화면의 코드를 실제로 실행하면 KeyError가 발생합니다. 표에 Price라는 이름의 열이 없기 때문입니다. 판다스는 소문자 price와 대문자 Price를 서로 다른 이름으로 봅니다. 오류를 만났을 때 아무 글자나 지우지 말고 마지막 오류 문장에 나온 이름을 확인하세요. columns 점 tolist로 실제 열 이름을 출력한 뒤 비교하면 원인을 찾기 쉽습니다. 이름이 맞는데도 문제가 생기면 앞뒤 공백이나 한글과 영문 입력 상태도 확인합니다. 올바른 소문자 price로 고친 뒤 다시 실행해 평균 천오백 점 영으로 돌아오는지 확인하세요.

```python
import pandas as pd

df = pd.DataFrame({
    'item': ['A', 'B', 'C'],
    'price': [1000, 1500, 2000]
})

print(df['Price'].mean())
```

출력 또는 문제 안내:
```text
KeyError: 'Price'
```

## 13:02 · 오류 해결 · shape와 mean 괄호

다음은 괄호에 관한 두 가지 실수입니다. shape는 표의 크기 속성이므로 뒤에 괄호를 붙이지 않습니다. shape 괄호를 실행하려고 하면 튜플은 호출할 수 없다는 타입 오류가 나타납니다. 반대로 mean은 평균 계산을 실행하는 메서드이므로 괄호가 필요합니다. mean 뒤 괄호를 빼면 평균 숫자 대신 메서드에 관한 설명이 나올 수 있습니다. 이 경우 프로그램이 오류 없이 끝났다는 표시만 보고 정답이라고 판단하면 안 됩니다. 우리가 구하려던 결과가 숫자 천오백인지까지 확인해야 합니다. 화면에서는 먼저 잘못된 shape 괄호를 보여 주고, 올바른 shape와 mean 괄호를 함께 확인합니다.

```python
import pandas as pd

df = pd.DataFrame({
    'item': ['A', 'B', 'C'],
    'price': [1000, 1500, 2000]
})

print(df.shape())
```

출력 또는 문제 안내:
```text
TypeError: 'tuple' object is not callable
```

## 13:52 · 먼저 풀어 보기 · 결과 예측

세 문제를 먼저 풀어 보세요. 첫 번째, head 괄호 이만 실행하면 원본 디에프의 행이 두 개가 될까요? 두 번째, 디에프에서 price를 한 겹 대괄호로 선택하면 Series일까요 DataFrame일까요? 세 번째, 가격 천, 천오백, 이천의 평균은 사천오백일까요 천오백일까요? 영상을 멈추고 정답과 이유를 함께 적습니다. 앞 두 행의 평균 천이백오십과 전체 평균 천오백도 구분해 보세요. 답을 적은 뒤에 다음 해설을 확인합니다.

```python
① df.head(2) 후 원본 행 수는?

② df['price']의 자료구조는?

③ 1000, 1500, 2000의 평균은?
```

출력 또는 문제 안내:
```text
영상을 멈추고
먼저 답과 이유를 적으세요.
```

## 14:52 · 예측 문제 정답과 해설

첫 번째, 원본의 행 수는 세 개 그대로입니다. head가 돌려준 앞 두 행을 출력했을 뿐 원본에 다시 대입하지 않았습니다. 두 번째, 문자열 price 하나로 열을 고르면 Series입니다. price를 리스트로 묶어 두 겹 대괄호로 선택하면 한 열짜리 DataFrame입니다. 세 번째, 평균은 천오백이며 파이썬 출력은 천오백 점 영입니다. 사천오백은 세 가격의 합계입니다. 평균을 구할 때는 어떤 값들을 더하고 몇 개로 나누었는지 설명할 수 있어야 합니다. 틀린 문제가 있다면 정답 번호만 고치지 말고 헷갈린 코드 부분을 한 줄 적어 두세요.

```python
① 원본은 3행 그대로

② Series / 두 겹이면 DataFrame

③ (1000 + 1500 + 2000) / 3 = 1500.0
```

출력 또는 문제 안내:
```text
① 3행 그대로
② Series
③ 1500.0
```

## 15:40 · VS Code에서 같은 파일 다시 실행

웹에서 완성한 누적 코드를 파이썬 파일로 저장하겠습니다. 웹앱의 파이썬 저장 버튼을 누르고, 저장한 파일을 수업 폴더에서 엽니다. 수업용 파이썬 인터프리터를 선택하고 터미널에서 파이썬과 파일 이름을 입력해 실행합니다. 같은 코드와 같은 값이라면 앞 두 행, 크기 삼 행 이 열, price 열의 값과 평균 천오백 점 영이 같아야 합니다. 파일을 찾지 못하면 폴더와 파일 이름을 확인하고, pandas가 없으면 선생님과 실행 환경을 점검하세요.

```python
import pandas as pd

df = pd.DataFrame({
    'item': ['A', 'B', 'C'],
    'price': [1000, 1500, 2000]
})

print(df.head(2))
print(df.shape)
print(df.columns.tolist())
print(df['price'])
print(df['price'].mean())
```

출력 또는 문제 안내:
```text
[출력의 마지막 8줄]
1    B   1500
(3, 2)
['item', 'price']
0    1000
1    1500
2    2000
Name: price, dtype: int64
1500.0
```

## 16:20 · 학습 기록과 다음 차시 준비

마지막으로 오늘 헷갈린 코드를 기록합니다. head는 원본을 줄이지 않으며, shape는 괄호가 없고 mean은 괄호가 필요합니다. 파이썬 저장은 코드 파일, JSON 백업은 학습 기록을 보관합니다. 서로 다른 파일이며 선생님에게 자동 제출되지 않습니다. 오늘 표는 코드에서 직접 만들었습니다. 기존 매점 판매 CSV는 열 구성이 다른 확장 자료이므로 오늘 가격 표와 혼동하지 마세요. 다음은 스포츠 CSV를 읽는 3차시입니다.

```python
import pandas as pd

df = pd.DataFrame({
    'item': ['A', 'B', 'C'],
    'price': [1000, 1500, 2000]
})

print(df['price'].mean())
```

출력 또는 문제 안내:
```text
1500.0
```

## 17:03 · 핵심 정리

오늘 배운 명령을 정리합니다. head 괄호 이는 앞 두 행을 반환하며 원본 표를 자동으로 줄이지 않습니다. shape는 행 수와 열 수를 알려 주는 속성이고 괄호가 없습니다. columns 점 tolist는 실제 열 이름을 확인하는 데 사용합니다. 문자열 하나로 열을 고르면 Series, 열 이름의 리스트로 고르면 DataFrame입니다. 숫자 열 뒤에 mean 괄호를 붙이면 평균을 계산합니다. 결과를 먼저 예측하고 직접 실행한 뒤, 예상과 다른 이유를 설명하는 습관을 기억하세요. 코드와 학습 기록을 저장한 뒤 3차시의 CSV 읽기로 이어가겠습니다.

```python
import pandas as pd

df = pd.DataFrame({
    'item': ['A', 'B', 'C'],
    'price': [1000, 1500, 2000]
})

print(df.head(2))
print(df.shape)
print(df.columns.tolist())
print(df['price'].mean())
```

출력 또는 문제 안내:
```text
  item  price
0    A   1000
1    B   1500
(3, 2)
['item', 'price']
1500.0
```

