
Как большая любительница поесть, я решила провести анализ данных о еде и выбрала свой любимый продукт — лапшу. Для дальнейшей проведенной мной работы я использовала датасет с kaggle (World Instant Noodles Consumption 2022).
Процесс создания графиков
Я решила сделать минимум (4 графика), но такой, чтобы показать как можно большее количество информации об имеющихся данных.
import pandas as pd import numpy as np
from google.colab import drive drive.mount ('/content/drive')
file_path = '/content/drive/MyDrive/Noodles.xlsx'
df = pd.read_excel (file_path, sheet_name='noodles (1)')
print («Первый взгляд на данные:») df.head ()
print («ПРОВЕРКА») print («Точные названия всех столбцов:») for i, col in enumerate (df.columns): print (f"Столбец {i}: '{col}' (тип: {type (col)})»)
print («\n» + «=»*50) print («Проверяем последние строки:») df.tail ()
import matplotlib.pyplot as plt import matplotlib.font_manager as fm
available_fonts = [f.name for f in fm.fontManager.ttflist] if 'DejaVu Sans' in available_fonts: plt.rcParams['font.family'] = 'DejaVu Sans' elif 'Liberation Sans' in available_fonts: plt.rcParams['font.family'] = 'Liberation Sans' else: plt.rcParams['font.family'] = 'sans-serif' plt.rcParams['axes.unicode_minus'] = False
palette = { 'noodle_gold': '#FFB347', 'broth_orange': '#FF8C42', 'soy_sauce': '#2D1B00', 'bowl_white': '#FFFBF0', 'chive_green': '#90A959', 'spice_red': '#D32F2F' }
plt.rcParams['figure.figsize'] = (12, 7) # размер plt.rcParams['axes.titleweight'] = 'bold' plt.rcParams['axes.titlecolor'] = palette['soy_sauce']
print («Стиль для графиков установлен»)
Столбчатая диаграмма (Bar Chart) показывает топ-10 стран-лидеров по потреблению лапши в 2022 году. Код для создания диаграммы:
df_sorted_2022 = df.sort_values (by=2022, ascending=False).head (10) countries = df_sorted_2022['Country/Region'] noodle_2022 = df_sorted_2022[2022]
fig, ax = plt.subplots (figsize=(13, 8))
num_bars = len (countries) colors = [palette['noodle_gold']] * num_bars colors[0] = palette['broth_orange'] colors[1] = palette['broth_orange']
bars = ax.bar (countries, noodle_2022, color=colors, edgecolor=palette['soy_sauce'], linewidth=1.5)
for bar in bars: height = bar.get_height () height_text = f'{int (height/1000)}K' if height >= 1000 else f'{int (height)}' ax.text (bar.get_x () + bar.get_width ()/2., height + 100, height_text, ha='center', va='bottom', fontsize=11, fontweight='bold', color=palette['soy_sauce'])
ax.set_title ('МИРОВЫЕ ЛИДЕРЫ ПО ПОТРЕБЛЕНИЮ ЛАПШИ (2022 год)', fontsize=20, pad=25, color=palette['soy_sauce']) ax.set_xlabel ('Страна', fontsize=14, fontweight='bold', color=palette['soy_sauce']) ax.set_ylabel ('Потребление (млн упаковок)', fontsize=14, fontweight='bold', color=palette['soy_sauce'])
plt.xticks (rotation=45, ha='right', fontsize=11)
ax.spines['top'].set_visible (False) ax.spines['right'].set_visible (False) ax.spines['left'].set_color (palette['soy_sauce']) ax.spines['bottom'].set_color (palette['soy_sauce']) ax.grid (axis='y', alpha=0.2, linestyle='--', color=palette['soy_sauce'])
ax.set_facecolor (palette['bowl_white']) fig.patch.set_facecolor (palette['bowl_white'])
plt.tight_layout ()
try: save_path = '/content/drive/MyDrive/noodles_chart_1_top10.png' plt.savefig (save_path, dpi=300, bbox_inches='tight', facecolor=palette['bowl_white']) print (f’График 1 сохранён: {save_path}') except: print ('Сохраните график вручную (значок дискеты на графике)')
plt.show ()
Столбчатая диаграмма
Линейный график (Line Chart) демонстрирует динамику изменения потребления лапши с 2018 по 2022 год в пяти ключевых странах. Код для создания графика:
top5_countries = df.sort_values (by=2022, ascending=False).head (5)['Country/Region'].tolist () df_top5 = df[df['Country/Region'].isin (top5_countries)] years = [2018, 2019, 2020, 2021, 2022]
fig, ax = plt.subplots (figsize=(14, 8))
line_colors = [ palette['broth_orange'], palette['spice_red'], palette['noodle_gold'], palette['chive_green'], '#FFB347' ]
for i, country in enumerate (top5_countries): country_data = df_top5[df_top5['Country/Region'] == country] values = [country_data[year].values[0] for year in years]
ax.plot (years, values,
marker='o',
markersize=8,
linewidth=3,
color=line_colors[i],
label=country,
alpha=0.9)
ax.set_title ('ДИНАМИКА ПОТРЕБЛЕНИЯ ЛАПШИ (2018-2022)', fontsize=20, pad=25, color=palette['soy_sauce']) ax.set_xlabel ('Год', fontsize=14, fontweight='bold', color=palette['soy_sauce']) ax.set_ylabel ('Потребление (млн упаковок)', fontsize=14, fontweight='bold', color=palette['soy_sauce'])
ax.set_xticks (years) ax.set_xticklabels (years, fontsize=12)
legend = ax.legend (loc='upper left', fontsize=12, framealpha=0.9) legend.get_frame ().set_facecolor (palette['bowl_white']) legend.get_frame ().set_edgecolor (palette['soy_sauce'])
ax.grid (True, alpha=0.2, linestyle='--', color=palette['soy_sauce']) ax.spines['top'].set_visible (False) ax.spines['right'].set_visible (False) ax.spines['left'].set_color (palette['soy_sauce']) ax.spines['bottom'].set_color (palette['soy_sauce'])
ax.set_facecolor (palette['bowl_white']) fig.patch.set_facecolor (palette['bowl_white'])
plt.tight_layout ()
try: save_path = '/content/drive/MyDrive/noodles_chart_2_lines.png' plt.savefig (save_path, dpi=300, bbox_inches='tight', facecolor=palette['bowl_white']) print (f’График 2 сохранён: {save_path}') except: print ('Сохраните график вручную (значок дискеты)')
plt.show ()
Линейный график
Интерактивная карта мира (Choropleth Map) визуализирует географическое распределение потребления лапши по странам. Код для создания карты (для корректной работы plotly я преобразовала числовые столбцы в строки):
! pip install plotly -q
import plotly.express as px import plotly.io as pio
df_map = df.copy ()
df_map_fixed = df_map.copy ()
year_columns = [2018, 2019, 2020, 2021, 2022] for year in year_columns: df_map_fixed[str (year)] = df_map_fixed[year]
df_map_fixed = df_map_fixed.dropna (subset=['CCA3', '2022'])
df_map_fixed['hover_text'] = df_map_fixed.apply (
lambda row: f»{row['Country/Region']}
» +
f"Потребление: {int (row['2022']):, } млн упаковок
» + # Используем '2022'
f"Рейтинг: {int (float (row['Rank'])) if pd.notna (row['Rank']) else 'N/A'}
» +
f"Континент: {row['Continent']}»,
axis=1
)
colorscale = [ [0.0, '#FFF3E0'], [0.3, '#FFCC80'], [0.6, '#FFA726'], [0.8, '#FB8C00'], [1.0, '#E65100'] ]
fig = px.choropleth ( df_map_fixed, locations='CCA3', color='2022', hover_name='Country/Region', hover_data={'hover_text': True, 'CCA3': False, '2022': False}, color_continuous_scale=colorscale, range_color=[0, 50000], labels={'2022': 'Потребление лапши (млн упаковок)'}, title='🌍 ПОТРЕБЛЕНИЕ ЛАПШИ ПО СТРАНАМ МИРА' )
fig.update_layout ( title={ 'text': '🌍 ПОТРЕБЛЕНИЕ ЛАПШИ ПО СТРАНАМ МИРА (2022 год)', 'y': 0.95, 'x': 0.5, 'xanchor': 'center', 'yanchor': 'top', 'font': dict (size=24, color=palette['soy_sauce'], family='DejaVu Sans, sans-serif') }, geo=dict ( showframe=True, showcoastlines=True, projection_type='natural earth', landcolor='#F5F5F5', coastlinecolor=palette['soy_sauce'], framecolor=palette['soy_sauce'] ), coloraxis_colorbar=dict ( title='Млн упаковок', title_font=dict (size=14, color=palette['soy_sauce']), tickfont=dict (size=12, color=palette['soy_sauce']), thickness=20, len=0.75 ), width=1300, height=700, paper_bgcolor=palette['bowl_white'], plot_bgcolor=palette['bowl_white'] )
fig.update_traces ( hovertemplate='%{customdata[0]}
Потребление лапши на карте мира
Диаграмма рассеяния (Scatter Plot)отображает взаимосвязь между численностью населения страны и объёмом потребления лапши. Здесь я захотела выделить Китай, который впереди по обоим показателям. Код для создания диаграммы:
import numpy as np
df['Population_num'] = df['2022 Population'].astype (str).str.replace ('.', '', regex=False).astype (float) df_clean = df.dropna (subset=['Population_num', 2022]) df_clean['Population_millions'] = df_clean['Population_num'] / 1_000_000 df_clean['Consumption_thousands'] = df_clean[2022] / 1_000
fig, ax = plt.subplots (figsize=(14, 9))
continent_colors = { 'Asia': palette['broth_orange'], 'Europe': palette['chive_green'], 'Africa': '#FF8C42', 'North America': '#4ECDC4', 'South America': '#FF6B6B', 'Oceania': '#A6A6A8' }
for continent, color in continent_colors.items (): continent_data = df_clean[df_clean['Continent'] == continent] if not continent_data.empty: ax.scatter ( continent_data['Population_millions'], continent_data['Consumption_thousands'], s=200, c=color, alpha=0.7, edgecolors=palette['soy_sauce'], linewidth=1.5, label=continent, zorder=5 )
special_countries = ['China', 'India', 'Indonesia'] for _, row in df_clean.iterrows (): if row['Country/Region'] in special_countries: ax.annotate ( row['Country/Region'], xy=(row['Population_millions'], row['Consumption_thousands']), xytext=(10, 10), textcoords='offset points', fontsize=11, fontweight='bold', color=palette['soy_sauce'], arrowprops=dict ( arrowstyle='->', color=palette['soy_sauce'], alpha=0.6, linewidth=1.5 ) )
df_no_china = df_clean[df_clean['Country/Region'] ≠ 'China'] if len (df_no_china) > 1: z = np.polyfit (df_no_china['Population_millions'], df_no_china['Consumption_thousands'], 1) p = np.poly1d (z) ax.plot (df_no_china['Population_millions'], p (df_no_china['Population_millions']), color=palette['soy_sauce'], linewidth=2, linestyle='--', alpha=0.6, label='Линия тренда (без Китая)')
ax.set_title ('ЗАВИСИТ ЛИ ПОТРЕБЛЕНИЕ ЛАПШИ ОТ НАСЕЛЕНИЯ СТРАНЫ? ', fontsize=20, pad=25, color=palette['soy_sauce']) ax.set_xlabel ('Население страны, млн человек', fontsize=14, fontweight='bold', color=palette['soy_sauce']) ax.set_ylabel ('Потребление лапши, тыс. упаковок', fontsize=14, fontweight='bold', color=palette['soy_sauce'])
legend = ax.legend (title='Континенты', fontsize=11, title_fontsize=12, loc='upper left', framealpha=0.9) legend.get_frame ().set_facecolor (palette['bowl_white']) legend.get_frame ().set_edgecolor (palette['soy_sauce'])
ax.grid (True, alpha=0.2, linestyle='--', color=palette['soy_sauce']) ax.spines['top'].set_visible (False) ax.spines['right'].set_visible (False) ax.spines['left'].set_color (palette['soy_sauce']) ax.spines['bottom'].set_color (palette['soy_sauce'])
ax.set_facecolor (palette['bowl_white']) fig.patch.set_facecolor (palette['bowl_white'])
plt.tight_layout ()
try: save_path = '/content/drive/MyDrive/noodles_chart_4_scatter.png' plt.savefig (save_path, dpi=300, bbox_inches='tight', facecolor=palette['bowl_white']) print (f’График 4 (Scatter Plot) сохранён: {save_path}') except Exception as e: print (f’Ошибка сохранения: {e}')
plt.show ()
print («\nАНАЛИЗ СВЯЗИ МЕЖДУ НАСЕЛЕНИЕМ И ПОТРЕБЛЕНИЕМ:») print («=»*60)
correlation = df_no_china['Population_millions'].corr (df_no_china['Consumption_thousands']) print (f"Коэффициент корреляции (без Китая): {correlation:.3f}»)
if correlation > 0.5: print («Сильная положительная связь: чем больше население, тем больше едят лапши») elif correlation > 0.3: print («Умеренная положительная связь») elif correlation > 0: print («Слабая положительная связь») elif correlation < -0.5: print («Сильная отрицательная связь») else: print («Связь практически отсутствует»)
print («\nКлючевые наблюдения:») print («1. Китай — абсолютный выброс: огромное население + огромное потребление») print («2. Индия: большое население, но относительно малое потребление лапши») print («3. Индонезия: среднее население, но высокое потребление») print («4. Большинство стран следуют общей тенденции»)
Диаграмма рассеяния