6)
plt.figure(figsize=(10, 5))
plt.barh(width=lang_frequency.values,
y=np.arange(len(lang_frequency)),
tick_label=lang_frequency.index,
alpha=0.6)
for index, lang in enumerate(lang_frequency.index):
prflang_count = prflang_frequency.loc[lang]
plt.barh(y=index, width=prflang_count, color='salmon', alpha=0.6)
plt.title('언어별 사용자 수 vs 사용 희망자 수', fontsize=15, fontweight='bold')
plt.ylabel('개발언어', fontweight='bold')
plt.xlabel('응답자 수', fontweight='bold')
plt.xticks(np.arange(0, max(lang_frequency.values.max(), prflang_frequency.values.max())+2000, 2000), rotation=45)
plt.grid(axis='x', linestyle='--', alpha=0.7)
plt.legend(['현재 사용하는 언어', '사용을 의망하는 언어'], loc='lower right')
plt.show()
plt.barh():tick_label 매개변수: 막대 그래프의 각 막대에 대한 레이블을 지정한다.
enumerate()함수는 주어진 시퀀스(리스트, 튜플, 문자열 등)의 각 요소에 대해 인덱스와 값을 순회하면서 반복하는 파이썬 내장 함수이다.
- 이 함수는 보통 for 반복문과 함께 사용되며, 반복하려는 시퀀스의 각 요소에 대해 인덱스와 값을 함께 가져올 수 있다.
languages = ['Python', 'Java', 'C++', 'JavaScript']
for index, lang in enumerate(languages):
print(f"Index: {index}, Language: {lang}")
# 결과값:
# Index: 0, Language: Python
# Index: 1, Language: Java
# Index: 2, Language: C++
# Index: 3, Language: JavaScript
loc[]은 Pandas DataFrame에서 특정 행(row)이나 열(column)을 선택하기 위해 사용되는 인덱싱(indexing) 메서드이다.loc[]을 사용하여 행을 선택할 때는 행의 라벨(label)을 기준으로 선택하며, 열을 선택할 때는 열의 라벨을 기준으로 선택한다.
# 특정 행 선택
df.loc['행_라벨']
# 특정 열 선택
df.loc[:, '열_라벨']
# 특정 행과 열 동시에 선택
df.loc['행_라벨', '열_라벨']
loc[]을 사용하여 선택된 데이터는 Series나 DataFrame 형식으로 반환된다. 따라서 선택된 데이터를 변수에 할당하여 나중에 사용할 수 있다.
예를 들어,
A B C
0 1 4 7
1 2 5 8
2 3 6 9
여기서 loc[]을 사용하여 특정 행이나 열을 선택할 수 있다.
import pandas as pd
# 예시 DataFrame 생성
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})
# 특정 행 선택
row = df.loc[0]
# 결과: row는 Series 객체로, {'A': 1, 'B': 4, 'C': 7}을 나타냄
# 특정 열 선택
col = df.loc[:, 'B']
# 결과: col은 Series 객체로, {0: 4, 1: 5, 2: 6}을 나타냄
# 특정 행과 열 동시 선택
value = df.loc[1, 'B']
# 결과: value는 5
plt.legend()함수는 그래프에 범례(legend)를 추가하는 함수이다. 범례는 그래프에 표시된 데이터의 의미를 설명해 주는 역할을 한다.
plt.legend() 함수는 특별한 매개변수를 받지 않고 호출할 수 있다. 이 함수를 호출하면 그래프에 설정된 레이블을 바탕으로 자동으로 범례가 생성되며, 그래프의 기본 위치에 표시된다.
범례를 특정 위치에 표시하고 싶다면 loc 매개변수를 사용하여 원하는 위치를 지정할 수 있다. 다양한 위치 옵션들이 있으며, 'upper left', 'upper right', 'lower left', 'lower right' 등이 있다. 또한 'best' 옵션을 사용하여 최적의 위치를 자동으로 선택할 수도 있다.
예를 들어, plt.legend(loc='upper left')와 같이 사용하면 범례가 그래프의 왼쪽 상단에 표시된다.

fig, ax = plt.subplots(1, 2, figsize=(20, 10))

