벌써 5주 차, 실시간 파이썬 수업이 막을 내렸어요 ! 
아직 나는 많이 서툰데, 벌써 끝이라고요? ( o 0 o ) ← 이런 느낌이에요!

실력은 아직 부족하지만, 파이썬 분석 프로젝트를 위한 주제 선정과 팀 배정, 그리고 첫 피어 세션까지 무사히 마쳤고,
드디어 내일은 프로젝트 수업의 첫걸음을 떼게 되었어요. 두근두근!

걱정도 되지만, 한편으로는 기대도 가득합니다.
무엇보다 팀원들에게 피해를 주고 싶지 않다는 마음에 이번 주는 더욱 열심히 공부했어요 

제가 작성하는 모든 내용은 강의에서 배운 내용을 바탕으로, 스스로 응용한 것이니 참고해 주세요!


 

1. Matplotlib을 이용한 시각화 

import numpy as np 
import matplotlib.pyplot as plt

- 시각화를 위해선 관련 라이브러리를 불러와야겠죠? 

 

x = np.linspace(0, 2 * np.pi, 100) #  # 0부터 2π까지 100개 점 생성
y1 = np.sin(x)
y2 = np.cos(x) 

# 도화지 옵션 
plt.figure(figsize = (12,8),dpi = 600 ) # dpi는 해상도, 이렇게 하면 조금더 선명해짐
plt.plot(x, y1, label='sinx', color='hotpink', linewidth=3)
plt.plot(x, y2, label='cosx', color='#5d83ac', linewidth=3)
plt.legend(loc = (1,1))

plt.plot(x,y1,color ='hotpink')
plt.plot(x,y2,color ='#5d83ac')

plt.title('Sin,Cos Graph') 
plt.xlabel('radians')
plt.ylabel('values') 
plt.grid() # 격자무늬 그려짐

 

저는 시각화할때 색상을 정말 중요시하는데요 

이왕이면 그릴거면 예뻤음 좋겠어서 메모장에 마음에 드는 색상을 적어놓고 시각화할때마다 불러와서 사용하는 거 같아요 ! 

 

1  - 1 . Plotly 시각화로 바꿔보기 

위에서 matplotlib으로 해본 그래프를 그대로 plotly 그래프로 그려볼건데요 

html 형식으로 되어 있어 발표용으로 할땐 이렇게 하라고 하시더라구요 ! 

분석할 땐 나만 보는거니까 확인정도를 matplotlib 으로 하는 

뭐 그렇대요 

 

import numpy as np
import plotly.graph_objects as go

# 1. 데이터 생성
x = np.linspace(0, 2*np.pi, 100) # 0 부터 2파이까지 100개의 점 생성 
y1 = np.sin(x)
y2 = np.cos(x)

# 2. 그래프 객체 생성
fig = go.Figure()

# 3. sin(x) 선 추가
fig.add_trace(go.Scatter(
    x=x, y=y1,	#   # x축에 들어갈 값 x, y축에 들어갈 값들 (예: sin(x))
    mode='lines',  # 선으로 표시
    name='sinx',   # 범례에 표시될 이름
    line=dict(color='hotpink', width=3)  # 선 색상 및 두께
))

# 4. cos(x) 선 추가
fig.add_trace(go.Scatter(
    x=x, y=y2,
    mode='lines',
    name='cosx',
    line=dict(color='#5d83ac', width=3)
))

# 5. 레이아웃 설정 (제목, 축 이름, 그리드)
fig.update_layout(
    title='Sin, Cos Graph',          # 제목
    xaxis_title='radians',           # x축 이름
    yaxis_title='values',            # y축 이름
    legend=dict(                     # 범례 위치 수동 설정
        x=1,
        y=1,
        xanchor='left',
        yanchor='top'
    ),
    width=600,                      # 폭 (픽셀)
    height=400,                      # 높이 (픽셀)
)

# 6. 그리드 켜기
fig.update_xaxes(showgrid=True)
fig.update_yaxes(showgrid=True)

# 7. 그래프 출력
fig.show()

# 8. HTML로 저장 (현재 디렉토리에 저장됨)
fig.write_html("sin_cos_plot.html")

 

 

-> 요기 들어가시면 plotly로 그린 그래프 확인 가능합니다 ! sin_cos_plot.html

 

2. Subplots 

여러 개의 시각화를 동시에 진행하는 방법 

 

x1 = np.arange( , ) # 범위 설정해주시고 
x2 = np.arange( , )

y1 = x1 # 각각 식 적어주시고
y2 = x2 

fig,(graph1, graph2) = plt. subplots(nrows = 1, ncols = 2, figsize = (8,4))
#nrows = 1, ncols = 2 -  1행 2열
#nrows = 2, ncols = 2 -  2행 2열
#nrows = 3, ncols = 2 -  3행 2열
#nrows = 3, ncols = 3 -  3행 3열


graph1.plot(x1, y1, color ="#f0bad5", marker = 'o') # 색상지정해주고 , marker 표시 지정
graph2.bar(x2, y2, color ="#437147")

 

3.  산점도 그래프 연습 

- GDP vs Life Expectancy by Continent

import pandas as pd

url = "https://raw.githubusercontent.com/resbaz/r-novice-gapminder-files/master/data/gapminder-FiveYearData.csv"
df = pd.read_csv(url)
df

일단 파일 불러오고 

df['continent'].unique()

이렇게  어떤 대륙들이 포함되어 있는지 살펴봤어요 

- 고민1: 5개국으로 나누면 시각적으로 보기 힘들지 않을까....
- 결론 5개로 나눠보고 임의로 3개만 추려서도 해봐서 비교해보기
 
시각화 연습을 위해서 데려온 데이터라 큰 분석은 안했는데도 혼자 해보니 고민들이 생기더라구요
 
-> 실시간강의나 온라인 강의에선 강사님들이 이미 다 정리해주셔서 고민은 안해봤는데 혼자서 해보니 이런것들을 
고민하고 결정하는게 조금 힘들었어요 
 
- x,y축을 적절한 컬럼명으로 하기
- 이때 컬럼명은 당연히 columns 확인하고 넣어야겠지 ~~~ ? ^^

- x축을 GDP(1인당 GDP, gdpPercap)

- y축을 기대수명(lifeExp) 
 
-> 그래프를 그리기 앞서 이렇게 설정해놓고 그리는게 편하더라구요
 

 

3-1 . Matplotlib 활용 

 

df_Asia = df[df['continent']=='Asia']
df_Europe = df[df['continent']=='Europe']
df_Africa= df[df['continent']=='Africa']
df_Americas = df[df['continent']=='Americas']
df_Oceania = df[df['continent']=='Oceania']

plt.scatter(x = df_Asia['gdpPercap'], y=df_Asia['lifeExp'], color = "#090E3D",label = 'Asia')
plt.scatter(x = df_Europe['gdpPercap'], y=df_Europe['lifeExp'], color = "#9DA2D9",label = 'Europe')
plt.scatter(x = df_Africa['gdpPercap'], y=df_Africa['lifeExp'], color = "#5C63A1",label = 'Africa')
#plt.scatter(x = df_Americas['gdpPercap'], y=df_Americas['lifeExp'], color = "#8F97D4",label = 'Americas')
#plt.scatter(x = df_Oceania['gdpPercap'], y=df_Oceania['lifeExp'], color = "#C5CBFF",label = 'Oceania')
#겹쳐도 비슷하긴한데 색이 확실히 많으니까 겹치는게 보이긴한데 눈에 안띔 
plt.legend()
plt.xlabel('GDP per Capita')
plt.ylabel('Life Expectancy')
plt.title('GDP vs Life Expectancy by Continent')
plt.show()

 

 

처음에는 5개국을 모두 그렸는데 겹쳐있다보니 잘안보이더라구요 그래서 3대륙으로 줄였어요 

-> 저는 이렇게 해석했어요 

- 아프리카는 아시아 유럽에 비해 GDP가 높진 않지만 기대 수명률이 30세부터 80세까지 넓게 있어보임
유럽과 아시아는 GDP가 어느정도 높게도 가는데 아프리카만 눈에 띔
 
제가 백그라운드 지식도 얕고 말주변도 없어서 이렇게 gpt에게 말하니까 말을 다듬어줬어요 !
 
- GDP (1인당 국내총생산): 아프리카는 아시아, 유럽에 비해 상대적으로 GDP가 낮은 국가들이 많고, 경제 발전 수준도 다양해서 GDP 값이 낮거나 중간 정도에 분포돼 있어요.

- 기대 수명: 아프리카는 의료, 생활 환경, 사회적 요인 등이 매우 다양해서 기대 수명이 30대부터 80대까지 굉장히 넓은 범위에 분포하는 경향이 있어요. 즉, 국가별 격차가 큽니다.

- 반면, 유럽과 아시아는 경제 발전 수준이 상대적으로 높고, 기대 수명도 대체로 일정한 수준 이상에 분포하는 편이에요. 그래서 GDP가 높으면서 기대 수명도 높은 군집이 형성되고, 분포가 좀 더 좁은 경향을 보이죠.

 

사실 이정도면 다 뜯어고치고 새로 말을 만들어 준거긴한데.... 결론은 같으니,,,, 뭐,,,,,ㅎㅎㅎ

 

3-2. Plotly 활용 

- 이게 좋은점이 겹쳐서 보지 못했던 관점들이 생기기도 하고 

겹쳐서 올려도 각각 따로 볼 수 있으니 좋더라구요 ! 

import pandas as pd
import plotly.express as px

# 데이터 불러오기
df = pd.read_csv("https://raw.githubusercontent.com/resbaz/r-novice-gapminder-files/master/data/gapminder-FiveYearData.csv")
df_2007 = df[df['year'] == 2007]

# 산점도 그래프 생성
fig = px.scatter(
    df_2007,
    x='gdpPercap',
    y='lifeExp',
    color='continent',
    hover_name='country',
    size='pop',
    title='GDP vs Life Expectancy (2007)',
    labels={'gdpPercap': 'GDP per Capita', 'lifeExp': 'Life Expectancy'},
)

# 축 범위 조정 (range 줄이기)
fig.update_layout(
    xaxis=dict(
        title='GDP per Capita',
        range=[0, 60000], # 범위는 위에 Matplotlib의 형태를 따라가기 위해 
        tickvals=[0, 10000, 20000, 30000, 40000, 50000, 60000] #조정한거임 
    ),
    yaxis=dict(
        title='Life Expectancy',
        range=[30, 85],
        tickvals=[30, 40, 50, 60, 70, 80]
    )
)

# 그래프 출력
fig.show()

# HTML 파일로 저장
fig.write_html("gdp_lifeExp_by_continent_nicer_range.html")

 

-> 요기 들어가시면 확인할 수 있습니다 :)  

gdp_lifeExp_by_continent_nicer_range.html

 이렇게 보게 되면 위에서 Matplotlib에서 했던 분석보다 더 정밀하게 가능하더라구요 ! 

많은 부분을 놓치고 있었구나... 깨닫게 됨,,,,, 

 

3 - 3 

많은 것을 깨닫고 Plotly로 애니메이션 차트로도 만들어봤는데요 ! 

# Plotly 애니메이션 차트 그리기
fig = px.scatter(
    df,
    x="gdpPercap",              # x축: GDP per capita
    y="lifeExp",                # y축: Life Expectancy
    size="pop",                 # 원 크기: 인구 수
    color="continent",          # 색상: 대륙
    hover_name="country",       # hover 시 표시될 국가 이름
    animation_frame="year",     # 애니메이션 프레임: 연도
    range_x=[0, 60000],         # x축 범위 조정
    range_y=[30, 90],           # y축 범위 조정
    title="Animated: GDP per Capita vs Life Expectancy (1952-2007)",
)

# 축 라벨 및 레이아웃 조정
fig.update_layout(
    xaxis_title="GDP per Capita",
    yaxis_title="Life Expectancy",
    template="plotly_white"
)

