@@ -80,6 +80,228 @@ plt.show()
8080
8181titanic_train.csv 사용
8282
83+ ## groupby
84+ - 집계에서의 ** "집"** 부분
85+ - 그룹 후 사용할 수 있는 함수들 (** "계"** )
86+ - NaN값은 집계에서 제외됨!!
87+ - 그룹 내의 데이터가 ** n개** 였다면, 계산을 수행하면 ** 1개** 가 된다!!!(** Reduction** )
8388
89+ | 함수| 설명|
90+ | :--| :--|
91+ | count()| 행의 개수|
92+ | nunique()| 행의 유니크한 개수|
93+ | sum()| 합|
94+ | mean()| 평균|
95+ | min()| 최솟값|
96+ | max()| 최댓값|
97+ | std()| 표준편차|
98+ | var()| 분산|
99+
100+ ### 단일 그룹
101+ - 기준이 한 개
102+
103+ ``` python
104+ # "집"
105+ df.groupby(" Pclass" ) # 출력 결과 : Pclass 기준 1등급/ 2등급 / 3등급으로 그룹이 나뉘어짐.
106+ ```
107+ ``` python
108+ # "계"
109+ df.groupby(" Pclass" ).count() # 그룹별로 모인 데이터에 대한 계산을 수행
110+ ```
111+ ``` python
112+ df.groupby(" Pclass" ).sum(numeric_only = True ) # 숫자인 값에 대해서만 sum하겠다.
113+ ```
114+ #### 특정 값에 대해서만 집계하기
115+
116+ ``` python
117+ # 특정 컬럼에 대해서만 집계
118+ df.groupby(" Pclass" )[" Age" ].sum()
119+ ```
120+
121+ #### Fancy Indexing으로 여러 컬럼에 대해 집계
122+
123+ ``` python
124+ df.groupby(" Pclass" )[[" Age" ," Fare" ]].sum()
125+ ```
84126
127+ ### 다중 그룹
128+ - 그룹핑에 기준이 두 개 이상
85129
130+ ``` python
131+ # 성별과 등급 별 값
132+ df.groupby([" Sex" , " Pclass" ]).mean(numeric_only = True )
133+ ```
134+
135+ ## crosstab
136+ - ** 범주형 데이터에 대한 집계** (비율(%), 대비)
137+ - 범주형 데이터 비교 분석에 유용
138+ - 행에 비치될 데이터(그룹핑), 열에 비치될 데이터(계산 대상)를 따로 지정
139+
140+ ``` python
141+ pd.crosstab(df[" Sex" ], df[" Survived" ]) # 행, 열에 비치될 데이터를 따로 지정 (행: "Sex", 열: "Survived")
142+ ```
143+ ``` python
144+ pd.crosstab(df[" Pclass" ], df[" Survived" ])
145+ ```
146+ ### crosstab - 범주별 비율 구하기
147+ - ` normalize : 정규화하다. `
148+ - ` normalize = 'all' ` : 전체 합이 100%
149+ - ` normalize = 'index' ` : 행별 합이 100%
150+ - ` normalize = 'columns' ` : 열별 합이 100%
151+ - 여자 100명: 많은가 적은가? 구분 불가!!! but, 여자 90% : 많다!
152+ ### 단일 인덱스, 컬럼의 범주표
153+ #### normalize = 'all'
154+ - 행, 열의 총합이 1
155+ ``` python
156+ pd.crosstab(df[" Sex" ], df[" Survived" ], normalize = ' all' , margins = True ) # margins = True: All에 행, 열 별 합계 값이 출력
157+ ```
158+ [ 결과]
159+ ![ ] ( /images/../images/2025-01-27-17-11-54.png )
160+
161+ #### normalize = 'index'
162+ - index 방식 : 행 방향의 데이터가 기준이 된다.
163+ ``` python
164+ # 성별 기준
165+ # ex) female 중 사망한 사람이 0.257962, female 중 생존한 사람이 0.742038 ( 행의 합이 1.0 )
166+ # male 중 사망한 사람이 0.811092, male 중 생존한 사람이 0.188908 (행의 합이 1.0 )
167+ # 전체 중 사망한 사람이 0.616162, 전체 중 생존한 사람이 0.383838 ( 행의 합이 1.0 )
168+ pd.crosstab(df[" Sex" ], df[" Survived" ], normalize = ' index' , margins = True )
169+ ```
170+ [ 결과]
171+ ![ ] ( /images/../images/2025-01-27-17-49-17.png )
172+
173+ #### normalize = 'columns'
174+ - columns 방식 : 열 방향의 데이터가 기준이 된다.
175+
176+ ``` python
177+ # Survived 기준
178+ # ex) 사망한 사람 중 female이 0.147541, male이 0.852459( 열의 합이 1.0 )
179+ # 생존한 사람 중 female이 0.681287, male이 0.318713( 열의 합이 1.0 )
180+ # 전체 인원 중 female이 0.352413, male이 0.647587 ( 열의 합이 1.0 )
181+ pd.crosstab(df[" Sex" ], df[" Survived" ], normalize = ' columns' , margins = True )
182+ ```
183+ [ 결과]
184+ ![ ] ( /images/../images/2025-01-27-17-51-14.png )
185+
186+ ### 다중 인덱스, 다중 컬럼의 범주표
187+ - index와 columns을 직접 지정
188+
189+ ``` python
190+ # "Sex"와 "Pclass"에 대해 "Survived"의 정규화
191+ pd.crosstab(index = [df[" Sex" ], df[" Pclass" ]], columns = df[" Survived" ], normalize = ' all' )
192+ ```
193+ [ 결과]
194+ ![ ] ( /images/../images/2025-01-27-18-03-11.png )
195+
196+ ``` python
197+ pd.crosstab(index = [df[' Sex' ], df[" Pclass" ]], columns = [df[' Survived' ], df[" Embarked" ]])
198+ ```
199+ [ 결과]
200+ ![ ] ( /images/../images/2025-01-27-18-04-58.png )
201+
202+ ## pivot table ⭐️⭐️⭐️
203+ - pivot : 축
204+ - 데이터를 원하는 형태로 집계할 때 아주 유용한 방법.
205+
206+ ### 단일 인덱스, 단일 컬럼, 단일 값
207+ ``` python
208+ pd.pivot_table(
209+ df,
210+ index = " Sex" , # 행 정의
211+ columns = " Pclass" , # 열 정의
212+ values = " Fare" , # 값 정의
213+ aggfunc = " mean" , # 계산 방법
214+ margins = True
215+ )
216+ ```
217+ [ 결과]
218+ ![ ] ( /images/../images/2025-01-27-18-19-40.png )
219+
220+ ``` python
221+ # 집계를 여러 방식으로 한 번에 수행 가능
222+ pd.pivot_table(
223+ df,
224+ index = ' Sex' ,
225+ columns = ' Pclass' ,
226+ values = ' Fare' ,
227+ aggfunc = [' mean' , ' min' , ' max' ],
228+ marigns = True
229+ )
230+ ```
231+ [ 결과]
232+ ![ ] ( /images/../images/2025-01-27-18-24-45.png )
233+
234+ ### 다중 인덱스, 다중 컬럼, 다중 값
235+ ``` python
236+ pd.pivot_table(
237+ df,
238+ index = ' Sex' , # 성별로 그룹을 잡은 상태
239+ columns = ' Pclass' ,
240+ values = [" Fare" , " Age" ],
241+ aggfunc = ' mean' ,
242+ margins = True
243+ )
244+ ```
245+ [ 결과]
246+ ![ ] ( /images/../images/2025-01-27-18-26-02.png )
247+
248+ ``` python
249+ pd.pivot_table(
250+ df,
251+ index = [' Sex' , ' Pclass' ],
252+ columns = [" Survived" , " Embarked" ],
253+ values = " Fare" ,
254+ aggfunc = " mean"
255+ )
256+ ```
257+ [ 결과]
258+ ![ ] ( /images/../images/2025-01-27-18-26-54.png )
259+
260+ ## stack, unstack, melt
261+ - 데이터의 ** 재구조화**
262+
263+ ### stack()
264+ - ** 열(columns)** 을 ** 행(row)** 의 하위 레벨로 이동
265+ - Long Format
266+
267+ ### unstack()
268+ - ** 행(row)** 의 하위레벨을 ** 열(columns)** 로 이동
269+ - stack의 반대 개념
270+ - Wide Format
271+
272+ ### melt()
273+ - 컬럼의 정보를 행단위로 가도록 녹여주는
274+ - 컬럼의 정보를 행으로 녹여 해당 정보에 대해 집계가 가능하도록 만든다.
275+
276+ # 12. 정렬
277+
278+ ### 인덱스 정렬
279+ ``` python
280+ df.sort_index() # ascending = True : 오름차순 정렬
281+ df.sort_index(ascending = False ) # : 내림차순 정렬
282+ ```
283+ ### 컬럼 기준 정렬
284+ ``` python
285+ df.sort_values(by = " Fare" ) # 요금 작은 순으로 정렬
286+ df.sort_values(by = " Fare" , ascending = False )
287+ ```
288+ #### 문자열 값으로도 정렬 가능
289+ ``` python
290+ df.sort_values(by = " Name" )
291+ ```
292+ #### 두 개 이상도 가능
293+ ``` python
294+ df.sort_values(by = [" Pclass" , " Fare" ], ascending = [True , False ]) # Pclass는 낮은 순(1,2,3), Fare은 높은 순
295+ ```
296+ #### loc와 iloc 차이점?
297+
298+ ![ ] ( /images/../images/2025-01-27-19-52-00.png )
299+ 위의 표에서 loc와 iloc로 행을 선택할 때
300+ ``` python
301+ # loc는 offset index 기준이 아니기 때문에, 표 그대로의 범위를 직접 입력
302+ df_sorted.loc[737 :88 ]
303+ # iloc는 인덱스 기준으로 인덱스로 입력
304+ df_sorted.iloc[2 :5 ]
305+ ```
306+ [ 결과 같음]
307+ ![ ] ( /images/../images/2025-01-27-19-53-31.png )
0 commit comments