plt.subplots() 함수는 Matplotlib에서 여러 개의 서브플롯(subplot)을 포함하는 그림(figure)을 생성하는 함수이다. 이 함수를 사용하면 행(row)과 열(column)의 개수를 지정하여 원하는 서브플롯 레이아웃을 만들 수 있다.
fig, axes = plt.subplots(nrows, ncols, figsize=(width, height))
# nrows: 생성할 서브플롯의 행(row) 수를 나타낸다.
# ncols: 생성할 서브플롯의 열(column) 수를 나타낸다.
# figsize: 생성할 그림(figure)의 크기를 지정한다. (가로 길이, 세로 길이) 형식의 튜플로 입력된다.
이 함수를 호출하면 fig 변수에는 생성된 그림 객체가, axes 변수에는 생성된 서브플롯의 축(axes) 객체들이 배열 형태로 저장된다. 이후에 각 축 객체를 사용하여 서브플롯에 그래프를 그릴 수 있다.
참고:
ax # 결과값: # array([<Axes: >, <Axes: >], dtype=object)
ax 변수는 plt.subplots() 함수에서 생성된 서브플롯(subplot)을 담고 있는 배열(array)이다. 각 서브플롯은 Axes 객체로 나타내며, 이 배열에 저장되어 있다.
따라서 ax를 출력하면 배열에 포함된 각 서브플롯의 정보가 출력된다. 이 경우에는 두 개의 서브플롯이 생성되었으며, 각각의 서브플롯을 Axes 객체로 나타내고 있다.
7)
fig, axes = plt.subplots(1, 2, figsize=(20, 10))
# 왼쪽 그래프
axes[0].barh(width=data_top10_lang.values, y=data_top10_lang.index)
axes[0].set_title('데이터 관련 직군 - 가장 인기 있는 개발언어 10위 (현재 사용)', fontsize=15, fontweight='bold')
axes[0].set_xlabel('응답자 수', fontweight='bold')
axes[0].set_ylabel('개발언어', fontweight='bold')
axes[0].grid(axis='x', linestyle='--', alpha=0.7)
# 오른쪽 그래프
axes[1].barh(width=data_top10_prflang.values, y=data_top10_prflang.index, color = 'salmon')
axes[1].set_title('데이터 관련 직군 - 가장 인기 있는 개발언어 10위 (사용 희망)', fontsize=15, fontweight='bold')
axes[1].set_xlabel('응답자 수', fontweight='bold')
axes[1].set_ylabel('개발언어', fontweight='bold')
axes[1].grid(axis='x', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()

Matplotlib의 객체 지향 인터페이스를 사용하면 그림(Figure) 객체와 축(Axes) 객체를 명시적으로 다룰 수 있다. 따라서 그림과 축을 직접적으로 다루기 위해 set_title(), set_xlabel(), set_ylabel()과 같은 메서드를 사용한다.
각 메서드는 특정한 축(Axes) 객체에 대해 호출되며, 해당 축에 대한 제목, x축 레이블, y축 레이블을 설정한다. 이러한 메서드를 사용하면 여러 개의 축이 있는 그림을 생성하거나 각 축에 대해 개별적으로 레이블을 설정할 수 있다.
반면에 title(), xlabel(), ylabel()과 같은 함수는 현재 활성화된 축(Axes)에 대해 각각 제목, x축 레이블, y축 레이블을 설정한다. 이 함수들은 현재 활성화된 축을 기본으로 사용하기 때문에, 여러 개의 축을 가진 그림을 다룰 때는 명확하지 않을 수 있다.
그러므로 객체 지향적인 스타일을 따르기 위해 set_title(), set_xlabel(), set_ylabel()을 사용한다.
set_title() 메소드: 그래프의 제목을 설정한다.set_xlabel() 메소드: x축의 레이블을 설정한다.set_ylabel() 메소드: y축의 레이블을 설정한다.예를 들어, 두 개의 서브플롯을 가진 그래프를 생성하고 각 서브플롯에 제목과 축 레이블을 설정하는 경우, 다음과 같이 코드를 작성할 수 있다.
import matplotlib.pyplot as plt
# 두 개의 서브플롯을 가진 그래프 생성
fig, axes = plt.subplots(1, 2, figsize=(12, 6))
# 첫 번째 서브플롯 설정
axes[0].plot([1, 2, 3], [4, 5, 6])
axes[0].set_title('첫 번째 서브플롯의 제목')
axes[0].set_xlabel('X축 레이블')
axes[0].set_ylabel('Y축 레이블')
# 두 번째 서브플롯 설정
axes[1].scatter([1, 2, 3], [4, 5, 6])
axes[1].set_title('두 번째 서브플롯의 제목')
axes[1].set_xlabel('X축 레이블')
axes[1].set_ylabel('Y축 레이블')
plt.tight_layout()
plt.show()
이 코드에서는 set_title(), set_xlabel(), set_ylabel() 메서드를 사용하여 각 서브플롯의 제목과 축 레이블을 설정한다. 이 메서드들은 각각 Axes 객체에 대해 호출되어 해당 객체에 대한 설정을 변경한다.
8)
plt.figure(figsize=(10, 5))
x_indices = np.arange(len(data_top10_lang.index))
bar_width = 0.25
for index, dev_type in enumerate(DATA_DEVS):
# 해당 직군 = dev_type 데이터를 필터링 한다 (lang_df)
filtered_data_lang_df = data_lang_df[data_lang_df['DevType'] == dev_type]
# 필터링된 데이터의 언어 사용빈도 계산 (lang_frequency)
data_lang_frequency = filtered_data_lang_df['LanguageHaveWorkedWith'].value_counts()
# 상위 10개 언어에 대한 빈도만 선택
data_lang_frequency_top10 = data_lang_frequency[data_lang_frequency.index.isin(data_top10_lang.index)]
values = [data_lang_frequency_top10[lang] for lang in data_top10_lang.index]
# 해당 직군의 막대를 그림
plt.bar(height=values, x=x_indices + index * bar_width, width=bar_width, label=dev_type)
plt.xticks(x_indices + bar_width, data_top10_lang.index, rotation=45)
plt.yticks(np.arange(0, data_lang_frequency.values.max() + 400, 100))
plt.title('데이터 관련 직군별 언어 사용 현황 (TOP 10 언어)', fontsize=15, fontweight='bold')
plt.xlabel('개발언어', fontweight='bold')
plt.ylabel('응답자 수', fontweight='bold')
plt.legend()
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()