# HTML로 저장
fig.write_html("gapminder_animated_chart.html")

# 차트 보여주기
fig.show()

 

-> 이건 진짜 꼭 확인해보셔요 ! gapminder_animated_chart.html

 

4. 한글폰트 적용해서 barplot 만들어보기 

plt.rc('font', family = 'Malgun Gothic') # 한글폰트 적용 

x = ['망댜', ' 쩡유 ', '쟈빵']
height= [100,130,160] 
color = ['#f0bad5',"#ee84b9","#cf2379"]


plt.bar(x,height,color=color,alpha = 0.6)
#plt.ylim(90,170)

 

- 한글 적용 폰트는    plt.rc('font', family = 'Malgun Gothic')  기억하기 ! 

# 선장난을 조금 치면 

plt.rc('font', family = 'Malgun Gothic') # 한글폰트 적용 

x = ['망댜', ' 쩡유 ', '쟈빵']
height= [100,130,160] 
color = ['#f0bad5',"#ee84b9","#cf2379"]


plt.bar(x,height,color=color,alpha = 0.6)
plt.ylim(0,360)
# 이렇게 하면 셋의 키가 비등비등해보임 
# 망댜가 키성장을 조금만 더 노력하면 따라잡을 수 있을 것처럼 보임

 

-> 이렇게 ylim을 조정하면 처음과 완전히 다르게 보이죠 ? 

 

5. 꺾은선 그래프와 BoxPlot 연습

- 애플 주식 데이터를 들고왔어요 

 

하루만 늦게 해봤더라면 머리가 덜 아팠을텐데,,,,, 

 

- ticker(티커)는 주식 시장에서 회사나 주식을 식별하는 고유한 약어예요.

- 예를 들어:

- 애플(Apple)은 AAPL

- 삼성전자는 미국 증시에 상장되어 있지 않지만, 한국 주식의 경우 005930.KS 같은 형식으로 쓸 수 있어요.

- 구글(Alphabet)은 GOOGL


- 마이크로소프트는 MSFT
-즉, 주가 데이터를 요청할 때 "이 회사 주가를 가져오세요" 라고 알려주는 코드가 바로 ticker입니다.

- 만약 한국 주가를 원하면, 보통 티커 뒤에 .KS (코스피), .KQ (코스닥) 같은 식으로 붙여서 요청해요.

- 예)
- 삼성전자 주가 (코스피) = 005930.KS
- 카카오 주가 (코스닥) = 035720.KQ
-=>ticker = 주식 종목 코드(약자)

 

이렇게 간단하게 모르는 것들 정리해 두고 

1. 데이터 찍어보기 

2. info() 찍어보기 

3. 기술통계량 확인할 수 있는 describe 찍어보기 

 

제가 이 데이터를 보고 가장 당황했던 점이 

 

-> 이렇게 멀티 인덱스로 되어 있어서 깜짝 놀랬거든요 ? 

- 5주간 배우면서 처음 만난 멀티인덱스,,,,

- 그걸 이제 오늘 배움 

- 연습한건 28일 멀티인덱스 배운건 29일 ,,,,, ㅎㅎㅎ

-> 정말 뭐랄까,,,, 분석 초보가 겨우겨우 분석해낸거라 자세한 코드 공유는 생략하고 큼직큼직한거 위주로 공유하면서 

되새겨 볼게요 

import pandas as pd


data['Date'] = pd.to_datetime(data['Date'])  # 먼저 전체 날짜 컬럼 변환

data['year'] = data['Date'].dt.year
data['month'] = data['Date'].dt.month
data['day'] = data['Date'].dt.day

data

-> 이렇게 년,월,일의 새로운 컬럼을 만들어서 날짜를 쪼개주고 

- 보기 힘들었던 date 컬럼은 drop() 사용해서 지웠어요 

 

- 뭣도 모르지만 일단 value_counts() 사용해서 월별 카운트 찍어보고 sort_index써서 순서정렬까지 

 

# data([('Close', 'AAPL'),
#             ('High', 'AAPL'),
#             ('Low', 'AAPL'),
#             ('Volume', 'AAPL'),]
# 이런 형태로 컬럼들이 되어 있어

 

-> 다들 아셨나요..... 멀티 인덱스인 데이터들은 시각화 함수 사용할때 접근을 다르게 해야한다는 것을..... 

# 그러면 Close/AAPL 컬럼을 선택할때 
data[('Close', 'AAPL')] # 이렇게해줘야함

-> 컬럼 자체를 이렇게 선택해줘야만 하는,,,,, 

 

- 근데 난중엔 귀찮아서 컬럼들을 다 묶어버림 

- 그리 좋은 코드는 아니여서 생략하겠습니다.... 

 

sns.boxplot(data=d , x=' ' , y='  ', color="#DFBAEE") # 각 자리에 잘 넣어주고
plt.show()

- 2023년엔 무슨 일이 있었을까,,,, 궁금해지는 

 

sns.boxplot(data=data, x='  ', y=' ', hue='  ') # hue는 색상으로 그룹을 나눠주는 역할

- 어김없이 제가 해석해보았구요 

- 2023년 주가가 가장 낮았고

- 2024년과 2025년은 비슷해 보인다

- 그런데 2024년의 상한가(최고 종가)가 2025년보다 높다

- ➡ "24년의 상한가가 25년보다 더 높다고 해석 
 
-> 제가 해석한것에 대한 feedback을 gpt가 해줬어요 
 
- 2023년: 평균도 낮고 상한가도 낮았다 → 주가가 전반적으로 부진

- 2024년: 평균은 2025년과 비슷하지만, 상한가가 더 높다 → 특정 시점에 급등한 날이 있었을 수 있음

- 2025년: 평균은 비슷하지만 상한가는 더 낮음 → 변동성이 상대적으로 적었거나 천천히 상승 중일 수도
 
=> 25년은 당연한 소리를 함.... 아직 25년이 다 안지났으니,,,, 

 

이게 그래프가 바꿀때마다 코드 자체는 같고 bar. boxplot.poinplot.lineplot 여기만 달라지거든요 

: 즉, 주인장이 그래프만 보여줄거라는 말임 

- 3월부터 점점 감소하더니 6월까지 쭉 하락세를 보이다가 7월에 껑충 ~~ <- 이라고 해석했어요  

 

pointplot의 경우엔 연속형 데이터엔 적합하지 않다는걸 엊그제 깨달았구요 (학습일지 쓰는 동안에 날짜가 바뀌어버림.,,,)

- poinplot()은 범주형 데이터의 평균값 변화를 시각화하는데 최적화되어 있음
- 주가처럼 연속적인 시계열 데이터에는 적합하지 않음
- 주가 데이터는 시간 흐름에 따른 연속성이 핵심이기 때문에, lineplot()이 자연스러움  
 
<-  제가 이렇게 회색 배경으로 들고오는건 공부하면서 배운것들 느낀점들 이런거 그대로 들고오는겁니다 ! 
4
 깨닫자 마자 lineplot 그려버림 
 

1월부터 12월까지 월별 주가 종가 평균이 점으로 연결된 그래프임 

예를 들어 3월부터 선이 점점 내려가다가 7월에 껑충 뛰었다면,
2월부터 4월까지 주가가 점점 하락하다가 4월 이후부터 7월에 크게 상승했음

-> 위에서보다 조금 더 정확한 해석이 가능해졌네 !
 
=> 공부하면서 느끼는건 시각화를 다양하게 해보면서 해석을 점점 명확하게 하는구나를 배움 

 

5-1 .주가 데이터를 활용한 Plotly 

 

boxplot_year_close.html

lineplot_year_close.html

 


문득 이렇게 써내려오다 든 생각인데 

이렇게 멋진걸 해냈는데 통일된 썸네일을 주기 위해 올려둔 이 썸네일이 갑자기 미워짐 ....

너무 멋져서 여기저기 자랑하고 싶은데,,,,, 

여러분들은 어떤 썸네일이 더 들어오고 싶어요? 

시간과 노력이 들어간 시각화  썸네일 VS  통일감을 주는 썸네일 

우와 ! 저 이걸로 A/B Test 한번 해볼까요? 

 

진짜 미쳤네,,,,,

다음 포스팅은 A,B 테스트로 가져오기 위해 

주말엔 A/B Test 공부 해봐야겠어요 

 

이번 포스팅은 제 노력이 와방방 들어가서 어디서도 공유하고 싶지 않아요,,,,, 

진짜,,,,,,,,,,,아무도 몰랐음 좋겠다,,,,,, 

정말 필요한 그런 분들만 보고 

그랬음 좋겠다...... 

오늘은 해시태그 안쓸래요. 

그래도 파이썬의 눈뜨게 해준 강사님만 태그하고 마무리 합니다 ! 

 

Pandas 기본개념에 대해 수업을 한 5주차 첫날 

기본 개념 쉽다고 얕봤다가 뒤에서 호되게 당하기 싫어서 

미리 정리하면서 기억하려고 선수침 ㅎ 

부캠 5주차가 되면 본인만의 루틴이 생기고

공부 습관이 생기나 보다 ! 

# pandas가 안깔려있따 or 세팅을 다시 해야한다 하시는 분들 
%pip install pandas
import pandas as pd
import numpy as np
# 하나의 컬럼으로 구성된 1차원 데이터 셋 

data = [100,200,300,400,500] 

se = pd.Series(data)
type(se)  /// pandas.core.series.Series

 

se.values /// array([100, 200, 300, 400, 500], dtype=int64)

se[0] /// 100

se[0:3] 

'''
0    100
1    200
2    300
dtype: int64
''' 

se.name = 'NUM' 

'''
0    100
1    200
2    300
3    400
4    500
Name: Num, dtype: int64
'''

 

데이터를 끌고오면 해야할 것들 

1. 데이터 찍어보기 

2. .info()

3. .describe()

4. . 컬럼명  = [' 컬럼명' ] / 두개 이상 들고 올때 리스트로 묶어주기 [   [   ' 컬럼명1', ' 컬럼명2 '   ]  ] 

5.  집합함수 aggregation -

 - .mean (numeric_only = True) : 숫자 데이터만 계산해달라고 하는거

- . max(),      , min()

-  sum() 

 

수업때 사용했던 데이터관련해서는 저작권 이슈로 못올려서 

비슷한 데이터 들고와서 비슷하게 질문도 만들어보고 

그렇게 안만드러지면 어떻게든 질문 찾아내기..... 

 

 

이렇게 불러와주고 

 

나름 호기롭게 강사님이 알려주신거에 한발짝 더 나아가고 싶어서 히트맵 그렸다가 당황함

그러면 그 당황스러웠던 히트맵 공개합니다.....

 

상관관계 가득한 것들만 뽑아서 그리는거 까지 배우고 돌아오겠습니다 .... ! 

이렇게 했더니 1시간 45분 걸렸구요....

눈이 뽀사지기 직전이라 그럼 이만 .....ㅎㅎ 

 

벌써 2025년 상반기가 지나가고 있어요 ! 

믿기지 않지만, 어느덧 한 해의 절반이 흘렀네요.
바쁘게 달려온 지난 6개월을 돌아보며 간단히 회고해보고, 앞으로의 6~7월 목표도 함께 정리해보려 합니다 ! 


1월 ~ 2월: 첫걸음

비상교육 인턴십
첫 사회생활이었어요 

사회에 대한 막연한 두려움을 가지고 있었던 시절이라
     업무에 적응하고 조직 안에서의 커뮤니케이션을 배우며 많이 성장했던 시간이였어요

정보처리기사 필기 도전
결과는 불합격이었지만, 덕분에 다음 도전이 훨씬 단단해질 수 있었어고

자격증 취득에 실패하신 분들 or 내가 너무 느린걸까라고 생각하는 분들에게 말씀드리고 싶어요

천천히 갈수록 많은 것을 볼 수 있다고 


3월 ~ 4월: 시도와 적응의 시기

