🌓

3일차 기본 실습

 
notion imagenotion image

목차

 
import numpy as np import pandas as pd
df = pd.DataFrame(np.random.randint(50, 100, size=(10, 5)), index = [['1학년' for i in range(5)]+ ['2학년' for i in range(5)], [str(i)+'반' for i in range(1, 6)] + [str(i)+'반' for i in range(1, 6)]], columns = ['국', '영', '수', '사', '과']) df
Out[-] 국 영 수 사 과 1학년 1반 57 79 66 96 85 2반 93 69 90 87 67 3반 87 81 83 66 79 4반 80 67 59 69 59 5반 51 68 88 94 80 2학년 1반 60 84 89 59 50 2반 62 93 59 60 73 3반 84 99 55 90 63 4반 95 57 68 85 69 5반 68 61 86 67 66
 

Data Information

df.info()
Out[-] <class 'pandas.core.frame.DataFrame'> MultiIndex: 10 entries, ('1학년', '1반') to ('2학년', '5반') Data columns (total 5 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 국 10 non-null int32 1 영 10 non-null int32 2 수 10 non-null int32 3 사 10 non-null int32 4 과 10 non-null int32 dtypes: int32(5) memory usage: 308.0+ bytes
df.dtypes
Out[-] 국 int32 영 int32 수 int32 사 int32 과 int32 dtype: object
df.head()
Out[-] 국 영 수 사 과 1학년 1반 57 79 66 96 85 2반 93 69 90 87 67 3반 87 81 83 66 79 4반 80 67 59 69 59 5반 51 68 88 94 80
df.tail(3)
Out[-] 국 영 수 사 과 2학년 3반 84 99 55 90 63 4반 95 57 68 85 69 5반 68 61 86 67 66
df.index
Out[-] MultiIndex([('1학년', '1반'), ('1학년', '2반'), ('1학년', '3반'), ('1학년', '4반'), ('1학년', '5반'), ('2학년', '1반'), ('2학년', '2반'), ('2학년', '3반'), ('2학년', '4반'), ('2학년', '5반')], )
df.values
Out[-] array([[57, 79, 66, 96, 85], [93, 69, 90, 87, 67], [87, 81, 83, 66, 79], [80, 67, 59, 69, 59], [51, 68, 88, 94, 80], [60, 84, 89, 59, 50], [62, 93, 59, 60, 73], [84, 99, 55, 90, 63], [95, 57, 68, 85, 69], [68, 61, 86, 67, 66]])
df.describe() # 가장 기초적인 통계 분석
Out[-] 국 영 수 사 과 count 10.000000 10.000000 10.000000 10.000000 10.000000 mean 73.700000 75.800000 74.300000 77.300000 69.100000 std 15.986453 13.725888 14.189589 14.453373 10.556199 min 51.000000 57.000000 55.000000 59.000000 50.000000 25% 60.500000 67.250000 60.750000 66.250000 63.750000 50% 74.000000 74.000000 75.500000 77.000000 68.000000 75% 86.250000 83.250000 87.500000 89.250000 77.500000 max 95.000000 99.000000 90.000000 96.000000 85.000000
 

indexing, slicing

df
Out[-] 국 영 수 사 과 1학년 1반 57 79 66 96 85 2반 93 69 90 87 67 3반 87 81 83 66 79 4반 80 67 59 69 59 5반 51 68 88 94 80 2학년 1반 60 84 89 59 50 2반 62 93 59 60 73 3반 84 99 55 90 63 4반 95 57 68 85 69 5반 68 61 86 67 66
print(df.국) print(df['국']) # 같은 결과
Out[-] 1학년 1반 57 2반 93 3반 87 4반 80 5반 51 2학년 1반 60 2반 62 3반 84 4반 95 5반 68 Name: 국, dtype: int32 1학년 1반 57 2반 93 3반 87 4반 80 5반 51 2학년 1반 60 2반 62 3반 84 4반 95 5반 68 Name: 국, dtype: int32
df[2:4] # 묵시적으로 선언된 인덱스로 slicing
Out[-] 국 영 수 사 과 1학년 3반 87 81 83 66 79 4반 80 67 59 69 59
df[['국', '영', '수']]
Out[-] 국 영 수 1학년 1반 57 79 66 2반 93 69 90 3반 87 81 83 4반 80 67 59 5반 51 68 88 2학년 1반 60 84 89 2반 62 93 59 3반 84 99 55 4반 95 57 68 5반 68 61 86
df.loc[:'1학년', ['국', '영', '수']]
Out[-] 국 영 수 1학년 1반 57 79 66 2반 93 69 90 3반 87 81 83 4반 80 67 59 5반 51 68 88
df.loc[:'1학년', ['국']]
Out[-] 국 1학년 1반 57 2반 93 3반 87 4반 80 5반 51
df.loc[:'1학년', ['국']][:3]
Out[-] 국 1학년 1반 57 2반 93 3반 87
df.loc[:'1학년', ['국']][::-1]
Out[-] 국 1학년 5반 51 4반 80 3반 87 2반 93 1반 57
df.iloc[:5, [0, 3]]
Out[-] 국 사 1학년 1반 57 96 2반 93 87 3반 87 66 4반 80 69 5반 51 94
df.iloc[-3:, [0, 3]]
Out[-] 국 사 2학년 3반 84 90 4반 95 85 5반 68 67
df.iloc[::2, [0, 3]]
Out[-] 국 사 1학년 1반 57 96 3반 87 66 5반 51 94 2학년 2반 62 60 4반 95 85
df.iloc[::-1, [0, 3]]
Out[-] 국 사 2학년 5반 68 67 4반 95 85 3반 84 90 2반 62 60 1반 60 59 1학년 5반 51 94 4반 80 69 3반 87 66 2반 93 87 1반 57 96
 

Assignment

df
Out[-] 국 영 수 사 과 1학년 1반 57 79 66 96 85 2반 93 69 90 87 67 3반 87 81 83 66 79 4반 80 67 59 69 59 5반 51 68 88 94 80 2학년 1반 60 84 89 59 50 2반 62 93 59 60 73 3반 84 99 55 90 63 4반 95 57 68 85 69 5반 68 61 86 67 66
df_3 = pd.DataFrame(np.random.randint(50, 100, size=(5, 5)), index = [['3학년' for i in range(5)], [str(i)+'반' for i in range(1, 6)]], columns = ['국', '영', '수', '사', '과']) df_3
Out[-] 국 영 수 사 과 3학년 1반 99 74 74 62 94 2반 55 60 64 84 60 3반 61 89 61 64 65 4반 60 51 50 82 56 5반 62 80 99 76 96
df.append(df_3)
Out[-] 국 영 수 사 과 1학년 1반 57 79 66 96 85 2반 93 69 90 87 67 3반 87 81 83 66 79 4반 80 67 59 69 59 5반 51 68 88 94 80 2학년 1반 60 84 89 59 50 2반 62 93 59 60 73 3반 84 99 55 90 63 4반 95 57 68 85 69 5반 68 61 86 67 66 3학년 1반 99 74 74 62 94 2반 55 60 64 84 60 3반 61 89 61 64 65 4반 60 51 50 82 56 5반 62 80 99 76 96
# for i in df: # print(i, df[i]) df['국']
Out[-] 1학년 1반 57 2반 93 3반 87 4반 80 5반 51 2학년 1반 60 2반 62 3반 84 4반 95 5반 68 3학년 1반 99 2반 55 3반 61 4반 60 5반 62 Name: 국, dtype: int32
df['평균'] = (df['국'] + df['영'] + df['수'] + df['사'] + df['과']) / 5 df
Out[-] 국 영 수 사 과 평균 1학년 1반 57 79 66 96 85 76.6 2반 93 69 90 87 67 81.2 3반 87 81 83 66 79 79.2 4반 80 67 59 69 59 66.8 5반 51 68 88 94 80 76.2 2학년 1반 60 84 89 59 50 68.4 2반 62 93 59 60 73 69.4 3반 84 99 55 90 63 78.2 4반 95 57 68 85 69 74.8 5반 68 61 86 67 66 69.6 3학년 1반 99 74 74 62 94 80.6 2반 55 60 64 84 60 64.6 3반 61 89 61 64 65 68.0 4반 60 51 50 82 56 59.8 5반 62 80 99 76 96 82.6
 

통계치와 결측치 처리, 값의 변경

len(df) # 1학년 1반부터 3학년 5반까지 총 15개의 반
Out[-] 15
for i in df: print(i)
Out[-] 국 영 수 사 과 평균
df.size
Out[-] 90
df.values # 이중 배열이기 때문에 len(df.values)는 15가 나옴
Out[-] array([[57. , 79. , 66. , 96. , 85. , 76.6], [93. , 69. , 90. , 87. , 67. , 81.2], [87. , 81. , 83. , 66. , 79. , 79.2], [80. , 67. , 59. , 69. , 59. , 66.8], [51. , 68. , 88. , 94. , 80. , 76.2], [60. , 84. , 89. , 59. , 50. , 68.4], [62. , 93. , 59. , 60. , 73. , 69.4], [84. , 99. , 55. , 90. , 63. , 78.2], [95. , 57. , 68. , 85. , 69. , 74.8], [68. , 61. , 86. , 67. , 66. , 69.6], [99. , 74. , 74. , 62. , 94. , 80.6], [55. , 60. , 64. , 84. , 60. , 64.6], [61. , 89. , 61. , 64. , 65. , 68. ], [60. , 51. , 50. , 82. , 56. , 59.8], [62. , 80. , 99. , 76. , 96. , 82.6]])
df.count()
Out[-] 국 15 영 15 수 15 사 15 과 15 평균 15 dtype: int64
df.shape
Out[-] (15, 6)
df.ndim
Out[-] 2
df.mean()
Out[-] 국 71.600000 영 74.133333 수 72.733333 사 76.066667 과 70.800000 평균 73.066667 dtype: float64
df
Out[-] 국 영 수 사 과 평균 1학년 1반 57 79 66 96 85 76.6 2반 93 69 90 87 67 81.2 3반 87 81 83 66 79 79.2 4반 80 67 59 69 59 66.8 5반 51 68 88 94 80 76.2 2학년 1반 60 84 89 59 50 68.4 2반 62 93 59 60 73 69.4 3반 84 99 55 90 63 78.2 4반 95 57 68 85 69 74.8 5반 68 61 86 67 66 69.6 3학년 1반 99 74 74 62 94 80.6 2반 55 60 64 84 60 64.6 3반 61 89 61 64 65 68.0 4반 60 51 50 82 56 59.8 5반 62 80 99 76 96 82.6
df.loc['1학년']['수'] = df.loc['1학년']['수'] + 10 df
Out[-] 국 영 수 사 과 평균 1학년 1반 57 79 76 96 85 76.6 2반 93 69 100 87 67 81.2 3반 87 81 93 66 79 79.2 4반 80 67 69 69 59 66.8 5반 51 68 98 94 80 76.2 2학년 1반 60 84 89 59 50 68.4 2반 62 93 59 60 73 69.4 3반 84 99 55 90 63 78.2 4반 95 57 68 85 69 74.8 5반 68 61 86 67 66 69.6 3학년 1반 99 74 74 62 94 80.6 2반 55 60 64 84 60 64.6 3반 61 89 61 64 65 68.0 4반 60 51 50 82 56 59.8 5반 62 80 99 76 96 82.6
df[df['수'] > 80]
Out[-] 국 영 수 사 과 평균 1학년 2반 93 69 100 87 67 81.2 3반 87 81 93 66 79 79.2 5반 51 68 98 94 80 76.2 2학년 1반 60 84 89 59 50 68.4 5반 68 61 86 67 66 69.6 3학년 5반 62 80 99 76 96 82.6
df['수'] > 80
Out[-] 1학년 1반 False 2반 True 3반 True 4반 False 5반 True 2학년 1반 True 2반 False 3반 False 4반 False 5반 True 3학년 1반 False 2반 False 3반 False 4반 False 5반 True Name: 수, dtype: bool
 

공분산 : 2개의 확률변수 상관정도

  • 하나의 값이 상승하는 경향을 보일 때, 다른 값도 상승하는 상관관계라면 공분산의 값은 양수
  • 하나의 값이 상승하는 경향을 보일 때, 다른 값이 하강하는 경향의 상관관계라면 공분산의 값은 음수
df.cov()
Out[-] 국 영 수 사 과 평균 국 264.971429 -4.585714 12.600000 -23.685714 32.414286 54.914286 영 -4.585714 193.838095 -8.366667 -48.152381 33.028571 34.104762 수 12.600000 -8.366667 288.495238 6.423810 92.157143 70.309524 사 -23.685714 -48.152381 6.423810 166.923810 15.300000 18.838095 과 32.414286 33.028571 92.157143 15.300000 183.885714 69.071429 평균 54.914286 34.104762 70.309524 18.838095 69.071429 47.352381
 

상관계수(피어슨 상관계수)

  • 두 변수간에 원인과 결과의 인과관계가 있는지에 대한 것은 회귀분석을 통해 인과관계의 방향, 정도와 수학적 모델을 확인
 
  • r이 -1.0과 -0.7 사이이면, 강한 음적 선형관계,
  • r이 -0.7과 -0.3 사이이면, 뚜렷한 음적 선형관계,
  • r이 -0.3과 -0.1 사이이면, 약한 음적 선형관계,
  • r이 -0.1과 +0.1 사이이면, 거의 무시될 수 있는 선형관계,
  • r이 +0.1과 +0.3 사이이면, 약한 양적 선형관계,
  • r이 +0.3과 +0.7 사이이면, 뚜렷한 양적 선형관계,
  • r이 +0.7과 +1.0 사이이면, 강한 양적 선형관계
df['국'].corr(df['사'])
Out[-] -0.11262318855527205
df['수'].corr(df['과'])
Out[-] 0.4001157819565991
df
Out[-] 국 영 수 사 과 평균 1학년 1반 57 79 76 96 85 76.6 2반 93 69 100 87 67 81.2 3반 87 81 93 66 79 79.2 4반 80 67 69 69 59 66.8 5반 51 68 98 94 80 76.2 2학년 1반 60 84 89 59 50 68.4 2반 62 93 59 60 73 69.4 3반 84 99 55 90 63 78.2 4반 95 57 68 85 69 74.8 5반 68 61 86 67 66 69.6 3학년 1반 99 74 74 62 94 80.6 2반 55 60 64 84 60 64.6 3반 61 89 61 64 65 68.0 4반 60 51 50 82 56 59.8 5반 62 80 99 76 96 82.6
# df['수']['1학년'] = np.nan print(df.info()) # int32 2**32//2 # 32비트 int형에는 nan을 입력해도 nan이 들어가지 못함 print(df['수'].dtypes) df['수'].astype('float') df['수'] = np.nan print(df)
Out[-] <class 'pandas.core.frame.DataFrame'> MultiIndex: 15 entries, ('1학년', '1반') to ('3학년', '5반') Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 국 15 non-null int32 1 영 15 non-null int32 2 수 0 non-null float64 3 사 15 non-null int32 4 과 15 non-null int32 5 평균 15 non-null float64 dtypes: float64(2), int32(4) memory usage: 626.0+ bytes 2147483648 int32 국 영 수 사 과 평균 1학년 1반 57 79 NaN 96 85 76.6 2반 93 69 NaN 87 67 81.2 3반 87 81 NaN 66 79 79.2 4반 80 67 NaN 69 59 66.8 5반 51 68 NaN 94 80 76.2 2학년 1반 60 84 NaN 59 50 68.4 2반 62 93 NaN 60 73 69.4 3반 84 99 NaN 90 63 78.2 4반 95 57 NaN 85 69 74.8 5반 68 61 NaN 67 66 69.6 3학년 1반 99 74 NaN 62 94 80.6 2반 55 60 NaN 84 60 64.6 3반 61 89 NaN 64 65 68.0 4반 60 51 NaN 82 56 59.8 5반 62 80 NaN 76 96 82.6
df.isna()
Out[-] 국 영 수 사 과 평균 1학년 1반 False False True False False False 2반 False False True False False False 3반 False False True False False False 4반 False False True False False False 5반 False False True False False False 2학년 1반 False False True False False False 2반 False False True False False False 3반 False False True False False False 4반 False False True False False False 5반 False False True False False False 3학년 1반 False False True False False False 2반 False False True False False False 3반 False False True False False False 4반 False False True False False False 5반 False False True False False False
# max(df.mean()) df.fillna(50) # 결측치를 다른 값으로 채움
Out[-] 국 영 수 사 과 평균 1학년 1반 57 79 50.0 96 85 76.6 2반 93 69 50.0 87 67 81.2 3반 87 81 50.0 66 79 79.2 4반 80 67 50.0 69 59 66.8 5반 51 68 50.0 94 80 76.2 2학년 1반 60 84 50.0 59 50 68.4 2반 62 93 50.0 60 73 69.4 3반 84 99 50.0 90 63 78.2 4반 95 57 50.0 85 69 74.8 5반 68 61 50.0 67 66 69.6 3학년 1반 99 74 50.0 62 94 80.6 2반 55 60 50.0 84 60 64.6 3반 61 89 50.0 64 65 68.0 4반 60 51 50.0 82 56 59.8 5반 62 80 50.0 76 96 82.6
 

데이터 출력

  • .T : 행과 열의 위치 치환
  • apply : 호출 함수
df.T
Out[-] 1학년 2학년 3학년 1반 2반 3반 4반 5반 1반 2반 3반 4반 5반 1반 2반 3반 4반 5반 국 57.0 93.0 87.0 80.0 51.0 60.0 62.0 84.0 95.0 68.0 99.0 55.0 61.0 60.0 62.0 영 79.0 69.0 81.0 67.0 68.0 84.0 93.0 99.0 57.0 61.0 74.0 60.0 89.0 51.0 80.0 수 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 사 96.0 87.0 66.0 69.0 94.0 59.0 60.0 90.0 85.0 67.0 62.0 84.0 64.0 82.0 76.0 과 85.0 67.0 79.0 59.0 80.0 50.0 73.0 63.0 69.0 66.0 94.0 60.0 65.0 56.0 96.0 평균 76.6 81.2 79.2 66.8 76.2 68.4 69.4 78.2 74.8 69.6 80.6 64.6 68.0 59.8 82.6
df.apply(max)
Out[-] 국 99.0 영 99.0 수 NaN 사 96.0 과 96.0 평균 82.6 dtype: float64
df.apply(min)
Out[-] 국 51.0 영 51.0 수 NaN 사 59.0 과 50.0 평균 59.8 dtype: float64
df.apply(lambda x: x.max() - x.min()) # 메소드가 들어가야 하므로 lambda 사용
Out[-] 국 48.0 영 48.0 수 NaN 사 37.0 과 46.0 평균 22.8 dtype: float64
df.sort_values('국', ascending=True)
Out[-] 국 영 수 사 과 평균 1학년 5반 51 68 NaN 94 80 76.2 3학년 2반 55 60 NaN 84 60 64.6 1학년 1반 57 79 NaN 96 85 76.6 2학년 1반 60 84 NaN 59 50 68.4 3학년 4반 60 51 NaN 82 56 59.8 3반 61 89 NaN 64 65 68.0 2학년 2반 62 93 NaN 60 73 69.4 3학년 5반 62 80 NaN 76 96 82.6 2학년 5반 68 61 NaN 67 66 69.6 1학년 4반 80 67 NaN 69 59 66.8 2학년 3반 84 99 NaN 90 63 78.2 1학년 3반 87 81 NaN 66 79 79.2 2반 93 69 NaN 87 67 81.2 2학년 4반 95 57 NaN 85 69 74.8 3학년 1반 99 74 NaN 62 94 80.6
#df.to_csv('학교점수.csv') df.to_csv('학교점수.csv', encoding='utf-8-sig') # 한글 인코딩