9)
y_positions = []
current_language = None
for index, row in top3_devtypes_by_lang_sorted.iterrows():
if current_language != row['LanguageHaveWorkedWith']:
current_language = row['LanguageHaveWorkedWith']
y_positions.append((current_language, index+2))
y_labels, y_ticks = zip(*y_positions)
plt.figure(figsize=(15,30))
plt.barh(y=top3_devtypes_by_lang_sorted.index, width=top3_devtypes_by_lang_sorted['Count'])
plt.yticks(y_ticks, y_labels)
plt.show()

iterrows()는 Pandas DataFrame에서 각 행을 순회하는 메서드이다. 이 메서드를 호출하면 DataFrame의 각 행에 대해 인덱스와 해당 행을 반환하는 iterator가 생성된다.
import pandas as pd
data = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'Los Angeles', 'Chicago']}
df = pd.DataFrame(data)
이제 iterrows()를 사용하여 DataFrame의 각 행을 반복할 수 있다.
for index, row in df.iterrows():
print(index, row['Name'], row['Age'], row['City'])
# 출력:
# 0 Alice 25 New York
# 1 Bob 30 Los Angeles
# 2 Charlie 35 Chicago
iterrows()를 사용하여 DataFrame의 각 행에 대해 반복할 수 있으며, 각 반복에서 인덱스와 해당 행을 가져와서 원하는 작업을 수행할 수 있다. 단, 대용량 데이터프레임의 경우에는 iterrows()를 사용하는 것보다 다른 방법을 고려해야 한다.
*은 파이썬에서 언패킹(Unpacking) 연산자로 사용됩니다. 리스트, 튜플 등의 iterable 객체를 언패킹하여 각 요소를 개별적인 인자로 전달합니다.
예를 들어, 다음과 같은 리스트가 있다고 가정해봅시다.
my_list = [1, 2, 3]
print(*my_list) # 출력: 1 2 3
이 경우 *my_list는 리스트 my_list의 각 요소를 개별적인 인자로 전달합니다. 즉, print(1, 2, 3)과 동일한 효과를 갖습니다.
zip(*y_positions)에서도 이와 비슷한 원리가 적용됩니다. *y_positions은 y_positions 리스트를 언패킹하여 각 튜플의 같은 위치에 있는 요소들을 묶어주는 역할을 합니다. 따라서 zip(*y_positions)은 각 튜플의 같은 위치에 있는 요소들을 묶어서 새로운 튜플을 생성합니다.
10)
plt.figure(figsize=(15,30))
top3_dev_bars = plt.barh(y=top3_devtypes_by_lang_sorted.index, width=top3_devtypes_by_lang_sorted['Count'])
plt.yticks(y_ticks, y_labels)
for bar, (devtype, percentage) in zip(top3_dev_bars, top3_devtypes_by_lang_with_total[['DevType', 'Percentage']].values):
plt.text(x=bar.get_width(), y=bar.get_y()+bar.get_height()/2, s=f'{devtype} ({percentage:.2f}%)', va='center', ha='left', fontsize=10)
plt.show()

참고:
plt.cm.viridis
plt.cm.viridis는 Matplotlib의 컬러맵(colormap) 중 하나이다. 컬러맵은 데이터를 시각화할 때 사용되는 색상 체계를 정의하는데 사용된다. Viridis 컬러맵은 낮은 값에서 높은 값까지 색상이 점진적으로 변화하며, 잘 구별되는 색상을 사용하여 데이터의 변화를 시각적으로 표현한다. 이 컬러맵은 색상의 밝기와 채도를 조정하여 데이터의 특징을 더욱 명확하게 보여준다.