빅데이터분석기사 필기 도전

패스트캠퍼스 강의 시작
새로운 커리큘럼에 적응하느라 바빴지만, 점점 리듬을 찾아가는 중!

TOEIC 시험 (목표 600점)
✔️ 목표 달성 성공!
덕분에 영어 공부 방향이 눈에 보이기 시작했어요.


5월: 작은 성취들이 모이는 시간

패스트캠퍼스 100% 출석 달성!
하루도 빠지지 않고 완주했다는 게 정말 뿌듯했던 한 달!

빅데이터분석기사 필기 결과

사실 이번에도 한문제 차이로 떨어져서 멘탈이 많이 무너졌는데 

어쩌겠어. 이미 결과는 나왔고

나는 기사 자격증이 필요한데 ! 라는 마음으로

빠르게 마음을 접고 바로 다음 시험인 정처기를 준비를 생각했어요

이때 당연히 붙을 줄 알고 정처기 접수도 안해놨었는데 ㅋㅋㅋㅋㅋㅋ

급하게 빈자리 접수를 했어요  

자리가 생각보다 더 없어서 공부기간은 2주정도 잡았고 

이론부터 다시 공부했어요 

정보처리기사 필기 합격 🎉
지난 실패를 딛고 결국 합격했어요.
포기하지 않길 잘했다는 생각이 드는 순간이었죠.


그리고 앞으로 가까운 목표들을 새로 잡아봤는데요 ! 

 6~7월 목표: 집중의 시간

이번 여름은 그 어느 때보다도 전략적이고 집중적인 시간관리가 중요할 것 같아요.

✅ 주요 일정

날짜목표
6/15, 6/29 TOEIC 시험 (목표: 800점)
7/24, 7/29 정보처리기사 실기 시험
평일 9 to 6 패스트캠퍼스 수업 (Full-time)
 

✅ 학습 전략 한눈에 보기

📍 6월: TOEIC 집중

LC: 쉐도잉 + 실전 모의고사 반복

RC: 문법 체계 + 어휘 + 독해 스킬

📝 전략 포인트

LC는 문제 유형에 대한 적응력이 관건!

RC는 문법과 독해 속도, 어휘력을 동시에 끌어올리는 게 핵심!

 7월: 정처기 실기 집중

기출 유형 분석

시나리오형 문제 연습

  • 실전 감각 기르기

 평일/주말 시간표 예시

🗓 평일 (패캠 + 자습)

시간내용
18:30 ~ 19:30 저녁 및 휴식
19:30 ~ 21:00 TOEIC / 정처기 교차 학습
21:00 ~ 22:00 복습 or 기출 실전풀이
 

💡 6월은 TOEIC 중심, 6월 말부터는 정처기 개념도 함께 넣기 시작!

🗓 주말 (자율 학습)

시간내용
10:00 ~ 12:00 TOEIC 실전 모의고사
13:00 ~ 15:00 오답 분석 / 단어 복습
15:00 ~ 17:00 정처기 개념 학습
20:00 ~ 22:00 마무리 복습
 

 TOEIC 전략 요약

📌 목표: LC 400 + RC 400 = 총 800점

✔️ LC (Listening)

Part 1~2: 빠른 반응 훈련

Part 3~4: 문제 미리 읽고 키워드 잡기

전략: 모의고사 반복 + 쉐도잉 연습

✔️ RC (Reading)

문법: 품사/시제/접속사 등 핵심 개념 정리

독해: 문제 푸는 순서 연습 + 속도 향상

어휘: 하루 30개 암기 + 누적 복습


🧠 마음가짐 한마디

상반기는 도전 → 실패 → 재도전 → 성공의 흐름이었어요.
때론 아쉬웠지만, 돌이켜보면 그 모든 과정이 성장의 발판이었죠.

다가오는 하반기에는 "꾸준함"과 느릴수록 더 많은 것들을 볼 수 있었던 저의 "시각"을 가장 큰 무기로 삼아
지속적으로 나아가는 제가 되어보려 해요.

📣 블로그를 보시는 여러분도
잠시 멈춰서 상반기 회고 한번 해보시는 건 어때요?
곧이어 **"토익 800점 달성기"**로 다시 찾아올게요! 😊

 

🔹 크롤링할때 고정적으로 가져가야 하는 코드

from selenium import webdriver

browser = webdriver.Chrome()
keyword = input('찾고자하는 논문 주제를 입력하세요요')

url = f'https://www.dbpia.co.kr/search/topSearch?searchOption=all&query={keyword}'
# 여기에 keyword 넣으면 내가 키워드 입력한 곳으로 감 
url = '' 이렇게 넣어도됨 

browser.get(url)

🔹 헷갈리던 용어 정리 !

구문의미예시
find_element 하나만 찾음 (처음 하나만 반환) browser.find_element(By.CLASS_NAME, 'title')
find_elements 여러 개를 리스트로 반환 browser.find_elements(By.CLASS_NAME, 'title')
.text element 안의 텍스트 추출 title.text
.get_attribute('href') 링크 등 속성 값 추출 a_tag.get_attribute('href')

🔹 “구조 안의 구조” ? 

HTML 문서는 계층적 구조로 되어 있어요.
예를 들어, 하나의 논문(thesisCard) 안에 제목, 저자, 발행일 등 여러 정보가 포함되어 있죠.

 

#1번 강사님 코드 들고옴 
#구조안의 구조
container = browser.find_element(By.ID, ' ')

제목 = container.find_element(By.CLASS_NAME, ' ').text
카테고리 = container.find_element(By.CLASS_NAME, ' ').text

정보컨테이너 = container.find_element(By.CLASS_NAME, ' ')
발행일 = 정보컨테이너.find_elements(By.CLASS_NAME, ' ')[0].text
저자 = 정보컨테이너.find_elements(By.CLASS_NAME, ' ')[1].text
이용수 = 정보컨테이너.find_element(By.CLASS_NAME, ' ').text

링크 = container.find_element(By.CLASS_NAME,' ').get_attribute('href')

제목, 카테고리, 발행일 ,저자, 이용수, 링크

 

여기서 핵심은:

  • 전체를 감싸는 큰 틀이 있음: id="paper-cards-section"
  • 그 안에 논문이 하나씩 묶여 있음: class="thesisCard"
  • 그 안에 제목, 저자, 발행일 등 정보가 있음 

✅ 핵심 요약

구문용도반환값
browser.find_element(...) 단일 요소 WebElement
browser.find_elements(...) 여러 요소 [WebElement, WebElement, ...] (리스트)
element.text 텍스트 내용 추출 문자열 (str)
element.get_attribute('href') 속성 추출 문자열 (str)

 

#페이지 이동하는 코드 
import time
data_list = []
for i in range(1,10):
    url = f'{i}'
    print(url)
    browser.get(url)
    time.sleep(3) 
    
    parent = browser.find_element(By.ID, ' ') # ID는 고유값
    containers = parent.find_elements(By.CLASS_NAME, ' ')
    
    for container in containers:
        try:
            제목 = container.find_element(By.CLASS_NAME, ' ').text
            카테고리 = container.find_element(By.CLASS_NAME, ' ').text
            
            정보컨테이너 = container.find_element(By.CLASS_NAME, ' ')
            발행일 = 정보컨테이너.find_elements(By.CLASS_NAME, ' ')[0].text
            저자 = 정보컨테이너.find_elements(By.CLASS_NAME, ' ')[1].text
            이용수 = 정보컨테이너.find_element(By.CLASS_NAME, ' ').text
            링크 = container.find_element(By.CLASS_NAME, '').get_attribute('href')
        
            data_list.append({
                '제목':제목,
                '카테고리':카테고리,
                '발행일':발행일,
                '저자':저자,
                '이용수':이용수,
                '링크':링크
            })
        except Exception as e:
            print('오류 로그 : ', e)
            pass

 

 

parent는 무엇인가요?

parent = browser.find_element(By.ID, 'paper-cards-section')
  • 이 코드는 HTML 문서에서 id="paper-cards-section"인 요소 하나를 찾아서 parent라는 변수에 저장하는 거예요.
  • 즉, 모든 논문 카드(thesisCard) 들을 감싸고 있는 부모 박스(div) 를 가져오는 거죠.

🧠 전체 흐름 정리

1. 🗂 저장할 빈 리스트 만들기

data_list = []
  • 논문 데이터를 하나씩 딕셔너리로 저장하고, 그 딕셔너리들을 리스트에 모아서 DataFrame으로 만들기 위해 사용해요.

2. 🔁 페이지 반복 (예: 1페이지부터 9페이지까지)

for page in range(1, 10): # 페이지 이동 코드
  • 여러 페이지의 논문을 수집하려고 for page 반복문을 사용해서 페이지 이동을 자동화해요.
  • 이 안에서 매번 새로 parent, containers를 잡고, 그 페이지에서만 데이터를 수집해요.

3. 🧱 부모 컨테이너 가져오기

parent = browser.find_element(By.ID, ' ')
현재 페이지 안에서 **모든 논문 카드(thesisCard)**를 감싸고 있는 박스를 가져와요.
HTML 구조 안에서 이걸 기준으로 검색 범위를 좁힐 수 있어요.
 

4. 📦 논문 카드들 가져오기

containers = parent.find_elements(By.CLASS_NAME, 'thesisCard')
  • parent 내부에 있는 개별 논문 박스를 리스트 형태로 가져와요.
  • 이후 반복문으로 하나씩 접근할 수 있게 돼요.

5. 🔁 각 논문에서 정보 추출

for container in containers:
	try: 
        제목 = ...
        카테고리 = ... 
        정보컨테이너 = ... 
        발행일 = ...
        저자 = ... 
        이용수 = ... 
        링크 = ... 
    
    	data_list.append({...})
    except Exception as e:
    print('오류 로그 :',e )
    pass
  • 각 논문 컨테이너에서 필요한 정보(제목, 카테고리, 발행일, 저자, 이용수, 링크)를 뽑고
  • 하나의 딕셔너리로 만들어 data_list에 추가해요.

5. 📊 최종 결과를 데이터프레임으로

 
import pandas as pd 
df = pd.DataFrame(data_list)
df.to_csv('저장할이름.csv',Encoding='utf-8-sig',index=False)

✅ 요약하면

페이지 반복 → 부모 컨테이너 → 논문 카드들 반복 → 정보 추출 → 리스트에 저장 → 데이터프레임 만들기 -> CSV파일 저장 
이 구조가 스크래핑의 기본적인 골격 ! 

 

 

 

 

 

 

 

 

 

오늘은 여러 가지 데이터를 가지고 데이터 가공부터 전처리, 분석까지 진행해 보았는데요 ! 

공통적으로 시행되는 단계들을 정리해보았어요 

colab환경에서 분석을 해보았습니다 ! 

 

단계 오늘의 데이터 분석 진행 과정 정리 🚀

 

 

  1. 데이터 마운트하기
    • 구글 드라이브나 외부 데이터를 Colab에 연결하여 불러옵니다.
  2. head() 함수로 데이터 살펴보기
    • 데이터의 첫 몇 줄을 확인하여 구조와 내용을 파악합니다.
    • 컬럼별 의미도 함께 확인해 봅니다.
  3. 분석 질문 만들기
    • 데이터를 통해 답하고 싶은 질문을 정리합니다.
  4. 데이터 전처리하기
    • 분석에 사용할 컬럼만 남깁니다.
    • 필요한 경우, 분리된 데이터를 merge() 함수로 합칩니다.
    • 중복된 컬럼이나 행이 있다면 drop() 함수로 정리합니다.
    • 질문에 맞춰 새로운 컬럼을 생성합니다.
    • 데이터 타입을 적절히 변환합니다.
      예) ID는 고유 값이니 문자열(str)로, 날짜 데이터는 pd.to_datetime()을 이용해 날짜 형식으로 변환
    • info() 함수로 데이터 타입이 잘 변환됐는지 확인합니다.
    • 결측치가 있는지 info()나 isnull()로 확인 후, dropna()로 제거합니다.
    • 전처리 후 head() 함수로 최종 데이터 형태를 다시 확인합니다.
    • 3번에 만들었던 질문에서 필요한 데이터가 있다면  기존컬럼들을 이용하여 새로운 컬럼 만들기
    • ex. id와 같은 값은 고유한 값으로 str로 바꿔주기 / date는 날짜 형식이기 때문에 날짜로 바꿔주기 
    •  이때 pandas에서 날짜로 바꿔주는 함수는 to_datetime
    •  데이터 타입 변경할건 변경하기

 

