Skip to content

Commit 615740c

Browse files
committed
gogogo
1 parent 4529b10 commit 615740c

12 files changed

+222
-0
lines changed

_posts/2025-01-18-10.[Pandas] 10. 데이터 집계_분포와 통계량.md

Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,228 @@ plt.show()
8080

8181
titanic_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)

images/2025-01-27-17-11-54.png

2.98 KB
Loading

images/2025-01-27-17-49-17.png

4.12 KB
Loading

images/2025-01-27-17-51-14.png

3.83 KB
Loading

images/2025-01-27-18-03-11.png

4 KB
Loading

images/2025-01-27-18-04-58.png

6.57 KB
Loading

images/2025-01-27-18-19-40.png

5.97 KB
Loading

images/2025-01-27-18-24-45.png

9.63 KB
Loading

images/2025-01-27-18-26-02.png

9.69 KB
Loading

images/2025-01-27-18-26-54.png

14.4 KB
Loading

0 commit comments

Comments
 (0)