
Committee of Experts on Public Administration First session New York , 22-26 July 2002 Item 4 of the provisional agenda* Basic data on the public sector Basic data on the public sector Report of the Secretariat Contents Introduction The present report represents the continuation of a discussion on collecting and making available internationally comparable data on the public sector , an effort undertaken in collaboration between the Division for Public Economics and Public Administration of the United Nations Secretariat and the former Group of Experts of the United Nations Programme on Public Administration and Finance which got under way during the fourteenth session of the former Group of Experts , in 1998. Following the recommendations made at that session , the Division elaborated and presented to the former Group of Experts at its fifteenth session a framework for the collection of such data ( see ST/SG/AC.6/2000/L.2 ) . That framework described the functions of the State as regulator , tax collector , producer , consumer and provider of cash transfers and subsidies , as well as an employer . It suggested that — taking into consideration the availability of data — the presentation of three kinds of indicators could provide a reasonable picture of the public sector in a given country : expenditure by all levels of government , government employment and the value of tax expenditures . At the same time , although the framework acknowledged the important role of the State as regulator , it suggested that it is extremely difficult to quantify the extent of regulation of economic activity , and concluded that even though regulation is an important function of States , it is virtually impossible to measure in any meaningful way and would be ignored in the remainder of that report ( see ST/SG/AC.6/2000/L.2 , para . Subsequently , as a result of discussion during the fifteenth session of the former Group of Experts and further elaboration of the framework of indicators for measuring the public sector , the set of indicators published in electronic form at www . unpan . org included the following five measures : • Government and public employment as a percentage of population . • Government consumption as a percentage of gross domestic product ( GDP ) . • Central government expenditure as a percentage of GDP . • Central government expenditures by type and by function , as a percentage of all central government expenditure . • Central government tax revenue as a percentage of GDP . The concept and indicators were presented in part two of the World Public Sector Report : Globalization and the State . Two thorny issues that were raised from the very beginning of the discussion about the scope of indicators for measuring the public sector remain unresolved . Although within those five categories some data can be collected and presented in an internationally comparable way , the lack of data in some cases and the lack of series of data in other cases makes that task difficult . Also , the lack of readily available data at the subnational level allows for the presentation of a partial picture only . United Nations basic data on the public sector and other international sources of data on the public sector As mentioned above , United Nations basic data on the public sector are available at www . unpan . org , the web site of the Division for Public Economics and Public Administration , as well as in the World Public Sector Report : Globalization and the State . The data are presented together with an analysis of changes and trends . As such , they represent the only source of basic data on the public sector that follows a defined concept of the public sector and its measurement . A cluster of indicators that measure the public sector “ in fact ” , i. e. , in areas and in ways that are allowed by the availability of internationally comparable statistics , was the starting point of reference . Work has been initiated to make the statistics more up to date . Also , the electronic version will allow for generating country , region and subject-specific reports . The United Nations Statistics Division offers statistical databases online , some of which are available for subscribers only . They are multisectoral and comprehensive , and are effective at presenting a long series of data . But there is no reference to public sector as such . If one approaches those databases with a well-defined concept of the public sector , one can piece a lot of useful information together . Such information can be found , for instance , under codes 14 ( National accounts ) and 15 ( Financial statistics ) . The United Nations Development Programme maintains a database on good governance . Its web site presents “ Stories from the field ” , a useful collection of anecdotal evidence that showcases local initiatives aimed at instilling practices of good governance . No statistical data is available . The Human Development Report web site provides statistics focused on monitoring human development , grouped according to key human capabilities , for example , leading a long and healthy life ; acquiring knowledge ; having access to resources needed for a decent standard of living . Again , while no database is devoted to the public sector per se , with a well defined concept of the public sector in hand one could browse such databases and identify a substantial amount of relevant information . The International Labour Organization maintains a web site of 20 key indicators on the labour market . Data on public sector employment can be found under cluster 4 ( Employment by sector ) . The World Bank features an information-rich web site of its Public Sector Group that is devoted to governance and public sector reform ( GPSRnet ) . From the point of view of the presentation of indicators on the public sector , the most relevant is the web page on administrative and civil service reform . In particular , it provides cross-national data on government employment and wages . But it is acknowledged that systematic comprehensive information on public sector employment and pay is rare and generally controversial . The general World Bank statistical database does not present a cluster of data that is specifically related to the public sector . It offers , inter alia , statistical information on domestic finance ( e. g. , consumption , expenditures , revenues ) ; governance ( e. g. , cross-referenced with GPSRnet on employment and wages ; cross-referenced with the above database on domestic finance ) ; and military expenditure . Again , if that statistical database is searched on the basis of a well defined concept of the public sector , a substantial amount of information can be generated . The International Monetary Fund ( IMF ) maintains the World Economic Outlook Database . One of its sections is devoted to general government fiscal balances and presents data on a national income accounts basis . No cluster of data devoted specifically to measurement of the public sector is available . Finally , the Organisation for Economic Cooperation and Development ( OECD ) programme on public management and governance focuses on institutional development , and on assisting Governments in building and strengthening effective , efficient and transparent administrative structures . It covers the 30 members of OECD . Public sector statistics available through the programme 's web site focus on public sector pay and employment . Other data related to the public sector , especially to expenditures , can be found in OECD publications ( partly available in electronic form ) that deal with national accounts , labour force statistics and general economics . The above overview confirms that apart from the United Nations database on the public sector , there is no other source of information and data solely dedicated to portraying the overall picture of the public sector in the world , measuring its size and major functions . To date , the United Nations database does not generate its own original data but researches available sources . Its value is in bringing all the pertinent information to one place and systematizing it according to an adopted concept . Currently , if for whatever reason an answer to the question “ What is the status of the public sector in the world , its size and impact ? ” were sought , practically the only place where such answer could be found is the United Nations database . That sets it apart and requires continuous thinking and effort in order to ensure the highest possible level of quality . The opportunity for expanding the United Nations database on the public sector The framework of the current concept The concept on which the United Nations database on the public sector has been built is a realistic one . While acknowledging that in theory there are many interesting and useful ways in which the public sector can be looked at , described and analysed , the concept stresses that only some of them are practical since no readily available , reliable and internationally comparable data that could support a broader approach exist . According to the report of the Secretariat on public sector indicators ( ST/SG/AC.6/2000/L.2 ) that constitutes the difference between measuring the public sector “ in theory ” and “ in fact ” . Currently , that approach requires further testing . When one thinks about the measurement of the public sector , three main questions come to mind : ( a ) How big is it ? ( b ) How much does it cost ? ( c ) What do we get from it ? With the growth of the overall interest in the changing role of the State and in its accountability to the public , those questions resonate more and more loudly . And there seems to be a growing demand for more and more precise answers . The five original indicators have gone a long way in giving answers to those questions . Data on government employment and government consumption provide an answer to the first question . Data on tax revenue provide an answer to the second question . And finally , data on government expenditures provide an answer to the third question . However , the provision of more comprehensive answers is possible , even if one stays in the realm of the possible , i. e. , measuring the public sector “ in fact ” . The growing interest in the changing role of government and in accessibility of data about its operation constitutes a trend that is rooted in the increasing integration of the world economy and the information revolution . It is not merely a question of monitoring the adjustment of local structures and institutions towards facilitating the capital and trade flows . It is equally about the increasing ease with which information can be exchanged and with which the demonstration effect can spread the world over . Therefore , the concept of the public sector cannot be treated as being limited to a certain group of countries that have already passed the early stages of government development , i. e. , building the very machinery of government and ensuring greater efficiency and effectiveness of that governmental machinery . It increasingly looks as if countries with deficiencies in government development may have to look for ways to accommodate all three stages of that development at the same time . They may have to put in place the processes of setting up governmental machinery , fine-tuning it for efficiency and effectiveness ; and increasing government accountability by placing citizens in the proper relationship vis-à-vis the government . As to ways in which the government can be measured in a more comprehensive way — to meet the expectations of awakening citizenry — new categories of data can be collected and presented , which concerns especially the second of the three above-mentioned questions , i. e. , “ How much does it cost ? ” The first area of interest concerns the total picture of government revenues . Taxes constitute the prevailing source of government revenues , but they are not by any means the only source of government income . Some of those sources are semi-permanent , such as income from government monopolies . Others , such as income from selling public property — for instance income resulting from privatization programmes — are one-off operations . As long as there are public assets to be sold , those revenues can be significant for the whole picture of government operations , since they may constitute a cushion for irresponsible fiscal policy . Therefore , it seems warranted to expand the United Nations database on the public sector by the following additional indicator : • Total public revenue as percentage of GDP . Governments borrow and increasingly they borrow not only at the central but also at the local levels , especially at the level of municipalities . That in itself is not a negative phenomenon as long as the debt portfolio is managed in a sustainable way . Also , by going to the national and increasingly international market for loans , Governments expose themselves to the scrutiny of the market and subject their finances to ranking , which tells a broader story about the state of affairs as managed by a Government , regardless of whether it is at the central or at the local level . Therefore , it seems warranted to expand the United Nations database on the public sector by the following additional indicators : • Public debt ( total and per capita ) . • Ratio of debt service to recurring revenues . • International ranking of public debt . • Domestic ranking of local debt ( BIS ratio ) . Finally , there are important aspects of government expenditures that should be considered for a more comprehensive presentation of the answer to the question “ What do we get from it ? ” . One is the issue of intergovernmental transfers and the increasingly important phenomenon of local expenditure of centrally collected revenues . Another is the issue of tax expenditures . Two years ago , little data could be found to illustrate that phenomenon . Today , with the pioneering efforts of IMF , several dozen countries make data concerning tax expenditures available in the public domain . Therefore , there is an opportunity to highlight those acts of government fiscal transparency . It seems warranted to expand the United Nations database on the public sector by additional indicators on : • Percentage of total central revenues spent at the local level . • Tax expenditures as a percentage of total tax revenue . One can stop the analysis of the public sector with the effort to capture its fiscal behaviour and the impact of that behaviour . Such an analysis documents the status of a broader contract between the public at large and the Government . It paints a picture of Governments as agents that work on behalf of the society . It shows how well public money and public trust are used to secure the current needs of society , and points to prospects for its future growth and development . If government decisions are right , if there are no principal agent problems , if bureaucratic capture does not prevail — then all that shows on the balance sheet of the cost of the existence of the public administrative machinery and the results of that existence . It shows in the structure and level of government consumption and government expenditures , to the extent that they relate to human capabilities . Dealing with the impact of government regulations and government behaviour As it is rightly pointed out in the report of the Secretariat on public sector indicators ( ST/SG/AC.6/2000/L.2 ) Governments enjoy a monopoly of legitimate force , limited perhaps by democratic tradition , a written constitution or a bill of rights . There is , moreover , an inherent conflict embedded in the concept of government since government is both the formulator of policies and the immediate arbiter of such policies . Their sheer size and political and often economic power make Governments the decisive factor in shaping the type of governance that prevails in societies the world over . Good governance1 does not exist in countries in which Governments do not actively support and practise it , in which they suppress the independence of the judiciary and the rule of law . Also , by regulating and making strategic investments , Governments have the power to lead the development of their economics in a certain direction . It is also axiomatic to claim , when discussing regulations , that Governments are better at formulating policies but are worse in delivery when compared to businesses . That is easily exemplified by the increasing interest in public/private partnerships . However , the regulatory hand of the State should not be unduly heavy since to impose onerous costs on business is equivalent to a tax . Therefore , it is hardly possible to answer the above questions related to the measurement of a government , especially the third one , “ What do we get from it ? ” , without an attempt to capture some of the impact of regulations and the behaviour of Governments . Such broadening of the scope and character of measurement of government would convert the current United Nations basic data on the public sector into a global public sector monitor . Such a monitor must be based on an acceptable concept . In turn , that concept must be supported by a set of well chosen indicators , even if they are proxy indicators . A compelling vantage point is the role that Governments play in formulating and implementing a high-quality response by a society to the challenge of building a knowledge-based society . When one looks into the future today , one appreciates that it will be inhabited , inter alia , by societies that are currently working to make space — changing policies and institutions — for knowledge to become the leading factor that shapes the way in which people work and live . They are moving in the direction of knowledge societies . Such societies rest on K-governance,2 i. e. , on values , institutions , policies and investments ( in human resources and skills ; in concepts , contents and ideas ; in communication and networking ) that provide optimal conditions for knowledge to play the role of the key factor in economic growth and human development . They embrace wireless connectivity and knowledge workers as much as the successful industrial societies formerly embraced the steam engine , electricity , the assembly line , the stock exchange , scientists , engineers and investment bankers . In the centre of that transition are the people with their new capabilities and roles . Their intelligence , augmented by ICT , is becoming the primary source of growth , development and wealth creation , which puts them in the position of the leading factor of production . Unlike physical or financial capital , that new leading factor of production will be capable of relocation based on its own calculation and its own merits . As competition for the most educated and skilled individuals grows , nations and firms will be likely to attune to their demands . They will try to become “ liveable ” by the standards established by the most sought-after individuals.3 Knowledge societies that embrace the proper set of values , especially the value of human solidarity , seem to carry the promise of a new wave of human emancipation , with new opportunities to increase human capabilities in ways that assure quicker , broader and more sustainable progress in human development . That conviction underpins the United Nations decision to create the Information and Communications Technologies Task Force , and it is also behind the call of the United Nations Millennium Declaration for values-based development that rests on good governance , human rights and freedoms , and participatory democracy . Successful knowledge societies are expected to have in the future a demonstration effect in the world as powerful as that which successful industrial societies have today . Many of them will emerge from redesigned industrial societies . But that is not guaranteed . Wherever a society and its government raises to the level of a high-quality response to that new developmental challenge , new concentrations of wealth and power are sure to appear , which has the potential for redrawing the current map of wealth and poverty , economic and political power , and vulnerability in the world . However , ethnic , cultural , religious and national groups are bound to form and are already forming their own assessment and reaction to the new challenge . Interest lobbies are also shaping the process . Resistance or support to following the change may come from various directions as a result of coalitions of various , oftentimes diverse interests . Choices to be made here will have long-term positive or negative consequences . The starting point for the transition — as measured in financial resources , human skills and the prevalence of enabling structures and institutions — matters . So does an enabling international environment and degree of cooperation . And not all in the transition will be rooted in government actions . Business and civil society have an important role to play . But , the process of change is no different than any other process of change . Leadership is one of its indispensable ingredients . It does not even matter that in that changing and by definition chaotic world , centralized , top-down , command-like governance structures are likely to give way to ( ad hoc ) coalitions of broad groups of shared interests , consisting of government agencies , businesses and citizens . In an emerging world of many players , interests and scattered capabilities ( including funding capacities ) , the role of a catalyst , organizer or “ stage manager ” will have to be performed . Governments — central and local — are well positioned to pick up and harness that role . They are equally well positioned to assume a passive or negative role , depending on the coalition of interests and forces that they would represent . Their behaviour in that respect matters . If it does , it is objectively beneficial to measure that behaviour and its impact and to present results of such measurement in the public domain . Among the many possible approaches , it is proposed that the future global public sector monitor focus on five additional areas for data collection and presentation : ( a ) state of the public sphere ; ( b ) knowledge acquisition ; ( c ) web-based platform for work and life ; ( d ) entrepreneurial development ; ( e ) links between the local and global levels . As with the initial attempt to present the basic data on the public sector , describing those areas “ in theory ” is much easier than describing them “ in fact ” . In many cases , data is simply unavailable . In many cases , proxy indicators will have to be used , and in others descriptive situations will have to be used . However , while the choice of indicators can be fine-tuned in time , those five areas seem to represent a key complement to the basic data on the public sector . They tell a fuller story about the government stewardship of the societies that they manage . Maintenance of the public sphere The general value of basing the legitimacy of Governments on well informed public consensus is perhaps most clearly pronounced at the time of change . Sustainable management of change and of the results of change require it . From that point of view , the state of the public sphere , i. e. , the institutional arena of discursive interaction where private persons can debate public matters , is of great interest . A lot of factors play an important role here . Is discussion in the public sphere open and accessible to all ? How does a society deal with bracketing inequalities of status among the participants ? Is the right to participate in such a discussion protected by laws and an independent judiciary ? Is the information about the functioning of the Government available in the public domain in a timely and user-friendly way ? Who owns and controls the means for public discourse ? The state of the public sphere is not sound the world over . Inequalities still matter , and with the retrenchment of the welfare State material means of bracketing them are more and more difficult to come by . The early enthusiasm about the liberating impact of ICT has been more recently lowered by governmental restrictions and by the use by some Governments of the eavesdropping , firewall and geo-locating technologies . And freedom of the privately owned press is too often compromised by collusion between business and government . In addition , the soundness of the public sphere relies often on intangible factors , such as culture . Be this as it may , Governments — through their regulations , investment and behaviour — carry a large share of responsibility for it . Therefore , indicators that describe the state of the public sphere tell a revealing story about the use by Governments of the public trust and public money . For these reasons , it is proposed that the global public monitor collect and present data on : • Ownership ( state , for profit , not for profit ) of newspapers , radio and television stations . • Status of ratification of human rights conventions . • Description of ways in which the government budget is disclosed to the public at large . Knowledge acquisition The real divide in the world should be measured not so much in terms of access to income or access to ICT connectivity but by access to knowledge . The legitimate worry that globalization ( i. e. , integration of the world economy ) is not benefiting all can be rephrased as a legitimate worry about the growing productivity divide . It can also be rephrased as a legitimate worry that knowledge that already exists in the world and could be effectively used to alleviate many grave social problems is not harnessed where it can have the greatest and most needed effect . Without bridging the knowledge divide , the world is bound to continue to be caught in discussions about the feasibility of increasing international financial transfers . The income divide is likely to dominate global politics . And many aberrations that have their roots in the every day realities of marginalization and exclusion will be with us . Naturally , an issue as huge as that is a matter that is best addressed by both national and international activities . However , local systems and local institutions for the creation of original knowledge , for knowledge adoption and adaptation , and for preparing a future cadre of knowledge workers can and should be usefully monitored and measured . It is proposed , therefore , that the global public sector monitor collect and present data on : • School enrolment ratio at all three levels of education ( by gender ) . • Public expenditures on research and development as a percentage of the military budget . • Number of internationally registered patents . • Foreign direct investment ( FDI ) as a percentage of total investments . Web-based platform for work and life Despite the relatively short history of business and social applications of the Internet , it is possible to conclude that it already has and will increasingly have a truly revolutionary impact on how people work and live . It empowers individuals in ways for which little precedence can be drawn from history . It carries the potential of converting them into well informed , knowledgeable individuals . It carries the potential of converting them into socially and politically active , networked individuals . With further improvements in wireless connectivity , it allows those individuals to move around with their personal “ bubble ” of access to information , knowledge and networks , which is increasingly having a profound impact on their capabilities and behaviour in the workplace and many other public and private arenas . ICT skills , connectivity and applications are the three main ingredients needed to enable the full potential of the new technology to be utilized . And while they do not depend solely on the activities of the Government , they are so important for opening new human development opportunities that measuring them at any level of overall development tells an important story about the capacity of the Government to lead and to focus on what matters in terms of future growth and development . A good example here is the debate about the rationale for maintaining a public monopoly on telecommunications . While useful , it has its final resolution in a very objective indicator : the cost of making a long-distance call or the cost of an Internet connection . Therefore , it is proposed that the global public sector monitor collect and present data on : • Infrastructure for wireless , broadband connectivity . • Number of cell phones per 100 population . • Number of Internet hosts per 100 population . • Cost of Internet connection . • E-government applications ( list and description of existing applications , with links to them and/or e-government index ) . Entrepreneurial development Entrepreneurial development is about individual freedom , the productive utilization of skills and knowledge and raising the overall quality of life by offering the public a better choice of goods and services . It is also about developmental sustainability and security . Moreover , it serves to strengthen democracy by developing and sustaining a middle class of citizenry . A society that has organized itself for easy business incorporation is a society that allows its citizens to undertake many experiments in satisfying the needs of consumers . Since no one can foresee the future with any certainty , an economy that is based on only few businesses is bound to be less flexible in adaptation to the opportunities and requirements of the future . The knowledge-based society aims to generate an increased number of ideas and applications of those ideas . Creating the conditions for easy , low-cost start-up of businesses represents a logical supplement to the ever-expanding pool of marketable ideas . A lot depends in this area on government regulations of a broad scope of business-augmenting activities , from regulation of the financial markets to regulation of the bankruptcy courts . Eventually , it demonstrates itself in people 's ability and willingness to engage their own capabilities and often their own funds into starting a business enterprise . It is proposed therefore that the global public sector monitor collect and present data on : • Number of steps needed for business incorporation . • Number of new businesses as a percentage of existing ones . Links between the local and the global Finally , knowledge-based societies will live in a framework of an integrating world , with the economy constituting perhaps the strongest net of integration . Knowledge multiplies best in knowledge-rich environments . With the help of modern telecommunication , those can be found globally as easily as locally . And market size matters when a marketable idea is converted into a business activity . The ability of the local environment to attract and keep from the global pool of savings is also a sign — among others — of good public stewardship . The same applies to people . Although the integration trends in the world seem unstoppable now , monitoring and measuring the direction and the quality of flows between the local and global environments can provide a useful indication of the soundness of the overall regulatory framework that has been put in place by local governments . Therefore , the following indicators seem useful : • Foreign trade as a percentage of GDP . • Net labour migration as a percentage of population . Recommendations Based on the above analysis , it is recommended that : ( a ) Basic data on the public sector should be presented in a more comprehensive form and , in addition to the current five basic indicators , should include the following indicators : • Total public revenue as a percentage of GDP . • Public debt ( total and per capita ) . • Ratio of debt service to recurring revenues . • International ranking of public debt . • Domestic ranking of local debt ( BIS ratio ) . • Percentage of total central revenues spent at the local level . • Tax expenditures as percentage of total tax revenue . ( b ) Basic data on the public sector should evolve into the global public sector monitor ; ( c ) The concept of that evolution should be based on collecting data that illustrate government regulations and behaviour , as they relate to the transition to a knowledge-based society ; ( d ) Data on government regulations and behaviour — as they relate to the transition to a knowledge-based society — should pertain to the following five areas : ( i ) maintenance of the public sphere ; ( ii ) knowledge acquisition ; ( iii ) web-based platform for work and life ; ( iv ) entrepreneurial development ; and ( v ) links between the local and the global ; ( e ) The new indicators should include : • Ownership ( State , for profit , not for profit ) of newspapers , radio and television stations . • Status of the ratification of human rights conventions . • Description of ways in which the government budget is disclosed to the public at large . • School enrolment ratio at all three levels of education . • Public expenditures on research and development as percentage of military budget . • Number of internationally registered patents . • FDI as a percentage of total investments . • Infrastructure for wireless , broadband connectivity . • Number of cellphones per 1,000 population . • Number of Internet hosts per 1,000 population . • Cost of Internet connection . • E-government applications ( list and description of existing applications with links to them ) . • Number of steps needed for business incorporation . • Number of new businesses as a percentage of existing ones . • Foreign trade as a percentage of GDP . • Net labour migration as a percentage of the population . Notes 1 While discussing governance , the process by which a society steers itself , the participants of the Global Knowledge II Conference , held in Kuala Lumpur in March 2000 , agreed on the following characteristics of “ good governance ” : it must be based on values , human rights and freedoms and the rule of law . It must be unified by the attractiveness of the development vision that it formulates and represents . It must be social consensus-seeking , non-divisive , supportive of peaceful coexistence and cooperation . It must be responsive to well informed , knowledgeable citizens . It must be focused on its goal , i. e. , serving the well-being of all stakeholders . It must be participatory and interactive , inclusive , providing open access and effective ownership to all stakeholders . It must be representative , i. e. , allowing regular renewal of leadership . It must be useful by being effective , responsive and flexible , and able to react quickly , and evolve in its modes of operation . It must be equitable in burden-sharing and distributing access to opportunities and resources ( including information and knowledge ) . In must be cost-efficient . It must be transparent and accountable , based on open access to information about its functioning . And finally , it must be consistent in all its characteristics at all levels — local , national and global . 2 It is important to distinguish the difference and discuss the relationship between ( a ) good governance ( G-governance , as defined in footnote 1 ) ; ( b ) governance that enables the creation and functioning of a knowledge-based society ( K-governance ) ; ( c ) application of information and communication technology ( ICT ) to the many processes through which power is executed in a society ( E-governance ) ; and ( d ) application of ICT to the operations of the governmental machinery ( E-government ) . Although it is true that the presence of greater amounts of knowledge and ICT capabilities in key areas of human activities triggers processes that amplify the desirable characteristics of governance , “ E-governance ” and “ E-government ” do not by themselves guarantee the achievement of a higher level of human development . They facilitate activities aimed at implementation of policies : it is the content and intended effect of those policies and activities that determines if they eventually measure up to the standards of G-governance , one that objectively serves human development , expands human opportunities and choices . Similarly , K-governance cannot be automatically equated with G-governance . It merely opens space for knowledge to become a decisive resource in the life of a society . By itself , it does not deal with exclusion , intolerance or lack of human solidarity . Only the goal of human development for all that is rooted in proper values would bring K-governance close to the ideal of G-governance . 3 Those standards are difficult to predict today . However , it is safe to assume that they will be likely to include peace ; human rights and freedoms ; non-discrimination and a culture of tolerance ; the rule of law and an independent judiciary ; open and accessible participation in the political process ; transparency , responsiveness , effectiveness and efficiency of public administration ; institutions that guarantee low-cost accessibility to health care , lifelong education , ICT , local and global markets and social safety nets capable of supporting the retooling of skills ; and a clean natural environment . The values of those individual elements will determine how broadly the conditions of “ liveability ” will spread to other sectors of society and to other countries and regions of the world . 