data['release_date'] = pd.to_datetime(data['release_date'], format='%Y-%m-%d') #년-월-일이였으니까 포맷을 맞춰서

 

  • 대신 요로캐 포맷은 맞춰줘야함 
  •  info() 함수를 통해 데이터 타입 잘 변환되었는지 확인하기 
  •  한번더 info()함수를 불러와 결측치 확인하기 
  •  dropna()함수를 통해서 결측치 제거하기 
  • 데이터 가공을 다했으면 head()함수로 전처리 준비가 완료되었는지 확인하기 

5. 분석 및 시각화

  • plotly 라이브러리 등의 시각화 도구로 그래프를 그려 분석 결과를 시각화합니다.
import plotly.express as px /// plotly 불러오는 방법

 

#plotly line data 불러오는 방법 
fig = px.line(data_frame=your_dataframe, x="x_column_name", y="y_column_name")
fig.show() 
///주의할점이 dataframe이 아니라 data_frame 인거 체크하기
# 1. title(영화 제목)별로 revenue(수익)를 그룹화하여 합계를 계산하고, 결과를 데이터프레임 형태로 정리
top = data.groupby('title')['revenue'].sum().reset_index()
/// .sum()이 아니라 mean() 도 가능함

# 2. 수익 기준으로 내림차순 정렬해서 가장 수익이 높은 순서대로 정렬
top = top.sort_values('revenue', ascending=False)

# 3. 상위 10개의 영화만 추출 (흥행 수익 TOP 10)
top = top.head(10)

# 4. Plotly의 bar 차트 생성
fig = px.bar(
    data_frame=top,           # 시각화에 사용할 데이터프레임
    x='title',                # x축에는 영화 제목을 표시
    y='revenue',              # y축에는 영화 수익을 표시
    title="흥행 수익 TOP 10 영화",  # 차트 제목
    color_discrete_sequence=['#C7CEEA']  # 막대 색상 지정 (연보라색 계열)
)

# 5. 그래프 출력 (Jupyter Notebook에서는 자동으로 웹 뷰어가 열림)
fig.show()

 

💡 보너스 팁 
groupby().sum()은 그룹별 합계를 낼 때 자주 쓰이는 대표적인 집계 함수입니다.

reset_index()를 써야 결과가 일반적인 데이터프레임 형태로 바뀌고, 이후 시각화에 쉽게 쓸 수 있어요.

sort_values()로 정렬하면 막대가 높은 순서로 나와서 가독성이 좋아집니다.

color_discrete_sequence는 색을 직접 지정할 수 있는 옵션이며, 리스트 형태로 전달합니다. (색 여러 개 넣으면 범례에 따라 다르게 색칠돼요)

plotly.express는 인터랙티브한 시각화를 손쉽게 만들 수 있어서 matplotlib보다 보기 좋은 결과물이 나오는 경우가 많아요.

 

 

title_dic = {'budget':'예산', 'vote_count':'투표수'}  # 컬럼명을 한글로 매핑한 딕셔너리

# 'budget'(예산), 'vote_count'(투표수)를 기준으로 각각 TOP10 막대그래프를 그릴 거예요
for y in ['budget', 'vote_count']:  
    # 1. 'title' 기준으로 그룹화 후, 해당 컬럼(y)의 합계를 구함
    # 2. 인덱스를 초기화해 데이터프레임 형태로 만들고
    # 3. y 값 기준 내림차순 정렬 후 상위 10개 항목 추출
    top = data.groupby('title')[[y]].sum().reset_index().sort_values(y, ascending=False).head(10)

    # 4. plotly로 막대그래프 생성
    fig = px.bar(
        data_frame=top,              # 그래프에 쓸 데이터프레임
        x='title',                   # x축에는 영화 제목
        y=y,                         # y축에는 현재 반복 중인 항목 (예산 or 투표수)
        title=f"{title_dic[y]} TOP 10 영화",  # 제목은 딕셔너리에서 가져온 한글로 표시
        color_discrete_sequence=['#AFCBFF']   # 막대 색상 지정 (연한 파란색 계열)
    )

    # 5. 그래프 출력
    fig.show()

 

 

top_director =
    data                            # 원본 데이터프레임
    .groupby(['director'])          # 감독(director)별로 그룹을 짓고
    ['revenue'].sum()              # 각 감독의 총 흥행 수익을 합산한 뒤
    .reset_index()                 # 결과를 표 형태로 보기 좋게 인덱스 초기화하고
    .sort_values('revenue', ascending=False)  # 수익 기준으로 내림차순 정렬해서
    .head(10)                      # 상위 10명의 감독만 추출해서

 

 

#plotly에서 boxplot 만드는 방법 
fig = px.box(data_frame = data, y = '', x = 'revenue', hover_name = '')
#data_frame = 데이터 넣고 , y='',x = '' , hover_name='title'
fig.show()

 

#누적막대그래프 
fig = px.bar(data_frame= 하고자하는 데이터, x="", y="", color='main_genre', color_discrete_sequence=px.colors.qualitative.Light24_r)
fig.show()

 

 

pd.pivot_table(data=data.query('조건'), index='', columns=' ', values=' ', aggfunc=sum, fill_value=0, margins=True) 

pd.pivot_table(
    data=data.query('조건'),          # 1. 피벗테이블을 만들 데이터, 조건에 맞는 행만 선택
    index='',                        # 2. 행 인덱스로 사용할 컬럼명 (피벗테이블의 행 기준)
    columns=' ',                     # 3. 열로 펼칠 컬럼명 (피벗테이블의 열 기준)
    values=' ',                     # 4. 집계할 값이 들어있는 컬럼명
    aggfunc=sum,                    # 5. 값을 집계할 함수 (예: sum, mean, count 등)
    fill_value=0,                   # 6. 결측값(NaN)을 0으로 채움
    margins=True                   # 7. 행과 열의 합계(총합)를 추가해줌 (전체 합계)
)

 

위치설명예시

data= 피벗테이블 만들 대상 데이터프레임, 필요한 행만 걸러서 사용 data.query('year==2023')
index= 피벗테이블에서 행 방향 기준이 될 컬럼명 'director', 'region'
columns= 피벗테이블에서 열 방향으로 펼칠 컬럼명 'genre', 'month'
values= 집계하려는 대상 컬럼명 (숫자 데이터) 'revenue', 'sales'
aggfunc= 집계함수, 값을 어떻게 요약할지 정함 sum, mean, count
fill_value= 집계 결과에 결측값이 있을 때 대신 채워줄 값 0 (결측값을 0으로 처리)
margins= 행과 열의 합계(총합)를 포함할지 여부 (True/False) True

 

 

#분석에 사용할 컬럼들 불러오고 .corr() 하면 상관관계가 분석됨
data[['col1','col2','col3','col4']].corr()

 

#상관분석 결과를 시각화한 히트맵
fig = px.imshow(data[['col1','col2','col3','col4']].corr(), text_auto='.2f', color_continuous_scale='Purp')
fig.show()
# text_auto='.2f 소수점 둘째자리까지
#대각선은 자기자신과의 상관관계로 1로 나오는거임

 

 

#trendline이 포함된 scatterplot 
for x in ['col1', 'col2', 'col3']:  # 1. col1, col2, col3 각각을 x축 변수로 사용해서 반복
    fig = px.scatter(               # 2. 산점도 그래프 생성
        data_frame=data,            # 3. 그래프에 사용할 데이터프레임 지정
        x=x,                       # 4. x축 값으로 현재 반복 중인 col1, col2, col3 중 하나
        y='col4',                  # 5. y축 값은 col4
        hover_name='title',        # 6. 점 위에 마우스 올리면 title 컬럼 값이 보임
        size='col4',               # 7. 점 크기를 col4 값에 비례해서 조절
        color='revenue',           # 8. 점 색깔을 revenue 값에 따라 다르게 표현
        color_continuous_scale=px.colors.sequential.Sunsetdark,  # 9. 점 색깔은 어두운 선셋 색상 그라데이션
        width=700,                 # 10. 그래프 가로 크기 700 픽셀
        height=600,                # 11. 그래프 세로 크기 600 픽셀
        trendline='ols'            # 12. x, y 데이터에 대해 선형 회귀 추세선을 그림
    )
    fig.show()                     # 13. 그래프 화면에 표시

 

 

#bubble chart 
data = data.sort_values('col1', ascending=False).head( )
# 'col1' 기준으로 내림차순 정렬 후 상위 일부 행만 선택 (head() 안에 숫자 넣으면 그 개수만큼 가져옴

fig = px.scatter(
    data_frame=data,                  # 2. 그래프에 사용할 데이터프레임 지정
    x=' ',                           # 3. x축에 사용할 컬럼명 (여기에 실제 컬럼명 넣어야 함)
    y=' ',                           # 4. y축에 사용할 컬럼명 (여기에 실제 컬럼명 넣어야 함)
    hover_name='title',              # 5. 마우스 올리면 영화 제목(title) 보여줌
    size='col1',                  # 6. 버블 크기는 'col1' 값에 비례
    color='main_genre',              # 7. 버블 색상은 'main_genre'별로 구분
    color_discrete_sequence=px.colors.qualitative.Light24,  # 8. 색상 팔레트는 Light24로 지정
    width=700,                      # 9. 그래프 가로 크기 700픽셀
    height=600                      # 10. 그래프 세로 크기 600픽셀
)

fig.show()

 

 

 


🎨 그래프 색상 정리

top = data.groupby('title')['revenue'].sum().reset_index().sort_values('revenue', ascending=False).head(10)
fig = px.bar(
    data_frame=top,
    x='title',
    y='revenue',
    title="흥행 수익 TOP 10 영화",
    color_discrete_sequence=['#C7CEEA']  # 막대 색상
)

# 배경색 설정은 따로!
fig.update_layout(
    paper_bgcolor='white',      # 전체 배경
    plot_bgcolor='white',       # 그래프 영역 배경
    yaxis=dict(
        showgrid=True,
        gridcolor='lightgray'
    )
)

fig.show()


#그 외의 취향이던 막대 색상
# pastel = ['#FFB5E8', '#FF9CEE', '#B28DFF', '#DCD3FF', '#AFCBFF', '#B5EAD7', '#C7CEEA']

 

✨  복습하면서 헷갈리던 것들 

 

 

✅ 정리:

title_dic = {'budget':'예산', 'vote_count':'투표수'

딕셔너리를 쓴 이유

이유설명
보기 좋은 한글 제목으로 바꾸기 위해 plotly title에 사용할 때 직관적 제목을 만들 수 있음
반복문에서 조건별 처리할 때 유용 y 값에 따라 title을 자동으로 다르게 생성 가능
향후 컬럼이 늘어나도 확장성 확보 딕셔너리만 추가하면 코드 전체 수정 없이 반복 가능

🔍 왜 title_dic = {'budget': '예산', 'vote_count': '투표수'}처럼 딕셔너리로 묶었을까?

1. 반복문에서 컬럼명을 바꿔서 출력하기 위함

  • for y in ['budget', 'vote_count']: 이렇게 반복하면서
  • 그래프 title에 한글 제목을 넣고 싶잖아요?

그래서 아래처럼 쓸 수 있게 만든 거예요:

title=f"{title_dic[y]} TOP 10 영화"
# y가 'budget'이면 → "예산 TOP 10 영화"
# y가 'vote_count'면 → "투표수 TOP 10 영화"

✅ groupby()는 언제 사용하나요?

groupby()는 데이터를 특정 기준(컬럼 값)에 따라 묶고, 묶인 각 그룹에 대해 합계, 평균, 개수 등의 집계(aggregation) 연산을 하고 싶을 때 사용합니다.

 

✅ 요약

함수역할
groupby() 특정 기준으로 그룹 묶기 + 집계 연산
reset_index() 그룹 결과의 인덱스를 일반 컬럼으로 변환해서 보기 좋게 만들기

 

///Q : dropna()함수로 결측치 제거하는데 inplace=True는 왜 사용해? 이게 무슨의미야? 
data.dropna(inplace=True)
///✅ inplace=True의 의미
///"결측치를 제거한 결과를 원본 데이터프레임 data에 바로 반영해줘!" 라는 뜻입니다.

✅ inplace=True의 장단점

🔹 장점

  1. 메모리 효율성
    • 새로운 복사본을 만들지 않아서 메모리 사용량이 적어요.
    • 특히 데이터가 매우 클 때 유리해요.
  2. 코드 간결
    • 별도의 변수 없이 한 줄로 처리할 수 있어서 깔끔해 보여요.

🔸 단점

  1. 원본 데이터가 바뀜
    • 한 번 바뀌면 되돌리기 어렵거나 불가능해요 (undo 불가).
    • 실수로 중요한 데이터를 날릴 위험이 있음.
  2. 코드의 가독성과 추적성 감소
    • df = df.dropna()처럼 할당하는 방식은 변화를 명확하게 보여줌.
    • inplace=True는 묵시적으로 변경되므로 디버깅이나 추적이 어려울 수 있어요.
  3. 일부 함수에서는 inplace 옵션이 없어졌거나 사라질 예정
    • 최신 판다스 버전에서는 inplace=True가 비추천(deprecated) 되는 방향으로 가고 있어요.

🚀 처음 보는 함수 정리

ast.literal_eval()은 문자열(String)을 실제 파이썬 객체처럼 안전하게 변환해주는 함수예요.
보통 문자열로 저장된 리스트나 딕셔너리 등을 진짜 리스트나 딕셔너리 객체로 바꿀 때 사용합니다.

import ast

result = ast.literal_eval('[1, 2, 3]')
print(result)        # [1, 2, 3]
print(type(result))  # <class 'list'>

📌 언제 쓰나?

  • CSV, Excel, JSON 등에서 "[1, 2, 3]", "{'a': 1}" 같은 문자열 형태의 자료구조가 저장되어 있을 때,
  • eval() 대신 안전하게 문자열을 파싱하고 싶을 때 사용합니다
ast.literal_eval("{'name': 'Alice', 'age': 25}")
# => {'name': 'Alice', 'age': 25}

ast.literal_eval("('x', 1, True)")
# => ('x', 1, True)

첫 파이썬 강의는 2년 전.

편입하고 나서 문득, "혹시 내가 선생님이 하고 싶었던 게 아니라, 단순히 경험이 부족했던 건 아닐까?" 라는 물음표를 스스로에게 던졌던 날이 있었어요.

우리과와 복수전공을 가장 많이 하는 세 학과의 공통점을 찾아보니, 다들 컴퓨터공학 관련 분야더라고요.

그런데 우리 학교는 컴공으로 뭉뚱그려 있지 않고,
정보보안 / 소프트웨어공학 / 데이터사이언스 세 학과로 나뉘어져 있어서…

현실적인 고민 끝에, 정보보안과 소공은 도저히 엄두가 안 났고 😅

결국 DS학과에서 들을 수 있는 수업 2개를 수강해본 뒤,
바로 다가오는 방학에 컴퓨터 학원 등록!

그날, 처음으로 파이썬을 배웠어요 🐍

그때는 정말 "이게 뭔가?" 싶었는데,
지금은 그래도 제어문이 무섭진 않은 단계까지 왔습니다...! (자유자재로 쓴다고는 아직 못해요 ㅎ)

But!
곧 자유자재로 핸들링할 날이 머지 않았으니

👉 앞으로의 성장기, 많은 관심 부탁드립니다 💻❤️


1. 조건문 (if)

특정 조건을 검사하여 그 조건에 따라 다른 코드를 실행하도록 하는 구문

if, elif, else 키워드를 사용하여 조건문을 작성

프로그램의 흐름을 제어 

 

1. 기본 구조

if 조건:
    실행할 코드
elif 조건:
    실행할 코드
else:
    실행할 코드

2. 작동 원리

  • if: 조건이 참이면 해당 블록 실행.
  • elif: 위 조건이 모두 거짓일 때 새로운 조건을 검사.
  • else: 모든 조건이 거짓일 때 실행.

(2) 조건문 예제

1. 기본 사용법

x = 10

if x > 5:
    print("x는 5보다 큽니다.")  # 출력됨
elif x == 5:
    print("x는 5입니다.")
else:
    print("x는 5보다 작습니다.") // x는 5보다 큽니다.

 

2. 중첩 조건문

#RuleBase라고 함 
x = 13

if x > 10:
    if x % 2 == 0: ## 나머지가 0인거 = 짝수인지 확인하려고 
        print("x는 10보다 크고 짝수입니다.")
    else:
        print("x는 10보다 크고 홀수입니다.")
else:
    print("x는 10 이하입니다.") // x는 10보다 크고 홀수입니다.

 

3. 조건문

age = 26
is_student = False

if age < 18 or is_student:
    print("할인이 적용됩니다.")  # 출력됨
else:
    print("할인이 적용되지 않습니다.") //할인이 적용되지 않습니다.

 

(3) 조건문과 자주 사용되는 함수

1. input()

사용자로부터 입력을 받아 조건을 검사할 때 자주 사용됩니다.

 

age = int(input("나이를 입력하세요: "))

if age >= 18:
    print("성인입니다.")
else:
    print("미성년자입니다.")

 

2. len()

문자열이나 리스트의 길이(크)를 조건으로 사용할 수 있습니다.

#다른 예. 리뷰가 50글자 이상인것만 
password = "abc12345"

if len(password) >= 6:
    print("비밀번호가 유효합니다.")
else:
    print("비밀번호는 최소 6자 이상이어야 합니다.")

 

 


(4) 비교연산자

조건문에 값을 비교할 때 사용

표현파이썬 코드

a와 b가 같다 a == b
a와 b가 같지 않다 a != b
a가 b보다 작다 a < b
a가 b보다 작거나 같다 a <= b
a가 b보다 크다 a > b
a가 b보다 크거나 같다 a >= b

 

 

a = 1
b = 3

print(a == b)  # False
print(a != b)  # True

print(a < b)   # True
print(a <= b)  # True

print(a > b)   # False
print(a >= b)  # False

 

(5) and, or 연산자

만약에 조건이 2가지 이상인 경우에는?

money = 50000
bus = False #비행기표가 없는거임 

# if money >= 50000 and bus:
#     print("비행기를 타세요.")
# elif money >= 100000 or bus:
#     print("고속버스를 타세요.")


if money>= 50000:
    if bus == True:
        print('고속버스를 타세요')
    elif bus == False:
        print('기차를 타세요')
else:
    print("걸어가세요")

 

2. 반복문 (for, while)

: 반복되는 행위를 할 때 사용

# 단 두 줄로 해결이 가능
for i in range(10):
    print("meanji is 9월 취뽀", i) 
 
 
 '''
meanji is 9월 취뽀 0
meanji is 9월 취뽀 1
meanji is 9월 취뽀 2
meanji is 9월 취뽀 3
meanji is 9월 취뽀 4
meanji is 9월 취뽀 5
meanji is 9월 취뽀 6
meanji is 9월 취뽀 7
meanji is 9월 취뽀 8
meanji is 9월 취뽀 9
'''

-> 이런 예 사용하면 되게 자기애 강해보이는데  저는 말하는 힘을 믿어요 ✨ 

for문의 기본 형태

for 변수 in 리스트(또는 튜플, 문자열):
    실행할 문장1

 

(1) for 반복문

for 반복문은 시퀀스(리스트, 문자열, 튜플 등)의 각 요소를 순차적으로 가져와 작업을 수행합니다.

for 변수 in 시퀀스:
    실행할 코드

 

리스트

fruits = ["apple", "banana", "cherry"]

for fruit in fruits:
    print(fruit)
    
    if fruit  == 'banana':
        print('원숭이')
        
'''
apple
banana
원숭이
cherry
'''

 

range()

for i in range(5): # 숫자(0부터 5미만)
    print(i)

# for i in range() 이거를 기계적으로 외워자자 
''' 
0
1
2
3
4
'''

 

문자열

text = "meanji 취뽀 9월"
for char in text:
    print(char) 
    
''' 
m
e
a
n
j
i
 
취
뽀
 
9
월

'''

 

(2) while 반복문

  • while 문은 조건이 참(True)인 동안 코드를 반복 실행합니다.
  • while 조건: 실행할 코드
num = 0
while num < 5:
#while True:
    #print('실행') # 무한루프에 빠지게 됨 why? 항상 참이니까 

    num = num + 1 
    print('num 값: ', num) #num가 5가 되는 순간 멈춤 
#while문을 사용할때 조건의 관리가 꼭 필요함 

''' 
num 값:  1
num 값:  2
num 값:  3
num 값:  4
num 값:  5
'''

 

num = 0
while num < 5:
#while True:
    #print('실행') # 무한루프에 빠지게 됨 why? 항상 참이니까 
    print('num 값: ', num) 
    num = num + 1 
#이렇게 순서를 바꾸면 01234가 됨  
'''
num 값:  0
num 값:  1
num 값:  2
num 값:  3
num 값:  4
''' 

for i in range(5):
    print(i) 

#이게 바로 위에 코드와 같음 
'''
0
1
2
3
4
'''

 

count = 10
while count < 3: 
    print('이코드는 실행되지 않습니다.') # 아예 실행되지 않음

 

(3) 반복문에서 자주 사용되는 키워드

1. break

  • break는 반복문을 즉시 종료합니다.
for i in range(5):
    if i == 3:
        break # 멈춰서 4가 표현이 안되고 
    print(i)
    
    
'''
0
1
2
'''

 

 

for i in range(5):
    if i == 3:
        continue # i=3을 만났을때 여기서 멈춰라는 뜻으로 3에서 넘어가니까 4로 표현되는거임 
    print(i) 
    
''' 
0
1
2
4
'''

 

2. continue

  • continue는 현재 반복을 건너뛰고, 다음 반복으로 넘어갑니다. 
for i in range(6):
    if i == 3:
        continue
    print(i)
    
''' 
0
1
2
4
5
'''

3. pass

  • pass는 아무 작업도 하지 않고 반복문을 유지합니다.
for i in range(5):
    if i == 3:
        pass # todo: 여기서부터
    print(i) 
    
''' 
0
1
2
3
4
'''

 

(4) 반복문에서 자주 사용되는 함수

1. range(start, stop, step)

  • 숫자 범위를 생성하며, 시작값(start), 끝값(stop), 증가값(step)을 지정할 수 있습니다.
for i in range(1, 10, 2):
    print(i)
''' 
1
3
5
7
9
'''

 

2. enumerate() - 열거하다, 나열하다

  • 리스트나 문자열을 순회하며 인덱스와 값을 동시에 가져옵니다.
fruits = ["apple", "banana", "cherry"]

for fruit in fruits:
    print(fruit)
    
 ''' 
 apple
banana
cherry
'''

# 이방식도 많이 사용함 기억해두기 
fruits = ["apple", "banana", "cherry"]

for index, fruit in enumerate(fruits): # 몇번째에 들어있는 데이터인지 확인가능함
    print(index, fruit)
    
'''
0 apple
1 banana
2 cherry
'''

 

3. zip()

  • 여러 시퀀스를 동시에 순회합니다. 

 

names = ["meanji", "Zoa", "쩡유"]
ages = [26, 25, 27]

for name, age in zip(names, ages):
    print(f"{name} is {age} years old.")
 
 ''' 
 meanji is 26 years old.
Zoa is 25 years old.
쩡유 is 27 years old.
'''

 

 


4. reversed()

  • 리스트나 문자열을 역순으로 순회합니다. 
  •  
for char in reversed([1,100,3,80,5]): #순서를 보장하는 것이 아님, 단순히 뒤집어주는거임
    print(char)
    
''' 
5
80
3
100
1
''' 

for char in sorted (reversed([1,100,3,80,5])): #순서를 보장하는 것이 아님, 단순히 뒤집어주는거임
    print(char)
    
''' 
1
3
5
80
100
''' 
for char in [1,2,3,4,5][::-1]: #reversed 와 동일한거임 
    print(char)

''' 
5
4
3
2
1
'''

 

# 강사님 Divide and Conquer
# 1. 1부터 20까지 나타내자
# 2. 조건을 통해 짝수만 걸러내자 

for i in range(1,21):
    if i % 2 == 0: 
        print('짝수 : ', i ) 

=> 수업 때 강사님이 알려주신 Divide and Conquer!
며칠 전 정처기 필기 공부할 때도 나왔던 개념이라 두 흐름이 딱 맞아떨어지는 순간, 소소한 재미 포인트임  ♠

 

 

 

파이썬 리스트형 자료형

1. 리스트형 소개

리스트는 여러 개의 데이터를 하나의 변수에 저장할 수 있는 자료형입니다.

**대괄호[ ]**를 사용하여 생성하며, 서로 다른 자료형도 저장할 수 있습니다.

 

# 빈 리스트 생성
empty_list = []

# 값이 있는 리스트 생성
fruits = ["apple", "banana", "cherry"]
numbers = [1, 2, 3, 4, 5]
mixed = [1, "apple", 3.14, [2, 4, 6], {}]

print(fruits)   # ['apple', 'banana', 'cherry']
print(numbers)  # [1, 2, 3, 4, 5]
print(mixed)    # [1, 'apple', 3.14, [2, 4, 6]]

(2) 리스트 인덱싱과 슬라이싱

  • 인덱싱: 특정 위치의 값을 가져옴 (0부터 시작).
  • 슬라이싱: 리스트의 일부를 잘라냄.
# 리스트 인덱싱
fruits = ["apple", "banana", "cherry", "mango"]
print(fruits[0])  # apple
print(fruits[-1]) # mango (뒤에서 첫 번째)
data = [0,1,2,3,4,5]

data[0:3] # 0<= data < 3

 

(3) 리스트의 주요 메서드

값 추가

  • append(value): 리스트의 끝에 값을 추가합니다.
  • insert(index, value): 특정 위치에 값을 삽입합니다.
# append 예제
fruits = ["apple", "banana"]
fruits.append("cherry")
fruits.append("방토마토")
print(fruits)  # ['apple', 'banana', 'cherry', '방토마토']

# insert 예제 - 특정한 위치에 값을 넣고 싶을 때
fruits.insert(1, "orange")
print(fruits)  # ['apple', 'orange', 'banana', 'cherry']
fruits.insert(0, "스토로베리") #0번째 즉, 제일 첫번째에 스트로베리를 넣어라 
print(fruits)
//['스토로베리', 'orange', 'apple', 'orange', 'banana', 'cherry', '방토마토']
//['스토로베리', '스토로베리', 'orange', 'apple', 'orange', 'banana', 'cherry', '방토마토']

 

 


값 제거

  • remove(value): 지정된 값을 제거합니다.
  • pop(index): 지정된 인덱스의 값을 제거하고 반환합니다. (인덱스를 생략하면 마지막 값을 제거)
  • clear(): 리스트의 모든 값을 제거합니다.
# remove 예제
fruits = ["apple", "banana", "cherry", "mango"]
fruits.remove("banana")
print(fruits)  # ['apple', 'cherry', 'mango']

 

# pop 예제
last_fruit = fruits.pop() # 뽑
print(f'pop()를 통해서 뽑아낸 값 : {last_fruit}')

print(fruits) 
// pop()를 통해서 뽑아낸 값 : apple
//[]

 

값 검색

  • index(value): 특정 값의 인덱스를 반환합니다.
  • count(value): 특정 값이 리스트에 몇 번 등장하는지 반환합니다.
fruits = ["apple", "banana", "cherry", "apple"]

# index 예제
print(fruits.index("apple"))  # 0 (첫 번째 'apple'의 위치)

# count 예제
print(fruits.count("apple"))  # 2

 

리스트 정렬

  • sort(): 리스트를 오름차순으로 정렬 (기본값).
  • reverse(): 리스트를 뒤집음.
numbers = [3, 1, 4, 2]

# sort 예제
numbers.sort()
print(numbers)  # [1, 2, 3, 4]

# reverse 예제
numbers.reverse()
print(numbers)  # [4, 3, 2, 1]

 

리스트 복사

  • copy(): 리스트를 복사합니다.
  • 리스트 데이터 타입은 복사를 할 때 메모리도 함께 복사됩니다.

-> 여기서 사담을 조금 해보자면 제가 BDA 학회할때도 강사님이 원본 데이터를 그대로 사용하면 나중에 잘못해서 복구하려고 하면 사고다라면서 무조건 데이터를 복사해서 사용하라는 말을 자주들었었는데 복사는 copy() 기억하기 

 

data = [1, 2, 3]

new_data = data
new_data.append(4) 
#new data에 4를 추가헀는데 data도 왜 4가 추가냐냐
# 리스트 타입은 메모리도 함게 복사가 되기 때문에 .copy()함수를 쓰는거임 
print(new_data, data) 
// [1, 2, 3, 4] [1, 2, 3, 4]

 

data = [1, 2, 3]
new_data = data.copy()

new_data.append(4)

print(data)  # [1, 2, 3]
print(new_data)    # [1, 2, 3, 4]

# 얕은 복사
# 깊은 복사 ...

 

4. 딕셔너리형 (Dict)

Dict → 사전

  • { 단어 : 뜻 }의 형태

중괄호 안에 키(key)와 벨류(value)로 구성되어 있는 형태

데이터의 빠른 검색, 추가, 삭제를 지원

{Key1:Value1, Key2:Value2, Key3:Value3, ...}

 

(1) 딕셔너리의 주요 특징

  1. 키-값 쌍으로 구성:
    • 데이터는 고유한 키와 값의 쌍으로 저장됩니다.
    • 예: {"name": "Alice", "age": 25}
  2. 키는 고유:
    • 키는 중복될 수 없습니다.
  3. 변경 가능 (Mutable):
    • 딕셔너리는 생성 후 수정, 추가, 삭제가 가능합니다.

(2) 딕셔너리 생성 및 기본 사용법

딕셔너리 생성

# 빈 딕셔너리 생성
empty_dict = {}

type(empty_dict) //dict 

# 값이 있는 딕셔너리 생성
person = {"name": "Alice", "age": 25, "city": "New York"}

print(person)  # {'name': 'Alice', 'age': 25, 'city': 'New York'}

 

⚠️ 주의! 파이썬에서 딕셔너리는 {} 중괄호로 감싸야 해요! 

 

딕셔너리 키로 값 접근 

person = {"name": "meanji", "age": 26, "city": "Seoul"}

# 키로 값 가져오기
print(person["name"])  #key값을 물어보면 value값을 가져옴 
print(person["age"])   

person['Seoul'] = 'Busan'
person['job'] = 'homeprotector'
person

//meanji
//26
//{'name': 'meanji',
// 'age': 26,
//'city': 'Seoul',
//'Seoul': 'Busan',
//'job': 'homeprotector'}

 

딕셔너리 값 추가 및 수정

#값 추가
person = {"name": "Alice", "age": 25}

# 값 추가
person["city"] = "New York"
print(person)  # {'name': 'Alice', 'age': 25, 'city': 'New York'}

# 값 수정
person["age"] = 33
print(person)  # {'name': 'Alice', 'age': 33, 'city': 'New York'}

 

 

딕셔너리 값 삭제

person = {"name": "Alice", "age": 25, "city": "New York"}

# 특정 키 삭제 (del: 예약어) 
del person["city"]
print(person)  # {'name': 'Alice', 'age': 25}

# 모든 키-값 삭제
person.clear() #기존에 있던 data는 다 날아가고 빈 딕셔너리가 출력됨 
print(person)  # {}

 

# Q. content에 들어있는 메세지 내용을 추출해주세요. 

# openai API response 예시
data = {
  "id": "chatcmpl-abc123",
  "object": "chat.completion",
  "created": 1677858242,
  "model": "gpt-4-1106-preview",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "안녕하세요! 무엇을 도와드릴까요?"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 10,
    "completion_tokens": 10,
    "total_tokens": 20
  }
}

 

# Q. content에 들어있는 메세지 내용을 추출해주세요.
data
print(data['choices']) #맨마지막에 대괄호가 있는걸 보니 choices는 리스트인거임 
print(data['choices'][0]) # 이렇게하면 맨 마지막에 대괄호가 빠져 나오면서 딕셔너리가 됨 
print(data['choices'][0]['message'])
print(data['choices'][0]['message']['content'])

'''
[{'index': 0, 'message': {'role': 'assistant', 'content': '안녕하세요! 무엇을 도와드릴까요?'}, 'finish_reason': 'stop'}]
{'index': 0, 'message': {'role': 'assistant', 'content': '안녕하세요! 무엇을 도와드릴까요?'}, 'finish_reason': 'stop'}
{'role': 'assistant', 'content': '안녕하세요! 무엇을 도와드릴까요?'}
안녕하세요! 무엇을 도와드릴까요?
'''

 

(3) 딕셔너리의 주요 메서드

1. keys(), values(), items()

person = {"name": "Alice", "age": 25, "city": "New York"}

print(person.keys())   # dict_keys(['name', 'age', 'city']) # 키값만 모다주는거

print(person.values()) # dict_values(['Alice', 25, 'New York']) #value 값만 모다주는거 

print(person.items())  # 키와 값이 함께 들어오는거


2. get()

  • 예외처리가 적용된 함수
person = {"name": "Alice", "age": 25}
person['city'] //KeyError  

print(person.get("city", "값없음")) //값없음

 

3. update()

person = {"name": "Alice", "age": 25}
person.update({"city": "New York", "age": 26})

print(person)  # {'name': 'Alice', 'age': 26, 'city': 'New York'}

 

4. pop()

person = {"name": "Alice", "age": 25}
age = person.pop("age") 

print(age)     # 25
print(person)  # {'name': 'Alice'}

 

 

문제 8: 아래의 dict 데이터 중에서 youtube 주소를 불러오세요.
data = {
  "id": "COURSE001",
  "title": "Python for Beginners",
  "category": ["Programming", "Python", "Beginner"],
  "instructor": [{
    "id": "INSTR001",
    "name": "Jane Kim",
    "email": "jane.kim@devedu.com",
    "profile": {
      "bio": "10년 경력의 파이썬 전문 강사",
      "social": [{
        "youtube": "https://www.youtube.com/@AI%EC%95%8C%EB%A0%A4%EC%A3%BC%EB%8A%94%EB%82%A8%EC%9E%90-%EB%8D%B0%EB%B8%8C%EB%82%A8",
        "linkedin": "https://linkedin.com/in/janekim"
      }]
    }
  }]
}

 

data = {
  "id": "COURSE001",
  "title": "Python for Beginners",
  "category": ["Programming", "Python", "Beginner"],
  "instructor": [{
    "id": "INSTR001",
    "name": "Jane Kim",
    "email": "jane.kim@devedu.com",
    "profile": {
      "bio": "10년 경력의 파이썬 전문 강사",
      "social": [{
        "youtube": "https://www.youtube.com/@AI%EC%95%8C%EB%A0%A4%EC%A3%BC%EB%8A%94%EB%82%A8%EC%9E%90-%EB%8D%B0%EB%B8%8C%EB%82%A8",
        "linkedin": "https://linkedin.com/in/janekim"
          }]
    }
  }]
}

/// data['instructor'][0]['profile']['social'][0]['youtube'] 
/// 'https://www.youtube.com/@AI%EC%95%8C%EB%A0%A4%EC%A3%BC%EB%8A%94%EB%82%A8%EC%9E%90-%EB%8D%B0%EB%B8%8C%EB%82%A8'

 

 

5. 튜플형 (Tuple)

불변(Immutable) 데이터 타입으로, 여러 값을 순서대로 저장할 수 있는 자료 구조

리스트형[ ]과 거의 비슷하고, () 괄호로 생성.

리스트와 비슷하지만 생성 후 수정, 추가, 삭제가 불가능합니다.

t = ()
t = ("a", "b", "c", "d", "e")
t = ("Hello", "Python")
t = (1, 2, 3, ("a", "b"))

 

(1) 튜플의 주요 특징

  1. 순서 유지 (Ordered):
    • 튜플은 저장된 순서를 유지하며, 인덱스를 통해 각 요소에 접근할 수 있습니다.
  2. 불변 (Immutable):
    • 튜플의 요소는 한 번 생성되면 변경할 수 없습니다.
  3. 중복 허용:
    • 동일한 값을 여러 번 포함할 수 있습니다.
  4. 다양한 자료형 저장 가능:
    • 숫자, 문자열, 리스트 등 다양한 자료형을 저장할 수 있습니다.


(2) 튜플 생성 및 기본 사용법

튜플 생성

# 빈 튜플 생성
empty_tuple = ()

# 값이 있는 튜플 생성
fruits = ("apple", "banana", "cherry")
numbers = (1, 2, 3, 4, 5)
mixed = (1, "hello", 3.14, [2, 4, 6], {"key":"value"})

print(fruits)   # ('apple', 'banana', 'cherry')
print(numbers)  # (1, 2, 3, 4, 5)
print(mixed)    # (1, 'hello', 3.14, [2, 4, 6])

 


튜플 인덱싱과 슬라이싱

fruits = ("apple", "banana", "cherry", "date")

# 인덱싱
print(fruits[0])   # apple
print(fruits[-1])  # date

# 슬라이싱
print(fruits[1:3])  # ('banana', 'cherry')
print(fruits[:2])   # ('apple', 'banana')
print(fruits[::-1]) # ('date', 'cherry', 'banana', 'apple')

 

튜플은 불변

튜플은 불변이므로 수정, 추가, 삭제가 불가능합니다. => 중요한 데이터를 보호하기 위해 이런 기능이 만들어진거임

 

fruits = ("apple", "banana", "cherry")
# fruits[0] = "orange"  # TypeError: 'tuple' object does not support item assignment

튜플 요소 반복

튜플의 요소를 순회하면서 작업할 수 있습니다.

fruits = ("apple", "banana", "cherry")

for fruit in fruits:
    print(fruit)

 

(3) 튜플의 주요 메서드

1. count()

  • 특정 값이 튜플에 몇 번 등장하는지 반환합니다.
numbers = (1, 2, 3, 2, 4, 2)
print(numbers.count(2))  # 3

 

 


2. index()

  • 특정 값의 첫 번째 위치(인덱스)를 반환합니다.
numbers = (1, 2, 3, 2, 4, 2)
print(numbers.index(2))  # 1


3. 튜플 언패킹 (unpacking)

튜플의 요소를 여러 변수에 할당할 수 있습니다.

 

person = ("Alice", 25, "New York")
name, age, city = person # ("Alice", 25, "New York")

print(name)  # Alice
print(age)   # 25
print(city)  # New York

 

 

4. 튜플 결합과 반복

튜플은 결합하거나 반복할 수 있습니다.

# 튜플 결합
tuple1 = (1, 2, 3)
tuple2 = (4, 5, 6)
combined = tuple1 + tuple2
print(combined)  # (1, 2, 3, 4, 5, 6)

# 튜플 반복
repeated = tuple1 * 3
print(repeated)  # (1, 2, 3, 1, 2, 3, 1, 2, 3)

 

 

📌 자료형 구분! 헷갈리지 말자!

🔹 리스트는 [] 대괄호

➡️ 순서가 있고, 값 변경 가능 (mutable)
➡️ 여러 자료를 한 줄에 묶어 처리할 때 자주 사용!

⚠️ 저번 포스팅에서 배운 리스트 기억나죠? 대괄호 꼭 기억하기!

🔸 **딕셔너리(Dictionary)**는 {} 중괄호

➡️ Key: Value 쌍으로 구성
➡️ 값에 빠르게 접근하고 싶을 때 유용!

⚠️ 이번 포스팅 포인트!
딕셔너리는 중괄호 {}로 감싸고, **key와 value는 콜론 :**으로 연결해요! 

🔹  **튜플(Tuple)**은 () 소괄호

➡️ 순서가 있고, 값 변경 불가 (immutable)
➡️ 변하지 않는 데이터를 묶어서 관리할 때 사용!

⚠️ 리스트와 헷갈리지 않게 주의!
튜플은 소괄호 (), 수정할 수 없다는 점 꼭 기억하기!

안녕하세요! @mean_so 입니다 😊

바로 전주에 패스트캠퍼스 BDA 19기 파이썬 강의가 개강했어요!

뭐랄까… 커피도 아메리카노를 잘하는 집이 다른 음료도 맛있듯,
코딩도 기초를 잘 다져야 다른 분야도 수월하게 배울 수 있다고 생각하거든요.

그래서 이번 강의처럼 기초부터 다시 배울 수 있는 시간이
정말 기대되었답니다 

그럼 바로 오늘의 정리, 시작해볼게요!

 

1. 숫자형 (Number) 
파이썬에서 숫자형(Number) 데이터 타입은 숫자 데이터를 표현하기 위해 사용됩니다.

주요 타입은 다음과 같습니다:

- 정수 (int): 소수점 없는 숫자
- 실수 (float): 소수점을 포함한 숫자

1+'1' # 앞에는 숫자고 뒤에는 문자이기 때문에 오류가 나는거임 
# data type을 철저하게 구분하자

 

 

(1) 정수형 (Integer, int)

정수형은 소수점이 없는 숫자를 저장합니다. 양수, 음수, 0 모두 가능합니다.

특징

  • 크기의 제한 없음 (메모리가 허용하는 한 큰 수 표현 가능)
  • 일반적인 수학 연산 가능
# 사칙 연산이 가능

a = 3
b = 5

print(a + b)  # 5
print(a - 2)  # 1
print(a * 2)  # 6
print(a / 3)  # 1

# 셀 실행: Shift + Enter
# 또는 왼쪽 위의 세모버튼 클릭

 

(2) 실수형 (Float)

실수형은 소수점을 포함한 숫자를 표현합니다.

특징

  • 소수점 아래를 표현
  • 정수와의 연산도 지원
x = 3.14
y = -0.99

x + y # <class 'float'>

 

 

(3) 숫자형 간 변환

숫자형 데이터 타입은 서로 변환 가능합니다.

# 실수를 정수로 변환
c = 3.14
d = int(c)
print(d)  # 3 (소수점 아래가 버려짐)

d
float(d) # 이 d를 다시 실수형태로 변환하면 3.0으로 나옴

 


(4) 숫자형 연산

파이썬은 다양한 연산자를 통해 숫자 데이터를 다룰 수 있습니다.

연산자설명예시결과

 

+ 더하기 5 + 3 8
- 빼기 5 - 3 2
* 곱하기 5 * 3 15
/ 나누기 5 / 2 2.5
// 5 // 2 2
% 나머지 5 % 2 1
** 제곱 2 ** 3 8(2^3)

 

# 기본 연산
x = 10
y = 3

print(x + y)   # 13
print(x - y)   # 7
print(x * y)   # 30
print(x / y)   # 3.333..

# 몫과 나머지
print(x // y)  # 3 (몫)
print(x % y)   # 1 (나머지) 

print(2 ** 3)  # 8

 

 

# 저희 19기가 수업시간에 자주했던 질문들도 모아봤어요 

# type(x)랑 print(type(x))랑 어떻게 차이가 나나요?

#print(): 괄호 안의 변수의 결과를 보여줌 
print(type(1)) # 파이썬이 알려주는거 
print(type(1.0)) #float  # print() 함수를 이용해주면 결과값을 모두 알려줌

 


문자형 (String)

문자형(String)은 문자의 집합으로 이루어진 데이터 타입입니다.

텍스트 데이터를 다룰 때 사용되며, 작은 따옴표(') 또는 큰 따옴표(")로 묶어서 표현합니다.

 


(1) 문자형 기본 사용법

문자형 생성

# 작은 따옴표와 큰 따옴표 모두 사용 가능
text1 = 'Hello'
text2 = "World"

text1, text2  # Hello World

 

저는 주로 큰 따옴표하려면 shift 키를 누르는게 번거로워서 

작은 따옴표를 많이 사용하고 있어요 ! 

 

문자열 결합

문자열을 결합하려면 + 연산자를 사용합니다.

greeting = "Hello, "
name = "meanji!"
message = greeting + name
print(message) # Hello, meanji!

 

(2) 문자열 인덱싱과 슬라이싱

파이썬에서 문자열을 부분적으로 접근하거나 조작할 수 있게 해주는 방법

 

text = "Hello World!"
print(text[0])   # H
print(text[-1])  # ! (뒤에서 첫 번째)

 

 


✂️ 슬라이싱: "글자 조각내기"

  • 문자열에서 여러 글자를 잘라서 가져오는 방법
  • 문법: 문자열[시작:끝] → 끝은 포함하지 않음 
# text = "Hello World!"

text[:] #'Hello World! ' 전체 
text[:6] #'Hello ' 
text[6:] #'World! ' #이렇게 앞과 뒤는 끝까지 앞까지로 앞뒤가 비어있어도 됨

 

✅ 1. 파일 확장자 추출

  • 마지막 3글자만 추출해서 확장자 가져오기 
filename = "report.pdf"
filename[6:] // '.pdf' 

filename = "report.pdf"
filename[-3:] // 'pdf'

 

 

#✅ 2. 주민등록번호 뒷자리 마스킹

ssn='000714-4002019'
#앞부분(8글자)만 남기고 나머지는 *로 처리

ssn[0:8] + '*'*6

 

✅ 3. 문자열에서 특정 구간 추출 (날짜 형식)

date = "20250408"
#year, month, day 
year=date[:4]
month=date[4:6]
day=date[6:] #[-2:] 이렇게하는 방법도 잇음

 


✅ 4. URL에서 도메인 이름 추출

url = "https://www.example.com"

print(url.find('https'))
print(url.find('example'))
print(len(url))

 

 

(3) 문자열 함수

문자열 길이 확인, 대소문자 변환, 문자열 검색, 문자열 교체, 문자열 분리와 결합, 공백 제거, 문자열 포함 여부 등 다양한 문자열 관련 함수들을 사용할 수 있습니다.

 

문자열 길이 확인: len()

문자열의 길이를 반환합니다.

 

name = 'meanji'

len(name) // 6

 

 

대소문자 변환

  • upper(): 문자열을 대문자로 변환
  • lower(): 문자열을 소문자로 변환

 

text = "hello WORLD"
print(text.upper())       # HELLO WORLD
print(text.lower())       # hello world

name = 'meanji'

print(name.capitalize()) #첫글자를 대문자로 바꿔줌

 


문자열 교체: replace()

특정 부분 문자열을 다른 문자열로 교체합니다.

 

text = "I like Python"
new_text = text.replace("Python", "meanji")
print(new_text)  //I like meanji

 

 

문자열 분리

  • split(delimiter): 특정 구분자를 기준으로 문자열을 나눔
# split 예제
text = "apple,banana,cherry"
fruits = text.split(",")  # 리스트로 반환
print(fruits)  # ['apple', 'banana', 'cherry']

 

⚠️ 주의! 파이썬에서 리스트는 [] 대괄호로 감싸야 해요!

# 올바른 예시
my_list = [1, 2, 3, 4]

# 잘못된 예시 ❌ (소괄호는 튜플, 중괄호는 딕셔너리/집합)
my_tuple = (1, 2, 3)   # 튜플
my_dict = {1: 'a'}     # 딕셔너리
my_set  = {1, 2, 3}    # 집합

리스트는 순서가 있고, 값 변경이 가능합니다! (가장 많이 쓰이는 자료형 중 하나예요)

 

뒤에서 자료형이 나올때마다 알려줄테지만 

처음 파이썬배울때 괄호 대괄호 소괄호 중괄호 너무 헷갈렸고 지금도 자신없지만..... 

기억하기 리스트 대괄호 

문자열 포함 여부: in, not in

특정 문자열이 포함되어 있는지 확인합니다.

 

data = "(주)화주유소, 주식회사 화주유소"

"(주)" in data or "주식회사" in data 
#or조건을 사용해서 (주) 포함되거나 주식회사라고 포함된다면 이건 주식회사라고 하는거


(4) 문자열 포맷팅

파이썬에서는 문자열을 동적으로 구성하기 위한 다양한 포맷팅 방법을 제공합니다.

name = 'meanji'
age = '26'
message = 'My name is {} and I am {} years old.'.format(name,age)
print(message)
#이게 중괄호가 많이 나오면 실수하기 쉽기 때문에 f-string을 사용하면 구조가 문자열 포맷팅보다 안정적임

 

name = 'meanji'
age = '26'
message = f'My name is {name} and I am {age} years old.'
print(message)
# 카카오 알림메시지를 보낼때 f-string을 많이 사용함

 

name = "김민지만지망디"
event = '쌍쌍바모임'
date = "5월 16일(금) 오후 2시"

message = "{}님, '{}'에 신청이 완료되었습니다.\n📅 일시: {}".format(name, event, date)
print(message)

//김민지만지망디님, '쌍쌍바모임'에 신청이 완료되었습니다.
//📅 일시: 5월 16일(금) 오후 2시

 

 

안녕하세요! 오늘은 두근두근 파이썬 개강날.

그리고 동시에,,,,,,,,,,,

정처기 필기 시험이 있는 날이에요.

 

올해 초 비상교육 인턴을 하면서 준비했던 시험에 1문제 차이로 떨어지고,
이후엔 빅분기도 1문제 차이로 떨어지면서 정말 많이 낙담했었는데요.

그렇다고 포기할 제가 아니잖아요? ㅎㅎ

오히려 그래, 더 해봐. 누가 이기는지 보자 뭐 이런,,,,ㅎㅎ
(아냐. 더하지 마. 제발 더하지 마.)

 

이번에는 독학 대신
아슬아슬하게 합격 말고 완벽하게 준비하자!
는 마음으로 흥달쌤 인강도 끊고 제대로 준비했어요.
(사실, 당연히 빅분기 합격할 줄 알고 정처기 원서접수는 안 했었다는 건 안 비밀…)

그러다 빈자리 접수로 겨우 시험 신청했는데,
자리가 생각보다 없어서 준비할 시간이 2주밖에 없더라구요 🥲

 

9 to 6 패캠 수업 듣고  → 저녁에 미친 듯이 공부주말도 공부
공부가 끝나면 공부를 하는 그런 생활을 했어요 😵‍💫
이게 바로 취준의 현실...?

 

파이썬 첫 실강날임에도 불구하고 시험 보러 출발했습니다!
시험 장소는 서울북부기술원이었는데요,
일부러 프린트 안 하고 패드로 보다가 넣으려고 했는데

이곳은 입장 전에 핸드폰과 패드 등을 전원 끄고 제출해야 하더라구요?! 😰
4~5과목만 더 풀어보려고 프린트도 챙겼는데
결국엔 1, 2, 3과목 복습 못 하고 시험을 치렀어요 ㅎㅎㅎ

 

그런데 여러분,

해가 지나고 회차가 올라갈수록 점점 난이도가 어려워진다는 말 들어보셨어요?

합격률 조정을 위해 난이도를 올린다는 그 말… 진짜 맞는 것 같더라구요.
정말 많은 문제를 풀어봤다고 생각했는데
처음 보는 듯한 문제, 헷갈리는 문제들이 가득….

심장은 콩닥콩닥, 버튼 하나 누르면 결과가 나온다는 생각에 벌벌 떨면서 제출을 눌렀는데 

정말 아슬아슬하게 60점으로 합격했어요! 🎉 

 

🔧 오답노트 꿀팁 공유

전공자 분들은 뚝딱 해내시던데,
저처럼 비전공자 분들을 위해 제가 정리했던 오답노트 팁 공유드려요!

 

💡 Tip 1
요런 식으로 정리해서 패드에 정답/해설 나오기 전까지만 띄워놓고
답 체크하고, 왜 틀렸는지 적어보면서 해당 개념 반복하기!

💡 Tip 2
위에 있는 노트 양식, 제가 자동화해둔 기능이거든요!
버튼 한 번 누르면 아래처럼 문제 + 해설만 입력하면 되도록 만들어놨어요.
시간 아끼고 많은 문제 풀어보는 거 강추드립니다 😸

마지막으로 Notion 링크 공유드리면서 오늘의 일상 나눔 마치겠습니다!
모두모두 화이팅이에요 💪💻✨

pvs=4https://www.notion.so/1ecc9a97d8f680268defe600eba2734e?pvs=4

 

 

'일상 나눔 ✨' 카테고리의 다른 글

⏳ 2025 상반기 회고록 : 취준생의 기록  (2) 2025.05.26

# 🚗  자동차 연비(mpg) 데이터 분석mpg : 지금까지 배운내용 활용해서 분석해보기 

 

🚗 `mpg` 데이터셋을 이용해`pandas`, `seaborn`, `scipy` 등 다양한 라이브러리를 활용해, 차량 특성과 연비 간의 관계를 분석했습니다 

 

 

이렇게 데이터를 한번 불러와주고 

 

# 요약 순서표
- 단계    할 일 코드 예시
- 1단계   데이터 크기/구성   df.shape, df.columns, df.info()
- 2단계   데이터 미리보기    df.head() / df.tail()
- 3단계   수치 요약   df.describe()
- 4단계   결측치 확인  df.isnull().sum()
- 5단계   데이터 타입 파악   df.dtypes
- 6단계   범주형 분포 확인   df['컬럼'].value_counts()
- 7단계   수치형 상관 분석   df.corr()

 

이렇게 모두 확인해주고 

### ✅ 2. mpg 컬럼의 이상치 제거 (IQR 방식 사용)
#mpg 컬럼 기준으로 이상치 제거
Q1 = mpg['mpg'].quantile(0.25)
Q3 = mpg['mpg'].quantile(0.75)

IQR= Q3-Q1

#이상치 기준 설정
lower_bound = Q1 -1.5*IQR
upper_bound = Q3 + 1.5*IQR

#이상치 제거 (처음공부함)
mpg_clean = mpg[(mpg['mpg']>= lower_bound) & (mpg['mpg']<=upper_bound)]
import matpolotlib.pylot as plt

plt.figure(figsize=(8,6))
sns.boxplot(x='origin',y='mpg',data=mpd_clean)
plt.title('이상치 제거 후 Boxplot (origin vs mpg)')
plt.show()

이상치 제거후도 별로 다르지 않음 

 

import pandas as pd
import numpy as np
import seaborn as sns

#sns.heatmap(mpg, annot=True, cmap=''viridis')
#그래서 바로 heatmap에 mpg를 넣으면 문자열이 섞여 있어서 오류가 나거나,
#의도치 않은 결과가 나올 수 있어.
#그래서 밑에처럼 숫자형만 골라서 넣는 코드를 넣어야함

sns.heatmap(mpg.corr(numeric_only=True), annot=True, cmap='coolwarm')
# mpg.corr() → 열들 간의 상관관계 행렬을 구함 (숫자형만 자동 선택됨)

# annot=True → 숫자 직접 표시

# cmap='coolwarm' → 색상 스타일

✅ 7단계: 수치형 변수 시각화 및 관계 분석 (Numeric EDA) 
import matplotlib.pyplot as plt
import seaborn as sns

sns.histplot(mpg['mpg'])                    # 연비 분포 히스토그램
sns.scatterplot(x='horsepower', y='mpg', data=mpg)  # 마력과 연비의 관계
sns.pairplot(mpg[['mpg','weight','horsepower','acceleration']])

✅ 8단계: 상관관계 분석
mpg.corr(numeric_only=True)         # 숫자형끼리 상관계수 확인
sns.heatmap(mpg.corr(numeric_only=True), annot=True, cmap='coolwarm')
 

✅ 10단계: 결측치 처리 / 이상치 처리
 
mpg['horsepower'].isnull().sum()     # 결측치 처리 전 확인
mpg['horsepower'] = mpg['horsepower'].fillna(mpg['horsepower'].mean())  # 평균 대체

# 이상치 시각화
sns.boxplot(x=mpg['mpg'])

sns.lineplot(x='model_year', y='mpg', data=mpg)

### 3단계: 시각화로 먼저 확인
import seaborn as sns
import matplotlib.pyplot as plt

sns.scatterplot(data=mpg,x='weight',y='mpg')
plt.title("차 무게 vs 연비")
plt.show()

#음의 상관관계를 띄는걸 볼 수 있음 즉, h1 채택 ho 기각

 

###  4단계: 수치로 확인 (상관계수(r))
corr = mpg[['mpg','weight']].corr()
print(corr)
###상관계수 (Correlation coefficient) 값:

- -1이면 완벽한 음의 상관관계

- 0이면 무관

- +1이면 완벽한 양의 상관관계

→ 만약 -0.8 같은 값이 나오면 무게가 무거울수록 mpg가 낮다는 걸 보여줘.


### 5단계: 통계적 검정 (선택사항)
from scipy.stats import pearsonr

corr_coef,p_value = pearsonr(mpg['weight'],mpg['mpg'])
print("상관계수:",corr_coef)
print("p값",p_value)
 
상관계수: -0.831740933244335
p값 2.9727995640497043e-103
 
## 분석결과
- 상관게수(r): 음의상관관계
- p값 : 유의수준 0.05> 2.9727995640497043e-103 p값
-> 유의수준이 더 크므로 h0 기각
-> 즉, 차의 무게가 증가하면 연비가 낮아진다는 가설은 통계적으로 유의미하다고함

 

import seaborn as sns
import matplotlib.pyplot as plt

plt.figure(figsize=(8,6))
sns.regplot(x='weight',y='mpg',data=mpg,scatter_kws={'alpha':0.5},line_kws={'color':'red'})
plt.title('챠랑 무게와 연비의 관계')
plt.xlabel('Weight (차량 무게)')
plt.ylabel('MPG(연비)')
plt.grid(True)
plt.show()
 
  • sns.regplot() : 회귀선 + 산점도 그려줌
  • scatter_kws={'alpha':0.5} : 산점도 점들을 약간 투명하게
  • line_kws={'color':'red'} : 회귀선 빨간색으로
  • plt.figure(figsize=(8,6)) : 그래프 사이즈 조정
  • 차가 무거울수록 연비가 낮아지는 경향이 선명한 빨간 선으로 보임

mpg_data분석 https://colab.research.google.com/drive/18dPdsaDehnq8QJbuEsZDwa3nuCqhhf-M?usp=drive_link

'Pandas_python 💻' 카테고리의 다른 글

Pandastudy_day02  (0) 2025.04.10
pandastudy_day01  (0) 2025.04.07

+ Recent posts